X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/b0a741412f3ea330272c827cf4a9c577498f8de9..48dae831507fc9de049bb4ab33f5fe40ac1891fd:/vendor/assets/iD/iD.js diff --git a/vendor/assets/iD/iD.js b/vendor/assets/iD/iD.js index 5c78af379..d89cd30da 100644 --- a/vendor/assets/iD/iD.js +++ b/vendor/assets/iD/iD.js @@ -5,7 +5,14 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; - var __commonJS = (cb, mod) => function __require() { + var __require = /* @__PURE__ */ ((x2) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x2, { + get: (a2, b2) => (typeof require !== "undefined" ? require : a2)[b2] + }) : x2)(function(x2) { + if (typeof require !== "undefined") + return require.apply(this, arguments); + throw Error('Dynamic require of "' + x2 + '" is not supported'); + }); + var __commonJS = (cb, mod) => function __require2() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { @@ -21,6 +28,10 @@ return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); @@ -424,18 +435,18 @@ } ]; var diacriticsMap = {}; - for (i2 = 0; i2 < replacementList.length; i2 += 1) { - chars = replacementList[i2].chars; - for (j2 = 0; j2 < chars.length; j2 += 1) { - diacriticsMap[chars[j2]] = replacementList[i2].base; + for (i3 = 0; i3 < replacementList.length; i3 += 1) { + chars = replacementList[i3].chars; + for (j3 = 0; j3 < chars.length; j3 += 1) { + diacriticsMap[chars[j3]] = replacementList[i3].base; } } var chars; - var j2; - var i2; + var j3; + var i3; function removeDiacritics2(str2) { - return str2.replace(/[^\u0000-\u007e]/g, function(c) { - return diacriticsMap[c] || c; + return str2.replace(/[^\u0000-\u007e]/g, function(c2) { + return diacriticsMap[c2] || c2; }); } exports2.replacementList = replacementList; @@ -457,14 +468,15 @@ [69216, 69247], [126064, 126143], [126464, 126719] + // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf ]; function isArabic(char) { if (char.length > 1) { throw new Error("isArabic works on only one-character strings"); } let code = char.charCodeAt(0); - for (let i2 = 0; i2 < arabicBlocks.length; i2++) { - let block2 = arabicBlocks[i2]; + for (let i3 = 0; i3 < arabicBlocks.length; i3++) { + let block2 = arabicBlocks[i3]; if (code >= block2[0] && code <= block2[1]) { return true; } @@ -2628,8 +2640,8 @@ var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8"; exports2.tashkeel = tashkeel; function addToTashkeel(start2, finish) { - for (var i2 = start2; i2 <= finish; i2++) { - exports2.tashkeel = tashkeel += String.fromCharCode(i2); + for (var i3 = start2; i3 <= finish; i3++) { + exports2.tashkeel = tashkeel += String.fromCharCode(i3); } } addToTashkeel(1552, 1562); @@ -2643,8 +2655,8 @@ var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9"; exports2.lineBreakers = lineBreakers; function addToLineBreakers(start2, finish) { - for (var i2 = start2; i2 <= finish; i2++) { - exports2.lineBreakers = lineBreakers += String.fromCharCode(i2); + for (var i3 = start2; i3 <= finish; i3++) { + exports2.lineBreakers = lineBreakers += String.fromCharCode(i3); } } addToLineBreakers(1536, 1567); @@ -2748,11 +2760,11 @@ returnable += letter; return; } - for (let w = 0; w < reference_1.letterList.length; w++) { - let letterForms = unicode_arabic_1.default[reference_1.letterList[w]]; + for (let w2 = 0; w2 < reference_1.letterList.length; w2++) { + let letterForms = unicode_arabic_1.default[reference_1.letterList[w2]]; let versions = Object.keys(letterForms); - for (let v = 0; v < versions.length; v++) { - let localVersion = letterForms[versions[v]]; + for (let v2 = 0; v2 < versions.length; v2++) { + let localVersion = letterForms[versions[v2]]; if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") { let embeddedForms = Object.keys(localVersion); for (let ef = 0; ef < embeddedForms.length; ef++) { @@ -2776,7 +2788,7 @@ } } } else if (localVersion === letter) { - if (breakPresentationForm && letterForms["normal"] && ["isolated", "initial", "medial", "final"].indexOf(versions[v]) > -1) { + if (breakPresentationForm && letterForms["normal"] && ["isolated", "initial", "medial", "final"].indexOf(versions[v2]) > -1) { if (typeof letterForms["normal"] === "object") { returnable += letterForms["normal"][0]; } else { @@ -2796,8 +2808,8 @@ let normalForm = reference_1.ligatureList[v2]; if (normalForm !== "words") { let ligForms = Object.keys(unicode_ligatures_1.default[normalForm]); - for (let f2 = 0; f2 < ligForms.length; f2++) { - if (unicode_ligatures_1.default[normalForm][ligForms[f2]] === letter) { + for (let f3 = 0; f3 < ligForms.length; f3++) { + if (unicode_ligatures_1.default[normalForm][ligForms[f3]] === letter) { returnable += normalForm; return; } @@ -2834,11 +2846,11 @@ if (letter === "\u0621") { return "\u0621"; } - for (let w = 0; w < reference_1.letterList.length; w++) { - let letterForms = unicode_arabic_1.default[reference_1.letterList[w]]; + for (let w2 = 0; w2 < reference_1.letterList.length; w2++) { + let letterForms = unicode_arabic_1.default[reference_1.letterList[w2]]; let versions = Object.keys(letterForms); - for (let v = 0; v < versions.length; v++) { - let localVersion = letterForms[versions[v]]; + for (let v2 = 0; v2 < versions.length; v2++) { + let localVersion = letterForms[versions[v2]]; if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) { if (versions.indexOf(form) > -1) { return letterForms[form]; @@ -2872,9 +2884,9 @@ function WordShaper2(word) { let state = "initial"; let output = ""; - for (let w = 0; w < word.length; w++) { + for (let w2 = 0; w2 < word.length; w2++) { let nextLetter = " "; - for (let nxw = w + 1; nxw < word.length; nxw++) { + for (let nxw = w2 + 1; nxw < word.length; nxw++) { if (!isArabic_1.isArabic(word[nxw])) { break; } @@ -2883,22 +2895,22 @@ break; } } - if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) { - output += word[w]; + if (!isArabic_1.isArabic(word[w2]) || isArabic_1.isMath(word[w2])) { + output += word[w2]; state = "initial"; - } else if (reference_1.tashkeel.indexOf(word[w]) > -1) { - output += word[w]; - } else if (nextLetter === " " || reference_1.lineBreakers.indexOf(word[w]) > -1) { - output += CharShaper_1.CharShaper(word[w], state === "initial" ? "isolated" : "final"); + } else if (reference_1.tashkeel.indexOf(word[w2]) > -1) { + output += word[w2]; + } else if (nextLetter === " " || reference_1.lineBreakers.indexOf(word[w2]) > -1) { + output += CharShaper_1.CharShaper(word[w2], state === "initial" ? "isolated" : "final"); state = "initial"; - } else if (reference_1.lams.indexOf(word[w]) > -1 && reference_1.alefs.indexOf(nextLetter) > -1) { - output += unicode_ligatures_1.default[word[w] + nextLetter][state === "initial" ? "isolated" : "final"]; - while (word[w] !== nextLetter) { - w++; + } else if (reference_1.lams.indexOf(word[w2]) > -1 && reference_1.alefs.indexOf(nextLetter) > -1) { + output += unicode_ligatures_1.default[word[w2] + nextLetter][state === "initial" ? "isolated" : "final"]; + while (word[w2] !== nextLetter) { + w2++; } state = "initial"; } else { - output += CharShaper_1.CharShaper(word[w], state); + output += CharShaper_1.CharShaper(word[w2], state); state = "medial"; } } @@ -2920,11 +2932,11 @@ if (!isArabic_1.isArabic(letter)) { throw new Error("Not an Arabic letter"); } - for (let w = 0; w < reference_1.letterList.length; w++) { - let letterForms = unicode_arabic_1.default[reference_1.letterList[w]]; + for (let w2 = 0; w2 < reference_1.letterList.length; w2++) { + let letterForms = unicode_arabic_1.default[reference_1.letterList[w2]]; let versions = Object.keys(letterForms); - for (let v = 0; v < versions.length; v++) { - let localVersion = letterForms[versions[v]]; + for (let v2 = 0; v2 < versions.length; v2++) { + let localVersion = letterForms[versions[v2]]; if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") { let embeddedForms = Object.keys(localVersion); for (let ef = 0; ef < embeddedForms.length; ef++) { @@ -2945,11 +2957,11 @@ if (!isArabic_1.isArabic(letter)) { throw new Error("Not an Arabic letter"); } - for (let w = 0; w < reference_1.letterList.length; w++) { - let letterForms = unicode_arabic_1.default[reference_1.letterList[w]]; + for (let w2 = 0; w2 < reference_1.letterList.length; w2++) { + let letterForms = unicode_arabic_1.default[reference_1.letterList[w2]]; let versions = Object.keys(letterForms); - for (let v = 0; v < versions.length; v++) { - let localVersion = letterForms[versions[v]]; + for (let v2 = 0; v2 < versions.length; v2++) { + let localVersion = letterForms[versions[v2]]; if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") { let embeddedForms = Object.keys(localVersion); for (let ef = 0; ef < embeddedForms.length; ef++) { @@ -2997,27 +3009,27 @@ "node_modules/vparse/index.js"(exports2, module2) { (function(window2) { "use strict"; - function parseVersion3(v) { - var m = v.replace(/[^0-9.]/g, "").match(/[0-9]*\.|[0-9]+/g) || []; - v = { - major: +m[0] || 0, - minor: +m[1] || 0, - patch: +m[2] || 0, - build: +m[3] || 0 + function parseVersion3(v2) { + var m2 = v2.replace(/[^0-9.]/g, "").match(/[0-9]*\.|[0-9]+/g) || []; + v2 = { + major: +m2[0] || 0, + minor: +m2[1] || 0, + patch: +m2[2] || 0, + build: +m2[3] || 0 }; - v.isEmpty = !v.major && !v.minor && !v.patch && !v.build; - v.parsed = [v.major, v.minor, v.patch, v.build]; - v.text = v.parsed.join("."); - v.compare = compare; - return v; + v2.isEmpty = !v2.major && !v2.minor && !v2.patch && !v2.build; + v2.parsed = [v2.major, v2.minor, v2.patch, v2.build]; + v2.text = v2.parsed.join("."); + v2.compare = compare; + return v2; } - function compare(v) { - if (typeof v === "string") { - v = parseVersion3(v); + function compare(v2) { + if (typeof v2 === "string") { + v2 = parseVersion3(v2); } - for (var i2 = 0; i2 < 4; i2++) { - if (this.parsed[i2] !== v.parsed[i2]) { - return this.parsed[i2] > v.parsed[i2] ? 1 : -1; + for (var i3 = 0; i3 < 4; i3++) { + if (this.parsed[i3] !== v2.parsed[i3]) { + return this.parsed[i3] > v2.parsed[i3] ? 1 : -1; } } return 0; @@ -3034,59 +3046,59 @@ // node_modules/which-polygon/node_modules/quickselect/quickselect.js var require_quickselect = __commonJS({ "node_modules/which-polygon/node_modules/quickselect/quickselect.js"(exports2, module2) { - (function(global3, factory) { - typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global3.quickselect = factory(); + (function(global2, factory) { + typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global2.quickselect = factory(); })(exports2, function() { "use strict"; - function quickselect2(arr, k, left, right, compare) { - quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare); + function quickselect2(arr, k2, left, right, compare) { + quickselectStep(arr, k2, left || 0, right || arr.length - 1, compare || defaultCompare); } - function quickselectStep(arr, k, left, right, compare) { + function quickselectStep(arr, k2, left, right, compare) { while (right > left) { if (right - left > 600) { - var n2 = right - left + 1; - var m = k - left + 1; - var z = Math.log(n2); - var s = 0.5 * Math.exp(2 * z / 3); - var sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1); - var newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd)); - var newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd)); - quickselectStep(arr, k, newLeft, newRight, compare); - } - var t = arr[k]; - var i2 = left; - var j2 = right; - swap2(arr, left, k); - if (compare(arr[right], t) > 0) + var n3 = right - left + 1; + var m2 = k2 - left + 1; + var z2 = Math.log(n3); + var s2 = 0.5 * Math.exp(2 * z2 / 3); + var sd = 0.5 * Math.sqrt(z2 * s2 * (n3 - s2) / n3) * (m2 - n3 / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k2 - m2 * s2 / n3 + sd)); + var newRight = Math.min(right, Math.floor(k2 + (n3 - m2) * s2 / n3 + sd)); + quickselectStep(arr, k2, newLeft, newRight, compare); + } + var t2 = arr[k2]; + var i3 = left; + var j3 = right; + swap2(arr, left, k2); + if (compare(arr[right], t2) > 0) swap2(arr, left, right); - while (i2 < j2) { - swap2(arr, i2, j2); - i2++; - j2--; - while (compare(arr[i2], t) < 0) - i2++; - while (compare(arr[j2], t) > 0) - j2--; - } - if (compare(arr[left], t) === 0) - swap2(arr, left, j2); + while (i3 < j3) { + swap2(arr, i3, j3); + i3++; + j3--; + while (compare(arr[i3], t2) < 0) + i3++; + while (compare(arr[j3], t2) > 0) + j3--; + } + if (compare(arr[left], t2) === 0) + swap2(arr, left, j3); else { - j2++; - swap2(arr, j2, right); + j3++; + swap2(arr, j3, right); } - if (j2 <= k) - left = j2 + 1; - if (k <= j2) - right = j2 - 1; + if (j3 <= k2) + left = j3 + 1; + if (k2 <= j3) + right = j3 - 1; } } - function swap2(arr, i2, j2) { - var tmp = arr[i2]; - arr[i2] = arr[j2]; - arr[j2] = tmp; + function swap2(arr, i3, j3) { + var tmp = arr[i3]; + arr[i3] = arr[j3]; + arr[j3] = tmp; } - function defaultCompare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; + function defaultCompare(a2, b2) { + return a2 < b2 ? -1 : a2 > b2 ? 1 : 0; } return quickselect2; }); @@ -3114,19 +3126,19 @@ all: function() { return this._all(this.data, []); }, - search: function(bbox) { + search: function(bbox2) { var node = this.data, result = [], toBBox = this.toBBox; - if (!intersects(bbox, node)) + if (!intersects(bbox2, node)) return result; - var nodesToSearch = [], i2, len, child, childBBox; + var nodesToSearch = [], i3, len, child, childBBox; while (node) { - for (i2 = 0, len = node.children.length; i2 < len; i2++) { - child = node.children[i2]; + for (i3 = 0, len = node.children.length; i3 < len; i3++) { + child = node.children[i3]; childBBox = node.leaf ? toBBox(child) : child; - if (intersects(bbox, childBBox)) { + if (intersects(bbox2, childBBox)) { if (node.leaf) result.push(child); - else if (contains(bbox, childBBox)) + else if (contains(bbox2, childBBox)) this._all(child, result); else nodesToSearch.push(child); @@ -3136,17 +3148,17 @@ } return result; }, - collides: function(bbox) { + collides: function(bbox2) { var node = this.data, toBBox = this.toBBox; - if (!intersects(bbox, node)) + if (!intersects(bbox2, node)) return false; - var nodesToSearch = [], i2, len, child, childBBox; + var nodesToSearch = [], i3, len, child, childBBox; while (node) { - for (i2 = 0, len = node.children.length; i2 < len; i2++) { - child = node.children[i2]; + for (i3 = 0, len = node.children.length; i3 < len; i3++) { + child = node.children[i3]; childBBox = node.leaf ? toBBox(child) : child; - if (intersects(bbox, childBBox)) { - if (node.leaf || contains(bbox, childBBox)) + if (intersects(bbox2, childBBox)) { + if (node.leaf || contains(bbox2, childBBox)) return true; nodesToSearch.push(child); } @@ -3159,8 +3171,8 @@ if (!(data && data.length)) return this; if (data.length < this._minEntries) { - for (var i2 = 0, len = data.length; i2 < len; i2++) { - this.insert(data[i2]); + for (var i3 = 0, len = data.length; i3 < len; i3++) { + this.insert(data[i3]); } return this; } @@ -3191,12 +3203,12 @@ remove: function(item, equalsFn) { if (!item) return this; - var node = this.data, bbox = this.toBBox(item), path = [], indexes = [], i2, parent, index, goingUp; + var node = this.data, bbox2 = this.toBBox(item), path = [], indexes = [], i3, parent, index, goingUp; while (node || path.length) { if (!node) { node = path.pop(); parent = path[path.length - 1]; - i2 = indexes.pop(); + i3 = indexes.pop(); goingUp = true; } if (node.leaf) { @@ -3208,15 +3220,15 @@ return this; } } - if (!goingUp && !node.leaf && contains(node, bbox)) { + if (!goingUp && !node.leaf && contains(node, bbox2)) { path.push(node); - indexes.push(i2); - i2 = 0; + indexes.push(i3); + i3 = 0; parent = node; node = node.children[0]; } else if (parent) { - i2++; - node = parent.children[i2]; + i3++; + node = parent.children[i3]; goingUp = false; } else node = null; @@ -3247,43 +3259,43 @@ return result; }, _build: function(items, left, right, height) { - var N = right - left + 1, M = this._maxEntries, node; - if (N <= M) { + var N2 = right - left + 1, M2 = this._maxEntries, node; + if (N2 <= M2) { node = createNode(items.slice(left, right + 1)); calcBBox(node, this.toBBox); return node; } if (!height) { - height = Math.ceil(Math.log(N) / Math.log(M)); - M = Math.ceil(N / Math.pow(M, height - 1)); + height = Math.ceil(Math.log(N2) / Math.log(M2)); + M2 = Math.ceil(N2 / Math.pow(M2, height - 1)); } node = createNode([]); node.leaf = false; node.height = height; - var N2 = Math.ceil(N / M), N1 = N2 * Math.ceil(Math.sqrt(M)), i2, j2, right2, right3; + var N22 = Math.ceil(N2 / M2), N1 = N22 * Math.ceil(Math.sqrt(M2)), i3, j3, right2, right3; multiSelect(items, left, right, N1, this.compareMinX); - for (i2 = left; i2 <= right; i2 += N1) { - right2 = Math.min(i2 + N1 - 1, right); - multiSelect(items, i2, right2, N2, this.compareMinY); - for (j2 = i2; j2 <= right2; j2 += N2) { - right3 = Math.min(j2 + N2 - 1, right2); - node.children.push(this._build(items, j2, right3, height - 1)); + for (i3 = left; i3 <= right; i3 += N1) { + right2 = Math.min(i3 + N1 - 1, right); + multiSelect(items, i3, right2, N22, this.compareMinY); + for (j3 = i3; j3 <= right2; j3 += N22) { + right3 = Math.min(j3 + N22 - 1, right2); + node.children.push(this._build(items, j3, right3, height - 1)); } } calcBBox(node, this.toBBox); return node; }, - _chooseSubtree: function(bbox, node, level, path) { - var i2, len, child, targetNode, area, enlargement, minArea, minEnlargement; + _chooseSubtree: function(bbox2, node, level, path) { + var i3, len, child, targetNode, area, enlargement, minArea, minEnlargement; while (true) { path.push(node); if (node.leaf || path.length - 1 === level) break; minArea = minEnlargement = Infinity; - for (i2 = 0, len = node.children.length; i2 < len; i2++) { - child = node.children[i2]; + for (i3 = 0, len = node.children.length; i3 < len; i3++) { + child = node.children[i3]; area = bboxArea(child); - enlargement = enlargedArea(bbox, child) - area; + enlargement = enlargedArea(bbox2, child) - area; if (enlargement < minEnlargement) { minEnlargement = enlargement; minArea = area < minArea ? area : minArea; @@ -3300,10 +3312,10 @@ return node; }, _insert: function(item, level, isNode) { - var toBBox = this.toBBox, bbox = isNode ? item : toBBox(item), insertPath = []; - var node = this._chooseSubtree(bbox, this.data, level, insertPath); + var toBBox = this.toBBox, bbox2 = isNode ? item : toBBox(item), insertPath = []; + var node = this._chooseSubtree(bbox2, this.data, level, insertPath); node.children.push(item); - extend2(node, bbox); + extend2(node, bbox2); while (level >= 0) { if (insertPath[level].children.length > this._maxEntries) { this._split(insertPath, level); @@ -3311,12 +3323,13 @@ } else break; } - this._adjustParentBBoxes(bbox, insertPath, level); + this._adjustParentBBoxes(bbox2, insertPath, level); }, + // split overflowed node into two _split: function(insertPath, level) { - var node = insertPath[level], M = node.children.length, m = this._minEntries; - this._chooseSplitAxis(node, m, M); - var splitIndex = this._chooseSplitIndex(node, m, M); + var node = insertPath[level], M2 = node.children.length, m2 = this._minEntries; + this._chooseSplitAxis(node, m2, M2); + var splitIndex = this._chooseSplitIndex(node, m2, M2); var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); newNode.height = node.height; newNode.leaf = node.leaf; @@ -3333,62 +3346,64 @@ this.data.leaf = false; calcBBox(this.data, this.toBBox); }, - _chooseSplitIndex: function(node, m, M) { - var i2, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + _chooseSplitIndex: function(node, m2, M2) { + var i3, bbox1, bbox2, overlap, area, minOverlap, minArea, index; minOverlap = minArea = Infinity; - for (i2 = m; i2 <= M - m; i2++) { - bbox1 = distBBox(node, 0, i2, this.toBBox); - bbox2 = distBBox(node, i2, M, this.toBBox); + for (i3 = m2; i3 <= M2 - m2; i3++) { + bbox1 = distBBox(node, 0, i3, this.toBBox); + bbox2 = distBBox(node, i3, M2, this.toBBox); overlap = intersectionArea(bbox1, bbox2); area = bboxArea(bbox1) + bboxArea(bbox2); if (overlap < minOverlap) { minOverlap = overlap; - index = i2; + index = i3; minArea = area < minArea ? area : minArea; } else if (overlap === minOverlap) { if (area < minArea) { minArea = area; - index = i2; + index = i3; } } } return index; }, - _chooseSplitAxis: function(node, m, M) { - var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, xMargin = this._allDistMargin(node, m, M, compareMinX), yMargin = this._allDistMargin(node, m, M, compareMinY); + // sorts node children by the best axis for split + _chooseSplitAxis: function(node, m2, M2) { + var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, xMargin = this._allDistMargin(node, m2, M2, compareMinX), yMargin = this._allDistMargin(node, m2, M2, compareMinY); if (xMargin < yMargin) node.children.sort(compareMinX); }, - _allDistMargin: function(node, m, M, compare) { + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function(node, m2, M2, compare) { node.children.sort(compare); - var toBBox = this.toBBox, leftBBox = distBBox(node, 0, m, toBBox), rightBBox = distBBox(node, M - m, M, toBBox), margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), i2, child; - for (i2 = m; i2 < M - m; i2++) { - child = node.children[i2]; + var toBBox = this.toBBox, leftBBox = distBBox(node, 0, m2, toBBox), rightBBox = distBBox(node, M2 - m2, M2, toBBox), margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), i3, child; + for (i3 = m2; i3 < M2 - m2; i3++) { + child = node.children[i3]; extend2(leftBBox, node.leaf ? toBBox(child) : child); margin += bboxMargin(leftBBox); } - for (i2 = M - m - 1; i2 >= m; i2--) { - child = node.children[i2]; + for (i3 = M2 - m2 - 1; i3 >= m2; i3--) { + child = node.children[i3]; extend2(rightBBox, node.leaf ? toBBox(child) : child); margin += bboxMargin(rightBBox); } return margin; }, - _adjustParentBBoxes: function(bbox, path, level) { - for (var i2 = level; i2 >= 0; i2--) { - extend2(path[i2], bbox); + _adjustParentBBoxes: function(bbox2, path, level) { + for (var i3 = level; i3 >= 0; i3--) { + extend2(path[i3], bbox2); } }, _condense: function(path) { - for (var i2 = path.length - 1, siblings; i2 >= 0; i2--) { - if (path[i2].children.length === 0) { - if (i2 > 0) { - siblings = path[i2 - 1].children; - siblings.splice(siblings.indexOf(path[i2]), 1); + for (var i3 = path.length - 1, siblings; i3 >= 0; i3--) { + if (path[i3].children.length === 0) { + if (i3 > 0) { + siblings = path[i3 - 1].children; + siblings.splice(siblings.indexOf(path[i3]), 1); } else this.clear(); } else - calcBBox(path[i2], this.toBBox); + calcBBox(path[i3], this.toBBox); } }, _initFormat: function(format2) { @@ -3404,59 +3419,59 @@ function findItem(item, items, equalsFn) { if (!equalsFn) return items.indexOf(item); - for (var i2 = 0; i2 < items.length; i2++) { - if (equalsFn(item, items[i2])) - return i2; + for (var i3 = 0; i3 < items.length; i3++) { + if (equalsFn(item, items[i3])) + return i3; } return -1; } function calcBBox(node, toBBox) { distBBox(node, 0, node.children.length, toBBox, node); } - function distBBox(node, k, p, toBBox, destNode) { + function distBBox(node, k2, p2, toBBox, destNode) { if (!destNode) destNode = createNode(null); destNode.minX = Infinity; destNode.minY = Infinity; destNode.maxX = -Infinity; destNode.maxY = -Infinity; - for (var i2 = k, child; i2 < p; i2++) { - child = node.children[i2]; + for (var i3 = k2, child; i3 < p2; i3++) { + child = node.children[i3]; extend2(destNode, node.leaf ? toBBox(child) : child); } return destNode; } - function extend2(a, b) { - a.minX = Math.min(a.minX, b.minX); - a.minY = Math.min(a.minY, b.minY); - a.maxX = Math.max(a.maxX, b.maxX); - a.maxY = Math.max(a.maxY, b.maxY); - return a; + function extend2(a2, b2) { + a2.minX = Math.min(a2.minX, b2.minX); + a2.minY = Math.min(a2.minY, b2.minY); + a2.maxX = Math.max(a2.maxX, b2.maxX); + a2.maxY = Math.max(a2.maxY, b2.maxY); + return a2; } - function compareNodeMinX(a, b) { - return a.minX - b.minX; + function compareNodeMinX(a2, b2) { + return a2.minX - b2.minX; } - function compareNodeMinY(a, b) { - return a.minY - b.minY; + function compareNodeMinY(a2, b2) { + return a2.minY - b2.minY; } - function bboxArea(a) { - return (a.maxX - a.minX) * (a.maxY - a.minY); + function bboxArea(a2) { + return (a2.maxX - a2.minX) * (a2.maxY - a2.minY); } - function bboxMargin(a) { - return a.maxX - a.minX + (a.maxY - a.minY); + function bboxMargin(a2) { + return a2.maxX - a2.minX + (a2.maxY - a2.minY); } - function enlargedArea(a, b) { - return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY)); + function enlargedArea(a2, b2) { + return (Math.max(b2.maxX, a2.maxX) - Math.min(b2.minX, a2.minX)) * (Math.max(b2.maxY, a2.maxY) - Math.min(b2.minY, a2.minY)); } - function intersectionArea(a, b) { - var minX = Math.max(a.minX, b.minX), minY = Math.max(a.minY, b.minY), maxX = Math.min(a.maxX, b.maxX), maxY = Math.min(a.maxY, b.maxY); + function intersectionArea(a2, b2) { + var minX = Math.max(a2.minX, b2.minX), minY = Math.max(a2.minY, b2.minY), maxX = Math.min(a2.maxX, b2.maxX), maxY = Math.min(a2.maxY, b2.maxY); return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); } - function contains(a, b) { - return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY; + function contains(a2, b2) { + return a2.minX <= b2.minX && a2.minY <= b2.minY && b2.maxX <= a2.maxX && b2.maxY <= a2.maxY; } - function intersects(a, b) { - return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY; + function intersects(a2, b2) { + return b2.minX <= a2.maxX && b2.minY <= a2.maxY && b2.maxX >= a2.minX && b2.maxY >= a2.minY; } function createNode(children2) { return { @@ -3469,14 +3484,14 @@ maxY: -Infinity }; } - function multiSelect(arr, left, right, n2, compare) { + function multiSelect(arr, left, right, n3, compare) { var stack = [left, right], mid; while (stack.length) { right = stack.pop(); left = stack.pop(); - if (right - left <= n2) + if (right - left <= n3) continue; - mid = left + Math.ceil((right - left) / n2 / 2) * n2; + mid = left + Math.ceil((right - left) / n3 / 2) * n3; quickselect2(arr, mid, left, right, compare); stack.push(left, mid, mid, right); } @@ -3491,35 +3506,35 @@ module2.exports = lineclip2; lineclip2.polyline = lineclip2; lineclip2.polygon = polygonclip2; - function lineclip2(points, bbox, result) { - var len = points.length, codeA = bitCode2(points[0], bbox), part = [], i2, a, b, codeB, lastCode; + function lineclip2(points, bbox2, result) { + var len = points.length, codeA = bitCode2(points[0], bbox2), part = [], i3, a2, b2, codeB, lastCode; if (!result) result = []; - for (i2 = 1; i2 < len; i2++) { - a = points[i2 - 1]; - b = points[i2]; - codeB = lastCode = bitCode2(b, bbox); + for (i3 = 1; i3 < len; i3++) { + a2 = points[i3 - 1]; + b2 = points[i3]; + codeB = lastCode = bitCode2(b2, bbox2); while (true) { if (!(codeA | codeB)) { - part.push(a); + part.push(a2); if (codeB !== lastCode) { - part.push(b); - if (i2 < len - 1) { + part.push(b2); + if (i3 < len - 1) { result.push(part); part = []; } - } else if (i2 === len - 1) { - part.push(b); + } else if (i3 === len - 1) { + part.push(b2); } break; } else if (codeA & codeB) { break; } else if (codeA) { - a = intersect2(a, b, codeA, bbox); - codeA = bitCode2(a, bbox); + a2 = intersect2(a2, b2, codeA, bbox2); + codeA = bitCode2(a2, bbox2); } else { - b = intersect2(a, b, codeB, bbox); - codeB = bitCode2(b, bbox); + b2 = intersect2(a2, b2, codeB, bbox2); + codeB = bitCode2(b2, bbox2); } } codeA = lastCode; @@ -3528,20 +3543,20 @@ result.push(part); return result; } - function polygonclip2(points, bbox) { - var result, edge, prev, prevInside, i2, p, inside; + function polygonclip2(points, bbox2) { + var result, edge, prev, prevInside, i3, p2, inside; for (edge = 1; edge <= 8; edge *= 2) { result = []; prev = points[points.length - 1]; - prevInside = !(bitCode2(prev, bbox) & edge); - for (i2 = 0; i2 < points.length; i2++) { - p = points[i2]; - inside = !(bitCode2(p, bbox) & edge); + prevInside = !(bitCode2(prev, bbox2) & edge); + for (i3 = 0; i3 < points.length; i3++) { + p2 = points[i3]; + inside = !(bitCode2(p2, bbox2) & edge); if (inside !== prevInside) - result.push(intersect2(prev, p, edge, bbox)); + result.push(intersect2(prev, p2, edge, bbox2)); if (inside) - result.push(p); - prev = p; + result.push(p2); + prev = p2; prevInside = inside; } points = result; @@ -3550,18 +3565,30 @@ } return result; } - function intersect2(a, b, edge, bbox) { - return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : null; + function intersect2(a2, b2, edge, bbox2) { + return edge & 8 ? [a2[0] + (b2[0] - a2[0]) * (bbox2[3] - a2[1]) / (b2[1] - a2[1]), bbox2[3]] : ( + // top + edge & 4 ? [a2[0] + (b2[0] - a2[0]) * (bbox2[1] - a2[1]) / (b2[1] - a2[1]), bbox2[1]] : ( + // bottom + edge & 2 ? [bbox2[2], a2[1] + (b2[1] - a2[1]) * (bbox2[2] - a2[0]) / (b2[0] - a2[0])] : ( + // right + edge & 1 ? [bbox2[0], a2[1] + (b2[1] - a2[1]) * (bbox2[0] - a2[0]) / (b2[0] - a2[0])] : ( + // left + null + ) + ) + ) + ); } - function bitCode2(p, bbox) { + function bitCode2(p2, bbox2) { var code = 0; - if (p[0] < bbox[0]) + if (p2[0] < bbox2[0]) code |= 1; - else if (p[0] > bbox[2]) + else if (p2[0] > bbox2[2]) code |= 2; - if (p[1] < bbox[1]) + if (p2[1] < bbox2[1]) code |= 4; - else if (p[1] > bbox[3]) + else if (p2[1] > bbox2[3]) code |= 8; return code; } @@ -3577,79 +3604,81 @@ module2.exports = whichPolygon5; function whichPolygon5(data) { var bboxes = []; - for (var i2 = 0; i2 < data.features.length; i2++) { - var feature3 = data.features[i2]; + for (var i3 = 0; i3 < data.features.length; i3++) { + var feature3 = data.features[i3]; + if (!feature3.geometry) + continue; var coords = feature3.geometry.coordinates; if (feature3.geometry.type === "Polygon") { bboxes.push(treeItem(coords, feature3.properties)); } else if (feature3.geometry.type === "MultiPolygon") { - for (var j2 = 0; j2 < coords.length; j2++) { - bboxes.push(treeItem(coords[j2], feature3.properties)); + for (var j3 = 0; j3 < coords.length; j3++) { + bboxes.push(treeItem(coords[j3], feature3.properties)); } } } var tree = rbush().load(bboxes); - function query(p, multi) { + function query(p2, multi) { var output = [], result = tree.search({ - minX: p[0], - minY: p[1], - maxX: p[0], - maxY: p[1] + minX: p2[0], + minY: p2[1], + maxX: p2[0], + maxY: p2[1] }); - for (var i3 = 0; i3 < result.length; i3++) { - if (insidePolygon(result[i3].coords, p)) { + for (var i4 = 0; i4 < result.length; i4++) { + if (insidePolygon(result[i4].coords, p2)) { if (multi) - output.push(result[i3].props); + output.push(result[i4].props); else - return result[i3].props; + return result[i4].props; } } return multi && output.length ? output : null; } query.tree = tree; - query.bbox = function queryBBox(bbox) { + query.bbox = function queryBBox(bbox2) { var output = []; var result = tree.search({ - minX: bbox[0], - minY: bbox[1], - maxX: bbox[2], - maxY: bbox[3] + minX: bbox2[0], + minY: bbox2[1], + maxX: bbox2[2], + maxY: bbox2[3] }); - for (var i3 = 0; i3 < result.length; i3++) { - if (polygonIntersectsBBox(result[i3].coords, bbox)) { - output.push(result[i3].props); + for (var i4 = 0; i4 < result.length; i4++) { + if (polygonIntersectsBBox(result[i4].coords, bbox2)) { + output.push(result[i4].props); } } return output; }; return query; } - function polygonIntersectsBBox(polygon2, bbox) { + function polygonIntersectsBBox(polygon2, bbox2) { var bboxCenter = [ - (bbox[0] + bbox[2]) / 2, - (bbox[1] + bbox[3]) / 2 + (bbox2[0] + bbox2[2]) / 2, + (bbox2[1] + bbox2[3]) / 2 ]; if (insidePolygon(polygon2, bboxCenter)) return true; - for (var i2 = 0; i2 < polygon2.length; i2++) { - if (lineclip2(polygon2[i2], bbox).length > 0) + for (var i3 = 0; i3 < polygon2.length; i3++) { + if (lineclip2(polygon2[i3], bbox2).length > 0) return true; } return false; } - function insidePolygon(rings, p) { + function insidePolygon(rings, p2) { var inside = false; - for (var i2 = 0, len = rings.length; i2 < len; i2++) { - var ring = rings[i2]; - for (var j2 = 0, len2 = ring.length, k = len2 - 1; j2 < len2; k = j2++) { - if (rayIntersect(p, ring[j2], ring[k])) + for (var i3 = 0, len = rings.length; i3 < len; i3++) { + var ring = rings[i3]; + for (var j3 = 0, len2 = ring.length, k2 = len2 - 1; j3 < len2; k2 = j3++) { + if (rayIntersect(p2, ring[j3], ring[k2])) inside = !inside; } } return inside; } - function rayIntersect(p, p1, p2) { - 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]; + function rayIntersect(p2, p1, p22) { + return p1[1] > p2[1] !== p22[1] > p2[1] && p2[0] < (p22[0] - p1[0]) * (p2[1] - p1[1]) / (p22[1] - p1[1]) + p1[0]; } function treeItem(coords, props) { var item = { @@ -3660,12 +3689,12 @@ coords, props }; - for (var i2 = 0; i2 < coords[0].length; i2++) { - var p = coords[0][i2]; - item.minX = Math.min(item.minX, p[0]); - item.minY = Math.min(item.minY, p[1]); - item.maxX = Math.max(item.maxX, p[0]); - item.maxY = Math.max(item.maxY, p[1]); + for (var i3 = 0; i3 < coords[0].length; i3++) { + var p2 = coords[0][i3]; + item.minX = Math.min(item.minX, p2[0]); + item.minY = Math.min(item.minY, p2[1]); + item.maxX = Math.max(item.maxX, p2[0]); + item.maxY = Math.max(item.maxY, p2[1]); } return item; } @@ -3687,14 +3716,14 @@ var wgs84 = require_wgs84(); module2.exports.geometry = geometry; module2.exports.ring = ringArea; - function geometry(_) { - var area = 0, i2; - switch (_.type) { + function geometry(_2) { + var area = 0, i3; + switch (_2.type) { case "Polygon": - return polygonArea(_.coordinates); + return polygonArea(_2.coordinates); case "MultiPolygon": - for (i2 = 0; i2 < _.coordinates.length; i2++) { - area += polygonArea(_.coordinates[i2]); + for (i3 = 0; i3 < _2.coordinates.length; i3++) { + area += polygonArea(_2.coordinates[i3]); } return area; case "Point": @@ -3703,8 +3732,8 @@ case "MultiLineString": return 0; case "GeometryCollection": - for (i2 = 0; i2 < _.geometries.length; i2++) { - area += geometry(_.geometries[i2]); + for (i3 = 0; i3 < _2.geometries.length; i3++) { + area += geometry(_2.geometries[i3]); } return area; } @@ -3713,28 +3742,28 @@ var area = 0; if (coords && coords.length > 0) { area += Math.abs(ringArea(coords[0])); - for (var i2 = 1; i2 < coords.length; i2++) { - area -= Math.abs(ringArea(coords[i2])); + for (var i3 = 1; i3 < coords.length; i3++) { + area -= Math.abs(ringArea(coords[i3])); } } return area; } function ringArea(coords) { - var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i2, area = 0, coordsLength = coords.length; + var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i3, area = 0, coordsLength = coords.length; if (coordsLength > 2) { - for (i2 = 0; i2 < coordsLength; i2++) { - if (i2 === coordsLength - 2) { + for (i3 = 0; i3 < coordsLength; i3++) { + if (i3 === coordsLength - 2) { lowerIndex = coordsLength - 2; middleIndex = coordsLength - 1; upperIndex = 0; - } else if (i2 === coordsLength - 1) { + } else if (i3 === coordsLength - 1) { lowerIndex = coordsLength - 1; middleIndex = 0; upperIndex = 1; } else { - lowerIndex = i2; - middleIndex = i2 + 1; - upperIndex = i2 + 2; + lowerIndex = i3; + middleIndex = i3 + 1; + upperIndex = i3 + 2; } p1 = coords[lowerIndex]; p2 = coords[middleIndex]; @@ -3745,8 +3774,8 @@ } return area; } - function rad(_) { - return _ * Math.PI / 180; + function rad(_2) { + return _2 * Math.PI / 180; } } }); @@ -3881,20 +3910,20 @@ return [toDegrees(lon), toDegrees(lat)]; } module2.exports = function circleToPolygon2(center, radius, options2) { - var n2 = getNumberOfEdges(options2); + var n3 = getNumberOfEdges(options2); var earthRadius2 = getEarthRadius(options2); var bearing = getBearing(options2); var direction = getDirection(options2); - validateInput({ center, radius, numberOfEdges: n2, earthRadius: earthRadius2, bearing }); + validateInput({ center, radius, numberOfEdges: n3, earthRadius: earthRadius2, bearing }); var start2 = toRadians(bearing); var coordinates = []; - for (var i2 = 0; i2 < n2; ++i2) { + for (var i3 = 0; i3 < n3; ++i3) { coordinates.push( offset( center, radius, earthRadius2, - start2 + direction * 2 * Math.PI * -i2 / n2 + start2 + direction * 2 * Math.PI * -i3 / n3 ) ); } @@ -3949,8 +3978,8 @@ // node_modules/polygon-clipping/dist/polygon-clipping.umd.js var require_polygon_clipping_umd = __commonJS({ "node_modules/polygon-clipping/dist/polygon-clipping.umd.js"(exports2, module2) { - (function(global3, factory) { - typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global3 = typeof globalThis !== "undefined" ? globalThis : global3 || self, global3.polygonClipping = factory()); + (function(global2, factory) { + typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, global2.polygonClipping = factory()); })(exports2, function() { "use strict"; function _classCallCheck(instance, Constructor) { @@ -3959,8 +3988,8 @@ } } function _defineProperties(target, props) { - for (var i2 = 0; i2 < props.length; i2++) { - var descriptor = props[i2]; + for (var i3 = 0; i3 < props.length; i3++) { + var descriptor = props[i3]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) @@ -3975,98 +4004,101 @@ _defineProperties(Constructor, staticProps); return Constructor; } - var Node = function() { - function Node2(key, data) { - this.next = null; - this.key = key; - this.data = data; - this.left = null; - this.right = null; - } - return Node2; - }(); - function DEFAULT_COMPARE(a, b) { - return a > b ? 1 : a < b ? -1 : 0; + var Node = ( + /** @class */ + function() { + function Node2(key, data) { + this.next = null; + this.key = key; + this.data = data; + this.left = null; + this.right = null; + } + return Node2; + }() + ); + function DEFAULT_COMPARE(a2, b2) { + return a2 > b2 ? 1 : a2 < b2 ? -1 : 0; } - function splay(i2, t, comparator) { - var N = new Node(null, null); - var l = N; - var r = N; + function splay(i3, t2, comparator) { + var N2 = new Node(null, null); + var l2 = N2; + var r2 = N2; while (true) { - var cmp2 = comparator(i2, t.key); + var cmp2 = comparator(i3, t2.key); if (cmp2 < 0) { - if (t.left === null) + if (t2.left === null) break; - if (comparator(i2, t.left.key) < 0) { - var y = t.left; - t.left = y.right; - y.right = t; - t = y; - if (t.left === null) + if (comparator(i3, t2.left.key) < 0) { + var y2 = t2.left; + t2.left = y2.right; + y2.right = t2; + t2 = y2; + if (t2.left === null) break; } - r.left = t; - r = t; - t = t.left; + r2.left = t2; + r2 = t2; + t2 = t2.left; } else if (cmp2 > 0) { - if (t.right === null) + if (t2.right === null) break; - if (comparator(i2, t.right.key) > 0) { - var y = t.right; - t.right = y.left; - y.left = t; - t = y; - if (t.right === null) + if (comparator(i3, t2.right.key) > 0) { + var y2 = t2.right; + t2.right = y2.left; + y2.left = t2; + t2 = y2; + if (t2.right === null) break; } - l.right = t; - l = t; - t = t.right; + l2.right = t2; + l2 = t2; + t2 = t2.right; } else break; } - l.right = t.left; - r.left = t.right; - t.left = N.right; - t.right = N.left; - return t; + l2.right = t2.left; + r2.left = t2.right; + t2.left = N2.right; + t2.right = N2.left; + return t2; } - function insert(i2, data, t, comparator) { - var node = new Node(i2, data); - if (t === null) { + function insert(i3, data, t2, comparator) { + var node = new Node(i3, data); + if (t2 === null) { node.left = node.right = null; return node; } - t = splay(i2, t, comparator); - var cmp2 = comparator(i2, t.key); + t2 = splay(i3, t2, comparator); + var cmp2 = comparator(i3, t2.key); if (cmp2 < 0) { - node.left = t.left; - node.right = t; - t.left = null; + node.left = t2.left; + node.right = t2; + t2.left = null; } else if (cmp2 >= 0) { - node.right = t.right; - node.left = t; - t.right = null; + node.right = t2.right; + node.left = t2; + t2.right = null; } return node; } - function split(key, v, comparator) { + function split(key, v2, comparator) { var left = null; var right = null; - if (v) { - v = splay(key, v, comparator); - var cmp2 = comparator(v.key, key); + if (v2) { + v2 = splay(key, v2, comparator); + var cmp2 = comparator(v2.key, key); if (cmp2 === 0) { - left = v.left; - right = v.right; + left = v2.left; + right = v2.right; } else if (cmp2 < 0) { - right = v.right; - v.right = null; - left = v; + right = v2.right; + v2.right = null; + left = v2; } else { - left = v.left; - v.left = null; - right = v; + left = v2.left; + v2.left = null; + right = v2; } } return { @@ -4074,7 +4106,7 @@ right }; } - function merge3(left, right, comparator) { + function merge2(left, right, comparator) { if (right === null) return left; if (left === null) @@ -4093,391 +4125,394 @@ printRow(root3.right, indent2, true, out, printNode); } } - var Tree = function() { - function Tree2(comparator) { - if (comparator === void 0) { - comparator = DEFAULT_COMPARE; - } - this._root = null; - this._size = 0; - this._comparator = comparator; - } - Tree2.prototype.insert = function(key, data) { - this._size++; - return this._root = insert(key, data, this._root, this._comparator); - }; - Tree2.prototype.add = function(key, data) { - var node = new Node(key, data); - if (this._root === null) { - node.left = node.right = null; - this._size++; - this._root = node; - } - var comparator = this._comparator; - var t = splay(key, this._root, comparator); - var cmp2 = comparator(key, t.key); - if (cmp2 === 0) - this._root = t; - else { - if (cmp2 < 0) { - node.left = t.left; - node.right = t; - t.left = null; - } else if (cmp2 > 0) { - node.right = t.right; - node.left = t; - t.right = null; + var Tree = ( + /** @class */ + function() { + function Tree2(comparator) { + if (comparator === void 0) { + comparator = DEFAULT_COMPARE; } - this._size++; - this._root = node; - } - return this._root; - }; - Tree2.prototype.remove = function(key) { - this._root = this._remove(key, this._root, this._comparator); - }; - Tree2.prototype._remove = function(i2, t, comparator) { - var x; - if (t === null) - return null; - t = splay(i2, t, comparator); - var cmp2 = comparator(i2, t.key); - if (cmp2 === 0) { - if (t.left === null) { - x = t.right; - } else { - x = splay(i2, t.left, comparator); - x.right = t.right; - } - this._size--; - return x; + this._root = null; + this._size = 0; + this._comparator = comparator; } - return t; - }; - Tree2.prototype.pop = function() { - var node = this._root; - if (node) { - while (node.left) { - node = node.left; + Tree2.prototype.insert = function(key, data) { + this._size++; + return this._root = insert(key, data, this._root, this._comparator); + }; + Tree2.prototype.add = function(key, data) { + var node = new Node(key, data); + if (this._root === null) { + node.left = node.right = null; + this._size++; + this._root = node; } - this._root = splay(node.key, this._root, this._comparator); - this._root = this._remove(node.key, this._root, this._comparator); - return { - key: node.key, - data: node.data - }; - } - return null; - }; - Tree2.prototype.findStatic = function(key) { - var current = this._root; - var compare = this._comparator; - while (current) { - var cmp2 = compare(key, current.key); + var comparator = this._comparator; + var t2 = splay(key, this._root, comparator); + var cmp2 = comparator(key, t2.key); if (cmp2 === 0) - return current; - else if (cmp2 < 0) - current = current.left; - else - current = current.right; - } - return null; - }; - Tree2.prototype.find = function(key) { - if (this._root) { - this._root = splay(key, this._root, this._comparator); - if (this._comparator(key, this._root.key) !== 0) + this._root = t2; + else { + if (cmp2 < 0) { + node.left = t2.left; + node.right = t2; + t2.left = null; + } else if (cmp2 > 0) { + node.right = t2.right; + node.left = t2; + t2.right = null; + } + this._size++; + this._root = node; + } + return this._root; + }; + Tree2.prototype.remove = function(key) { + this._root = this._remove(key, this._root, this._comparator); + }; + Tree2.prototype._remove = function(i3, t2, comparator) { + var x2; + if (t2 === null) return null; - } - return this._root; - }; - Tree2.prototype.contains = function(key) { - var current = this._root; - var compare = this._comparator; - while (current) { - var cmp2 = compare(key, current.key); - if (cmp2 === 0) - return true; - else if (cmp2 < 0) - current = current.left; - else - current = current.right; - } - return false; - }; - Tree2.prototype.forEach = function(visitor, ctx) { - var current = this._root; - var Q = []; - var done = false; - while (!done) { - if (current !== null) { - Q.push(current); - current = current.left; - } else { - if (Q.length !== 0) { - current = Q.pop(); - visitor.call(ctx, current); - current = current.right; - } else - done = true; + t2 = splay(i3, t2, comparator); + var cmp2 = comparator(i3, t2.key); + if (cmp2 === 0) { + if (t2.left === null) { + x2 = t2.right; + } else { + x2 = splay(i3, t2.left, comparator); + x2.right = t2.right; + } + this._size--; + return x2; } - } - return this; - }; - Tree2.prototype.range = function(low, high, fn, ctx) { - var Q = []; - var compare = this._comparator; - var node = this._root; - var cmp2; - while (Q.length !== 0 || node) { + return t2; + }; + Tree2.prototype.pop = function() { + var node = this._root; if (node) { - Q.push(node); - node = node.left; - } else { - node = Q.pop(); - cmp2 = compare(node.key, high); - if (cmp2 > 0) { - break; - } else if (compare(node.key, low) >= 0) { - if (fn.call(ctx, node)) - return this; + while (node.left) { + node = node.left; } - node = node.right; + this._root = splay(node.key, this._root, this._comparator); + this._root = this._remove(node.key, this._root, this._comparator); + return { + key: node.key, + data: node.data + }; } - } - return this; - }; - Tree2.prototype.keys = function() { - var keys = []; - this.forEach(function(_a) { - var key = _a.key; - return keys.push(key); - }); - return keys; - }; - Tree2.prototype.values = function() { - var values = []; - this.forEach(function(_a) { - var data = _a.data; - return values.push(data); - }); - return values; - }; - Tree2.prototype.min = function() { - if (this._root) - return this.minNode(this._root).key; - return null; - }; - Tree2.prototype.max = function() { - if (this._root) - return this.maxNode(this._root).key; - return null; - }; - Tree2.prototype.minNode = function(t) { - if (t === void 0) { - t = this._root; - } - if (t) - while (t.left) { - t = t.left; + return null; + }; + Tree2.prototype.findStatic = function(key) { + var current = this._root; + var compare = this._comparator; + while (current) { + var cmp2 = compare(key, current.key); + if (cmp2 === 0) + return current; + else if (cmp2 < 0) + current = current.left; + else + current = current.right; } - return t; - }; - Tree2.prototype.maxNode = function(t) { - if (t === void 0) { - t = this._root; - } - if (t) - while (t.right) { - t = t.right; + return null; + }; + Tree2.prototype.find = function(key) { + if (this._root) { + this._root = splay(key, this._root, this._comparator); + if (this._comparator(key, this._root.key) !== 0) + return null; } - return t; - }; - Tree2.prototype.at = function(index2) { - var current = this._root; - var done = false; - var i2 = 0; - var Q = []; - while (!done) { - if (current) { - Q.push(current); - current = current.left; - } else { - if (Q.length > 0) { - current = Q.pop(); - if (i2 === index2) - return current; - i2++; + return this._root; + }; + Tree2.prototype.contains = function(key) { + var current = this._root; + var compare = this._comparator; + while (current) { + var cmp2 = compare(key, current.key); + if (cmp2 === 0) + return true; + else if (cmp2 < 0) + current = current.left; + else current = current.right; - } else - done = true; } - } - return null; - }; - Tree2.prototype.next = function(d) { - var root3 = this._root; - var successor = null; - if (d.right) { - successor = d.right; - while (successor.left) { - successor = successor.left; + return false; + }; + Tree2.prototype.forEach = function(visitor, ctx) { + var current = this._root; + var Q2 = []; + var done = false; + while (!done) { + if (current !== null) { + Q2.push(current); + current = current.left; + } else { + if (Q2.length !== 0) { + current = Q2.pop(); + visitor.call(ctx, current); + current = current.right; + } else + done = true; + } + } + return this; + }; + Tree2.prototype.range = function(low, high, fn, ctx) { + var Q2 = []; + var compare = this._comparator; + var node = this._root; + var cmp2; + while (Q2.length !== 0 || node) { + if (node) { + Q2.push(node); + node = node.left; + } else { + node = Q2.pop(); + cmp2 = compare(node.key, high); + if (cmp2 > 0) { + break; + } else if (compare(node.key, low) >= 0) { + if (fn.call(ctx, node)) + return this; + } + node = node.right; + } + } + return this; + }; + Tree2.prototype.keys = function() { + var keys2 = []; + this.forEach(function(_a) { + var key = _a.key; + return keys2.push(key); + }); + return keys2; + }; + Tree2.prototype.values = function() { + var values = []; + this.forEach(function(_a) { + var data = _a.data; + return values.push(data); + }); + return values; + }; + Tree2.prototype.min = function() { + if (this._root) + return this.minNode(this._root).key; + return null; + }; + Tree2.prototype.max = function() { + if (this._root) + return this.maxNode(this._root).key; + return null; + }; + Tree2.prototype.minNode = function(t2) { + if (t2 === void 0) { + t2 = this._root; + } + if (t2) + while (t2.left) { + t2 = t2.left; + } + return t2; + }; + Tree2.prototype.maxNode = function(t2) { + if (t2 === void 0) { + t2 = this._root; + } + if (t2) + while (t2.right) { + t2 = t2.right; + } + return t2; + }; + Tree2.prototype.at = function(index2) { + var current = this._root; + var done = false; + var i3 = 0; + var Q2 = []; + while (!done) { + if (current) { + Q2.push(current); + current = current.left; + } else { + if (Q2.length > 0) { + current = Q2.pop(); + if (i3 === index2) + return current; + i3++; + current = current.right; + } else + done = true; + } + } + return null; + }; + Tree2.prototype.next = function(d2) { + var root3 = this._root; + var successor = null; + if (d2.right) { + successor = d2.right; + while (successor.left) { + successor = successor.left; + } + return successor; + } + var comparator = this._comparator; + while (root3) { + var cmp2 = comparator(d2.key, root3.key); + if (cmp2 === 0) + break; + else if (cmp2 < 0) { + successor = root3; + root3 = root3.left; + } else + root3 = root3.right; } return successor; - } - var comparator = this._comparator; - while (root3) { - var cmp2 = comparator(d.key, root3.key); - if (cmp2 === 0) - break; - else if (cmp2 < 0) { - successor = root3; - root3 = root3.left; - } else - root3 = root3.right; - } - return successor; - }; - Tree2.prototype.prev = function(d) { - var root3 = this._root; - var predecessor = null; - if (d.left !== null) { - predecessor = d.left; - while (predecessor.right) { - predecessor = predecessor.right; + }; + Tree2.prototype.prev = function(d2) { + var root3 = this._root; + var predecessor = null; + if (d2.left !== null) { + predecessor = d2.left; + while (predecessor.right) { + predecessor = predecessor.right; + } + return predecessor; + } + var comparator = this._comparator; + while (root3) { + var cmp2 = comparator(d2.key, root3.key); + if (cmp2 === 0) + break; + else if (cmp2 < 0) + root3 = root3.left; + else { + predecessor = root3; + root3 = root3.right; + } } return predecessor; - } - var comparator = this._comparator; - while (root3) { - var cmp2 = comparator(d.key, root3.key); - if (cmp2 === 0) - break; - else if (cmp2 < 0) - root3 = root3.left; - else { - predecessor = root3; - root3 = root3.right; + }; + Tree2.prototype.clear = function() { + this._root = null; + this._size = 0; + return this; + }; + Tree2.prototype.toList = function() { + return toList(this._root); + }; + Tree2.prototype.load = function(keys2, values, presort) { + if (values === void 0) { + values = []; } - } - return predecessor; - }; - Tree2.prototype.clear = function() { - this._root = null; - this._size = 0; - return this; - }; - Tree2.prototype.toList = function() { - return toList(this._root); - }; - Tree2.prototype.load = function(keys, values, presort) { - if (values === void 0) { - values = []; - } - if (presort === void 0) { - presort = false; - } - var size = keys.length; - var comparator = this._comparator; - if (presort) - sort(keys, values, 0, size - 1, comparator); - if (this._root === null) { - this._root = loadRecursive(keys, values, 0, size); - this._size = size; - } else { - var mergedList = mergeLists(this.toList(), createList(keys, values), comparator); - size = this._size + size; - this._root = sortedListToBST({ - head: mergedList - }, 0, size); - } - return this; - }; - Tree2.prototype.isEmpty = function() { - return this._root === null; - }; - Object.defineProperty(Tree2.prototype, "size", { - get: function get4() { - return this._size; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tree2.prototype, "root", { - get: function get4() { - return this._root; - }, - enumerable: true, - configurable: true - }); - Tree2.prototype.toString = function(printNode) { - if (printNode === void 0) { - printNode = function printNode2(n2) { - return String(n2.key); - }; - } - var out = []; - printRow(this._root, "", true, function(v) { - return out.push(v); - }, printNode); - return out.join(""); - }; - Tree2.prototype.update = function(key, newKey, newData) { - var comparator = this._comparator; - var _a = split(key, this._root, comparator), left = _a.left, right = _a.right; - if (comparator(key, newKey) < 0) { - right = insert(newKey, newData, right, comparator); - } else { - left = insert(newKey, newData, left, comparator); - } - this._root = merge3(left, right, comparator); - }; - Tree2.prototype.split = function(key) { - return split(key, this._root, this._comparator); - }; - return Tree2; - }(); - function loadRecursive(keys, values, start2, end) { + if (presort === void 0) { + presort = false; + } + var size = keys2.length; + var comparator = this._comparator; + if (presort) + sort(keys2, values, 0, size - 1, comparator); + if (this._root === null) { + this._root = loadRecursive(keys2, values, 0, size); + this._size = size; + } else { + var mergedList = mergeLists(this.toList(), createList(keys2, values), comparator); + size = this._size + size; + this._root = sortedListToBST({ + head: mergedList + }, 0, size); + } + return this; + }; + Tree2.prototype.isEmpty = function() { + return this._root === null; + }; + Object.defineProperty(Tree2.prototype, "size", { + get: function get4() { + return this._size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tree2.prototype, "root", { + get: function get4() { + return this._root; + }, + enumerable: true, + configurable: true + }); + Tree2.prototype.toString = function(printNode) { + if (printNode === void 0) { + printNode = function printNode2(n3) { + return String(n3.key); + }; + } + var out = []; + printRow(this._root, "", true, function(v2) { + return out.push(v2); + }, printNode); + return out.join(""); + }; + Tree2.prototype.update = function(key, newKey, newData) { + var comparator = this._comparator; + var _a = split(key, this._root, comparator), left = _a.left, right = _a.right; + if (comparator(key, newKey) < 0) { + right = insert(newKey, newData, right, comparator); + } else { + left = insert(newKey, newData, left, comparator); + } + this._root = merge2(left, right, comparator); + }; + Tree2.prototype.split = function(key) { + return split(key, this._root, this._comparator); + }; + return Tree2; + }() + ); + function loadRecursive(keys2, values, start2, end) { var size = end - start2; if (size > 0) { var middle = start2 + Math.floor(size / 2); - var key = keys[middle]; + var key = keys2[middle]; var data = values[middle]; var node = new Node(key, data); - node.left = loadRecursive(keys, values, start2, middle); - node.right = loadRecursive(keys, values, middle + 1, end); + node.left = loadRecursive(keys2, values, start2, middle); + node.right = loadRecursive(keys2, values, middle + 1, end); return node; } return null; } - function createList(keys, values) { + function createList(keys2, values) { var head = new Node(null, null); - var p = head; - for (var i2 = 0; i2 < keys.length; i2++) { - p = p.next = new Node(keys[i2], values[i2]); + var p2 = head; + for (var i3 = 0; i3 < keys2.length; i3++) { + p2 = p2.next = new Node(keys2[i3], values[i3]); } - p.next = null; + p2.next = null; return head.next; } function toList(root3) { var current = root3; - var Q = []; + var Q2 = []; var done = false; var head = new Node(null, null); - var p = head; + var p2 = head; while (!done) { if (current) { - Q.push(current); + Q2.push(current); current = current.left; } else { - if (Q.length > 0) { - current = p = p.next = Q.pop(); + if (Q2.length > 0) { + current = p2 = p2.next = Q2.pop(); current = current.right; } else done = true; } } - p.next = null; + p2.next = null; return head.next; } function sortedListToBST(list, start2, end) { @@ -4495,53 +4530,53 @@ } function mergeLists(l1, l2, compare) { var head = new Node(null, null); - var p = head; + var p2 = head; var p1 = l1; - var p2 = l2; - while (p1 !== null && p2 !== null) { - if (compare(p1.key, p2.key) < 0) { - p.next = p1; + var p22 = l2; + while (p1 !== null && p22 !== null) { + if (compare(p1.key, p22.key) < 0) { + p2.next = p1; p1 = p1.next; } else { - p.next = p2; - p2 = p2.next; + p2.next = p22; + p22 = p22.next; } - p = p.next; + p2 = p2.next; } if (p1 !== null) { - p.next = p1; - } else if (p2 !== null) { - p.next = p2; + p2.next = p1; + } else if (p22 !== null) { + p2.next = p22; } return head.next; } - function sort(keys, values, left, right, compare) { + function sort(keys2, values, left, right, compare) { if (left >= right) return; - var pivot = keys[left + right >> 1]; - var i2 = left - 1; - var j2 = right + 1; + var pivot = keys2[left + right >> 1]; + var i3 = left - 1; + var j3 = right + 1; while (true) { do { - i2++; - } while (compare(keys[i2], pivot) < 0); + i3++; + } while (compare(keys2[i3], pivot) < 0); do { - j2--; - } while (compare(keys[j2], pivot) > 0); - if (i2 >= j2) + j3--; + } while (compare(keys2[j3], pivot) > 0); + if (i3 >= j3) break; - var tmp = keys[i2]; - keys[i2] = keys[j2]; - keys[j2] = tmp; - tmp = values[i2]; - values[i2] = values[j2]; - values[j2] = tmp; - } - sort(keys, values, left, j2, compare); - sort(keys, values, j2 + 1, right, compare); - } - var isInBbox = function isInBbox2(bbox, point) { - return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y; + var tmp = keys2[i3]; + keys2[i3] = keys2[j3]; + keys2[j3] = tmp; + tmp = values[i3]; + values[i3] = values[j3]; + values[j3] = tmp; + } + sort(keys2, values, left, j3, compare); + sort(keys2, values, j3 + 1, right, compare); + } + var isInBbox = function isInBbox2(bbox2, point2) { + return bbox2.ll.x <= point2.x && point2.x <= bbox2.ur.x && bbox2.ll.y <= point2.y && point2.y <= bbox2.ur.y; }; var getBboxOverlap = function getBboxOverlap2(b1, b2) { if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) @@ -4565,17 +4600,17 @@ if (epsilon3 === void 0) epsilon3 = Math.pow(2, -52); var EPSILON_SQ = epsilon3 * epsilon3; - var cmp = function cmp2(a, b) { - if (-epsilon3 < a && a < epsilon3) { - if (-epsilon3 < b && b < epsilon3) { + var cmp = function cmp2(a2, b2) { + if (-epsilon3 < a2 && a2 < epsilon3) { + if (-epsilon3 < b2 && b2 < epsilon3) { return 0; } } - var ab = a - b; - if (ab * ab < EPSILON_SQ * a * b) { + var ab = a2 - b2; + if (ab * ab < EPSILON_SQ * a2 * b2) { return 0; } - return a < b ? -1 : 1; + return a2 < b2 ? -1 : 1; }; var PtRounder = /* @__PURE__ */ function() { function PtRounder2() { @@ -4590,10 +4625,10 @@ } }, { key: "round", - value: function round(x, y) { + value: function round(x2, y2) { return { - x: this.xRounder.round(x), - y: this.yRounder.round(y) + x: this.xRounder.round(x2), + y: this.yRounder.round(y2) }; } }]); @@ -4625,11 +4660,11 @@ return CoordRounder2; }(); var rounder = new PtRounder(); - var crossProduct = function crossProduct2(a, b) { - return a.x * b.y - a.y * b.x; + var crossProduct = function crossProduct2(a2, b2) { + return a2.x * b2.y - a2.y * b2.x; }; - var dotProduct = function dotProduct2(a, b) { - return a.x * b.x + a.y * b.y; + var dotProduct = function dotProduct2(a2, b2) { + return a2.x * b2.x + a2.y * b2.y; }; var compareVectorAngles = function compareVectorAngles2(basePt, endPt1, endPt2) { var v1 = { @@ -4643,8 +4678,8 @@ var kross = crossProduct(v1, v2); return cmp(kross, 0); }; - var length = function length2(v) { - return Math.sqrt(dotProduct(v, v)); + var length = function length2(v2) { + return Math.sqrt(dotProduct(v2, v2)); }; var sineOfAngle = function sineOfAngle2(pShared, pBase, pAngle) { var vBase = { @@ -4668,20 +4703,20 @@ }; return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase); }; - var horizontalIntersection = function horizontalIntersection2(pt, v, y) { - if (v.y === 0) + var horizontalIntersection = function horizontalIntersection2(pt2, v2, y2) { + if (v2.y === 0) return null; return { - x: pt.x + v.x / v.y * (y - pt.y), - y + x: pt2.x + v2.x / v2.y * (y2 - pt2.y), + y: y2 }; }; - var verticalIntersection = function verticalIntersection2(pt, v, x) { - if (v.x === 0) + var verticalIntersection = function verticalIntersection2(pt2, v2, x2) { + if (v2.x === 0) return null; return { - x, - y: pt.y + v.y / v.x * (x - pt.x) + x: x2, + y: pt2.y + v2.y / v2.x * (x2 - pt2.x) }; }; var intersection = function intersection2(pt1, v1, pt2, v2) { @@ -4696,34 +4731,36 @@ var kross = crossProduct(v1, v2); if (kross == 0) return null; - var ve = { + var ve2 = { x: pt2.x - pt1.x, y: pt2.y - pt1.y }; - var d1 = crossProduct(ve, v1) / kross; - var d2 = crossProduct(ve, v2) / kross; + var d1 = crossProduct(ve2, v1) / kross; + var d2 = crossProduct(ve2, v2) / kross; var x12 = pt1.x + d2 * v1.x, x2 = pt2.x + d1 * v2.x; var y12 = pt1.y + d2 * v1.y, y2 = pt2.y + d1 * v2.y; - var x = (x12 + x2) / 2; - var y = (y12 + y2) / 2; + var x3 = (x12 + x2) / 2; + var y3 = (y12 + y2) / 2; return { - x, - y + x: x3, + y: y3 }; }; var SweepEvent = /* @__PURE__ */ function() { _createClass(SweepEvent2, null, [{ key: "compare", - value: function compare(a, b) { - var ptCmp = SweepEvent2.comparePoints(a.point, b.point); + // for ordering sweep events in the sweep event queue + value: function compare(a2, b2) { + var ptCmp = SweepEvent2.comparePoints(a2.point, b2.point); if (ptCmp !== 0) return ptCmp; - if (a.point !== b.point) - a.link(b); - if (a.isLeft !== b.isLeft) - return a.isLeft ? 1 : -1; - return Segment.compare(a.segment, b.segment); + if (a2.point !== b2.point) + a2.link(b2); + if (a2.isLeft !== b2.isLeft) + return a2.isLeft ? 1 : -1; + return Segment.compare(a2.segment, b2.segment); } + // for ordering points in sweep line order }, { key: "comparePoints", value: function comparePoints(aPt, bPt) { @@ -4737,14 +4774,15 @@ return 1; return 0; } + // Warning: 'point' input will be modified and re-used (for performance) }]); - function SweepEvent2(point, isLeft) { + function SweepEvent2(point2, isLeft) { _classCallCheck(this, SweepEvent2); - if (point.events === void 0) - point.events = [this]; + if (point2.events === void 0) + point2.events = [this]; else - point.events.push(this); - this.point = point; + point2.events.push(this); + this.point = point2; this.isLeft = isLeft; } _createClass(SweepEvent2, [{ @@ -4754,23 +4792,25 @@ throw new Error("Tried to link already linked events"); } var otherEvents = other.point.events; - for (var i2 = 0, iMax = otherEvents.length; i2 < iMax; i2++) { - var evt = otherEvents[i2]; + for (var i3 = 0, iMax = otherEvents.length; i3 < iMax; i3++) { + var evt = otherEvents[i3]; this.point.events.push(evt); evt.point = this.point; } this.checkForConsuming(); } + /* Do a pass over our linked events and check to see if any pair + * of segments match, and should be consumed. */ }, { key: "checkForConsuming", value: function checkForConsuming() { var numEvents = this.point.events.length; - for (var i2 = 0; i2 < numEvents; i2++) { - var evt1 = this.point.events[i2]; + for (var i3 = 0; i3 < numEvents; i3++) { + var evt1 = this.point.events[i3]; if (evt1.segment.consumedBy !== void 0) continue; - for (var j2 = i2 + 1; j2 < numEvents; j2++) { - var evt2 = this.point.events[j2]; + for (var j3 = i3 + 1; j3 < numEvents; j3++) { + var evt2 = this.point.events[j3]; if (evt2.consumedBy !== void 0) continue; if (evt1.otherSE.point.events !== evt2.otherSE.point.events) @@ -4783,14 +4823,24 @@ key: "getAvailableLinkedEvents", value: function getAvailableLinkedEvents() { var events = []; - for (var i2 = 0, iMax = this.point.events.length; i2 < iMax; i2++) { - var evt = this.point.events[i2]; + for (var i3 = 0, iMax = this.point.events.length; i3 < iMax; i3++) { + var evt = this.point.events[i3]; if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) { events.push(evt); } } return events; } + /** + * Returns a comparator function for sorting linked events that will + * favor the event that will give us the smallest left-side angle. + * All ring construction starts as low as possible heading to the right, + * so by always turning left as sharp as possible we'll get polygons + * without uncessary loops & holes. + * + * The comparator function has a compute cache such that it avoids + * re-computing already-computed values. + */ }, { key: "getLeftmostComparator", value: function getLeftmostComparator(baseEvent) { @@ -4803,13 +4853,13 @@ cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point) }); }; - return function(a, b) { - if (!cache.has(a)) - fillCache(a); - if (!cache.has(b)) - fillCache(b); - var _cache$get = cache.get(a), asine = _cache$get.sine, acosine = _cache$get.cosine; - var _cache$get2 = cache.get(b), bsine = _cache$get2.sine, bcosine = _cache$get2.cosine; + return function(a2, b2) { + if (!cache.has(a2)) + fillCache(a2); + if (!cache.has(b2)) + fillCache(b2); + var _cache$get = cache.get(a2), asine = _cache$get.sine, acosine = _cache$get.cosine; + var _cache$get2 = cache.get(b2), bsine = _cache$get2.sine, bcosine = _cache$get2.cosine; if (asine >= 0 && bsine >= 0) { if (acosine < bcosine) return 1; @@ -4838,30 +4888,43 @@ var Segment = /* @__PURE__ */ function() { _createClass(Segment2, null, [{ key: "compare", - value: function compare(a, b) { - var alx = a.leftSE.point.x; - var blx = b.leftSE.point.x; - var arx = a.rightSE.point.x; - var brx = b.rightSE.point.x; + /* This compare() function is for ordering segments in the sweep + * line tree, and does so according to the following criteria: + * + * Consider the vertical line that lies an infinestimal step to the + * right of the right-more of the two left endpoints of the input + * segments. Imagine slowly moving a point up from negative infinity + * in the increasing y direction. Which of the two segments will that + * point intersect first? That segment comes 'before' the other one. + * + * If neither segment would be intersected by such a line, (if one + * or more of the segments are vertical) then the line to be considered + * is directly on the right-more of the two left inputs. + */ + value: function compare(a2, b2) { + var alx = a2.leftSE.point.x; + var blx = b2.leftSE.point.x; + var arx = a2.rightSE.point.x; + var brx = b2.rightSE.point.x; if (brx < alx) return 1; if (arx < blx) return -1; - var aly = a.leftSE.point.y; - var bly = b.leftSE.point.y; - var ary = a.rightSE.point.y; - var bry = b.rightSE.point.y; + var aly = a2.leftSE.point.y; + var bly = b2.leftSE.point.y; + var ary = a2.rightSE.point.y; + var bry = b2.rightSE.point.y; if (alx < blx) { if (bly < aly && bly < ary) return 1; if (bly > aly && bly > ary) return -1; - var aCmpBLeft = a.comparePoint(b.leftSE.point); + var aCmpBLeft = a2.comparePoint(b2.leftSE.point); if (aCmpBLeft < 0) return 1; if (aCmpBLeft > 0) return -1; - var bCmpARight = b.comparePoint(a.rightSE.point); + var bCmpARight = b2.comparePoint(a2.rightSE.point); if (bCmpARight !== 0) return bCmpARight; return -1; @@ -4871,10 +4934,10 @@ return -1; if (aly > bly && aly > bry) return 1; - var bCmpALeft = b.comparePoint(a.leftSE.point); + var bCmpALeft = b2.comparePoint(a2.leftSE.point); if (bCmpALeft !== 0) return bCmpALeft; - var aCmpBRight = a.comparePoint(b.rightSE.point); + var aCmpBRight = a2.comparePoint(b2.rightSE.point); if (aCmpBRight < 0) return 1; if (aCmpBRight > 0) @@ -4886,12 +4949,12 @@ if (aly > bly) return 1; if (arx < brx) { - var _bCmpARight = b.comparePoint(a.rightSE.point); + var _bCmpARight = b2.comparePoint(a2.rightSE.point); if (_bCmpARight !== 0) return _bCmpARight; } if (arx > brx) { - var _aCmpBRight = a.comparePoint(b.rightSE.point); + var _aCmpBRight = a2.comparePoint(b2.rightSE.point); if (_aCmpBRight < 0) return 1; if (_aCmpBRight > 0) @@ -4915,12 +4978,14 @@ return -1; if (ary > bry) return 1; - if (a.id < b.id) + if (a2.id < b2.id) return -1; - if (a.id > b.id) + if (a2.id > b2.id) return 1; return 0; } + /* Warning: a reference to ringWindings input will be stored, + * and possibly will be later modified */ }]); function Segment2(leftSE, rightSE, rings, windings) { _classCallCheck(this, Segment2); @@ -4936,6 +5001,7 @@ } _createClass(Segment2, [{ key: "replaceRightSE", + /* When a segment is split, the rightSE is replaced with a new sweep event */ value: function replaceRightSE(newRightSE) { this.rightSE = newRightSE; this.rightSE.segment = this; @@ -4944,7 +5010,7 @@ } }, { key: "bbox", - value: function bbox() { + value: function bbox2() { var y12 = this.leftSE.point.y; var y2 = this.rightSE.point.y; return { @@ -4958,6 +5024,7 @@ } }; } + /* A vector from the left point to the right */ }, { key: "vector", value: function vector() { @@ -4968,32 +5035,60 @@ } }, { key: "isAnEndpoint", - value: function isAnEndpoint(pt) { - return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y; - } + value: function isAnEndpoint(pt2) { + return pt2.x === this.leftSE.point.x && pt2.y === this.leftSE.point.y || pt2.x === this.rightSE.point.x && pt2.y === this.rightSE.point.y; + } + /* Compare this segment with a point. + * + * A point P is considered to be colinear to a segment if there + * exists a distance D such that if we travel along the segment + * from one * endpoint towards the other a distance D, we find + * ourselves at point P. + * + * Return value indicates: + * + * 1: point lies above the segment (to the left of vertical) + * 0: point is colinear to segment + * -1: point lies below the segment (to the right of vertical) + */ }, { key: "comparePoint", - value: function comparePoint(point) { - if (this.isAnEndpoint(point)) + value: function comparePoint(point2) { + if (this.isAnEndpoint(point2)) return 0; var lPt = this.leftSE.point; var rPt = this.rightSE.point; - var v = this.vector(); + var v2 = this.vector(); if (lPt.x === rPt.x) { - if (point.x === lPt.x) + if (point2.x === lPt.x) return 0; - return point.x < lPt.x ? 1 : -1; + return point2.x < lPt.x ? 1 : -1; } - var yDist = (point.y - lPt.y) / v.y; - var xFromYDist = lPt.x + yDist * v.x; - if (point.x === xFromYDist) + var yDist = (point2.y - lPt.y) / v2.y; + var xFromYDist = lPt.x + yDist * v2.x; + if (point2.x === xFromYDist) return 0; - var xDist = (point.x - lPt.x) / v.x; - var yFromXDist = lPt.y + xDist * v.y; - if (point.y === yFromXDist) + var xDist = (point2.x - lPt.x) / v2.x; + var yFromXDist = lPt.y + xDist * v2.y; + if (point2.y === yFromXDist) return 0; - return point.y < yFromXDist ? -1 : 1; - } + return point2.y < yFromXDist ? -1 : 1; + } + /** + * Given another segment, returns the first non-trivial intersection + * between the two segments (in terms of sweep line ordering), if it exists. + * + * A 'non-trivial' intersection is one that will cause one or both of the + * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection: + * + * * endpoint of segA with endpoint of segB --> trivial + * * endpoint of segA with point along segB --> non-trivial + * * endpoint of segB with point along segA --> non-trivial + * * point along segA with point along segB --> non-trivial + * + * If no non-trivial intersection exists, return null + * Else, return null. + */ }, { key: "getIntersection", value: function getIntersection(other) { @@ -5037,20 +5132,32 @@ return trp; if (touchesOtherRSE) return orp; - var pt = intersection(tlp, this.vector(), olp, other.vector()); - if (pt === null) + var pt2 = intersection(tlp, this.vector(), olp, other.vector()); + if (pt2 === null) return null; - if (!isInBbox(bboxOverlap, pt)) + if (!isInBbox(bboxOverlap, pt2)) return null; - return rounder.round(pt.x, pt.y); - } + return rounder.round(pt2.x, pt2.y); + } + /** + * Split the given segment into multiple segments on the given points. + * * Each existing segment will retain its leftSE and a new rightSE will be + * generated for it. + * * A new segment will be generated which will adopt the original segment's + * rightSE, and a new leftSE will be generated for it. + * * If there are more than two points given to split on, new segments + * in the middle will be generated with new leftSE and rightSE's. + * * An array of the newly generated SweepEvents will be returned. + * + * Warning: input array of points is modified + */ }, { key: "split", - value: function split2(point) { + value: function split2(point2) { var newEvents = []; - var alreadyLinked = point.events !== void 0; - var newLeftSE = new SweepEvent(point, true); - var newRightSE = new SweepEvent(point, false); + var alreadyLinked = point2.events !== void 0; + var newLeftSE = new SweepEvent(point2, true); + var newRightSE = new SweepEvent(point2, false); var oldRightSE = this.rightSE; this.replaceRightSE(newRightSE); newEvents.push(newRightSE); @@ -5068,6 +5175,7 @@ } return newEvents; } + /* Swap which event is left and right */ }, { key: "swapEvents", value: function swapEvents() { @@ -5076,10 +5184,12 @@ this.leftSE = tmpEvt; this.leftSE.isLeft = true; this.rightSE.isLeft = false; - for (var i2 = 0, iMax = this.windings.length; i2 < iMax; i2++) { - this.windings[i2] *= -1; + for (var i3 = 0, iMax = this.windings.length; i3 < iMax; i3++) { + this.windings[i3] *= -1; } } + /* Consume another segment. We take their rings under our wing + * and mark them as consumed. Use for perfectly overlapping segments */ }, { key: "consume", value: function consume(other) { @@ -5104,9 +5214,9 @@ consumer = consumee; consumee = _tmp; } - for (var i2 = 0, iMax = consumee.rings.length; i2 < iMax; i2++) { - var ring = consumee.rings[i2]; - var winding = consumee.windings[i2]; + for (var i3 = 0, iMax = consumee.rings.length; i3 < iMax; i3++) { + var ring = consumee.rings[i3]; + var winding = consumee.windings[i3]; var index2 = consumer.rings.indexOf(ring); if (index2 === -1) { consumer.rings.push(ring); @@ -5120,6 +5230,7 @@ consumee.leftSE.consumedBy = consumer.leftSE; consumee.rightSE.consumedBy = consumer.rightSE; } + /* The first segment previous segment chain that is in the result */ }, { key: "prevInResult", value: function prevInResult() { @@ -5164,9 +5275,9 @@ var ringsAfter = this._afterState.rings; var windingsAfter = this._afterState.windings; var mpsAfter = this._afterState.multiPolys; - for (var i2 = 0, iMax = this.rings.length; i2 < iMax; i2++) { - var ring = this.rings[i2]; - var winding = this.windings[i2]; + for (var i3 = 0, iMax = this.rings.length; i3 < iMax; i3++) { + var ring = this.rings[i3]; + var winding = this.windings[i3]; var index2 = ringsAfter.indexOf(ring); if (index2 === -1) { ringsAfter.push(ring); @@ -5200,6 +5311,7 @@ } return this._afterState; } + /* Is this segment part of the final result? */ }, { key: "isInResult", value: function isInResult() { @@ -5292,23 +5404,23 @@ } }; var prevPoint = firstPoint; - for (var i2 = 1, iMax = geomRing.length; i2 < iMax; i2++) { - if (typeof geomRing[i2][0] !== "number" || typeof geomRing[i2][1] !== "number") { + for (var i3 = 1, iMax = geomRing.length; i3 < iMax; i3++) { + if (typeof geomRing[i3][0] !== "number" || typeof geomRing[i3][1] !== "number") { throw new Error("Input geometry is not a valid Polygon or MultiPolygon"); } - var point = rounder.round(geomRing[i2][0], geomRing[i2][1]); - if (point.x === prevPoint.x && point.y === prevPoint.y) + var point2 = rounder.round(geomRing[i3][0], geomRing[i3][1]); + if (point2.x === prevPoint.x && point2.y === prevPoint.y) continue; - this.segments.push(Segment.fromRing(prevPoint, point, this)); - if (point.x < this.bbox.ll.x) - this.bbox.ll.x = point.x; - if (point.y < this.bbox.ll.y) - this.bbox.ll.y = point.y; - if (point.x > this.bbox.ur.x) - this.bbox.ur.x = point.x; - if (point.y > this.bbox.ur.y) - this.bbox.ur.y = point.y; - prevPoint = point; + this.segments.push(Segment.fromRing(prevPoint, point2, this)); + if (point2.x < this.bbox.ll.x) + this.bbox.ll.x = point2.x; + if (point2.y < this.bbox.ll.y) + this.bbox.ll.y = point2.y; + if (point2.x > this.bbox.ur.x) + this.bbox.ur.x = point2.x; + if (point2.y > this.bbox.ur.y) + this.bbox.ur.y = point2.y; + prevPoint = point2; } if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) { this.segments.push(Segment.fromRing(prevPoint, firstPoint, this)); @@ -5318,8 +5430,8 @@ key: "getSweepEvents", value: function getSweepEvents() { var sweepEvents = []; - for (var i2 = 0, iMax = this.segments.length; i2 < iMax; i2++) { - var segment = this.segments[i2]; + for (var i3 = 0, iMax = this.segments.length; i3 < iMax; i3++) { + var segment = this.segments[i3]; sweepEvents.push(segment.leftSE); sweepEvents.push(segment.rightSE); } @@ -5346,8 +5458,8 @@ } }; this.interiorRings = []; - for (var i2 = 1, iMax = geomPoly.length; i2 < iMax; i2++) { - var ring = new RingIn(geomPoly[i2], this, false); + for (var i3 = 1, iMax = geomPoly.length; i3 < iMax; i3++) { + var ring = new RingIn(geomPoly[i3], this, false); if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x; if (ring.bbox.ll.y < this.bbox.ll.y) @@ -5364,10 +5476,10 @@ key: "getSweepEvents", value: function getSweepEvents() { var sweepEvents = this.exteriorRing.getSweepEvents(); - for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) { - var ringSweepEvents = this.interiorRings[i2].getSweepEvents(); - for (var j2 = 0, jMax = ringSweepEvents.length; j2 < jMax; j2++) { - sweepEvents.push(ringSweepEvents[j2]); + for (var i3 = 0, iMax = this.interiorRings.length; i3 < iMax; i3++) { + var ringSweepEvents = this.interiorRings[i3].getSweepEvents(); + for (var j3 = 0, jMax = ringSweepEvents.length; j3 < jMax; j3++) { + sweepEvents.push(ringSweepEvents[j3]); } } return sweepEvents; @@ -5397,8 +5509,8 @@ y: Number.NEGATIVE_INFINITY } }; - for (var i2 = 0, iMax = geom.length; i2 < iMax; i2++) { - var poly = new PolyIn(geom[i2], this); + for (var i3 = 0, iMax = geom.length; i3 < iMax; i3++) { + var poly = new PolyIn(geom[i3], this); if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x; if (poly.bbox.ll.y < this.bbox.ll.y) @@ -5415,10 +5527,10 @@ key: "getSweepEvents", value: function getSweepEvents() { var sweepEvents = []; - for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) { - var polySweepEvents = this.polys[i2].getSweepEvents(); - for (var j2 = 0, jMax = polySweepEvents.length; j2 < jMax; j2++) { - sweepEvents.push(polySweepEvents[j2]); + for (var i3 = 0, iMax = this.polys.length; i3 < iMax; i3++) { + var polySweepEvents = this.polys[i3].getSweepEvents(); + for (var j3 = 0, jMax = polySweepEvents.length; j3 < jMax; j3++) { + sweepEvents.push(polySweepEvents[j3]); } } return sweepEvents; @@ -5429,10 +5541,12 @@ var RingOut = /* @__PURE__ */ function() { _createClass(RingOut2, null, [{ key: "factory", + /* Given the segments from the sweep line pass, compute & return a series + * of closed rings from all the segments marked to be part of the result */ value: function factory(allSegments) { var ringsOut = []; - for (var i2 = 0, iMax = allSegments.length; i2 < iMax; i2++) { - var segment = allSegments[i2]; + for (var i3 = 0, iMax = allSegments.length; i3 < iMax; i3++) { + var segment = allSegments[i3]; if (!segment.isInResult() || segment.ringOut) continue; var prevEvent = null; @@ -5459,9 +5573,9 @@ break; } var indexLE = null; - for (var j2 = 0, jMax = intersectionLEs.length; j2 < jMax; j2++) { - if (intersectionLEs[j2].point === event.point) { - indexLE = j2; + for (var j3 = 0, jMax = intersectionLEs.length; j3 < jMax; j3++) { + if (intersectionLEs[j3].point === event.point) { + indexLE = j3; break; } } @@ -5489,8 +5603,8 @@ function RingOut2(events) { _classCallCheck(this, RingOut2); this.events = events; - for (var i2 = 0, iMax = events.length; i2 < iMax; i2++) { - events[i2].segment.ringOut = this; + for (var i3 = 0, iMax = events.length; i3 < iMax; i3++) { + events[i3].segment.ringOut = this; } this.poly = null; } @@ -5499,9 +5613,9 @@ value: function getGeom2() { var prevPt = this.events[0].point; var points = [prevPt]; - for (var i2 = 1, iMax = this.events.length - 1; i2 < iMax; i2++) { - var _pt = this.events[i2].point; - var _nextPt = this.events[i2 + 1].point; + for (var i3 = 1, iMax = this.events.length - 1; i3 < iMax; i3++) { + var _pt = this.events[i3].point; + var _nextPt = this.events[i3 + 1].point; if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue; points.push(_pt); @@ -5509,9 +5623,9 @@ } if (points.length === 1) return null; - var pt = points[0]; + var pt2 = points[0]; var nextPt = points[1]; - if (compareVectorAngles(pt, prevPt, nextPt) === 0) + if (compareVectorAngles(pt2, prevPt, nextPt) === 0) points.shift(); points.push(points[0]); var step = this.isExteriorRing() ? 1 : -1; @@ -5540,12 +5654,13 @@ } return this._enclosingRing; } + /* Returns the ring that encloses this one, if any */ }, { key: "_calcEnclosingRing", value: function _calcEnclosingRing() { var leftMostEvt = this.events[0]; - for (var i2 = 1, iMax = this.events.length; i2 < iMax; i2++) { - var evt = this.events[i2]; + for (var i3 = 1, iMax = this.events.length; i3 < iMax; i3++) { + var evt = this.events[i3]; if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt; } @@ -5588,8 +5703,8 @@ var geom = [this.exteriorRing.getGeom()]; if (geom[0] === null) return null; - for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) { - var ringGeom = this.interiorRings[i2].getGeom(); + for (var i3 = 0, iMax = this.interiorRings.length; i3 < iMax; i3++) { + var ringGeom = this.interiorRings[i3].getGeom(); if (ringGeom === null) continue; geom.push(ringGeom); @@ -5609,8 +5724,8 @@ key: "getGeom", value: function getGeom2() { var geom = []; - for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) { - var polyGeom = this.polys[i2].getGeom(); + for (var i3 = 0, iMax = this.polys.length; i3 < iMax; i3++) { + var polyGeom = this.polys[i3].getGeom(); if (polyGeom === null) continue; geom.push(polyGeom); @@ -5621,8 +5736,8 @@ key: "_composePolys", value: function _composePolys(rings) { var polys = []; - for (var i2 = 0, iMax = rings.length; i2 < iMax; i2++) { - var ring = rings[i2]; + for (var i3 = 0, iMax = rings.length; i3 < iMax; i3++) { + var ring = rings[i3]; if (ring.poly) continue; if (ring.isExteriorRing()) @@ -5689,8 +5804,8 @@ prevMySplitter = prevInter; if (!prevSeg.isAnEndpoint(prevInter)) { var newEventsFromSplit = this._splitSafely(prevSeg, prevInter); - for (var i2 = 0, iMax = newEventsFromSplit.length; i2 < iMax; i2++) { - newEvents.push(newEventsFromSplit[i2]); + for (var i3 = 0, iMax = newEventsFromSplit.length; i3 < iMax; i3++) { + newEvents.push(newEventsFromSplit[i3]); } } } @@ -5755,13 +5870,15 @@ } return newEvents; } + /* Safely split a segment that is currently in the datastructures + * IE - a segment other than the one that is currently being processed. */ }, { key: "_splitSafely", - value: function _splitSafely(seg, pt) { + value: function _splitSafely(seg, pt2) { this.tree.remove(seg); var rightSE = seg.rightSE; this.queue.remove(rightSE); - var newEvents = seg.split(pt); + var newEvents = seg.split(pt2); newEvents.push(rightSE); if (seg.consumedBy === void 0) this.tree.insert(seg); @@ -5778,12 +5895,12 @@ } _createClass(Operation2, [{ key: "run", - value: function run(type3, geom, moreGeoms) { - operation.type = type3; + value: function run(type2, geom, moreGeoms) { + operation.type = type2; rounder.reset(); var multipolys = [new MultiPolyIn(geom, true)]; - for (var i2 = 0, iMax = moreGeoms.length; i2 < iMax; i2++) { - multipolys.push(new MultiPolyIn(moreGeoms[i2], false)); + for (var i3 = 0, iMax = moreGeoms.length; i3 < iMax; i3++) { + multipolys.push(new MultiPolyIn(moreGeoms[i3], false)); } operation.numMultiPolys = multipolys.length; if (operation.type === "difference") { @@ -5799,8 +5916,8 @@ if (operation.type === "intersection") { for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) { var mpA = multipolys[_i2]; - for (var j2 = _i2 + 1, jMax = multipolys.length; j2 < jMax; j2++) { - if (getBboxOverlap(mpA.bbox, multipolys[j2].bbox) === null) + for (var j3 = _i2 + 1, jMax = multipolys.length; j3 < jMax; j3++) { + if (getBboxOverlap(mpA.bbox, multipolys[j3].bbox) === null) return []; } } @@ -5887,24 +6004,24 @@ var require_geojson_precision = __commonJS({ "node_modules/geojson-precision/index.js"(exports2, module2) { (function() { - function parse(t, coordinatePrecision, extrasPrecision) { - function point(p) { - return p.map(function(e, index) { + function parse(t2, coordinatePrecision, extrasPrecision) { + function point2(p2) { + return p2.map(function(e3, index) { if (index < 2) { - return 1 * e.toFixed(coordinatePrecision); + return 1 * e3.toFixed(coordinatePrecision); } else { - return 1 * e.toFixed(extrasPrecision); + return 1 * e3.toFixed(extrasPrecision); } }); } - function multi(l) { - return l.map(point); + function multi(l2) { + return l2.map(point2); } - function poly(p) { - return p.map(multi); + function poly(p2) { + return p2.map(multi); } - function multiPoly(m) { - return m.map(poly); + function multiPoly(m2) { + return m2.map(poly); } function geometry(obj) { if (!obj) { @@ -5912,7 +6029,7 @@ } switch (obj.type) { case "Point": - obj.coordinates = point(obj.coordinates); + obj.coordinates = point2(obj.coordinates); return obj; case "LineString": case "MultiPoint": @@ -5936,33 +6053,33 @@ obj.geometry = geometry(obj.geometry); return obj; } - function featureCollection(f2) { - f2.features = f2.features.map(feature3); - return f2; + function featureCollection(f3) { + f3.features = f3.features.map(feature3); + return f3; } - function geometryCollection(g) { - g.geometries = g.geometries.map(geometry); - return g; + function geometryCollection(g3) { + g3.geometries = g3.geometries.map(geometry); + return g3; } - if (!t) { - return t; + if (!t2) { + return t2; } - switch (t.type) { + switch (t2.type) { case "Feature": - return feature3(t); + return feature3(t2); case "GeometryCollection": - return geometryCollection(t); + return geometryCollection(t2); case "FeatureCollection": - return featureCollection(t); + return featureCollection(t2); case "Point": case "LineString": case "Polygon": case "MultiPoint": case "MultiPolygon": case "MultiLineString": - return geometry(t); + return geometry(t2); default: - return t; + return t2; } } module2.exports = parse; @@ -5974,13 +6091,13 @@ // node_modules/@aitodotai/json-stringify-pretty-compact/index.js var require_json_stringify_pretty_compact = __commonJS({ "node_modules/@aitodotai/json-stringify-pretty-compact/index.js"(exports2, module2) { - function isObject2(obj) { + function isObject3(obj) { return typeof obj === "object" && obj !== null; } function forEach(obj, cb) { if (Array.isArray(obj)) { obj.forEach(cb); - } else if (isObject2(obj)) { + } else if (isObject3(obj)) { Object.keys(obj).forEach(function(key) { var val = obj[key]; cb(val, key); @@ -5989,9 +6106,9 @@ } function getTreeDepth(obj) { var depth = 0; - if (Array.isArray(obj) || isObject2(obj)) { + if (Array.isArray(obj) || isObject3(obj)) { forEach(obj, function(val) { - if (Array.isArray(val) || isObject2(val)) { + if (Array.isArray(val) || isObject3(val)) { var tmpDepth = getTreeDepth(val); if (tmpDepth > depth) { depth = tmpDepth; @@ -6030,7 +6147,7 @@ return prettified; } } - if (isObject2(obj2)) { + if (isObject3(obj2)) { var nextIndent = currentIndent + indent2; var items = []; var delimiters; @@ -6111,8 +6228,8 @@ if (!checkInt(arrayish.length)) { return false; } - for (var i2 = 0; i2 < arrayish.length; i2++) { - if (!checkInt(arrayish[i2]) || arrayish[i2] < 0 || arrayish[i2] > 255) { + for (var i3 = 0; i3 < arrayish.length; i3++) { + if (!checkInt(arrayish[i3]) || arrayish[i3] < 0 || arrayish[i3] > 255) { return false; } } @@ -6155,32 +6272,32 @@ } var convertUtf8 = function() { function toBytes(text2) { - var result = [], i2 = 0; + var result = [], i3 = 0; text2 = encodeURI(text2); - while (i2 < text2.length) { - var c = text2.charCodeAt(i2++); - if (c === 37) { - result.push(parseInt(text2.substr(i2, 2), 16)); - i2 += 2; + while (i3 < text2.length) { + var c2 = text2.charCodeAt(i3++); + if (c2 === 37) { + result.push(parseInt(text2.substr(i3, 2), 16)); + i3 += 2; } else { - result.push(c); + result.push(c2); } } return coerceArray(result); } function fromBytes(bytes) { - var result = [], i2 = 0; - while (i2 < bytes.length) { - var c = bytes[i2]; - if (c < 128) { - result.push(String.fromCharCode(c)); - i2++; - } else if (c > 191 && c < 224) { - result.push(String.fromCharCode((c & 31) << 6 | bytes[i2 + 1] & 63)); - i2 += 2; + var result = [], i3 = 0; + while (i3 < bytes.length) { + var c2 = bytes[i3]; + if (c2 < 128) { + result.push(String.fromCharCode(c2)); + i3++; + } else if (c2 > 191 && c2 < 224) { + result.push(String.fromCharCode((c2 & 31) << 6 | bytes[i3 + 1] & 63)); + i3 += 2; } else { - result.push(String.fromCharCode((c & 15) << 12 | (bytes[i2 + 1] & 63) << 6 | bytes[i2 + 2] & 63)); - i2 += 3; + result.push(String.fromCharCode((c2 & 15) << 12 | (bytes[i3 + 1] & 63) << 6 | bytes[i3 + 2] & 63)); + i3 += 3; } } return result.join(""); @@ -6193,17 +6310,17 @@ var convertHex = function() { function toBytes(text2) { var result = []; - for (var i2 = 0; i2 < text2.length; i2 += 2) { - result.push(parseInt(text2.substr(i2, 2), 16)); + for (var i3 = 0; i3 < text2.length; i3 += 2) { + result.push(parseInt(text2.substr(i3, 2), 16)); } return result; } var Hex = "0123456789abcdef"; function fromBytes(bytes) { var result = []; - for (var i2 = 0; i2 < bytes.length; i2++) { - var v = bytes[i2]; - result.push(Hex[(v & 240) >> 4] + Hex[v & 15]); + for (var i3 = 0; i3 < bytes.length; i3++) { + var v2 = bytes[i3]; + result.push(Hex[(v2 & 240) >> 4] + Hex[v2 & 15]); } return result.join(""); } @@ -6214,7 +6331,7 @@ }(); var numberOfRounds = { 16: 10, 24: 12, 32: 14 }; var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145]; - var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]; + var S2 = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]; var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125]; var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986]; var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766]; @@ -6230,9 +6347,9 @@ var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925]; function convertToInt32(bytes) { var result = []; - for (var i2 = 0; i2 < bytes.length; i2 += 4) { + for (var i3 = 0; i3 < bytes.length; i3 += 4) { result.push( - bytes[i2] << 24 | bytes[i2 + 1] << 16 | bytes[i2 + 2] << 8 | bytes[i2 + 3] + bytes[i3] << 24 | bytes[i3 + 1] << 16 | bytes[i3 + 2] << 8 | bytes[i3 + 3] ); } return result; @@ -6253,7 +6370,7 @@ } this._Ke = []; this._Kd = []; - for (var i2 = 0; i2 <= rounds; i2++) { + for (var i3 = 0; i3 <= rounds; i3++) { this._Ke.push([0, 0, 0, 0]); this._Kd.push([0, 0, 0, 0]); } @@ -6261,44 +6378,44 @@ var KC = this.key.length / 4; var tk = convertToInt32(this.key); var index; - for (var i2 = 0; i2 < KC; i2++) { - index = i2 >> 2; - this._Ke[index][i2 % 4] = tk[i2]; - this._Kd[rounds - index][i2 % 4] = tk[i2]; + for (var i3 = 0; i3 < KC; i3++) { + index = i3 >> 2; + this._Ke[index][i3 % 4] = tk[i3]; + this._Kd[rounds - index][i3 % 4] = tk[i3]; } var rconpointer = 0; - var t = KC, tt; - while (t < roundKeyCount) { - tt = tk[KC - 1]; - tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24; + var t2 = KC, tt2; + while (t2 < roundKeyCount) { + tt2 = tk[KC - 1]; + tk[0] ^= S2[tt2 >> 16 & 255] << 24 ^ S2[tt2 >> 8 & 255] << 16 ^ S2[tt2 & 255] << 8 ^ S2[tt2 >> 24 & 255] ^ rcon[rconpointer] << 24; rconpointer += 1; if (KC != 8) { - for (var i2 = 1; i2 < KC; i2++) { - tk[i2] ^= tk[i2 - 1]; + for (var i3 = 1; i3 < KC; i3++) { + tk[i3] ^= tk[i3 - 1]; } } else { - for (var i2 = 1; i2 < KC / 2; i2++) { - tk[i2] ^= tk[i2 - 1]; + for (var i3 = 1; i3 < KC / 2; i3++) { + tk[i3] ^= tk[i3 - 1]; } - tt = tk[KC / 2 - 1]; - tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24; - for (var i2 = KC / 2 + 1; i2 < KC; i2++) { - tk[i2] ^= tk[i2 - 1]; + tt2 = tk[KC / 2 - 1]; + tk[KC / 2] ^= S2[tt2 & 255] ^ S2[tt2 >> 8 & 255] << 8 ^ S2[tt2 >> 16 & 255] << 16 ^ S2[tt2 >> 24 & 255] << 24; + for (var i3 = KC / 2 + 1; i3 < KC; i3++) { + tk[i3] ^= tk[i3 - 1]; } } - var i2 = 0, r, c; - while (i2 < KC && t < roundKeyCount) { - r = t >> 2; - c = t % 4; - this._Ke[r][c] = tk[i2]; - this._Kd[rounds - r][c] = tk[i2++]; - t++; + var i3 = 0, r2, c2; + while (i3 < KC && t2 < roundKeyCount) { + r2 = t2 >> 2; + c2 = t2 % 4; + this._Ke[r2][c2] = tk[i3]; + this._Kd[rounds - r2][c2] = tk[i3++]; + t2++; } } - for (var r = 1; r < rounds; r++) { - for (var c = 0; c < 4; c++) { - tt = this._Kd[r][c]; - this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255]; + for (var r2 = 1; r2 < rounds; r2++) { + for (var c2 = 0; c2 < 4; c2++) { + tt2 = this._Kd[r2][c2]; + this._Kd[r2][c2] = U1[tt2 >> 24 & 255] ^ U2[tt2 >> 16 & 255] ^ U3[tt2 >> 8 & 255] ^ U4[tt2 & 255]; } } }; @@ -6307,24 +6424,24 @@ throw new Error("invalid plaintext size (must be 16 bytes)"); } var rounds = this._Ke.length - 1; - var a = [0, 0, 0, 0]; - var t = convertToInt32(plaintext); - for (var i2 = 0; i2 < 4; i2++) { - t[i2] ^= this._Ke[0][i2]; + var a2 = [0, 0, 0, 0]; + var t2 = convertToInt32(plaintext); + for (var i3 = 0; i3 < 4; i3++) { + t2[i3] ^= this._Ke[0][i3]; } - for (var r = 1; r < rounds; r++) { - for (var i2 = 0; i2 < 4; i2++) { - a[i2] = T1[t[i2] >> 24 & 255] ^ T2[t[(i2 + 1) % 4] >> 16 & 255] ^ T3[t[(i2 + 2) % 4] >> 8 & 255] ^ T4[t[(i2 + 3) % 4] & 255] ^ this._Ke[r][i2]; + for (var r2 = 1; r2 < rounds; r2++) { + for (var i3 = 0; i3 < 4; i3++) { + a2[i3] = T1[t2[i3] >> 24 & 255] ^ T2[t2[(i3 + 1) % 4] >> 16 & 255] ^ T3[t2[(i3 + 2) % 4] >> 8 & 255] ^ T4[t2[(i3 + 3) % 4] & 255] ^ this._Ke[r2][i3]; } - t = a.slice(); + t2 = a2.slice(); } - var result = createArray(16), tt; - for (var i2 = 0; i2 < 4; i2++) { - tt = this._Ke[rounds][i2]; - result[4 * i2] = (S[t[i2] >> 24 & 255] ^ tt >> 24) & 255; - result[4 * i2 + 1] = (S[t[(i2 + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255; - result[4 * i2 + 2] = (S[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255; - result[4 * i2 + 3] = (S[t[(i2 + 3) % 4] & 255] ^ tt) & 255; + var result = createArray(16), tt2; + for (var i3 = 0; i3 < 4; i3++) { + tt2 = this._Ke[rounds][i3]; + result[4 * i3] = (S2[t2[i3] >> 24 & 255] ^ tt2 >> 24) & 255; + result[4 * i3 + 1] = (S2[t2[(i3 + 1) % 4] >> 16 & 255] ^ tt2 >> 16) & 255; + result[4 * i3 + 2] = (S2[t2[(i3 + 2) % 4] >> 8 & 255] ^ tt2 >> 8) & 255; + result[4 * i3 + 3] = (S2[t2[(i3 + 3) % 4] & 255] ^ tt2) & 255; } return result; }; @@ -6333,24 +6450,24 @@ throw new Error("invalid ciphertext size (must be 16 bytes)"); } var rounds = this._Kd.length - 1; - var a = [0, 0, 0, 0]; - var t = convertToInt32(ciphertext); - for (var i2 = 0; i2 < 4; i2++) { - t[i2] ^= this._Kd[0][i2]; + var a2 = [0, 0, 0, 0]; + var t2 = convertToInt32(ciphertext); + for (var i3 = 0; i3 < 4; i3++) { + t2[i3] ^= this._Kd[0][i3]; } - for (var r = 1; r < rounds; r++) { - for (var i2 = 0; i2 < 4; i2++) { - a[i2] = T5[t[i2] >> 24 & 255] ^ T6[t[(i2 + 3) % 4] >> 16 & 255] ^ T7[t[(i2 + 2) % 4] >> 8 & 255] ^ T8[t[(i2 + 1) % 4] & 255] ^ this._Kd[r][i2]; + for (var r2 = 1; r2 < rounds; r2++) { + for (var i3 = 0; i3 < 4; i3++) { + a2[i3] = T5[t2[i3] >> 24 & 255] ^ T6[t2[(i3 + 3) % 4] >> 16 & 255] ^ T7[t2[(i3 + 2) % 4] >> 8 & 255] ^ T8[t2[(i3 + 1) % 4] & 255] ^ this._Kd[r2][i3]; } - t = a.slice(); + t2 = a2.slice(); } - var result = createArray(16), tt; - for (var i2 = 0; i2 < 4; i2++) { - tt = this._Kd[rounds][i2]; - result[4 * i2] = (Si[t[i2] >> 24 & 255] ^ tt >> 24) & 255; - result[4 * i2 + 1] = (Si[t[(i2 + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255; - result[4 * i2 + 2] = (Si[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255; - result[4 * i2 + 3] = (Si[t[(i2 + 1) % 4] & 255] ^ tt) & 255; + var result = createArray(16), tt2; + for (var i3 = 0; i3 < 4; i3++) { + tt2 = this._Kd[rounds][i3]; + result[4 * i3] = (Si[t2[i3] >> 24 & 255] ^ tt2 >> 24) & 255; + result[4 * i3 + 1] = (Si[t2[(i3 + 3) % 4] >> 16 & 255] ^ tt2 >> 16) & 255; + result[4 * i3 + 2] = (Si[t2[(i3 + 2) % 4] >> 8 & 255] ^ tt2 >> 8) & 255; + result[4 * i3 + 3] = (Si[t2[(i3 + 1) % 4] & 255] ^ tt2) & 255; } return result; }; @@ -6369,10 +6486,10 @@ } var ciphertext = createArray(plaintext.length); var block2 = createArray(16); - for (var i2 = 0; i2 < plaintext.length; i2 += 16) { - copyArray(plaintext, block2, 0, i2, i2 + 16); + for (var i3 = 0; i3 < plaintext.length; i3 += 16) { + copyArray(plaintext, block2, 0, i3, i3 + 16); block2 = this._aes.encrypt(block2); - copyArray(block2, ciphertext, i2); + copyArray(block2, ciphertext, i3); } return ciphertext; }; @@ -6383,10 +6500,10 @@ } var plaintext = createArray(ciphertext.length); var block2 = createArray(16); - for (var i2 = 0; i2 < ciphertext.length; i2 += 16) { - copyArray(ciphertext, block2, 0, i2, i2 + 16); + for (var i3 = 0; i3 < ciphertext.length; i3 += 16) { + copyArray(ciphertext, block2, 0, i3, i3 + 16); block2 = this._aes.decrypt(block2); - copyArray(block2, plaintext, i2); + copyArray(block2, plaintext, i3); } return plaintext; }; @@ -6411,13 +6528,13 @@ } var ciphertext = createArray(plaintext.length); var block2 = createArray(16); - for (var i2 = 0; i2 < plaintext.length; i2 += 16) { - copyArray(plaintext, block2, 0, i2, i2 + 16); - for (var j2 = 0; j2 < 16; j2++) { - block2[j2] ^= this._lastCipherblock[j2]; + for (var i3 = 0; i3 < plaintext.length; i3 += 16) { + copyArray(plaintext, block2, 0, i3, i3 + 16); + for (var j3 = 0; j3 < 16; j3++) { + block2[j3] ^= this._lastCipherblock[j3]; } this._lastCipherblock = this._aes.encrypt(block2); - copyArray(this._lastCipherblock, ciphertext, i2); + copyArray(this._lastCipherblock, ciphertext, i3); } return ciphertext; }; @@ -6428,13 +6545,13 @@ } var plaintext = createArray(ciphertext.length); var block2 = createArray(16); - for (var i2 = 0; i2 < ciphertext.length; i2 += 16) { - copyArray(ciphertext, block2, 0, i2, i2 + 16); + for (var i3 = 0; i3 < ciphertext.length; i3 += 16) { + copyArray(ciphertext, block2, 0, i3, i3 + 16); block2 = this._aes.decrypt(block2); - for (var j2 = 0; j2 < 16; j2++) { - plaintext[i2 + j2] = block2[j2] ^ this._lastCipherblock[j2]; + for (var j3 = 0; j3 < 16; j3++) { + plaintext[i3 + j3] = block2[j3] ^ this._lastCipherblock[j3]; } - copyArray(ciphertext, this._lastCipherblock, 0, i2, i2 + 16); + copyArray(ciphertext, this._lastCipherblock, 0, i3, i3 + 16); } return plaintext; }; @@ -6462,13 +6579,13 @@ } var encrypted = coerceArray(plaintext, true); var xorSegment; - for (var i2 = 0; i2 < encrypted.length; i2 += this.segmentSize) { + for (var i3 = 0; i3 < encrypted.length; i3 += this.segmentSize) { xorSegment = this._aes.encrypt(this._shiftRegister); - for (var j2 = 0; j2 < this.segmentSize; j2++) { - encrypted[i2 + j2] ^= xorSegment[j2]; + for (var j3 = 0; j3 < this.segmentSize; j3++) { + encrypted[i3 + j3] ^= xorSegment[j3]; } copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); - copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize); + copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i3, i3 + this.segmentSize); } return encrypted; }; @@ -6478,13 +6595,13 @@ } var plaintext = coerceArray(ciphertext, true); var xorSegment; - for (var i2 = 0; i2 < plaintext.length; i2 += this.segmentSize) { + for (var i3 = 0; i3 < plaintext.length; i3 += this.segmentSize) { xorSegment = this._aes.encrypt(this._shiftRegister); - for (var j2 = 0; j2 < this.segmentSize; j2++) { - plaintext[i2 + j2] ^= xorSegment[j2]; + for (var j3 = 0; j3 < this.segmentSize; j3++) { + plaintext[i3 + j3] ^= xorSegment[j3]; } copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); - copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize); + copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i3, i3 + this.segmentSize); } return plaintext; }; @@ -6505,12 +6622,12 @@ }; ModeOfOperationOFB.prototype.encrypt = function(plaintext) { var encrypted = coerceArray(plaintext, true); - for (var i2 = 0; i2 < encrypted.length; i2++) { + for (var i3 = 0; i3 < encrypted.length; i3++) { if (this._lastPrecipherIndex === 16) { this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); this._lastPrecipherIndex = 0; } - encrypted[i2] ^= this._lastPrecipher[this._lastPrecipherIndex++]; + encrypted[i3] ^= this._lastPrecipher[this._lastPrecipherIndex++]; } return encrypted; }; @@ -6549,11 +6666,11 @@ this._counter = bytes; }; Counter.prototype.increment = function() { - for (var i2 = 15; i2 >= 0; i2--) { - if (this._counter[i2] === 255) { - this._counter[i2] = 0; + for (var i3 = 15; i3 >= 0; i3--) { + if (this._counter[i3] === 255) { + this._counter[i3] = 0; } else { - this._counter[i2]++; + this._counter[i3]++; break; } } @@ -6574,13 +6691,13 @@ }; ModeOfOperationCTR.prototype.encrypt = function(plaintext) { var encrypted = coerceArray(plaintext, true); - for (var i2 = 0; i2 < encrypted.length; i2++) { + for (var i3 = 0; i3 < encrypted.length; i3++) { if (this._remainingCounterIndex === 16) { this._remainingCounter = this._aes.encrypt(this._counter._counter); this._remainingCounterIndex = 0; this._counter.increment(); } - encrypted[i2] ^= this._remainingCounter[this._remainingCounterIndex++]; + encrypted[i3] ^= this._remainingCounter[this._remainingCounterIndex++]; } return encrypted; }; @@ -6590,8 +6707,8 @@ var padder = 16 - data.length % 16; var result = createArray(data.length + padder); copyArray(data, result); - for (var i2 = data.length; i2 < result.length; i2++) { - result[i2] = padder; + for (var i3 = data.length; i3 < result.length; i3++) { + result[i3] = padder; } return result; } @@ -6605,8 +6722,8 @@ throw new Error("PKCS#7 padding byte out of range"); } var length = data.length - padder; - for (var i2 = 0; i2 < padder; i2++) { - if (data[length + i2] !== padder) { + for (var i3 = 0; i3 < padder; i3++) { + if (data[length + i3] !== padder) { throw new Error("PKCS#7 invalid padding byte"); } } @@ -6656,69 +6773,24 @@ } }); - // node_modules/fast-deep-equal/index.js - var require_fast_deep_equal = __commonJS({ - "node_modules/fast-deep-equal/index.js"(exports2, module2) { - "use strict"; - module2.exports = function equal(a, b) { - if (a === b) - return true; - if (a && b && typeof a == "object" && typeof b == "object") { - if (a.constructor !== b.constructor) - return false; - var length, i2, keys; - if (Array.isArray(a)) { - length = a.length; - if (length != b.length) - return false; - for (i2 = length; i2-- !== 0; ) - if (!equal(a[i2], b[i2])) - return false; - return true; - } - if (a.constructor === RegExp) - return a.source === b.source && a.flags === b.flags; - if (a.valueOf !== Object.prototype.valueOf) - return a.valueOf() === b.valueOf(); - if (a.toString !== Object.prototype.toString) - return a.toString() === b.toString(); - keys = Object.keys(a); - length = keys.length; - if (length !== Object.keys(b).length) - return false; - for (i2 = length; i2-- !== 0; ) - if (!Object.prototype.hasOwnProperty.call(b, keys[i2])) - return false; - for (i2 = length; i2-- !== 0; ) { - var key = keys[i2]; - if (!equal(a[key], b[key])) - return false; - } - return true; - } - return a !== a && b !== b; - }; - } - }); - // node_modules/lodash/lodash.js var require_lodash = __commonJS({ "node_modules/lodash/lodash.js"(exports2, module2) { (function() { var undefined2; var VERSION = "4.17.21"; - var LARGE_ARRAY_SIZE = 200; + var LARGE_ARRAY_SIZE2 = 200; var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT3 = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`"; - var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var HASH_UNDEFINED4 = "__lodash_hash_undefined__"; var MAX_MEMOIZE_SIZE = 500; var PLACEHOLDER = "__lodash_placeholder__"; var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; - var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; + var COMPARE_PARTIAL_FLAG5 = 1, COMPARE_UNORDERED_FLAG3 = 2; var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "..."; var HOT_COUNT = 800, HOT_SPAN = 16; var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; - var INFINITY2 = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN2 = 0 / 0; + var INFINITY2 = 1 / 0, MAX_SAFE_INTEGER3 = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN2 = 0 / 0; var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; var wrapFlags = [ ["ary", WRAP_ARY_FLAG], @@ -6731,13 +6803,13 @@ ["partialRight", WRAP_PARTIAL_RIGHT_FLAG], ["rearg", WRAP_REARG_FLAG] ]; - var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag2 = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag2 = "[object Symbol]", undefinedTag2 = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]"; - var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; + var argsTag4 = "[object Arguments]", arrayTag3 = "[object Array]", asyncTag2 = "[object AsyncFunction]", boolTag3 = "[object Boolean]", dateTag3 = "[object Date]", domExcTag = "[object DOMException]", errorTag3 = "[object Error]", funcTag3 = "[object Function]", genTag2 = "[object GeneratorFunction]", mapTag4 = "[object Map]", numberTag4 = "[object Number]", nullTag2 = "[object Null]", objectTag4 = "[object Object]", promiseTag2 = "[object Promise]", proxyTag2 = "[object Proxy]", regexpTag3 = "[object RegExp]", setTag4 = "[object Set]", stringTag3 = "[object String]", symbolTag3 = "[object Symbol]", undefinedTag2 = "[object Undefined]", weakMapTag3 = "[object WeakMap]", weakSetTag = "[object WeakSet]"; + var arrayBufferTag3 = "[object ArrayBuffer]", dataViewTag4 = "[object DataView]", float32Tag2 = "[object Float32Array]", float64Tag2 = "[object Float64Array]", int8Tag2 = "[object Int8Array]", int16Tag2 = "[object Int16Array]", int32Tag2 = "[object Int32Array]", uint8Tag2 = "[object Uint8Array]", uint8ClampedTag2 = "[object Uint8ClampedArray]", uint16Tag2 = "[object Uint16Array]", uint32Tag2 = "[object Uint32Array]"; var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; var reEscapedHtml2 = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml2 = /[&<>"']/g, reHasEscapedHtml2 = RegExp(reEscapedHtml2.source), reHasUnescapedHtml2 = RegExp(reUnescapedHtml2.source); var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); + var reRegExpChar2 = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar2.source); var reTrimStart2 = /^\s+/; var reWhitespace2 = /\s/; var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; @@ -6748,9 +6820,9 @@ var reFlags = /\w*$/; var reIsBadHex2 = /^[-+]0x[0-9a-f]+$/i; var reIsBinary2 = /^0b[01]+$/i; - var reIsHostCtor = /^\[object .+?Constructor\]$/; + var reIsHostCtor2 = /^\[object .+?Constructor\]$/; var reIsOctal2 = /^0o[0-7]+$/i; - var reIsUint = /^(?:0|[1-9]\d*)$/; + var reIsUint2 = /^(?:0|[1-9]\d*)$/; var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; var reNoMatch = /($^)/; var reUnescapedString = /['\n\r\u2028\u2029\\]/g; @@ -6805,13 +6877,14 @@ "setTimeout" ]; var templateCounter = -1; - var typedArrayTags = {}; - typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; - typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + var typedArrayTags2 = {}; + typedArrayTags2[float32Tag2] = typedArrayTags2[float64Tag2] = typedArrayTags2[int8Tag2] = typedArrayTags2[int16Tag2] = typedArrayTags2[int32Tag2] = typedArrayTags2[uint8Tag2] = typedArrayTags2[uint8ClampedTag2] = typedArrayTags2[uint16Tag2] = typedArrayTags2[uint32Tag2] = true; + typedArrayTags2[argsTag4] = typedArrayTags2[arrayTag3] = typedArrayTags2[arrayBufferTag3] = typedArrayTags2[boolTag3] = typedArrayTags2[dataViewTag4] = typedArrayTags2[dateTag3] = typedArrayTags2[errorTag3] = typedArrayTags2[funcTag3] = typedArrayTags2[mapTag4] = typedArrayTags2[numberTag4] = typedArrayTags2[objectTag4] = typedArrayTags2[regexpTag3] = typedArrayTags2[setTag4] = typedArrayTags2[stringTag3] = typedArrayTags2[weakMapTag3] = false; var cloneableTags = {}; - cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag2] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; - cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; + cloneableTags[argsTag4] = cloneableTags[arrayTag3] = cloneableTags[arrayBufferTag3] = cloneableTags[dataViewTag4] = cloneableTags[boolTag3] = cloneableTags[dateTag3] = cloneableTags[float32Tag2] = cloneableTags[float64Tag2] = cloneableTags[int8Tag2] = cloneableTags[int16Tag2] = cloneableTags[int32Tag2] = cloneableTags[mapTag4] = cloneableTags[numberTag4] = cloneableTags[objectTag4] = cloneableTags[regexpTag3] = cloneableTags[setTag4] = cloneableTags[stringTag3] = cloneableTags[symbolTag3] = cloneableTags[uint8Tag2] = cloneableTags[uint8ClampedTag2] = cloneableTags[uint16Tag2] = cloneableTags[uint32Tag2] = true; + cloneableTags[errorTag3] = cloneableTags[funcTag3] = cloneableTags[weakMapTag3] = false; var deburredLetters = { + // Latin-1 Supplement block. "\xC0": "A", "\xC1": "A", "\xC2": "A", @@ -6874,6 +6947,7 @@ "\xDE": "Th", "\xFE": "th", "\xDF": "ss", + // Latin Extended-A block. "\u0100": "A", "\u0102": "A", "\u0104": "A", @@ -7029,21 +7103,21 @@ var freeGlobal2 = typeof global == "object" && global && global.Object === Object && global; var freeSelf2 = typeof self == "object" && self && self.Object === Object && self; var root3 = freeGlobal2 || freeSelf2 || Function("return this")(); - var freeExports = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2; - var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2; - var moduleExports = freeModule && freeModule.exports === freeExports; - var freeProcess = moduleExports && freeGlobal2.process; - var nodeUtil = function() { + var freeExports3 = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2; + var freeModule3 = freeExports3 && typeof module2 == "object" && module2 && !module2.nodeType && module2; + var moduleExports3 = freeModule3 && freeModule3.exports === freeExports3; + var freeProcess2 = moduleExports3 && freeGlobal2.process; + var nodeUtil2 = function() { try { - var types = freeModule && freeModule.require && freeModule.require("util").types; + var types = freeModule3 && freeModule3.require && freeModule3.require("util").types; if (types) { return types; } - return freeProcess && freeProcess.binding && freeProcess.binding("util"); - } catch (e) { + return freeProcess2 && freeProcess2.binding && freeProcess2.binding("util"); + } catch (e3) { } }(); - var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + var nodeIsArrayBuffer = nodeUtil2 && nodeUtil2.isArrayBuffer, nodeIsDate = nodeUtil2 && nodeUtil2.isDate, nodeIsMap = nodeUtil2 && nodeUtil2.isMap, nodeIsRegExp = nodeUtil2 && nodeUtil2.isRegExp, nodeIsSet = nodeUtil2 && nodeUtil2.isSet, nodeIsTypedArray2 = nodeUtil2 && nodeUtil2.isTypedArray; function apply(func, thisArg, args) { switch (args.length) { case 0: @@ -7092,7 +7166,7 @@ } return true; } - function arrayFilter(array2, predicate) { + function arrayFilter2(array2, predicate) { var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = []; while (++index < length) { var value = array2[index]; @@ -7122,7 +7196,7 @@ } return result; } - function arrayPush(array2, values) { + function arrayPush2(array2, values) { var index = -1, length = values.length, offset = array2.length; while (++index < length) { array2[offset + index] = values[index]; @@ -7149,7 +7223,7 @@ } return accumulator; } - function arraySome(array2, predicate) { + function arraySome2(array2, predicate) { var index = -1, length = array2 == null ? 0 : array2.length; while (++index < length) { if (predicate(array2[index], index, array2)) { @@ -7237,9 +7311,9 @@ } return result; } - function baseTimes(n2, iteratee) { - var index = -1, result = Array(n2); - while (++index < n2) { + function baseTimes2(n3, iteratee) { + var index = -1, result = Array(n3); + while (++index < n3) { result[index] = iteratee(index); } return result; @@ -7252,7 +7326,7 @@ function baseTrim2(string) { return string ? string.slice(0, trimmedEndIndex2(string) + 1).replace(reTrimStart2, "") : string; } - function baseUnary(func) { + function baseUnary2(func) { return function(value) { return func(value); }; @@ -7262,7 +7336,7 @@ return object[key]; }); } - function cacheHas(cache, key) { + function cacheHas2(cache, key) { return cache.has(key); } function charsStartIndex(strSymbols, chrSymbols) { @@ -7291,7 +7365,7 @@ function escapeStringChar(chr) { return "\\" + stringEscapes[chr]; } - function getValue(object, key) { + function getValue2(object, key) { return object == null ? undefined2 : object[key]; } function hasUnicode(string) { @@ -7307,14 +7381,14 @@ } return result; } - function mapToArray(map2) { + function mapToArray2(map2) { var index = -1, result = Array(map2.size); map2.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } - function overArg(func, transform2) { + function overArg2(func, transform2) { return function(arg) { return func(transform2(arg)); }; @@ -7330,7 +7404,7 @@ } return result; } - function setToArray(set3) { + function setToArray2(set3) { var index = -1, result = Array(set3.size); set3.forEach(function(value) { result[++index] = value; @@ -7389,45 +7463,45 @@ return string.match(reUnicodeWord) || []; } var runInContext = function runInContext2(context) { - context = context == null ? root3 : _.defaults(root3.Object(), context, _.pick(root3, contextProps)); + context = context == null ? root3 : _2.defaults(root3.Object(), context, _2.pick(root3, contextProps)); var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError; - var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto3 = Object2.prototype; - var coreJsData = context["__core-js_shared__"]; - var funcToString = funcProto.toString; - var hasOwnProperty2 = objectProto3.hasOwnProperty; + var arrayProto2 = Array2.prototype, funcProto3 = Function2.prototype, objectProto13 = Object2.prototype; + var coreJsData2 = context["__core-js_shared__"]; + var funcToString3 = funcProto3.toString; + var hasOwnProperty10 = objectProto13.hasOwnProperty; var idCounter = 0; - var maskSrcKey = function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); + var maskSrcKey2 = function() { + var uid = /[^.]+$/.exec(coreJsData2 && coreJsData2.keys && coreJsData2.keys.IE_PROTO || ""); return uid ? "Symbol(src)_1." + uid : ""; }(); - var nativeObjectToString3 = objectProto3.toString; - var objectCtorString = funcToString.call(Object2); + var nativeObjectToString3 = objectProto13.toString; + var objectCtorString = funcToString3.call(Object2); var oldDash = root3._; - var reIsNative = RegExp2( - "^" + funcToString.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" + var reIsNative2 = RegExp2( + "^" + funcToString3.call(hasOwnProperty10).replace(reRegExpChar2, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" ); - var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol3 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto3.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol3 ? Symbol3.isConcatSpreadable : undefined2, symIterator = Symbol3 ? Symbol3.iterator : undefined2, symToStringTag3 = Symbol3 ? Symbol3.toStringTag : undefined2; + var Buffer3 = moduleExports3 ? context.Buffer : undefined2, Symbol3 = context.Symbol, Uint8Array3 = context.Uint8Array, allocUnsafe = Buffer3 ? Buffer3.allocUnsafe : undefined2, getPrototype = overArg2(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable3 = objectProto13.propertyIsEnumerable, splice2 = arrayProto2.splice, spreadableSymbol = Symbol3 ? Symbol3.isConcatSpreadable : undefined2, symIterator = Symbol3 ? Symbol3.iterator : undefined2, symToStringTag3 = Symbol3 ? Symbol3.toStringTag : undefined2; var defineProperty = function() { try { - var func = getNative(Object2, "defineProperty"); + var func = getNative2(Object2, "defineProperty"); func({}, "", {}); return func; - } catch (e) { + } catch (e3) { } }(); var ctxClearTimeout = context.clearTimeout !== root3.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root3.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root3.setTimeout && context.setTimeout; - var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax2 = Math2.max, nativeMin2 = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse; - var DataView2 = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create"); - var metaMap = WeakMap && new WeakMap(); + var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols2 = Object2.getOwnPropertySymbols, nativeIsBuffer2 = Buffer3 ? Buffer3.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto2.join, nativeKeys2 = overArg2(Object2.keys, Object2), nativeMax2 = Math2.max, nativeMin2 = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto2.reverse; + var DataView3 = getNative2(context, "DataView"), Map3 = getNative2(context, "Map"), Promise3 = getNative2(context, "Promise"), Set3 = getNative2(context, "Set"), WeakMap2 = getNative2(context, "WeakMap"), nativeCreate2 = getNative2(Object2, "create"); + var metaMap = WeakMap2 && new WeakMap2(); var realNames = {}; - var dataViewCtorString = toSource(DataView2), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap); - var symbolProto2 = Symbol3 ? Symbol3.prototype : undefined2, symbolValueOf = symbolProto2 ? symbolProto2.valueOf : undefined2, symbolToString2 = symbolProto2 ? symbolProto2.toString : undefined2; + var dataViewCtorString2 = toSource2(DataView3), mapCtorString2 = toSource2(Map3), promiseCtorString2 = toSource2(Promise3), setCtorString2 = toSource2(Set3), weakMapCtorString2 = toSource2(WeakMap2); + var symbolProto3 = Symbol3 ? Symbol3.prototype : undefined2, symbolValueOf2 = symbolProto3 ? symbolProto3.valueOf : undefined2, symbolToString2 = symbolProto3 ? symbolProto3.toString : undefined2; function lodash(value) { if (isObjectLike2(value) && !isArray2(value) && !(value instanceof LazyWrapper)) { if (value instanceof LodashWrapper) { return value; } - if (hasOwnProperty2.call(value, "__wrapped__")) { + if (hasOwnProperty10.call(value, "__wrapped__")) { return wrapperClone(value); } } @@ -7437,7 +7511,7 @@ function object() { } return function(proto) { - if (!isObject2(proto)) { + if (!isObject3(proto)) { return {}; } if (objectCreate) { @@ -7459,11 +7533,47 @@ this.__values__ = undefined2; } lodash.templateSettings = { + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ "escape": reEscape, + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ "evaluate": reEvaluate, + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ "interpolate": reInterpolate, + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ "variable": "", + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ "imports": { + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ "_": lodash } }; @@ -7512,11 +7622,11 @@ index += dir; var iterIndex = -1, value = array2[index]; while (++iterIndex < iterLength) { - var data = iteratees[iterIndex], iteratee2 = data.iteratee, type3 = data.type, computed = iteratee2(value); - if (type3 == LAZY_MAP_FLAG) { + var data = iteratees[iterIndex], iteratee2 = data.iteratee, type2 = data.type, computed = iteratee2(value); + if (type2 == LAZY_MAP_FLAG) { value = computed; } else if (!computed) { - if (type3 == LAZY_FILTER_FLAG) { + if (type2 == LAZY_FILTER_FLAG) { continue outer; } else { break outer; @@ -7529,7 +7639,7 @@ } LazyWrapper.prototype = baseCreate(baseLodash.prototype); LazyWrapper.prototype.constructor = LazyWrapper; - function Hash(entries) { + function Hash2(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { @@ -7537,39 +7647,39 @@ this.set(entry[0], entry[1]); } } - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; + function hashClear2() { + this.__data__ = nativeCreate2 ? nativeCreate2(null) : {}; this.size = 0; } - function hashDelete(key) { + function hashDelete2(key) { var result2 = this.has(key) && delete this.__data__[key]; this.size -= result2 ? 1 : 0; return result2; } - function hashGet(key) { + function hashGet2(key) { var data = this.__data__; - if (nativeCreate) { + if (nativeCreate2) { var result2 = data[key]; - return result2 === HASH_UNDEFINED ? undefined2 : result2; + return result2 === HASH_UNDEFINED4 ? undefined2 : result2; } - return hasOwnProperty2.call(data, key) ? data[key] : undefined2; + return hasOwnProperty10.call(data, key) ? data[key] : undefined2; } - function hashHas(key) { + function hashHas2(key) { var data = this.__data__; - return nativeCreate ? data[key] !== undefined2 : hasOwnProperty2.call(data, key); + return nativeCreate2 ? data[key] !== undefined2 : hasOwnProperty10.call(data, key); } - function hashSet(key, value) { + function hashSet2(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; - data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value; + data[key] = nativeCreate2 && value === undefined2 ? HASH_UNDEFINED4 : value; return this; } - Hash.prototype.clear = hashClear; - Hash.prototype["delete"] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - function ListCache(entries) { + Hash2.prototype.clear = hashClear2; + Hash2.prototype["delete"] = hashDelete2; + Hash2.prototype.get = hashGet2; + Hash2.prototype.has = hashHas2; + Hash2.prototype.set = hashSet2; + function ListCache2(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { @@ -7577,12 +7687,12 @@ this.set(entry[0], entry[1]); } } - function listCacheClear() { + function listCacheClear2() { this.__data__ = []; this.size = 0; } - function listCacheDelete(key) { - var data = this.__data__, index = assocIndexOf(data, key); + function listCacheDelete2(key) { + var data = this.__data__, index = assocIndexOf2(data, key); if (index < 0) { return false; } @@ -7590,20 +7700,20 @@ if (index == lastIndex) { data.pop(); } else { - splice.call(data, index, 1); + splice2.call(data, index, 1); } --this.size; return true; } - function listCacheGet(key) { - var data = this.__data__, index = assocIndexOf(data, key); + function listCacheGet2(key) { + var data = this.__data__, index = assocIndexOf2(data, key); return index < 0 ? undefined2 : data[index][1]; } - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; + function listCacheHas2(key) { + return assocIndexOf2(this.__data__, key) > -1; } - function listCacheSet(key, value) { - var data = this.__data__, index = assocIndexOf(data, key); + function listCacheSet2(key, value) { + var data = this.__data__, index = assocIndexOf2(data, key); if (index < 0) { ++this.size; data.push([key, value]); @@ -7612,12 +7722,12 @@ } return this; } - ListCache.prototype.clear = listCacheClear; - ListCache.prototype["delete"] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; - function MapCache(entries) { + ListCache2.prototype.clear = listCacheClear2; + ListCache2.prototype["delete"] = listCacheDelete2; + ListCache2.prototype.get = listCacheGet2; + ListCache2.prototype.has = listCacheHas2; + ListCache2.prototype.set = listCacheSet2; + function MapCache2(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { @@ -7625,95 +7735,99 @@ this.set(entry[0], entry[1]); } } - function mapCacheClear() { + function mapCacheClear2() { this.size = 0; this.__data__ = { - "hash": new Hash(), - "map": new (Map2 || ListCache)(), - "string": new Hash() + "hash": new Hash2(), + "map": new (Map3 || ListCache2)(), + "string": new Hash2() }; } - function mapCacheDelete(key) { - var result2 = getMapData(this, key)["delete"](key); + function mapCacheDelete2(key) { + var result2 = getMapData2(this, key)["delete"](key); this.size -= result2 ? 1 : 0; return result2; } - function mapCacheGet(key) { - return getMapData(this, key).get(key); + function mapCacheGet2(key) { + return getMapData2(this, key).get(key); } - function mapCacheHas(key) { - return getMapData(this, key).has(key); + function mapCacheHas2(key) { + return getMapData2(this, key).has(key); } - function mapCacheSet(key, value) { - var data = getMapData(this, key), size2 = data.size; + function mapCacheSet2(key, value) { + var data = getMapData2(this, key), size2 = data.size; data.set(key, value); this.size += data.size == size2 ? 0 : 1; return this; } - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype["delete"] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; - function SetCache(values2) { + MapCache2.prototype.clear = mapCacheClear2; + MapCache2.prototype["delete"] = mapCacheDelete2; + MapCache2.prototype.get = mapCacheGet2; + MapCache2.prototype.has = mapCacheHas2; + MapCache2.prototype.set = mapCacheSet2; + function SetCache2(values2) { var index = -1, length = values2 == null ? 0 : values2.length; - this.__data__ = new MapCache(); + this.__data__ = new MapCache2(); while (++index < length) { this.add(values2[index]); } } - function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); + function setCacheAdd2(value) { + this.__data__.set(value, HASH_UNDEFINED4); return this; } - function setCacheHas(value) { + function setCacheHas2(value) { return this.__data__.has(value); } - SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; - SetCache.prototype.has = setCacheHas; - function Stack(entries) { - var data = this.__data__ = new ListCache(entries); + SetCache2.prototype.add = SetCache2.prototype.push = setCacheAdd2; + SetCache2.prototype.has = setCacheHas2; + function Stack2(entries) { + var data = this.__data__ = new ListCache2(entries); this.size = data.size; } - function stackClear() { - this.__data__ = new ListCache(); + function stackClear2() { + this.__data__ = new ListCache2(); this.size = 0; } - function stackDelete(key) { + function stackDelete2(key) { var data = this.__data__, result2 = data["delete"](key); this.size = data.size; return result2; } - function stackGet(key) { + function stackGet2(key) { return this.__data__.get(key); } - function stackHas(key) { + function stackHas2(key) { return this.__data__.has(key); } - function stackSet(key, value) { + function stackSet2(key, value) { var data = this.__data__; - if (data instanceof ListCache) { - var pairs = data.__data__; - if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) { - pairs.push([key, value]); + if (data instanceof ListCache2) { + var pairs2 = data.__data__; + if (!Map3 || pairs2.length < LARGE_ARRAY_SIZE2 - 1) { + pairs2.push([key, value]); this.size = ++data.size; return this; } - data = this.__data__ = new MapCache(pairs); + data = this.__data__ = new MapCache2(pairs2); } data.set(key, value); this.size = data.size; return this; } - Stack.prototype.clear = stackClear; - Stack.prototype["delete"] = stackDelete; - Stack.prototype.get = stackGet; - Stack.prototype.has = stackHas; - Stack.prototype.set = stackSet; - function arrayLikeKeys(value, inherited) { - var isArr = isArray2(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length; + Stack2.prototype.clear = stackClear2; + Stack2.prototype["delete"] = stackDelete2; + Stack2.prototype.get = stackGet2; + Stack2.prototype.has = stackHas2; + Stack2.prototype.set = stackSet2; + function arrayLikeKeys2(value, inherited) { + var isArr = isArray2(value), isArg = !isArr && isArguments2(value), isBuff = !isArr && !isArg && isBuffer2(value), isType = !isArr && !isArg && !isBuff && isTypedArray2(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes2(value.length, String2) : [], length = result2.length; for (var key in value) { - if ((inherited || hasOwnProperty2.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) { + if ((inherited || hasOwnProperty10.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. + (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. + isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. + isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties. + isIndex2(key, length)))) { result2.push(key); } } @@ -7723,27 +7837,27 @@ var length = array2.length; return length ? array2[baseRandom(0, length - 1)] : undefined2; } - function arraySampleSize(array2, n2) { - return shuffleSelf(copyArray(array2), baseClamp(n2, 0, array2.length)); + function arraySampleSize(array2, n3) { + return shuffleSelf(copyArray(array2), baseClamp(n3, 0, array2.length)); } function arrayShuffle(array2) { return shuffleSelf(copyArray(array2)); } function assignMergeValue(object, key, value) { - if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) { + if (value !== undefined2 && !eq2(object[key], value) || value === undefined2 && !(key in object)) { baseAssignValue(object, key, value); } } function assignValue(object, key, value) { var objValue = object[key]; - if (!(hasOwnProperty2.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) { + if (!(hasOwnProperty10.call(object, key) && eq2(objValue, value)) || value === undefined2 && !(key in object)) { baseAssignValue(object, key, value); } } - function assocIndexOf(array2, key) { + function assocIndexOf2(array2, key) { var length = array2.length; while (length--) { - if (eq(array2[length][0], key)) { + if (eq2(array2[length][0], key)) { return length; } } @@ -7756,7 +7870,7 @@ return accumulator; } function baseAssign(object, source) { - return object && copyObject(source, keys(source), object); + return object && copyObject(source, keys2(source), object); } function baseAssignIn(object, source) { return object && copyObject(source, keysIn(source), object); @@ -7799,7 +7913,7 @@ if (result2 !== undefined2) { return result2; } - if (!isObject2(value)) { + if (!isObject3(value)) { return value; } var isArr = isArray2(value); @@ -7809,11 +7923,11 @@ return copyArray(value, result2); } } else { - var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; - if (isBuffer(value)) { + var tag = getTag2(value), isFunc = tag == funcTag3 || tag == genTag2; + if (isBuffer2(value)) { return cloneBuffer(value, isDeep); } - if (tag == objectTag || tag == argsTag || isFunc && !object) { + if (tag == objectTag4 || tag == argsTag4 || isFunc && !object) { result2 = isFlat || isFunc ? {} : initCloneObject(value); if (!isDeep) { return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value)); @@ -7825,7 +7939,7 @@ result2 = initCloneByTag(value, tag, isDeep); } } - stack || (stack = new Stack()); + stack || (stack = new Stack2()); var stacked = stack.get(value); if (stacked) { return stacked; @@ -7840,7 +7954,7 @@ result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); }); } - var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys; + var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys2 : isFlat ? keysIn : keys2; var props = isArr ? undefined2 : keysFunc(value); arrayEach(props || value, function(subValue, key2) { if (props) { @@ -7852,7 +7966,7 @@ return result2; } function baseConforms(source) { - var props = keys(source); + var props = keys2(source); return function(object) { return baseConformsTo(object, source, props); }; @@ -7885,15 +7999,15 @@ return result2; } if (iteratee2) { - values2 = arrayMap2(values2, baseUnary(iteratee2)); + values2 = arrayMap2(values2, baseUnary2(iteratee2)); } if (comparator) { includes2 = arrayIncludesWith; isCommon = false; - } else if (values2.length >= LARGE_ARRAY_SIZE) { - includes2 = cacheHas; + } else if (values2.length >= LARGE_ARRAY_SIZE2) { + includes2 = cacheHas2; isCommon = false; - values2 = new SetCache(values2); + values2 = new SetCache2(values2); } outer: while (++index < length) { @@ -7968,7 +8082,7 @@ if (depth > 1) { baseFlatten(value, depth - 1, predicate, isStrict, result2); } else { - arrayPush(result2, value); + arrayPush2(result2, value); } } else if (!isStrict) { result2[result2.length] = value; @@ -7979,14 +8093,14 @@ var baseFor = createBaseFor(); var baseForRight = createBaseFor(true); function baseForOwn(object, iteratee2) { - return object && baseFor(object, iteratee2, keys); + return object && baseFor(object, iteratee2, keys2); } function baseForOwnRight(object, iteratee2) { - return object && baseForRight(object, iteratee2, keys); + return object && baseForRight(object, iteratee2, keys2); } function baseFunctions(object, props) { - return arrayFilter(props, function(key) { - return isFunction(object[key]); + return arrayFilter2(props, function(key) { + return isFunction2(object[key]); }); } function baseGet(object, path) { @@ -7997,9 +8111,9 @@ } return index && index == length ? object : undefined2; } - function baseGetAllKeys(object, keysFunc, symbolsFunc) { + function baseGetAllKeys2(object, keysFunc, symbolsFunc) { var result2 = keysFunc(object); - return isArray2(object) ? result2 : arrayPush(result2, symbolsFunc(object)); + return isArray2(object) ? result2 : arrayPush2(result2, symbolsFunc(object)); } function baseGetTag2(value) { if (value == null) { @@ -8011,7 +8125,7 @@ return value > other; } function baseHas(object, key) { - return object != null && hasOwnProperty2.call(object, key); + return object != null && hasOwnProperty10.call(object, key); } function baseHasIn(object, key) { return object != null && key in Object2(object); @@ -8024,10 +8138,10 @@ while (othIndex--) { var array2 = arrays[othIndex]; if (othIndex && iteratee2) { - array2 = arrayMap2(array2, baseUnary(iteratee2)); + array2 = arrayMap2(array2, baseUnary2(iteratee2)); } maxLength = nativeMin2(array2.length, maxLength); - caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array2.length >= 120) ? new SetCache(othIndex && array2) : undefined2; + caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array2.length >= 120) ? new SetCache2(othIndex && array2) : undefined2; } array2 = arrays[0]; var index = -1, seen = caches[0]; @@ -8035,11 +8149,11 @@ while (++index < length && result2.length < maxLength) { var value = array2[index], computed = iteratee2 ? iteratee2(value) : value; value = comparator || value !== 0 ? value : 0; - if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) { + if (!(seen ? cacheHas2(seen, computed) : includes2(result2, computed, comparator))) { othIndex = othLength; while (--othIndex) { var cache = caches[othIndex]; - if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) { + if (!(cache ? cacheHas2(cache, computed) : includes2(arrays[othIndex], computed, comparator))) { continue outer; } } @@ -8063,56 +8177,56 @@ var func = object == null ? object : object[toKey(last(path))]; return func == null ? undefined2 : apply(func, object, args); } - function baseIsArguments(value) { - return isObjectLike2(value) && baseGetTag2(value) == argsTag; + function baseIsArguments2(value) { + return isObjectLike2(value) && baseGetTag2(value) == argsTag4; } function baseIsArrayBuffer(value) { - return isObjectLike2(value) && baseGetTag2(value) == arrayBufferTag; + return isObjectLike2(value) && baseGetTag2(value) == arrayBufferTag3; } function baseIsDate(value) { - return isObjectLike2(value) && baseGetTag2(value) == dateTag; + return isObjectLike2(value) && baseGetTag2(value) == dateTag3; } - function baseIsEqual(value, other, bitmask, customizer, stack) { + function baseIsEqual2(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || !isObjectLike2(value) && !isObjectLike2(other)) { return value !== value && other !== other; } - return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + return baseIsEqualDeep2(value, other, bitmask, customizer, baseIsEqual2, stack); } - function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; - var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; - if (isSameTag && isBuffer(object)) { - if (!isBuffer(other)) { + function baseIsEqualDeep2(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag3 : getTag2(object), othTag = othIsArr ? arrayTag3 : getTag2(other); + objTag = objTag == argsTag4 ? objectTag4 : objTag; + othTag = othTag == argsTag4 ? objectTag4 : othTag; + var objIsObj = objTag == objectTag4, othIsObj = othTag == objectTag4, isSameTag = objTag == othTag; + if (isSameTag && isBuffer2(object)) { + if (!isBuffer2(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { - stack || (stack = new Stack()); - return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + stack || (stack = new Stack2()); + return objIsArr || isTypedArray2(object) ? equalArrays2(object, other, bitmask, customizer, equalFunc, stack) : equalByTag2(object, other, objTag, bitmask, customizer, equalFunc, stack); } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = objIsObj && hasOwnProperty2.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty2.call(other, "__wrapped__"); + if (!(bitmask & COMPARE_PARTIAL_FLAG5)) { + var objIsWrapped = objIsObj && hasOwnProperty10.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty10.call(other, "__wrapped__"); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; - stack || (stack = new Stack()); + stack || (stack = new Stack2()); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } - stack || (stack = new Stack()); - return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + stack || (stack = new Stack2()); + return equalObjects2(object, other, bitmask, customizer, equalFunc, stack); } function baseIsMap(value) { - return isObjectLike2(value) && getTag(value) == mapTag; + return isObjectLike2(value) && getTag2(value) == mapTag4; } function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; @@ -8134,32 +8248,32 @@ return false; } } else { - var stack = new Stack(); + var stack = new Stack2(); if (customizer) { var result2 = customizer(objValue, srcValue, key, object, source, stack); } - if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) { + if (!(result2 === undefined2 ? baseIsEqual2(srcValue, objValue, COMPARE_PARTIAL_FLAG5 | COMPARE_UNORDERED_FLAG3, customizer, stack) : result2)) { return false; } } } return true; } - function baseIsNative(value) { - if (!isObject2(value) || isMasked(value)) { + function baseIsNative2(value) { + if (!isObject3(value) || isMasked2(value)) { return false; } - var pattern = isFunction(value) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); + var pattern = isFunction2(value) ? reIsNative2 : reIsHostCtor2; + return pattern.test(toSource2(value)); } function baseIsRegExp(value) { - return isObjectLike2(value) && baseGetTag2(value) == regexpTag; + return isObjectLike2(value) && baseGetTag2(value) == regexpTag3; } function baseIsSet(value) { - return isObjectLike2(value) && getTag(value) == setTag; + return isObjectLike2(value) && getTag2(value) == setTag4; } - function baseIsTypedArray(value) { - return isObjectLike2(value) && isLength(value.length) && !!typedArrayTags[baseGetTag2(value)]; + function baseIsTypedArray2(value) { + return isObjectLike2(value) && isLength2(value.length) && !!typedArrayTags2[baseGetTag2(value)]; } function baseIteratee(value) { if (typeof value == "function") { @@ -8173,25 +8287,25 @@ } return property(value); } - function baseKeys(object) { - if (!isPrototype(object)) { - return nativeKeys(object); + function baseKeys2(object) { + if (!isPrototype2(object)) { + return nativeKeys2(object); } var result2 = []; for (var key in Object2(object)) { - if (hasOwnProperty2.call(object, key) && key != "constructor") { + if (hasOwnProperty10.call(object, key) && key != "constructor") { result2.push(key); } } return result2; } function baseKeysIn(object) { - if (!isObject2(object)) { + if (!isObject3(object)) { return nativeKeysIn(object); } - var isProto = isPrototype(object), result2 = []; + var isProto = isPrototype2(object), result2 = []; for (var key in object) { - if (!(key == "constructor" && (isProto || !hasOwnProperty2.call(object, key)))) { + if (!(key == "constructor" && (isProto || !hasOwnProperty10.call(object, key)))) { result2.push(key); } } @@ -8201,7 +8315,7 @@ return value < other; } function baseMap(collection, iteratee2) { - var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : []; + var index = -1, result2 = isArrayLike2(collection) ? Array2(collection.length) : []; baseEach(collection, function(value, key, collection2) { result2[++index] = iteratee2(value, key, collection2); }); @@ -8222,7 +8336,7 @@ } return function(object) { var objValue = get4(object, path); - return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual2(srcValue, objValue, COMPARE_PARTIAL_FLAG5 | COMPARE_UNORDERED_FLAG3); }; } function baseMerge(object, source, srcIndex, customizer, stack) { @@ -8230,8 +8344,8 @@ return; } baseFor(source, function(srcValue, key) { - stack || (stack = new Stack()); - if (isObject2(srcValue)) { + stack || (stack = new Stack2()); + if (isObject3(srcValue)) { baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); } else { var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2; @@ -8251,7 +8365,7 @@ var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2; var isCommon = newValue === undefined2; if (isCommon) { - var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); + var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer2(srcValue), isTyped = !isArr && !isBuff && isTypedArray2(srcValue); newValue = srcValue; if (isArr || isBuff || isTyped) { if (isArray2(objValue)) { @@ -8267,11 +8381,11 @@ } else { newValue = []; } - } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + } else if (isPlainObject(srcValue) || isArguments2(srcValue)) { newValue = objValue; - if (isArguments(objValue)) { + if (isArguments2(objValue)) { newValue = toPlainObject(objValue); - } else if (!isObject2(objValue) || isFunction(objValue)) { + } else if (!isObject3(objValue) || isFunction2(objValue)) { newValue = initCloneObject(srcValue); } } else { @@ -8285,13 +8399,13 @@ } assignMergeValue(object, key, newValue); } - function baseNth(array2, n2) { + function baseNth(array2, n3) { var length = array2.length; if (!length) { return; } - n2 += n2 < 0 ? length : 0; - return isIndex(n2, length) ? array2[n2] : undefined2; + n3 += n3 < 0 ? length : 0; + return isIndex2(n3, length) ? array2[n3] : undefined2; } function baseOrderBy(collection, iteratees, orders) { if (iteratees.length) { @@ -8307,7 +8421,7 @@ iteratees = [identity4]; } var index = -1; - iteratees = arrayMap2(iteratees, baseUnary(getIteratee())); + iteratees = arrayMap2(iteratees, baseUnary2(getIteratee())); var result2 = baseMap(collection, function(value, key, collection2) { var criteria = arrayMap2(iteratees, function(iteratee2) { return iteratee2(value); @@ -8344,15 +8458,15 @@ values2 = copyArray(values2); } if (iteratee2) { - seen = arrayMap2(array2, baseUnary(iteratee2)); + seen = arrayMap2(array2, baseUnary2(iteratee2)); } while (++index < length) { var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value; while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) { if (seen !== array2) { - splice.call(seen, fromIndex, 1); + splice2.call(seen, fromIndex, 1); } - splice.call(array2, fromIndex, 1); + splice2.call(array2, fromIndex, 1); } } return array2; @@ -8363,8 +8477,8 @@ var index = indexes[length]; if (length == lastIndex || index !== previous) { var previous = index; - if (isIndex(index)) { - splice.call(array2, index, 1); + if (isIndex2(index)) { + splice2.call(array2, index, 1); } else { baseUnset(array2, index); } @@ -8383,20 +8497,20 @@ } return result2; } - function baseRepeat(string, n2) { + function baseRepeat(string, n3) { var result2 = ""; - if (!string || n2 < 1 || n2 > MAX_SAFE_INTEGER) { + if (!string || n3 < 1 || n3 > MAX_SAFE_INTEGER3) { return result2; } do { - if (n2 % 2) { + if (n3 % 2) { result2 += string; } - n2 = nativeFloor(n2 / 2); - if (n2) { + n3 = nativeFloor(n3 / 2); + if (n3) { string += string; } - } while (n2); + } while (n3); return result2; } function baseRest(func, start2) { @@ -8405,12 +8519,12 @@ function baseSample(collection) { return arraySample(values(collection)); } - function baseSampleSize(collection, n2) { + function baseSampleSize(collection, n3) { var array2 = values(collection); - return shuffleSelf(array2, baseClamp(n2, 0, array2.length)); + return shuffleSelf(array2, baseClamp(n3, 0, array2.length)); } function baseSet(object, path, value, customizer) { - if (!isObject2(object)) { + if (!isObject3(object)) { return object; } path = castPath(path, object); @@ -8424,7 +8538,7 @@ var objValue = nested[key]; newValue = customizer ? customizer(objValue, key, nested) : undefined2; if (newValue === undefined2) { - newValue = isObject2(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; + newValue = isObject3(objValue) ? objValue : isIndex2(path[index + 1]) ? [] : {}; } } assignValue(nested, key, newValue); @@ -8521,7 +8635,7 @@ var index = -1, length = array2.length, resIndex = 0, result2 = []; while (++index < length) { var value = array2[index], computed = iteratee2 ? iteratee2(value) : value; - if (!index || !eq(computed, seen)) { + if (!index || !eq2(computed, seen)) { var seen = computed; result2[resIndex++] = value === 0 ? 0 : value; } @@ -8555,14 +8669,14 @@ if (comparator) { isCommon = false; includes2 = arrayIncludesWith; - } else if (length >= LARGE_ARRAY_SIZE) { + } else if (length >= LARGE_ARRAY_SIZE2) { var set4 = iteratee2 ? null : createSet(array2); if (set4) { - return setToArray(set4); + return setToArray2(set4); } isCommon = false; - includes2 = cacheHas; - seen = new SetCache(); + includes2 = cacheHas2; + seen = new SetCache2(); } else { seen = iteratee2 ? [] : result2; } @@ -8610,7 +8724,7 @@ result2 = result2.value(); } return arrayReduce(actions, function(result3, action) { - return action.func.apply(action.thisArg, arrayPush([result3], action.args)); + return action.func.apply(action.thisArg, arrayPush2([result3], action.args)); }, result2); } function baseXor(arrays, iteratee2, comparator) { @@ -8668,7 +8782,7 @@ } function cloneArrayBuffer(arrayBuffer) { var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength); - new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer)); + new Uint8Array3(result2).set(new Uint8Array3(arrayBuffer)); return result2; } function cloneDataView(dataView, isDeep) { @@ -8681,7 +8795,7 @@ return result2; } function cloneSymbol(symbol) { - return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {}; + return symbolValueOf2 ? Object2(symbolValueOf2.call(symbol)) : {}; } function cloneTypedArray(typedArray, isDeep) { var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; @@ -8772,7 +8886,7 @@ return object; } function copySymbols(source, object) { - return copyObject(source, getSymbols(source), object); + return copyObject(source, getSymbols2(source), object); } function copySymbolsIn(source, object) { return copyObject(source, getSymbolsIn(source), object); @@ -8806,7 +8920,7 @@ if (collection == null) { return collection; } - if (!isArrayLike(collection)) { + if (!isArrayLike2(collection)) { return eachFunc(collection, iteratee2); } var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection); @@ -8874,7 +8988,7 @@ return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); } var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args); - return isObject2(result2) ? result2 : thisBinding; + return isObject3(result2) ? result2 : thisBinding; }; } function createCurry(func, bitmask, arity) { @@ -8908,9 +9022,9 @@ function createFind(findIndexFunc) { return function(collection, predicate, fromIndex) { var iterable = Object2(collection); - if (!isArrayLike(collection)) { + if (!isArrayLike2(collection)) { var iteratee2 = getIteratee(predicate, 3); - collection = keys(collection); + collection = keys2(collection); predicate = function(key) { return iteratee2(iterable[key], key, iterable); }; @@ -9038,7 +9152,7 @@ } function createOver(arrayFunc) { return flatRest(function(iteratees) { - iteratees = arrayMap2(iteratees, baseUnary(getIteratee())); + iteratees = arrayMap2(iteratees, baseUnary2(getIteratee())); return baseRest(function(args) { var thisArg = this; return arrayFunc(iteratees, function(iteratee2) { @@ -9089,8 +9203,8 @@ function createRelationalOperation(operator) { return function(value, other) { if (!(typeof value == "string" && typeof other == "string")) { - value = toNumber2(value); - other = toNumber2(other); + value = toNumber3(value); + other = toNumber3(other); } return operator(value, other); }; @@ -9124,26 +9238,26 @@ function createRound(methodName) { var func = Math2[methodName]; return function(number3, precision2) { - number3 = toNumber2(number3); + number3 = toNumber3(number3); precision2 = precision2 == null ? 0 : nativeMin2(toInteger(precision2), 292); if (precision2 && nativeIsFinite(number3)) { - var pair2 = (toString2(number3) + "e").split("e"), value = func(pair2[0] + "e" + (+pair2[1] + precision2)); - pair2 = (toString2(value) + "e").split("e"); - return +(pair2[0] + "e" + (+pair2[1] - precision2)); + var pair3 = (toString2(number3) + "e").split("e"), value = func(pair3[0] + "e" + (+pair3[1] + precision2)); + pair3 = (toString2(value) + "e").split("e"); + return +(pair3[0] + "e" + (+pair3[1] - precision2)); } return func(number3); }; } - var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY2) ? noop3 : function(values2) { - return new Set2(values2); + var createSet = !(Set3 && 1 / setToArray2(new Set3([, -0]))[1] == INFINITY2) ? noop3 : function(values2) { + return new Set3(values2); }; function createToPairs(keysFunc) { return function(object) { - var tag = getTag(object); - if (tag == mapTag) { - return mapToArray(object); + var tag = getTag2(object); + if (tag == mapTag4) { + return mapToArray2(object); } - if (tag == setTag) { + if (tag == setTag4) { return setToPairs(object); } return baseToPairs(object, keysFunc(object)); @@ -9204,13 +9318,13 @@ return setWrapToString(setter(result2, newData), func, bitmask); } function customDefaultsAssignIn(objValue, srcValue, key, object) { - if (objValue === undefined2 || eq(objValue, objectProto3[key]) && !hasOwnProperty2.call(object, key)) { + if (objValue === undefined2 || eq2(objValue, objectProto13[key]) && !hasOwnProperty10.call(object, key)) { return srcValue; } return objValue; } function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { - if (isObject2(objValue) && isObject2(srcValue)) { + if (isObject3(objValue) && isObject3(srcValue)) { stack.set(srcValue, objValue); baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack); stack["delete"](srcValue); @@ -9220,8 +9334,8 @@ function customOmitClone(value) { return isPlainObject(value) ? undefined2 : value; } - function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array2.length, othLength = other.length; + function equalArrays2(array2, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG5, arrLength = array2.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } @@ -9230,7 +9344,7 @@ if (arrStacked && othStacked) { return arrStacked == other && othStacked == array2; } - var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2; + var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG3 ? new SetCache2() : undefined2; stack.set(array2, other); stack.set(other, array2); while (++index < arrLength) { @@ -9246,8 +9360,8 @@ break; } if (seen) { - if (!arraySome(other, function(othValue2, othIndex) { - if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { + if (!arraySome2(other, function(othValue2, othIndex) { + if (!cacheHas2(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { @@ -9263,33 +9377,33 @@ stack["delete"](other); return result2; } - function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + function equalByTag2(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { - case dataViewTag: + case dataViewTag4: if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { return false; } object = object.buffer; other = other.buffer; - case arrayBufferTag: - if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) { + case arrayBufferTag3: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array3(object), new Uint8Array3(other))) { return false; } return true; - case boolTag: - case dateTag: - case numberTag: - return eq(+object, +other); - case errorTag: + case boolTag3: + case dateTag3: + case numberTag4: + return eq2(+object, +other); + case errorTag3: return object.name == other.name && object.message == other.message; - case regexpTag: - case stringTag: + case regexpTag3: + case stringTag3: return object == other + ""; - case mapTag: - var convert = mapToArray; - case setTag: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG; - convert || (convert = setToArray); + case mapTag4: + var convert = mapToArray2; + case setTag4: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG5; + convert || (convert = setToArray2); if (object.size != other.size && !isPartial) { return false; } @@ -9297,27 +9411,27 @@ if (stacked) { return stacked == other; } - bitmask |= COMPARE_UNORDERED_FLAG; + bitmask |= COMPARE_UNORDERED_FLAG3; stack.set(object, other); - var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + var result2 = equalArrays2(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack["delete"](object); return result2; - case symbolTag2: - if (symbolValueOf) { - return symbolValueOf.call(object) == symbolValueOf.call(other); + case symbolTag3: + if (symbolValueOf2) { + return symbolValueOf2.call(object) == symbolValueOf2.call(other); } } return false; } - function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; + function equalObjects2(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG5, objProps = getAllKeys2(object), objLength = objProps.length, othProps = getAllKeys2(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty2.call(other, key))) { + if (!(isPartial ? key in other : hasOwnProperty10.call(other, key))) { return false; } } @@ -9355,17 +9469,17 @@ function flatRest(func) { return setToString(overRest(func, undefined2, flatten2), func + ""); } - function getAllKeys(object) { - return baseGetAllKeys(object, keys, getSymbols); + function getAllKeys2(object) { + return baseGetAllKeys2(object, keys2, getSymbols2); } function getAllKeysIn(object) { - return baseGetAllKeys(object, keysIn, getSymbolsIn); + return baseGetAllKeys2(object, keysIn, getSymbolsIn); } var getData = !metaMap ? noop3 : function(func) { return metaMap.get(func); }; function getFuncName(func) { - var result2 = func.name + "", array2 = realNames[result2], length = hasOwnProperty2.call(realNames, result2) ? array2.length : 0; + var result2 = func.name + "", array2 = realNames[result2], length = hasOwnProperty10.call(realNames, result2) ? array2.length : 0; while (length--) { var data = array2[length], otherFunc = data.func; if (otherFunc == null || otherFunc == func) { @@ -9375,7 +9489,7 @@ return result2; } function getHolder(func) { - var object = hasOwnProperty2.call(lodash, "placeholder") ? lodash : func; + var object = hasOwnProperty10.call(lodash, "placeholder") ? lodash : func; return object.placeholder; } function getIteratee() { @@ -9383,28 +9497,28 @@ result2 = result2 === iteratee ? baseIteratee : result2; return arguments.length ? result2(arguments[0], arguments[1]) : result2; } - function getMapData(map3, key) { + function getMapData2(map3, key) { var data = map3.__data__; - return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + return isKeyable2(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; } function getMatchData(object) { - var result2 = keys(object), length = result2.length; + var result2 = keys2(object), length = result2.length; while (length--) { var key = result2[length], value = object[key]; result2[length] = [key, value, isStrictComparable(value)]; } return result2; } - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined2; + function getNative2(object, key) { + var value = getValue2(object, key); + return baseIsNative2(value) ? value : undefined2; } function getRawTag2(value) { - var isOwn = hasOwnProperty2.call(value, symToStringTag3), tag = value[symToStringTag3]; + var isOwn = hasOwnProperty10.call(value, symToStringTag3), tag = value[symToStringTag3]; try { value[symToStringTag3] = undefined2; var unmasked = true; - } catch (e) { + } catch (e3) { } var result2 = nativeObjectToString3.call(value); if (unmasked) { @@ -9416,39 +9530,39 @@ } return result2; } - var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + var getSymbols2 = !nativeGetSymbols2 ? stubArray2 : function(object) { if (object == null) { return []; } object = Object2(object); - return arrayFilter(nativeGetSymbols(object), function(symbol) { - return propertyIsEnumerable.call(object, symbol); + return arrayFilter2(nativeGetSymbols2(object), function(symbol) { + return propertyIsEnumerable3.call(object, symbol); }); }; - var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var getSymbolsIn = !nativeGetSymbols2 ? stubArray2 : function(object) { var result2 = []; while (object) { - arrayPush(result2, getSymbols(object)); + arrayPush2(result2, getSymbols2(object)); object = getPrototype(object); } return result2; }; - var getTag = baseGetTag2; - if (DataView2 && getTag(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { - getTag = function(value) { - var result2 = baseGetTag2(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : ""; + var getTag2 = baseGetTag2; + if (DataView3 && getTag2(new DataView3(new ArrayBuffer(1))) != dataViewTag4 || Map3 && getTag2(new Map3()) != mapTag4 || Promise3 && getTag2(Promise3.resolve()) != promiseTag2 || Set3 && getTag2(new Set3()) != setTag4 || WeakMap2 && getTag2(new WeakMap2()) != weakMapTag3) { + getTag2 = function(value) { + var result2 = baseGetTag2(value), Ctor = result2 == objectTag4 ? value.constructor : undefined2, ctorString = Ctor ? toSource2(Ctor) : ""; if (ctorString) { switch (ctorString) { - case dataViewCtorString: - return dataViewTag; - case mapCtorString: - return mapTag; - case promiseCtorString: - return promiseTag; - case setCtorString: - return setTag; - case weakMapCtorString: - return weakMapTag; + case dataViewCtorString2: + return dataViewTag4; + case mapCtorString2: + return mapTag4; + case promiseCtorString2: + return promiseTag2; + case setCtorString2: + return setTag4; + case weakMapCtorString2: + return weakMapTag3; } } return result2; @@ -9493,49 +9607,49 @@ return result2; } length = object == null ? 0 : object.length; - return !!length && isLength(length) && isIndex(key, length) && (isArray2(object) || isArguments(object)); + return !!length && isLength2(length) && isIndex2(key, length) && (isArray2(object) || isArguments2(object)); } function initCloneArray(array2) { var length = array2.length, result2 = new array2.constructor(length); - if (length && typeof array2[0] == "string" && hasOwnProperty2.call(array2, "index")) { + if (length && typeof array2[0] == "string" && hasOwnProperty10.call(array2, "index")) { result2.index = array2.index; result2.input = array2.input; } return result2; } function initCloneObject(object) { - return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; + return typeof object.constructor == "function" && !isPrototype2(object) ? baseCreate(getPrototype(object)) : {}; } function initCloneByTag(object, tag, isDeep) { var Ctor = object.constructor; switch (tag) { - case arrayBufferTag: + case arrayBufferTag3: return cloneArrayBuffer(object); - case boolTag: - case dateTag: + case boolTag3: + case dateTag3: return new Ctor(+object); - case dataViewTag: + case dataViewTag4: return cloneDataView(object, isDeep); - case float32Tag: - case float64Tag: - case int8Tag: - case int16Tag: - case int32Tag: - case uint8Tag: - case uint8ClampedTag: - case uint16Tag: - case uint32Tag: + case float32Tag2: + case float64Tag2: + case int8Tag2: + case int16Tag2: + case int32Tag2: + case uint8Tag2: + case uint8ClampedTag2: + case uint16Tag2: + case uint32Tag2: return cloneTypedArray(object, isDeep); - case mapTag: + case mapTag4: return new Ctor(); - case numberTag: - case stringTag: + case numberTag4: + case stringTag3: return new Ctor(object); - case regexpTag: + case regexpTag3: return cloneRegExp(object); - case setTag: + case setTag4: return new Ctor(); - case symbolTag2: + case symbolTag3: return cloneSymbol(object); } } @@ -9550,20 +9664,20 @@ return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n"); } function isFlattenable(value) { - return isArray2(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + return isArray2(value) || isArguments2(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); } - function isIndex(value, length) { - var type3 = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; - return !!length && (type3 == "number" || type3 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + function isIndex2(value, length) { + var type2 = typeof value; + length = length == null ? MAX_SAFE_INTEGER3 : length; + return !!length && (type2 == "number" || type2 != "symbol" && reIsUint2.test(value)) && (value > -1 && value % 1 == 0 && value < length); } function isIterateeCall(value, index, object) { - if (!isObject2(object)) { + if (!isObject3(object)) { return false; } - var type3 = typeof index; - if (type3 == "number" ? isArrayLike(object) && isIndex(index, object.length) : type3 == "string" && index in object) { - return eq(object[index], value); + var type2 = typeof index; + if (type2 == "number" ? isArrayLike2(object) && isIndex2(index, object.length) : type2 == "string" && index in object) { + return eq2(object[index], value); } return false; } @@ -9571,15 +9685,15 @@ if (isArray2(value)) { return false; } - var type3 = typeof value; - if (type3 == "number" || type3 == "symbol" || type3 == "boolean" || value == null || isSymbol2(value)) { + var type2 = typeof value; + if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol2(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object); } - function isKeyable(value) { - var type3 = typeof value; - return type3 == "string" || type3 == "number" || type3 == "symbol" || type3 == "boolean" ? value !== "__proto__" : value === null; + function isKeyable2(value) { + var type2 = typeof value; + return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null; } function isLaziable(func) { var funcName = getFuncName(func), other = lodash[funcName]; @@ -9592,16 +9706,16 @@ var data = getData(other); return !!data && func === data[0]; } - function isMasked(func) { - return !!maskSrcKey && maskSrcKey in func; + function isMasked2(func) { + return !!maskSrcKey2 && maskSrcKey2 in func; } - var isMaskable = coreJsData ? isFunction : stubFalse; - function isPrototype(value) { - var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto3; + var isMaskable = coreJsData2 ? isFunction2 : stubFalse2; + function isPrototype2(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto13; return value === proto; } function isStrictComparable(value) { - return value === value && !isObject2(value); + return value === value && !isObject3(value); } function matchesStrictComparable(key, srcValue) { return function(object) { @@ -9692,7 +9806,7 @@ var arrLength = array2.length, length = nativeMin2(indexes.length, arrLength), oldArray = copyArray(array2); while (length--) { var index = indexes[length]; - array2[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2; + array2[length] = isIndex2(index, arrLength) ? oldArray[index] : undefined2; } return array2; } @@ -9757,23 +9871,23 @@ var result2 = value + ""; return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2; } - function toSource(func) { + function toSource2(func) { if (func != null) { try { - return funcToString.call(func); - } catch (e) { + return funcToString3.call(func); + } catch (e3) { } try { return func + ""; - } catch (e) { + } catch (e3) { } } return ""; } function updateWrapDetails(details, bitmask) { - arrayEach(wrapFlags, function(pair2) { - var value = "_." + pair2[0]; - if (bitmask & pair2[1] && !arrayIncludes(details, value)) { + arrayEach(wrapFlags, function(pair3) { + var value = "_." + pair3[0]; + if (bitmask & pair3[1] && !arrayIncludes(details, value)) { details.push(value); } }); @@ -9824,7 +9938,7 @@ while (index--) { args[index - 1] = arguments[index]; } - return arrayPush(isArray2(array2) ? copyArray(array2) : [array2], baseFlatten(args, 1)); + return arrayPush2(isArray2(array2) ? copyArray(array2) : [array2], baseFlatten(args, 1)); } var difference = baseRest(function(array2, values2) { return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true)) : []; @@ -9843,22 +9957,22 @@ } return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : []; }); - function drop(array2, n2, guard) { + function drop(array2, n3, guard) { var length = array2 == null ? 0 : array2.length; if (!length) { return []; } - n2 = guard || n2 === undefined2 ? 1 : toInteger(n2); - return baseSlice(array2, n2 < 0 ? 0 : n2, length); + n3 = guard || n3 === undefined2 ? 1 : toInteger(n3); + return baseSlice(array2, n3 < 0 ? 0 : n3, length); } - function dropRight(array2, n2, guard) { + function dropRight(array2, n3, guard) { var length = array2 == null ? 0 : array2.length; if (!length) { return []; } - n2 = guard || n2 === undefined2 ? 1 : toInteger(n2); - n2 = length - n2; - return baseSlice(array2, 0, n2 < 0 ? 0 : n2); + n3 = guard || n3 === undefined2 ? 1 : toInteger(n3); + n3 = length - n3; + return baseSlice(array2, 0, n3 < 0 ? 0 : n3); } function dropRightWhile(array2, predicate) { return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true, true) : []; @@ -9916,11 +10030,11 @@ depth = depth === undefined2 ? 1 : toInteger(depth); return baseFlatten(array2, depth); } - function fromPairs(pairs) { - var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {}; + function fromPairs(pairs2) { + var index = -1, length = pairs2 == null ? 0 : pairs2.length, result2 = {}; while (++index < length) { - var pair2 = pairs[index]; - result2[pair2[0]] = pair2[1]; + var pair3 = pairs2[index]; + result2[pair3[0]] = pair3[1]; } return result2; } @@ -9982,8 +10096,8 @@ } return value === value ? strictLastIndexOf(array2, value, index) : baseFindIndex(array2, baseIsNaN, index, true); } - function nth(array2, n2) { - return array2 && array2.length ? baseNth(array2, toInteger(n2)) : undefined2; + function nth(array2, n3) { + return array2 && array2.length ? baseNth(array2, toInteger(n3)) : undefined2; } var pull = baseRest(pullAll); function pullAll(array2, values2) { @@ -9998,7 +10112,7 @@ var pullAt = flatRest(function(array2, indexes) { var length = array2 == null ? 0 : array2.length, result2 = baseAt(array2, indexes); basePullAt(array2, arrayMap2(indexes, function(index) { - return isIndex(index, length) ? +index : index; + return isIndex2(index, length) ? +index : index; }).sort(compareAscending)); return result2; }); @@ -10046,7 +10160,7 @@ var length = array2 == null ? 0 : array2.length; if (length) { var index = baseSortedIndex(array2, value); - if (index < length && eq(array2[index], value)) { + if (index < length && eq2(array2[index], value)) { return index; } } @@ -10062,7 +10176,7 @@ var length = array2 == null ? 0 : array2.length; if (length) { var index = baseSortedIndex(array2, value, true) - 1; - if (eq(array2[index], value)) { + if (eq2(array2[index], value)) { return index; } } @@ -10078,21 +10192,21 @@ var length = array2 == null ? 0 : array2.length; return length ? baseSlice(array2, 1, length) : []; } - function take(array2, n2, guard) { + function take(array2, n3, guard) { if (!(array2 && array2.length)) { return []; } - n2 = guard || n2 === undefined2 ? 1 : toInteger(n2); - return baseSlice(array2, 0, n2 < 0 ? 0 : n2); + n3 = guard || n3 === undefined2 ? 1 : toInteger(n3); + return baseSlice(array2, 0, n3 < 0 ? 0 : n3); } - function takeRight(array2, n2, guard) { + function takeRight(array2, n3, guard) { var length = array2 == null ? 0 : array2.length; if (!length) { return []; } - n2 = guard || n2 === undefined2 ? 1 : toInteger(n2); - n2 = length - n2; - return baseSlice(array2, n2 < 0 ? 0 : n2, length); + n3 = guard || n3 === undefined2 ? 1 : toInteger(n3); + n3 = length - n3; + return baseSlice(array2, n3 < 0 ? 0 : n3, length); } function takeRightWhile(array2, predicate) { return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), false, true) : []; @@ -10130,13 +10244,13 @@ return []; } var length = 0; - array2 = arrayFilter(array2, function(group) { + array2 = arrayFilter2(array2, function(group) { if (isArrayLikeObject(group)) { length = nativeMax2(group.length, length); return true; } }); - return baseTimes(length, function(index) { + return baseTimes2(length, function(index) { return arrayMap2(array2, baseProperty(index)); }); } @@ -10156,19 +10270,19 @@ return isArrayLikeObject(array2) ? baseDifference(array2, values2) : []; }); var xor = baseRest(function(arrays) { - return baseXor(arrayFilter(arrays, isArrayLikeObject)); + return baseXor(arrayFilter2(arrays, isArrayLikeObject)); }); var xorBy = baseRest(function(arrays) { var iteratee2 = last(arrays); if (isArrayLikeObject(iteratee2)) { iteratee2 = undefined2; } - return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); + return baseXor(arrayFilter2(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); }); var xorWith = baseRest(function(arrays) { var comparator = last(arrays); comparator = typeof comparator == "function" ? comparator : undefined2; - return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator); + return baseXor(arrayFilter2(arrays, isArrayLikeObject), undefined2, comparator); }); var zip = baseRest(unzip); function zipObject(props, values2) { @@ -10198,7 +10312,7 @@ var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) { return baseAt(object, paths); }; - if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) { + if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex2(start2)) { return this.thru(interceptor); } value = value.slice(start2, +start2 + (length ? 1 : 0)); @@ -10268,7 +10382,7 @@ return baseWrapperValue(this.__wrapped__, this.__actions__); } var countBy = createAggregator(function(result2, value, key) { - if (hasOwnProperty2.call(result2, key)) { + if (hasOwnProperty10.call(result2, key)) { ++result2[key]; } else { baseAssignValue(result2, key, 1); @@ -10282,7 +10396,7 @@ return func(collection, getIteratee(predicate, 3)); } function filter2(collection, predicate) { - var func = isArray2(collection) ? arrayFilter : baseFilter; + var func = isArray2(collection) ? arrayFilter2 : baseFilter; return func(collection, getIteratee(predicate, 3)); } var find2 = createFind(findIndex); @@ -10306,14 +10420,14 @@ return func(collection, getIteratee(iteratee2, 3)); } var groupBy = createAggregator(function(result2, value, key) { - if (hasOwnProperty2.call(result2, key)) { + if (hasOwnProperty10.call(result2, key)) { result2[key].push(value); } else { baseAssignValue(result2, key, [value]); } }); function includes(collection, value, fromIndex, guard) { - collection = isArrayLike(collection) ? collection : values(collection); + collection = isArrayLike2(collection) ? collection : values(collection); fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; var length = collection.length; if (fromIndex < 0) { @@ -10322,7 +10436,7 @@ return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; } var invokeMap = baseRest(function(collection, path, args) { - var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : []; + var index = -1, isFunc = typeof path == "function", result2 = isArrayLike2(collection) ? Array2(collection.length) : []; baseEach(collection, function(value) { result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); }); @@ -10362,21 +10476,21 @@ return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight); } function reject(collection, predicate) { - var func = isArray2(collection) ? arrayFilter : baseFilter; + var func = isArray2(collection) ? arrayFilter2 : baseFilter; return func(collection, negate(getIteratee(predicate, 3))); } function sample(collection) { var func = isArray2(collection) ? arraySample : baseSample; return func(collection); } - function sampleSize(collection, n2, guard) { - if (guard ? isIterateeCall(collection, n2, guard) : n2 === undefined2) { - n2 = 1; + function sampleSize(collection, n3, guard) { + if (guard ? isIterateeCall(collection, n3, guard) : n3 === undefined2) { + n3 = 1; } else { - n2 = toInteger(n2); + n3 = toInteger(n3); } var func = isArray2(collection) ? arraySampleSize : baseSampleSize; - return func(collection, n2); + return func(collection, n3); } function shuffle(collection) { var func = isArray2(collection) ? arrayShuffle : baseShuffle; @@ -10386,17 +10500,17 @@ if (collection == null) { return 0; } - if (isArrayLike(collection)) { + if (isArrayLike2(collection)) { return isString(collection) ? stringSize(collection) : collection.length; } - var tag = getTag(collection); - if (tag == mapTag || tag == setTag) { + var tag = getTag2(collection); + if (tag == mapTag4 || tag == setTag4) { return collection.size; } - return baseKeys(collection).length; + return baseKeys2(collection).length; } function some(collection, predicate, guard) { - var func = isArray2(collection) ? arraySome : baseSome; + var func = isArray2(collection) ? arraySome2 : baseSome; if (guard && isIterateeCall(collection, predicate, guard)) { predicate = undefined2; } @@ -10417,33 +10531,33 @@ var now3 = ctxNow || function() { return root3.Date.now(); }; - function after(n2, func) { + function after(n3, func) { if (typeof func != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); } - n2 = toInteger(n2); + n3 = toInteger(n3); return function() { - if (--n2 < 1) { + if (--n3 < 1) { return func.apply(this, arguments); } }; } - function ary(func, n2, guard) { - n2 = guard ? undefined2 : n2; - n2 = func && n2 == null ? func.length : n2; - return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n2); + function ary(func, n3, guard) { + n3 = guard ? undefined2 : n3; + n3 = func && n3 == null ? func.length : n3; + return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n3); } - function before(n2, func) { + function before(n3, func) { var result2; if (typeof func != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); } - n2 = toInteger(n2); + n3 = toInteger(n3); return function() { - if (--n2 > 0) { + if (--n3 > 0) { result2 = func.apply(this, arguments); } - if (n2 <= 1) { + if (n3 <= 1) { func = undefined2; } return result2; @@ -10482,11 +10596,11 @@ if (typeof func != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); } - wait = toNumber2(wait) || 0; - if (isObject2(options2)) { + wait = toNumber3(wait) || 0; + if (isObject3(options2)) { leading = !!options2.leading; maxing = "maxWait" in options2; - maxWait = maxing ? nativeMax2(toNumber2(options2.maxWait) || 0, wait) : maxWait; + maxWait = maxing ? nativeMax2(toNumber3(options2.maxWait) || 0, wait) : maxWait; trailing = "trailing" in options2 ? !!options2.trailing : trailing; } function invokeFunc(time) { @@ -10562,7 +10676,7 @@ return baseDelay(func, 1, args); }); var delay = baseRest(function(func, wait, args) { - return baseDelay(func, toNumber2(wait) || 0, args); + return baseDelay(func, toNumber3(wait) || 0, args); }); function flip(func) { return createWrap(func, WRAP_FLIP_FLAG); @@ -10580,10 +10694,10 @@ memoized.cache = cache.set(key, result2) || cache; return result2; }; - memoized.cache = new (memoize.Cache || MapCache)(); + memoized.cache = new (memoize.Cache || MapCache2)(); return memoized; } - memoize.Cache = MapCache; + memoize.Cache = MapCache2; function negate(predicate) { if (typeof predicate != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); @@ -10607,7 +10721,7 @@ return before(2, func); } var overArgs = castRest(function(func, transforms) { - transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap2(transforms[0], baseUnary(getIteratee())) : arrayMap2(baseFlatten(transforms, 1), baseUnary(getIteratee())); + transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap2(transforms[0], baseUnary2(getIteratee())) : arrayMap2(baseFlatten(transforms, 1), baseUnary2(getIteratee())); var funcsLength = transforms.length; return baseRest(function(args) { var index = -1, length = nativeMin2(args.length, funcsLength); @@ -10643,7 +10757,7 @@ return baseRest(function(args) { var array2 = args[start2], otherArgs = castSlice(args, 0, start2); if (array2) { - arrayPush(otherArgs, array2); + arrayPush2(otherArgs, array2); } return apply(func, this, otherArgs); }); @@ -10653,7 +10767,7 @@ if (typeof func != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); } - if (isObject2(options2)) { + if (isObject3(options2)) { leading = "leading" in options2 ? !!options2.leading : leading; trailing = "trailing" in options2 ? !!options2.trailing : trailing; } @@ -10691,33 +10805,33 @@ return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); } function conformsTo(object, source) { - return source == null || baseConformsTo(object, source, keys(source)); + return source == null || baseConformsTo(object, source, keys2(source)); } - function eq(value, other) { + function eq2(value, other) { return value === other || value !== value && other !== other; } - var gt = createRelationalOperation(baseGt); + var gt2 = createRelationalOperation(baseGt); var gte = createRelationalOperation(function(value, other) { return value >= other; }); - var isArguments = baseIsArguments(function() { + var isArguments2 = baseIsArguments2(function() { return arguments; - }()) ? baseIsArguments : function(value) { - return isObjectLike2(value) && hasOwnProperty2.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }()) ? baseIsArguments2 : function(value) { + return isObjectLike2(value) && hasOwnProperty10.call(value, "callee") && !propertyIsEnumerable3.call(value, "callee"); }; var isArray2 = Array2.isArray; - var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; - function isArrayLike(value) { - return value != null && isLength(value.length) && !isFunction(value); + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary2(nodeIsArrayBuffer) : baseIsArrayBuffer; + function isArrayLike2(value) { + return value != null && isLength2(value.length) && !isFunction2(value); } function isArrayLikeObject(value) { - return isObjectLike2(value) && isArrayLike(value); + return isObjectLike2(value) && isArrayLike2(value); } function isBoolean(value) { - return value === true || value === false || isObjectLike2(value) && baseGetTag2(value) == boolTag; + return value === true || value === false || isObjectLike2(value) && baseGetTag2(value) == boolTag3; } - var isBuffer = nativeIsBuffer || stubFalse; - var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + var isBuffer2 = nativeIsBuffer2 || stubFalse2; + var isDate = nodeIsDate ? baseUnary2(nodeIsDate) : baseIsDate; function isElement2(value) { return isObjectLike2(value) && value.nodeType === 1 && !isPlainObject(value); } @@ -10725,62 +10839,62 @@ if (value == null) { return true; } - if (isArrayLike(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) { + if (isArrayLike2(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer2(value) || isTypedArray2(value) || isArguments2(value))) { return !value.length; } - var tag = getTag(value); - if (tag == mapTag || tag == setTag) { + var tag = getTag2(value); + if (tag == mapTag4 || tag == setTag4) { return !value.size; } - if (isPrototype(value)) { - return !baseKeys(value).length; + if (isPrototype2(value)) { + return !baseKeys2(value).length; } for (var key in value) { - if (hasOwnProperty2.call(value, key)) { + if (hasOwnProperty10.call(value, key)) { return false; } } return true; } - function isEqual(value, other) { - return baseIsEqual(value, other); + function isEqual4(value, other) { + return baseIsEqual2(value, other); } function isEqualWith(value, other, customizer) { customizer = typeof customizer == "function" ? customizer : undefined2; var result2 = customizer ? customizer(value, other) : undefined2; - return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2; + return result2 === undefined2 ? baseIsEqual2(value, other, undefined2, customizer) : !!result2; } function isError(value) { if (!isObjectLike2(value)) { return false; } var tag = baseGetTag2(value); - return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value); + return tag == errorTag3 || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value); } function isFinite2(value) { return typeof value == "number" && nativeIsFinite(value); } - function isFunction(value) { - if (!isObject2(value)) { + function isFunction2(value) { + if (!isObject3(value)) { return false; } var tag = baseGetTag2(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + return tag == funcTag3 || tag == genTag2 || tag == asyncTag2 || tag == proxyTag2; } function isInteger(value) { return typeof value == "number" && value == toInteger(value); } - function isLength(value) { - return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + function isLength2(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER3; } - function isObject2(value) { - var type3 = typeof value; - return value != null && (type3 == "object" || type3 == "function"); + function isObject3(value) { + var type2 = typeof value; + return value != null && (type2 == "object" || type2 == "function"); } function isObjectLike2(value) { return value != null && typeof value == "object"; } - var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + var isMap = nodeIsMap ? baseUnary2(nodeIsMap) : baseIsMap; function isMatch(object, source) { return object === source || baseIsMatch(object, source, getMatchData(source)); } @@ -10789,13 +10903,13 @@ return baseIsMatch(object, source, getMatchData(source), customizer); } function isNaN2(value) { - return isNumber2(value) && value != +value; + return isNumber3(value) && value != +value; } function isNative(value) { if (isMaskable(value)) { throw new Error2(CORE_ERROR_TEXT); } - return baseIsNative(value); + return baseIsNative2(value); } function isNull(value) { return value === null; @@ -10803,42 +10917,42 @@ function isNil(value) { return value == null; } - function isNumber2(value) { - return typeof value == "number" || isObjectLike2(value) && baseGetTag2(value) == numberTag; + function isNumber3(value) { + return typeof value == "number" || isObjectLike2(value) && baseGetTag2(value) == numberTag4; } function isPlainObject(value) { - if (!isObjectLike2(value) || baseGetTag2(value) != objectTag) { + if (!isObjectLike2(value) || baseGetTag2(value) != objectTag4) { return false; } var proto = getPrototype(value); if (proto === null) { return true; } - var Ctor = hasOwnProperty2.call(proto, "constructor") && proto.constructor; - return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + var Ctor = hasOwnProperty10.call(proto, "constructor") && proto.constructor; + return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString3.call(Ctor) == objectCtorString; } - var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + var isRegExp = nodeIsRegExp ? baseUnary2(nodeIsRegExp) : baseIsRegExp; function isSafeInteger(value) { - return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + return isInteger(value) && value >= -MAX_SAFE_INTEGER3 && value <= MAX_SAFE_INTEGER3; } - var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + var isSet = nodeIsSet ? baseUnary2(nodeIsSet) : baseIsSet; function isString(value) { - return typeof value == "string" || !isArray2(value) && isObjectLike2(value) && baseGetTag2(value) == stringTag; + return typeof value == "string" || !isArray2(value) && isObjectLike2(value) && baseGetTag2(value) == stringTag3; } function isSymbol2(value) { - return typeof value == "symbol" || isObjectLike2(value) && baseGetTag2(value) == symbolTag2; + return typeof value == "symbol" || isObjectLike2(value) && baseGetTag2(value) == symbolTag3; } - var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + var isTypedArray2 = nodeIsTypedArray2 ? baseUnary2(nodeIsTypedArray2) : baseIsTypedArray2; function isUndefined(value) { return value === undefined2; } function isWeakMap(value) { - return isObjectLike2(value) && getTag(value) == weakMapTag; + return isObjectLike2(value) && getTag2(value) == weakMapTag3; } function isWeakSet(value) { return isObjectLike2(value) && baseGetTag2(value) == weakSetTag; } - var lt = createRelationalOperation(baseLt); + var lt2 = createRelationalOperation(baseLt); var lte = createRelationalOperation(function(value, other) { return value <= other; }); @@ -10846,20 +10960,20 @@ if (!value) { return []; } - if (isArrayLike(value)) { + if (isArrayLike2(value)) { return isString(value) ? stringToArray(value) : copyArray(value); } if (symIterator && value[symIterator]) { return iteratorToArray(value[symIterator]()); } - var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; + var tag = getTag2(value), func = tag == mapTag4 ? mapToArray2 : tag == setTag4 ? setToArray2 : values; return func(value); } function toFinite(value) { if (!value) { return value === 0 ? value : 0; } - value = toNumber2(value); + value = toNumber3(value); if (value === INFINITY2 || value === -INFINITY2) { var sign2 = value < 0 ? -1 : 1; return sign2 * MAX_INTEGER; @@ -10873,16 +10987,16 @@ function toLength(value) { return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; } - function toNumber2(value) { + function toNumber3(value) { if (typeof value == "number") { return value; } if (isSymbol2(value)) { return NAN2; } - if (isObject2(value)) { + if (isObject3(value)) { var other = typeof value.valueOf == "function" ? value.valueOf() : value; - value = isObject2(other) ? other + "" : other; + value = isObject3(other) ? other + "" : other; } if (typeof value != "string") { return value === 0 ? value : +value; @@ -10895,18 +11009,18 @@ return copyObject(value, keysIn(value)); } function toSafeInteger(value) { - return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; + return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER3, MAX_SAFE_INTEGER3) : value === 0 ? value : 0; } function toString2(value) { return value == null ? "" : baseToString2(value); } var assign = createAssigner(function(object, source) { - if (isPrototype(source) || isArrayLike(source)) { - copyObject(source, keys(source), object); + if (isPrototype2(source) || isArrayLike2(source)) { + copyObject(source, keys2(source), object); return; } for (var key in source) { - if (hasOwnProperty2.call(source, key)) { + if (hasOwnProperty10.call(source, key)) { assignValue(object, key, source[key]); } } @@ -10918,14 +11032,14 @@ copyObject(source, keysIn(source), object, customizer); }); var assignWith = createAssigner(function(object, source, srcIndex, customizer) { - copyObject(source, keys(source), object, customizer); + copyObject(source, keys2(source), object, customizer); }); - var at = flatRest(baseAt); + var at2 = flatRest(baseAt); function create2(prototype, properties) { var result2 = baseCreate(prototype); return properties == null ? result2 : baseAssign(result2, properties); } - var defaults2 = baseRest(function(object, sources) { + var defaults = baseRest(function(object, sources) { object = Object2(object); var index = -1; var length = sources.length; @@ -10941,7 +11055,7 @@ while (++propsIndex < propsLength) { var key = props[propsIndex]; var value = object[key]; - if (value === undefined2 || eq(value, objectProto3[key]) && !hasOwnProperty2.call(object, key)) { + if (value === undefined2 || eq2(value, objectProto13[key]) && !hasOwnProperty10.call(object, key)) { object[key] = source[key]; } } @@ -10971,7 +11085,7 @@ return object && baseForOwnRight(object, getIteratee(iteratee2, 3)); } function functions(object) { - return object == null ? [] : baseFunctions(object, keys(object)); + return object == null ? [] : baseFunctions(object, keys2(object)); } function functionsIn(object) { return object == null ? [] : baseFunctions(object, keysIn(object)); @@ -10996,18 +11110,18 @@ if (value != null && typeof value.toString != "function") { value = nativeObjectToString3.call(value); } - if (hasOwnProperty2.call(result2, value)) { + if (hasOwnProperty10.call(result2, value)) { result2[value].push(key); } else { result2[value] = [key]; } }, getIteratee); var invoke = baseRest(baseInvoke); - function keys(object) { - return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + function keys2(object) { + return isArrayLike2(object) ? arrayLikeKeys2(object) : baseKeys2(object); } function keysIn(object) { - return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + return isArrayLike2(object) ? arrayLikeKeys2(object, true) : baseKeysIn(object); } function mapKeys(object, iteratee2) { var result2 = {}; @@ -11025,7 +11139,7 @@ }); return result2; } - var merge3 = createAssigner(function(object, source, srcIndex) { + var merge2 = createAssigner(function(object, source, srcIndex) { baseMerge(object, source, srcIndex); }); var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { @@ -11083,7 +11197,7 @@ index = length; value = defaultValue; } - object = isFunction(value) ? value.call(object) : value; + object = isFunction2(value) ? value.call(object) : value; } return object; } @@ -11094,17 +11208,17 @@ customizer = typeof customizer == "function" ? customizer : undefined2; return object == null ? object : baseSet(object, path, value, customizer); } - var toPairs = createToPairs(keys); + var toPairs = createToPairs(keys2); var toPairsIn = createToPairs(keysIn); function transform2(object, iteratee2, accumulator) { - var isArr = isArray2(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); + var isArr = isArray2(object), isArrLike = isArr || isBuffer2(object) || isTypedArray2(object); iteratee2 = getIteratee(iteratee2, 4); if (accumulator == null) { var Ctor = object && object.constructor; if (isArrLike) { accumulator = isArr ? new Ctor() : []; - } else if (isObject2(object)) { - accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } else if (isObject3(object)) { + accumulator = isFunction2(Ctor) ? baseCreate(getPrototype(object)) : {}; } else { accumulator = {}; } @@ -11125,7 +11239,7 @@ return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); } function values(object) { - return object == null ? [] : baseValues(object, keys(object)); + return object == null ? [] : baseValues(object, keys2(object)); } function valuesIn(object) { return object == null ? [] : baseValues(object, keysIn(object)); @@ -11136,14 +11250,14 @@ lower2 = undefined2; } if (upper !== undefined2) { - upper = toNumber2(upper); + upper = toNumber3(upper); upper = upper === upper ? upper : 0; } if (lower2 !== undefined2) { - lower2 = toNumber2(lower2); + lower2 = toNumber3(lower2); lower2 = lower2 === lower2 ? lower2 : 0; } - return baseClamp(toNumber2(number3), lower2, upper); + return baseClamp(toNumber3(number3), lower2, upper); } function inRange(number3, start2, end) { start2 = toFinite(start2); @@ -11153,7 +11267,7 @@ } else { end = toFinite(end); } - number3 = toNumber2(number3); + number3 = toNumber3(number3); return baseInRange(number3, start2, end); } function random(lower2, upper, floating) { @@ -11218,7 +11332,7 @@ } function escapeRegExp(string) { string = toString2(string); - return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string; + return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar2, "\\$&") : string; } var kebabCase = createCompounder(function(result2, word, index) { return result2 + (index ? "-" : "") + word.toLowerCase(); @@ -11257,13 +11371,13 @@ } return nativeParseInt(toString2(string).replace(reTrimStart2, ""), radix || 0); } - function repeat(string, n2, guard) { - if (guard ? isIterateeCall(string, n2, guard) : n2 === undefined2) { - n2 = 1; + function repeat(string, n3, guard) { + if (guard ? isIterateeCall(string, n3, guard) : n3 === undefined2) { + n3 = 1; } else { - n2 = toInteger(n2); + n3 = toInteger(n3); } - return baseRepeat(toString2(string), n2); + return baseRepeat(toString2(string), n3); } function replace() { var args = arguments, string = toString2(args[0]); @@ -11305,13 +11419,13 @@ } string = toString2(string); options2 = assignInWith({}, options2, settings, customDefaultsAssignIn); - var imports = assignInWith({}, options2.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys); + var imports = assignInWith({}, options2.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys2(imports), importsValues = baseValues(imports, importsKeys); var isEscaping, isEvaluating, index = 0, interpolate = options2.interpolate || reNoMatch, source = "__p += '"; var reDelimiters = RegExp2( (options2.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options2.evaluate || reNoMatch).source + "|$", "g" ); - var sourceURL = "//# sourceURL=" + (hasOwnProperty2.call(options2, "sourceURL") ? (options2.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; + var sourceURL = "//# sourceURL=" + (hasOwnProperty10.call(options2, "sourceURL") ? (options2.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { interpolateValue || (interpolateValue = esTemplateValue); source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); @@ -11330,7 +11444,7 @@ return match; }); source += "';\n"; - var variable = hasOwnProperty2.call(options2, "variable") && options2.variable; + var variable = hasOwnProperty10.call(options2, "variable") && options2.variable; if (!variable) { source = "with (obj) {\n" + source + "\n}\n"; } else if (reForbiddenIdentifierChars.test(variable)) { @@ -11388,7 +11502,7 @@ } function truncate(string, options2) { var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; - if (isObject2(options2)) { + if (isObject3(options2)) { var separator = "separator" in options2 ? options2.separator : separator; length = "length" in options2 ? toInteger(options2.length) : length; omission = "omission" in options2 ? baseToString2(options2.omission) : omission; @@ -11452,8 +11566,8 @@ var attempt = baseRest(function(func, args) { try { return apply(func, undefined2, args); - } catch (e) { - return isError(e) ? e : new Error2(e); + } catch (e3) { + return isError(e3) ? e3 : new Error2(e3); } }); var bindAll = flatRest(function(object, methodNames) { @@ -11463,20 +11577,20 @@ }); return object; }); - function cond(pairs) { - var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee(); - pairs = !length ? [] : arrayMap2(pairs, function(pair2) { - if (typeof pair2[1] != "function") { + function cond(pairs2) { + var length = pairs2 == null ? 0 : pairs2.length, toIteratee = getIteratee(); + pairs2 = !length ? [] : arrayMap2(pairs2, function(pair3) { + if (typeof pair3[1] != "function") { throw new TypeError2(FUNC_ERROR_TEXT3); } - return [toIteratee(pair2[0]), pair2[1]]; + return [toIteratee(pair3[0]), pair3[1]]; }); return baseRest(function(args) { var index = -1; while (++index < length) { - var pair2 = pairs[index]; - if (apply(pair2[0], this, args)) { - return apply(pair2[1], this, args); + var pair3 = pairs2[index]; + if (apply(pair3[0], this, args)) { + return apply(pair3[1], this, args); } } }); @@ -11517,14 +11631,14 @@ }; }); function mixin(object, source, options2) { - var props = keys(source), methodNames = baseFunctions(source, props); - if (options2 == null && !(isObject2(source) && (methodNames.length || !props.length))) { + var props = keys2(source), methodNames = baseFunctions(source, props); + if (options2 == null && !(isObject3(source) && (methodNames.length || !props.length))) { options2 = source; source = object; object = this; - methodNames = baseFunctions(source, keys(source)); + methodNames = baseFunctions(source, keys2(source)); } - var chain2 = !(isObject2(options2) && "chain" in options2) || !!options2.chain, isFunc = isFunction(object); + var chain2 = !(isObject3(options2) && "chain" in options2) || !!options2.chain, isFunc = isFunction2(object); arrayEach(methodNames, function(methodName) { var func = source[methodName]; object[methodName] = func; @@ -11537,7 +11651,7 @@ result2.__chain__ = chainAll; return result2; } - return func.apply(object, arrayPush([this.value()], arguments)); + return func.apply(object, arrayPush2([this.value()], arguments)); }; } }); @@ -11551,15 +11665,15 @@ } function noop3() { } - function nthArg(n2) { - n2 = toInteger(n2); + function nthArg(n3) { + n3 = toInteger(n3); return baseRest(function(args) { - return baseNth(args, n2); + return baseNth(args, n3); }); } var over = createOver(arrayMap2); var overEvery = createOver(arrayEvery); - var overSome = createOver(arraySome); + var overSome = createOver(arraySome2); function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } @@ -11570,10 +11684,10 @@ } var range3 = createRange(); var rangeRight = createRange(true); - function stubArray() { + function stubArray2() { return []; } - function stubFalse() { + function stubFalse2() { return false; } function stubObject() { @@ -11585,16 +11699,16 @@ function stubTrue() { return true; } - function times(n2, iteratee2) { - n2 = toInteger(n2); - if (n2 < 1 || n2 > MAX_SAFE_INTEGER) { + function times(n3, iteratee2) { + n3 = toInteger(n3); + if (n3 < 1 || n3 > MAX_SAFE_INTEGER3) { return []; } - var index = MAX_ARRAY_LENGTH, length = nativeMin2(n2, MAX_ARRAY_LENGTH); + var index = MAX_ARRAY_LENGTH, length = nativeMin2(n3, MAX_ARRAY_LENGTH); iteratee2 = getIteratee(iteratee2); - n2 -= MAX_ARRAY_LENGTH; - var result2 = baseTimes(length, iteratee2); - while (++index < n2) { + n3 -= MAX_ARRAY_LENGTH; + var result2 = baseTimes2(length, iteratee2); + while (++index < n3) { iteratee2(index); } return result2; @@ -11654,7 +11768,7 @@ lodash.assignIn = assignIn; lodash.assignInWith = assignInWith; lodash.assignWith = assignWith; - lodash.at = at; + lodash.at = at2; lodash.before = before; lodash.bind = bind; lodash.bindAll = bindAll; @@ -11672,7 +11786,7 @@ lodash.curry = curry; lodash.curryRight = curryRight; lodash.debounce = debounce2; - lodash.defaults = defaults2; + lodash.defaults = defaults; lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; @@ -11707,7 +11821,7 @@ lodash.invokeMap = invokeMap; lodash.iteratee = iteratee; lodash.keyBy = keyBy; - lodash.keys = keys; + lodash.keys = keys2; lodash.keysIn = keysIn; lodash.map = map2; lodash.mapKeys = mapKeys; @@ -11715,7 +11829,7 @@ lodash.matches = matches; lodash.matchesProperty = matchesProperty; lodash.memoize = memoize; - lodash.merge = merge3; + lodash.merge = merge2; lodash.mergeWith = mergeWith; lodash.method = method; lodash.methodOf = methodOf; @@ -11817,7 +11931,7 @@ lodash.defaultTo = defaultTo; lodash.divide = divide; lodash.endsWith = endsWith; - lodash.eq = eq; + lodash.eq = eq2; lodash.escape = escape6; lodash.escapeRegExp = escapeRegExp; lodash.every = every; @@ -11835,7 +11949,7 @@ lodash.forOwn = forOwn; lodash.forOwnRight = forOwnRight; lodash.get = get4; - lodash.gt = gt; + lodash.gt = gt2; lodash.gte = gte; lodash.has = has; lodash.hasIn = hasIn; @@ -11845,23 +11959,23 @@ lodash.indexOf = indexOf; lodash.inRange = inRange; lodash.invoke = invoke; - lodash.isArguments = isArguments; + lodash.isArguments = isArguments2; lodash.isArray = isArray2; lodash.isArrayBuffer = isArrayBuffer; - lodash.isArrayLike = isArrayLike; + lodash.isArrayLike = isArrayLike2; lodash.isArrayLikeObject = isArrayLikeObject; lodash.isBoolean = isBoolean; - lodash.isBuffer = isBuffer; + lodash.isBuffer = isBuffer2; lodash.isDate = isDate; lodash.isElement = isElement2; lodash.isEmpty = isEmpty; - lodash.isEqual = isEqual; + lodash.isEqual = isEqual4; lodash.isEqualWith = isEqualWith; lodash.isError = isError; lodash.isFinite = isFinite2; - lodash.isFunction = isFunction; + lodash.isFunction = isFunction2; lodash.isInteger = isInteger; - lodash.isLength = isLength; + lodash.isLength = isLength2; lodash.isMap = isMap; lodash.isMatch = isMatch; lodash.isMatchWith = isMatchWith; @@ -11869,8 +11983,8 @@ lodash.isNative = isNative; lodash.isNil = isNil; lodash.isNull = isNull; - lodash.isNumber = isNumber2; - lodash.isObject = isObject2; + lodash.isNumber = isNumber3; + lodash.isObject = isObject3; lodash.isObjectLike = isObjectLike2; lodash.isPlainObject = isPlainObject; lodash.isRegExp = isRegExp; @@ -11878,7 +11992,7 @@ lodash.isSet = isSet; lodash.isString = isString; lodash.isSymbol = isSymbol2; - lodash.isTypedArray = isTypedArray; + lodash.isTypedArray = isTypedArray2; lodash.isUndefined = isUndefined; lodash.isWeakMap = isWeakMap; lodash.isWeakSet = isWeakSet; @@ -11888,7 +12002,7 @@ lodash.lastIndexOf = lastIndexOf; lodash.lowerCase = lowerCase; lodash.lowerFirst = lowerFirst; - lodash.lt = lt; + lodash.lt = lt2; lodash.lte = lte; lodash.max = max3; lodash.maxBy = maxBy; @@ -11896,8 +12010,8 @@ lodash.meanBy = meanBy; lodash.min = min3; lodash.minBy = minBy; - lodash.stubArray = stubArray; - lodash.stubFalse = stubFalse; + lodash.stubArray = stubArray2; + lodash.stubFalse = stubFalse2; lodash.stubObject = stubObject; lodash.stubString = stubString; lodash.stubTrue = stubTrue; @@ -11939,7 +12053,7 @@ lodash.toInteger = toInteger; lodash.toLength = toLength; lodash.toLower = toLower; - lodash.toNumber = toNumber2; + lodash.toNumber = toNumber3; lodash.toSafeInteger = toSafeInteger; lodash.toString = toString2; lodash.toUpper = toUpper; @@ -11957,7 +12071,7 @@ mixin(lodash, function() { var source = {}; baseForOwn(lodash, function(func, methodName) { - if (!hasOwnProperty2.call(lodash.prototype, methodName)) { + if (!hasOwnProperty10.call(lodash.prototype, methodName)) { source[methodName] = func; } }); @@ -11968,30 +12082,30 @@ lodash[methodName].placeholder = lodash; }); arrayEach(["drop", "take"], function(methodName, index) { - LazyWrapper.prototype[methodName] = function(n2) { - n2 = n2 === undefined2 ? 1 : nativeMax2(toInteger(n2), 0); + LazyWrapper.prototype[methodName] = function(n3) { + n3 = n3 === undefined2 ? 1 : nativeMax2(toInteger(n3), 0); var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone(); if (result2.__filtered__) { - result2.__takeCount__ = nativeMin2(n2, result2.__takeCount__); + result2.__takeCount__ = nativeMin2(n3, result2.__takeCount__); } else { result2.__views__.push({ - "size": nativeMin2(n2, MAX_ARRAY_LENGTH), + "size": nativeMin2(n3, MAX_ARRAY_LENGTH), "type": methodName + (result2.__dir__ < 0 ? "Right" : "") }); } return result2; }; - LazyWrapper.prototype[methodName + "Right"] = function(n2) { - return this.reverse()[methodName](n2).reverse(); + LazyWrapper.prototype[methodName + "Right"] = function(n3) { + return this.reverse()[methodName](n3).reverse(); }; }); arrayEach(["filter", "map", "takeWhile"], function(methodName, index) { - var type3 = index + 1, isFilter = type3 == LAZY_FILTER_FLAG || type3 == LAZY_WHILE_FLAG; + var type2 = index + 1, isFilter = type2 == LAZY_FILTER_FLAG || type2 == LAZY_WHILE_FLAG; LazyWrapper.prototype[methodName] = function(iteratee2) { var result2 = this.clone(); result2.__iteratees__.push({ "iteratee": getIteratee(iteratee2, 3), - "type": type3 + "type": type2 }); result2.__filtered__ = result2.__filtered__ || isFilter; return result2; @@ -12060,7 +12174,7 @@ lodash.prototype[methodName] = function() { var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray2(value); var interceptor = function(value2) { - var result3 = lodashFunc.apply(lodash, arrayPush([value2], args)); + var result3 = lodashFunc.apply(lodash, arrayPush2([value2], args)); return isTaker && chainAll ? result3[0] : result3; }; if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) { @@ -12081,7 +12195,7 @@ }; }); arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) { - var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); + var func = arrayProto2[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); lodash.prototype[methodName] = function() { var args = arguments; if (retUnwrapped && !this.__chain__) { @@ -12097,7 +12211,7 @@ var lodashFunc = lodash[methodName]; if (lodashFunc) { var key = lodashFunc.name + ""; - if (!hasOwnProperty2.call(realNames, key)) { + if (!hasOwnProperty10.call(realNames, key)) { realNames[key] = []; } realNames[key].push({ "name": methodName, "func": lodashFunc }); @@ -12123,254 +12237,299 @@ } return lodash; }; - var _ = runInContext(); + var _2 = runInContext(); if (typeof define == "function" && typeof define.amd == "object" && define.amd) { - root3._ = _; + root3._ = _2; define(function() { - return _; + return _2; }); - } else if (freeModule) { - (freeModule.exports = _)._ = _; - freeExports._ = _; + } else if (freeModule3) { + (freeModule3.exports = _2)._ = _2; + freeExports3._ = _2; } else { - root3._ = _; + root3._ = _2; } }).call(exports2); } }); + // node_modules/fast-deep-equal/index.js + var require_fast_deep_equal = __commonJS({ + "node_modules/fast-deep-equal/index.js"(exports2, module2) { + "use strict"; + module2.exports = function equal(a2, b2) { + if (a2 === b2) + return true; + if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") { + if (a2.constructor !== b2.constructor) + return false; + var length, i3, keys2; + if (Array.isArray(a2)) { + length = a2.length; + if (length != b2.length) + return false; + for (i3 = length; i3-- !== 0; ) + if (!equal(a2[i3], b2[i3])) + return false; + return true; + } + if (a2.constructor === RegExp) + return a2.source === b2.source && a2.flags === b2.flags; + if (a2.valueOf !== Object.prototype.valueOf) + return a2.valueOf() === b2.valueOf(); + if (a2.toString !== Object.prototype.toString) + return a2.toString() === b2.toString(); + keys2 = Object.keys(a2); + length = keys2.length; + if (length !== Object.keys(b2).length) + return false; + for (i3 = length; i3-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(b2, keys2[i3])) + return false; + for (i3 = length; i3-- !== 0; ) { + var key = keys2[i3]; + if (!equal(a2[key], b2[key])) + return false; + } + return true; + } + return a2 !== a2 && b2 !== b2; + }; + } + }); + // node_modules/rbush/rbush.min.js var require_rbush_min = __commonJS({ "node_modules/rbush/rbush.min.js"(exports2, module2) { - !function(t, i2) { - "object" == typeof exports2 && "undefined" != typeof module2 ? module2.exports = i2() : "function" == typeof define && define.amd ? define(i2) : (t = t || self).RBush = i2(); + !function(t2, i3) { + "object" == typeof exports2 && "undefined" != typeof module2 ? module2.exports = i3() : "function" == typeof define && define.amd ? define(i3) : (t2 = t2 || self).RBush = i3(); }(exports2, function() { "use strict"; - function t(t2, r2, e3, a2, h2) { - !function t3(n3, r3, e4, a3, h3) { - for (; a3 > e4; ) { - if (a3 - e4 > 600) { - var o2 = a3 - e4 + 1, s2 = r3 - e4 + 1, l2 = Math.log(o2), f3 = 0.5 * Math.exp(2 * l2 / 3), u2 = 0.5 * Math.sqrt(l2 * f3 * (o2 - f3) / o2) * (s2 - o2 / 2 < 0 ? -1 : 1), m2 = Math.max(e4, Math.floor(r3 - s2 * f3 / o2 + u2)), c2 = Math.min(a3, Math.floor(r3 + (o2 - s2) * f3 / o2 + u2)); - t3(n3, r3, m2, c2, h3); + function t2(t3, r3, e4, a3, h3) { + !function t4(n4, r4, e6, a4, h4) { + for (; a4 > e6; ) { + if (a4 - e6 > 600) { + var o3 = a4 - e6 + 1, s3 = r4 - e6 + 1, l3 = Math.log(o3), f4 = 0.5 * Math.exp(2 * l3 / 3), u3 = 0.5 * Math.sqrt(l3 * f4 * (o3 - f4) / o3) * (s3 - o3 / 2 < 0 ? -1 : 1), m3 = Math.max(e6, Math.floor(r4 - s3 * f4 / o3 + u3)), c3 = Math.min(a4, Math.floor(r4 + (o3 - s3) * f4 / o3 + u3)); + t4(n4, r4, m3, c3, h4); } - var p2 = n3[r3], d2 = e4, x = a3; - for (i2(n3, e4, r3), h3(n3[a3], p2) > 0 && i2(n3, e4, a3); d2 < x; ) { - for (i2(n3, d2, x), d2++, x--; h3(n3[d2], p2) < 0; ) - d2++; - for (; h3(n3[x], p2) > 0; ) - x--; + var p3 = n4[r4], d4 = e6, x2 = a4; + for (i3(n4, e6, r4), h4(n4[a4], p3) > 0 && i3(n4, e6, a4); d4 < x2; ) { + for (i3(n4, d4, x2), d4++, x2--; h4(n4[d4], p3) < 0; ) + d4++; + for (; h4(n4[x2], p3) > 0; ) + x2--; } - 0 === h3(n3[e4], p2) ? i2(n3, e4, x) : i2(n3, ++x, a3), x <= r3 && (e4 = x + 1), r3 <= x && (a3 = x - 1); + 0 === h4(n4[e6], p3) ? i3(n4, e6, x2) : i3(n4, ++x2, a4), x2 <= r4 && (e6 = x2 + 1), r4 <= x2 && (a4 = x2 - 1); } - }(t2, r2, e3 || 0, a2 || t2.length - 1, h2 || n2); + }(t3, r3, e4 || 0, a3 || t3.length - 1, h3 || n3); } - function i2(t2, i3, n3) { - var r2 = t2[i3]; - t2[i3] = t2[n3], t2[n3] = r2; + function i3(t3, i4, n4) { + var r3 = t3[i4]; + t3[i4] = t3[n4], t3[n4] = r3; } - function n2(t2, i3) { - return t2 < i3 ? -1 : t2 > i3 ? 1 : 0; + function n3(t3, i4) { + return t3 < i4 ? -1 : t3 > i4 ? 1 : 0; } - var r = function(t2) { - void 0 === t2 && (t2 = 9), this._maxEntries = Math.max(4, t2), this._minEntries = Math.max(2, Math.ceil(0.4 * this._maxEntries)), this.clear(); + var r2 = function(t3) { + void 0 === t3 && (t3 = 9), this._maxEntries = Math.max(4, t3), this._minEntries = Math.max(2, Math.ceil(0.4 * this._maxEntries)), this.clear(); }; - function e(t2, i3, n3) { - if (!n3) - return i3.indexOf(t2); - for (var r2 = 0; r2 < i3.length; r2++) - if (n3(t2, i3[r2])) - return r2; + function e3(t3, i4, n4) { + if (!n4) + return i4.indexOf(t3); + for (var r3 = 0; r3 < i4.length; r3++) + if (n4(t3, i4[r3])) + return r3; return -1; } - function a(t2, i3) { - h(t2, 0, t2.children.length, i3, t2); + function a2(t3, i4) { + h2(t3, 0, t3.children.length, i4, t3); } - function h(t2, i3, n3, r2, e3) { - e3 || (e3 = p(null)), e3.minX = 1 / 0, e3.minY = 1 / 0, e3.maxX = -1 / 0, e3.maxY = -1 / 0; - for (var a2 = i3; a2 < n3; a2++) { - var h2 = t2.children[a2]; - o(e3, t2.leaf ? r2(h2) : h2); + function h2(t3, i4, n4, r3, e4) { + e4 || (e4 = p2(null)), e4.minX = 1 / 0, e4.minY = 1 / 0, e4.maxX = -1 / 0, e4.maxY = -1 / 0; + for (var a3 = i4; a3 < n4; a3++) { + var h3 = t3.children[a3]; + o2(e4, t3.leaf ? r3(h3) : h3); } - return e3; + return e4; } - function o(t2, i3) { - return t2.minX = Math.min(t2.minX, i3.minX), t2.minY = Math.min(t2.minY, i3.minY), t2.maxX = Math.max(t2.maxX, i3.maxX), t2.maxY = Math.max(t2.maxY, i3.maxY), t2; + function o2(t3, i4) { + return t3.minX = Math.min(t3.minX, i4.minX), t3.minY = Math.min(t3.minY, i4.minY), t3.maxX = Math.max(t3.maxX, i4.maxX), t3.maxY = Math.max(t3.maxY, i4.maxY), t3; } - function s(t2, i3) { - return t2.minX - i3.minX; + function s2(t3, i4) { + return t3.minX - i4.minX; } - function l(t2, i3) { - return t2.minY - i3.minY; + function l2(t3, i4) { + return t3.minY - i4.minY; } - function f2(t2) { - return (t2.maxX - t2.minX) * (t2.maxY - t2.minY); + function f3(t3) { + return (t3.maxX - t3.minX) * (t3.maxY - t3.minY); } - function u(t2) { - return t2.maxX - t2.minX + (t2.maxY - t2.minY); + function u2(t3) { + return t3.maxX - t3.minX + (t3.maxY - t3.minY); } - function m(t2, i3) { - return t2.minX <= i3.minX && t2.minY <= i3.minY && i3.maxX <= t2.maxX && i3.maxY <= t2.maxY; + function m2(t3, i4) { + return t3.minX <= i4.minX && t3.minY <= i4.minY && i4.maxX <= t3.maxX && i4.maxY <= t3.maxY; } - function c(t2, i3) { - return i3.minX <= t2.maxX && i3.minY <= t2.maxY && i3.maxX >= t2.minX && i3.maxY >= t2.minY; + function c2(t3, i4) { + return i4.minX <= t3.maxX && i4.minY <= t3.maxY && i4.maxX >= t3.minX && i4.maxY >= t3.minY; } - function p(t2) { - return { children: t2, height: 1, leaf: true, minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0 }; + function p2(t3) { + return { children: t3, height: 1, leaf: true, minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0 }; } - function d(i3, n3, r2, e3, a2) { - for (var h2 = [n3, r2]; h2.length; ) - if (!((r2 = h2.pop()) - (n3 = h2.pop()) <= e3)) { - var o2 = n3 + Math.ceil((r2 - n3) / e3 / 2) * e3; - t(i3, o2, n3, r2, a2), h2.push(n3, o2, o2, r2); + function d2(i4, n4, r3, e4, a3) { + for (var h3 = [n4, r3]; h3.length; ) + if (!((r3 = h3.pop()) - (n4 = h3.pop()) <= e4)) { + var o3 = n4 + Math.ceil((r3 - n4) / e4 / 2) * e4; + t2(i4, o3, n4, r3, a3), h3.push(n4, o3, o3, r3); } } - return r.prototype.all = function() { + return r2.prototype.all = function() { return this._all(this.data, []); - }, r.prototype.search = function(t2) { - var i3 = this.data, n3 = []; - if (!c(t2, i3)) - return n3; - for (var r2 = this.toBBox, e3 = []; i3; ) { - for (var a2 = 0; a2 < i3.children.length; a2++) { - var h2 = i3.children[a2], o2 = i3.leaf ? r2(h2) : h2; - c(t2, o2) && (i3.leaf ? n3.push(h2) : m(t2, o2) ? this._all(h2, n3) : e3.push(h2)); - } - i3 = e3.pop(); - } - return n3; - }, r.prototype.collides = function(t2) { - var i3 = this.data; - if (!c(t2, i3)) + }, r2.prototype.search = function(t3) { + var i4 = this.data, n4 = []; + if (!c2(t3, i4)) + return n4; + for (var r3 = this.toBBox, e4 = []; i4; ) { + for (var a3 = 0; a3 < i4.children.length; a3++) { + var h3 = i4.children[a3], o3 = i4.leaf ? r3(h3) : h3; + c2(t3, o3) && (i4.leaf ? n4.push(h3) : m2(t3, o3) ? this._all(h3, n4) : e4.push(h3)); + } + i4 = e4.pop(); + } + return n4; + }, r2.prototype.collides = function(t3) { + var i4 = this.data; + if (!c2(t3, i4)) return false; - for (var n3 = []; i3; ) { - for (var r2 = 0; r2 < i3.children.length; r2++) { - var e3 = i3.children[r2], a2 = i3.leaf ? this.toBBox(e3) : e3; - if (c(t2, a2)) { - if (i3.leaf || m(t2, a2)) + for (var n4 = []; i4; ) { + for (var r3 = 0; r3 < i4.children.length; r3++) { + var e4 = i4.children[r3], a3 = i4.leaf ? this.toBBox(e4) : e4; + if (c2(t3, a3)) { + if (i4.leaf || m2(t3, a3)) return true; - n3.push(e3); + n4.push(e4); } } - i3 = n3.pop(); + i4 = n4.pop(); } return false; - }, r.prototype.load = function(t2) { - if (!t2 || !t2.length) + }, r2.prototype.load = function(t3) { + if (!t3 || !t3.length) return this; - if (t2.length < this._minEntries) { - for (var i3 = 0; i3 < t2.length; i3++) - this.insert(t2[i3]); + if (t3.length < this._minEntries) { + for (var i4 = 0; i4 < t3.length; i4++) + this.insert(t3[i4]); return this; } - var n3 = this._build(t2.slice(), 0, t2.length - 1, 0); + var n4 = this._build(t3.slice(), 0, t3.length - 1, 0); if (this.data.children.length) - if (this.data.height === n3.height) - this._splitRoot(this.data, n3); + if (this.data.height === n4.height) + this._splitRoot(this.data, n4); else { - if (this.data.height < n3.height) { - var r2 = this.data; - this.data = n3, n3 = r2; + if (this.data.height < n4.height) { + var r3 = this.data; + this.data = n4, n4 = r3; } - this._insert(n3, this.data.height - n3.height - 1, true); + this._insert(n4, this.data.height - n4.height - 1, true); } else - this.data = n3; + this.data = n4; return this; - }, r.prototype.insert = function(t2) { - return t2 && this._insert(t2, this.data.height - 1), this; - }, r.prototype.clear = function() { - return this.data = p([]), this; - }, r.prototype.remove = function(t2, i3) { - if (!t2) + }, r2.prototype.insert = function(t3) { + return t3 && this._insert(t3, this.data.height - 1), this; + }, r2.prototype.clear = function() { + return this.data = p2([]), this; + }, r2.prototype.remove = function(t3, i4) { + if (!t3) return this; - for (var n3, r2, a2, h2 = this.data, o2 = this.toBBox(t2), s2 = [], l2 = []; h2 || s2.length; ) { - if (h2 || (h2 = s2.pop(), r2 = s2[s2.length - 1], n3 = l2.pop(), a2 = true), h2.leaf) { - var f3 = e(t2, h2.children, i3); - if (-1 !== f3) - return h2.children.splice(f3, 1), s2.push(h2), this._condense(s2), this; + for (var n4, r3, a3, h3 = this.data, o3 = this.toBBox(t3), s3 = [], l3 = []; h3 || s3.length; ) { + if (h3 || (h3 = s3.pop(), r3 = s3[s3.length - 1], n4 = l3.pop(), a3 = true), h3.leaf) { + var f4 = e3(t3, h3.children, i4); + if (-1 !== f4) + return h3.children.splice(f4, 1), s3.push(h3), this._condense(s3), this; } - a2 || h2.leaf || !m(h2, o2) ? r2 ? (n3++, h2 = r2.children[n3], a2 = false) : h2 = null : (s2.push(h2), l2.push(n3), n3 = 0, r2 = h2, h2 = h2.children[0]); + a3 || h3.leaf || !m2(h3, o3) ? r3 ? (n4++, h3 = r3.children[n4], a3 = false) : h3 = null : (s3.push(h3), l3.push(n4), n4 = 0, r3 = h3, h3 = h3.children[0]); } return this; - }, r.prototype.toBBox = function(t2) { - return t2; - }, r.prototype.compareMinX = function(t2, i3) { - return t2.minX - i3.minX; - }, r.prototype.compareMinY = function(t2, i3) { - return t2.minY - i3.minY; - }, r.prototype.toJSON = function() { + }, r2.prototype.toBBox = function(t3) { + return t3; + }, r2.prototype.compareMinX = function(t3, i4) { + return t3.minX - i4.minX; + }, r2.prototype.compareMinY = function(t3, i4) { + return t3.minY - i4.minY; + }, r2.prototype.toJSON = function() { return this.data; - }, r.prototype.fromJSON = function(t2) { - return this.data = t2, this; - }, r.prototype._all = function(t2, i3) { - for (var n3 = []; t2; ) - t2.leaf ? i3.push.apply(i3, t2.children) : n3.push.apply(n3, t2.children), t2 = n3.pop(); - return i3; - }, r.prototype._build = function(t2, i3, n3, r2) { - var e3, h2 = n3 - i3 + 1, o2 = this._maxEntries; - if (h2 <= o2) - return a(e3 = p(t2.slice(i3, n3 + 1)), this.toBBox), e3; - r2 || (r2 = Math.ceil(Math.log(h2) / Math.log(o2)), o2 = Math.ceil(h2 / Math.pow(o2, r2 - 1))), (e3 = p([])).leaf = false, e3.height = r2; - var s2 = Math.ceil(h2 / o2), l2 = s2 * Math.ceil(Math.sqrt(o2)); - d(t2, i3, n3, l2, this.compareMinX); - for (var f3 = i3; f3 <= n3; f3 += l2) { - var u2 = Math.min(f3 + l2 - 1, n3); - d(t2, f3, u2, s2, this.compareMinY); - for (var m2 = f3; m2 <= u2; m2 += s2) { - var c2 = Math.min(m2 + s2 - 1, u2); - e3.children.push(this._build(t2, m2, c2, r2 - 1)); - } - } - return a(e3, this.toBBox), e3; - }, r.prototype._chooseSubtree = function(t2, i3, n3, r2) { - for (; r2.push(i3), !i3.leaf && r2.length - 1 !== n3; ) { - for (var e3 = 1 / 0, a2 = 1 / 0, h2 = void 0, o2 = 0; o2 < i3.children.length; o2++) { - var s2 = i3.children[o2], l2 = f2(s2), u2 = (m2 = t2, c2 = s2, (Math.max(c2.maxX, m2.maxX) - Math.min(c2.minX, m2.minX)) * (Math.max(c2.maxY, m2.maxY) - Math.min(c2.minY, m2.minY)) - l2); - u2 < a2 ? (a2 = u2, e3 = l2 < e3 ? l2 : e3, h2 = s2) : u2 === a2 && l2 < e3 && (e3 = l2, h2 = s2); - } - i3 = h2 || i3.children[0]; - } - var m2, c2; - return i3; - }, r.prototype._insert = function(t2, i3, n3) { - var r2 = n3 ? t2 : this.toBBox(t2), e3 = [], a2 = this._chooseSubtree(r2, this.data, i3, e3); - for (a2.children.push(t2), o(a2, r2); i3 >= 0 && e3[i3].children.length > this._maxEntries; ) - this._split(e3, i3), i3--; - this._adjustParentBBoxes(r2, e3, i3); - }, r.prototype._split = function(t2, i3) { - var n3 = t2[i3], r2 = n3.children.length, e3 = this._minEntries; - this._chooseSplitAxis(n3, e3, r2); - var h2 = this._chooseSplitIndex(n3, e3, r2), o2 = p(n3.children.splice(h2, n3.children.length - h2)); - o2.height = n3.height, o2.leaf = n3.leaf, a(n3, this.toBBox), a(o2, this.toBBox), i3 ? t2[i3 - 1].children.push(o2) : this._splitRoot(n3, o2); - }, r.prototype._splitRoot = function(t2, i3) { - this.data = p([t2, i3]), this.data.height = t2.height + 1, this.data.leaf = false, a(this.data, this.toBBox); - }, r.prototype._chooseSplitIndex = function(t2, i3, n3) { - for (var r2, e3, a2, o2, s2, l2, u2, m2 = 1 / 0, c2 = 1 / 0, p2 = i3; p2 <= n3 - i3; p2++) { - var d2 = h(t2, 0, p2, this.toBBox), x = h(t2, p2, n3, this.toBBox), v = (e3 = d2, a2 = x, o2 = void 0, s2 = void 0, l2 = void 0, u2 = void 0, o2 = Math.max(e3.minX, a2.minX), s2 = Math.max(e3.minY, a2.minY), l2 = Math.min(e3.maxX, a2.maxX), u2 = Math.min(e3.maxY, a2.maxY), Math.max(0, l2 - o2) * Math.max(0, u2 - s2)), M = f2(d2) + f2(x); - v < m2 ? (m2 = v, r2 = p2, c2 = M < c2 ? M : c2) : v === m2 && M < c2 && (c2 = M, r2 = p2); - } - return r2 || n3 - i3; - }, r.prototype._chooseSplitAxis = function(t2, i3, n3) { - var r2 = t2.leaf ? this.compareMinX : s, e3 = t2.leaf ? this.compareMinY : l; - this._allDistMargin(t2, i3, n3, r2) < this._allDistMargin(t2, i3, n3, e3) && t2.children.sort(r2); - }, r.prototype._allDistMargin = function(t2, i3, n3, r2) { - t2.children.sort(r2); - for (var e3 = this.toBBox, a2 = h(t2, 0, i3, e3), s2 = h(t2, n3 - i3, n3, e3), l2 = u(a2) + u(s2), f3 = i3; f3 < n3 - i3; f3++) { - var m2 = t2.children[f3]; - o(a2, t2.leaf ? e3(m2) : m2), l2 += u(a2); - } - for (var c2 = n3 - i3 - 1; c2 >= i3; c2--) { - var p2 = t2.children[c2]; - o(s2, t2.leaf ? e3(p2) : p2), l2 += u(s2); - } - return l2; - }, r.prototype._adjustParentBBoxes = function(t2, i3, n3) { - for (var r2 = n3; r2 >= 0; r2--) - o(i3[r2], t2); - }, r.prototype._condense = function(t2) { - for (var i3 = t2.length - 1, n3 = void 0; i3 >= 0; i3--) - 0 === t2[i3].children.length ? i3 > 0 ? (n3 = t2[i3 - 1].children).splice(n3.indexOf(t2[i3]), 1) : this.clear() : a(t2[i3], this.toBBox); - }, r; + }, r2.prototype.fromJSON = function(t3) { + return this.data = t3, this; + }, r2.prototype._all = function(t3, i4) { + for (var n4 = []; t3; ) + t3.leaf ? i4.push.apply(i4, t3.children) : n4.push.apply(n4, t3.children), t3 = n4.pop(); + return i4; + }, r2.prototype._build = function(t3, i4, n4, r3) { + var e4, h3 = n4 - i4 + 1, o3 = this._maxEntries; + if (h3 <= o3) + return a2(e4 = p2(t3.slice(i4, n4 + 1)), this.toBBox), e4; + r3 || (r3 = Math.ceil(Math.log(h3) / Math.log(o3)), o3 = Math.ceil(h3 / Math.pow(o3, r3 - 1))), (e4 = p2([])).leaf = false, e4.height = r3; + var s3 = Math.ceil(h3 / o3), l3 = s3 * Math.ceil(Math.sqrt(o3)); + d2(t3, i4, n4, l3, this.compareMinX); + for (var f4 = i4; f4 <= n4; f4 += l3) { + var u3 = Math.min(f4 + l3 - 1, n4); + d2(t3, f4, u3, s3, this.compareMinY); + for (var m3 = f4; m3 <= u3; m3 += s3) { + var c3 = Math.min(m3 + s3 - 1, u3); + e4.children.push(this._build(t3, m3, c3, r3 - 1)); + } + } + return a2(e4, this.toBBox), e4; + }, r2.prototype._chooseSubtree = function(t3, i4, n4, r3) { + for (; r3.push(i4), !i4.leaf && r3.length - 1 !== n4; ) { + for (var e4 = 1 / 0, a3 = 1 / 0, h3 = void 0, o3 = 0; o3 < i4.children.length; o3++) { + var s3 = i4.children[o3], l3 = f3(s3), u3 = (m3 = t3, c3 = s3, (Math.max(c3.maxX, m3.maxX) - Math.min(c3.minX, m3.minX)) * (Math.max(c3.maxY, m3.maxY) - Math.min(c3.minY, m3.minY)) - l3); + u3 < a3 ? (a3 = u3, e4 = l3 < e4 ? l3 : e4, h3 = s3) : u3 === a3 && l3 < e4 && (e4 = l3, h3 = s3); + } + i4 = h3 || i4.children[0]; + } + var m3, c3; + return i4; + }, r2.prototype._insert = function(t3, i4, n4) { + var r3 = n4 ? t3 : this.toBBox(t3), e4 = [], a3 = this._chooseSubtree(r3, this.data, i4, e4); + for (a3.children.push(t3), o2(a3, r3); i4 >= 0 && e4[i4].children.length > this._maxEntries; ) + this._split(e4, i4), i4--; + this._adjustParentBBoxes(r3, e4, i4); + }, r2.prototype._split = function(t3, i4) { + var n4 = t3[i4], r3 = n4.children.length, e4 = this._minEntries; + this._chooseSplitAxis(n4, e4, r3); + var h3 = this._chooseSplitIndex(n4, e4, r3), o3 = p2(n4.children.splice(h3, n4.children.length - h3)); + o3.height = n4.height, o3.leaf = n4.leaf, a2(n4, this.toBBox), a2(o3, this.toBBox), i4 ? t3[i4 - 1].children.push(o3) : this._splitRoot(n4, o3); + }, r2.prototype._splitRoot = function(t3, i4) { + this.data = p2([t3, i4]), this.data.height = t3.height + 1, this.data.leaf = false, a2(this.data, this.toBBox); + }, r2.prototype._chooseSplitIndex = function(t3, i4, n4) { + for (var r3, e4, a3, o3, s3, l3, u3, m3 = 1 / 0, c3 = 1 / 0, p3 = i4; p3 <= n4 - i4; p3++) { + var d4 = h2(t3, 0, p3, this.toBBox), x2 = h2(t3, p3, n4, this.toBBox), v2 = (e4 = d4, a3 = x2, o3 = void 0, s3 = void 0, l3 = void 0, u3 = void 0, o3 = Math.max(e4.minX, a3.minX), s3 = Math.max(e4.minY, a3.minY), l3 = Math.min(e4.maxX, a3.maxX), u3 = Math.min(e4.maxY, a3.maxY), Math.max(0, l3 - o3) * Math.max(0, u3 - s3)), M2 = f3(d4) + f3(x2); + v2 < m3 ? (m3 = v2, r3 = p3, c3 = M2 < c3 ? M2 : c3) : v2 === m3 && M2 < c3 && (c3 = M2, r3 = p3); + } + return r3 || n4 - i4; + }, r2.prototype._chooseSplitAxis = function(t3, i4, n4) { + var r3 = t3.leaf ? this.compareMinX : s2, e4 = t3.leaf ? this.compareMinY : l2; + this._allDistMargin(t3, i4, n4, r3) < this._allDistMargin(t3, i4, n4, e4) && t3.children.sort(r3); + }, r2.prototype._allDistMargin = function(t3, i4, n4, r3) { + t3.children.sort(r3); + for (var e4 = this.toBBox, a3 = h2(t3, 0, i4, e4), s3 = h2(t3, n4 - i4, n4, e4), l3 = u2(a3) + u2(s3), f4 = i4; f4 < n4 - i4; f4++) { + var m3 = t3.children[f4]; + o2(a3, t3.leaf ? e4(m3) : m3), l3 += u2(a3); + } + for (var c3 = n4 - i4 - 1; c3 >= i4; c3--) { + var p3 = t3.children[c3]; + o2(s3, t3.leaf ? e4(p3) : p3), l3 += u2(s3); + } + return l3; + }, r2.prototype._adjustParentBBoxes = function(t3, i4, n4) { + for (var r3 = n4; r3 >= 0; r3--) + o2(i4[r3], t3); + }, r2.prototype._condense = function(t3) { + for (var i4 = t3.length - 1, n4 = void 0; i4 >= 0; i4--) + 0 === t3[i4].children.length ? i4 > 0 ? (n4 = t3[i4 - 1].children).splice(n4.indexOf(t3[i4]), 1) : this.clear() : a2(t3[i4], this.toBBox); + }, r2; }); } }); @@ -12379,81 +12538,81 @@ var require_ieee754 = __commonJS({ "node_modules/ieee754/index.js"(exports2) { exports2.read = function(buffer, offset, isLE, mLen, nBytes) { - var e, m; + var e3, m2; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = -7; - var i2 = isLE ? nBytes - 1 : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i2]; - i2 += d; - e = s & (1 << -nBits) - 1; - s >>= -nBits; + var i3 = isLE ? nBytes - 1 : 0; + var d2 = isLE ? -1 : 1; + var s2 = buffer[offset + i3]; + i3 += d2; + e3 = s2 & (1 << -nBits) - 1; + s2 >>= -nBits; nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i2], i2 += d, nBits -= 8) { + for (; nBits > 0; e3 = e3 * 256 + buffer[offset + i3], i3 += d2, nBits -= 8) { } - m = e & (1 << -nBits) - 1; - e >>= -nBits; + m2 = e3 & (1 << -nBits) - 1; + e3 >>= -nBits; nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i2], i2 += d, nBits -= 8) { + for (; nBits > 0; m2 = m2 * 256 + buffer[offset + i3], i3 += d2, nBits -= 8) { } - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : (s ? -1 : 1) * Infinity; + if (e3 === 0) { + e3 = 1 - eBias; + } else if (e3 === eMax) { + return m2 ? NaN : (s2 ? -1 : 1) * Infinity; } else { - m = m + Math.pow(2, mLen); - e = e - eBias; + m2 = m2 + Math.pow(2, mLen); + e3 = e3 - eBias; } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); + return (s2 ? -1 : 1) * m2 * Math.pow(2, e3 - mLen); }; exports2.write = function(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; + var e3, m2, c2; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; - var i2 = isLE ? 0 : nBytes - 1; - var d = isLE ? 1 : -1; - var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + var i3 = isLE ? 0 : nBytes - 1; + var d2 = isLE ? 1 : -1; + var s2 = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; + m2 = isNaN(value) ? 1 : 0; + e3 = eMax; } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; + e3 = Math.floor(Math.log(value) / Math.LN2); + if (value * (c2 = Math.pow(2, -e3)) < 1) { + e3--; + c2 *= 2; } - if (e + eBias >= 1) { - value += rt / c; + if (e3 + eBias >= 1) { + value += rt / c2; } else { value += rt * Math.pow(2, 1 - eBias); } - if (value * c >= 2) { - e++; - c /= 2; + if (value * c2 >= 2) { + e3++; + c2 /= 2; } - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; + if (e3 + eBias >= eMax) { + m2 = 0; + e3 = eMax; + } else if (e3 + eBias >= 1) { + m2 = (value * c2 - 1) * Math.pow(2, mLen); + e3 = e3 + eBias; } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; + m2 = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e3 = 0; } } - for (; mLen >= 8; buffer[offset + i2] = m & 255, i2 += d, m /= 256, mLen -= 8) { + for (; mLen >= 8; buffer[offset + i3] = m2 & 255, i3 += d2, m2 /= 256, mLen -= 8) { } - e = e << mLen | m; + e3 = e3 << mLen | m2; eLen += mLen; - for (; eLen > 0; buffer[offset + i2] = e & 255, i2 += d, e /= 256, eLen -= 8) { + for (; eLen > 0; buffer[offset + i3] = e3 & 255, i3 += d2, e3 /= 256, eLen -= 8) { } - buffer[offset + i2 - d] |= s * 128; + buffer[offset + i3 - d2] |= s2 * 128; }; } }); @@ -12482,6 +12641,7 @@ destroy: function() { this.buf = null; }, + // === READING ================================================================= readFields: function(readField, result, end) { end = end || this.length; while (this.pos < end) { @@ -12506,6 +12666,7 @@ this.pos += 4; return val; }, + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) readFixed64: function() { var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; @@ -12527,25 +12688,25 @@ return val; }, readVarint: function(isSigned) { - var buf = this.buf, val, b; - b = buf[this.pos++]; - val = b & 127; - if (b < 128) + var buf = this.buf, val, b2; + b2 = buf[this.pos++]; + val = b2 & 127; + if (b2 < 128) return val; - b = buf[this.pos++]; - val |= (b & 127) << 7; - if (b < 128) + b2 = buf[this.pos++]; + val |= (b2 & 127) << 7; + if (b2 < 128) return val; - b = buf[this.pos++]; - val |= (b & 127) << 14; - if (b < 128) + b2 = buf[this.pos++]; + val |= (b2 & 127) << 14; + if (b2 < 128) return val; - b = buf[this.pos++]; - val |= (b & 127) << 21; - if (b < 128) + b2 = buf[this.pos++]; + val |= (b2 & 127) << 21; + if (b2 < 128) return val; - b = buf[this.pos]; - val |= (b & 15) << 28; + b2 = buf[this.pos]; + val |= (b2 & 15) << 28; return readVarintRemainder(val, isSigned, this); }, readVarint64: function() { @@ -12572,6 +12733,7 @@ this.pos = end; return buffer; }, + // verbose for performance reasons; doesn't affect gzipped size readPackedVarint: function(arr, isSigned) { if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned)); @@ -12654,21 +12816,22 @@ return arr; }, skip: function(val) { - var type3 = val & 7; - if (type3 === Pbf.Varint) + var type2 = val & 7; + if (type2 === Pbf.Varint) while (this.buf[this.pos++] > 127) { } - else if (type3 === Pbf.Bytes) + else if (type2 === Pbf.Bytes) this.pos = this.readVarint() + this.pos; - else if (type3 === Pbf.Fixed32) + else if (type2 === Pbf.Fixed32) this.pos += 4; - else if (type3 === Pbf.Fixed64) + else if (type2 === Pbf.Fixed64) this.pos += 8; else - throw new Error("Unimplemented type: " + type3); + throw new Error("Unimplemented type: " + type2); }, - writeTag: function(tag, type3) { - this.writeVarint(tag << 3 | type3); + // === WRITING ================================================================= + writeTag: function(tag, type2) { + this.writeVarint(tag << 3 | type2); }, realloc: function(min3) { var length = this.length || 16; @@ -12759,8 +12922,8 @@ var len = buffer.length; this.writeVarint(len); this.realloc(len); - for (var i2 = 0; i2 < len; i2++) - this.buf[this.pos++] = buffer[i2]; + for (var i3 = 0; i3 < len; i3++) + this.buf[this.pos++] = buffer[i3]; }, writeRawMessage: function(fn, obj) { this.pos++; @@ -12857,32 +13020,32 @@ this.writeVarintField(tag, Boolean(val)); } }; - function readVarintRemainder(l, s, p) { - var buf = p.buf, h, b; - b = buf[p.pos++]; - h = (b & 112) >> 4; - if (b < 128) - return toNum(l, h, s); - b = buf[p.pos++]; - h |= (b & 127) << 3; - if (b < 128) - return toNum(l, h, s); - b = buf[p.pos++]; - h |= (b & 127) << 10; - if (b < 128) - return toNum(l, h, s); - b = buf[p.pos++]; - h |= (b & 127) << 17; - if (b < 128) - return toNum(l, h, s); - b = buf[p.pos++]; - h |= (b & 127) << 24; - if (b < 128) - return toNum(l, h, s); - b = buf[p.pos++]; - h |= (b & 1) << 31; - if (b < 128) - return toNum(l, h, s); + function readVarintRemainder(l2, s2, p2) { + var buf = p2.buf, h2, b2; + b2 = buf[p2.pos++]; + h2 = (b2 & 112) >> 4; + if (b2 < 128) + return toNum(l2, h2, s2); + b2 = buf[p2.pos++]; + h2 |= (b2 & 127) << 3; + if (b2 < 128) + return toNum(l2, h2, s2); + b2 = buf[p2.pos++]; + h2 |= (b2 & 127) << 10; + if (b2 < 128) + return toNum(l2, h2, s2); + b2 = buf[p2.pos++]; + h2 |= (b2 & 127) << 17; + if (b2 < 128) + return toNum(l2, h2, s2); + b2 = buf[p2.pos++]; + h2 |= (b2 & 127) << 24; + if (b2 < 128) + return toNum(l2, h2, s2); + b2 = buf[p2.pos++]; + h2 |= (b2 & 1) << 31; + if (b2 < 128) + return toNum(l2, h2, s2); throw new Error("Expected varint not more than 10 bytes"); } function readPackedEnd(pbf) { @@ -12949,44 +13112,44 @@ function makeRoomForExtraLength(startPos, len, pbf) { var extraLen = len <= 16383 ? 1 : len <= 2097151 ? 2 : len <= 268435455 ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); pbf.realloc(extraLen); - for (var i2 = pbf.pos - 1; i2 >= startPos; i2--) - pbf.buf[i2 + extraLen] = pbf.buf[i2]; + for (var i3 = pbf.pos - 1; i3 >= startPos; i3--) + pbf.buf[i3 + extraLen] = pbf.buf[i3]; } function writePackedVarint(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeVarint(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeVarint(arr[i3]); } function writePackedSVarint(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeSVarint(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeSVarint(arr[i3]); } function writePackedFloat(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeFloat(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeFloat(arr[i3]); } function writePackedDouble(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeDouble(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeDouble(arr[i3]); } function writePackedBoolean(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeBoolean(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeBoolean(arr[i3]); } function writePackedFixed32(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeFixed32(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeFixed32(arr[i3]); } function writePackedSFixed32(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeSFixed32(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeSFixed32(arr[i3]); } function writePackedFixed64(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeFixed64(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeFixed64(arr[i3]); } function writePackedSFixed64(arr, pbf) { - for (var i2 = 0; i2 < arr.length; i2++) - pbf.writeSFixed64(arr[i2]); + for (var i3 = 0; i3 < arr.length; i3++) + pbf.writeSFixed64(arr[i3]); } function readUInt32(buf, pos) { return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 16777216; @@ -13002,56 +13165,56 @@ } function readUtf8(buf, pos, end) { var str2 = ""; - var i2 = pos; - while (i2 < end) { - var b0 = buf[i2]; - var c = null; + var i3 = pos; + while (i3 < end) { + var b0 = buf[i3]; + var c2 = null; var bytesPerSequence = b0 > 239 ? 4 : b0 > 223 ? 3 : b0 > 191 ? 2 : 1; - if (i2 + bytesPerSequence > end) + if (i3 + bytesPerSequence > end) break; var b1, b2, b3; if (bytesPerSequence === 1) { if (b0 < 128) { - c = b0; + c2 = b0; } } else if (bytesPerSequence === 2) { - b1 = buf[i2 + 1]; + b1 = buf[i3 + 1]; if ((b1 & 192) === 128) { - c = (b0 & 31) << 6 | b1 & 63; - if (c <= 127) { - c = null; + c2 = (b0 & 31) << 6 | b1 & 63; + if (c2 <= 127) { + c2 = null; } } } else if (bytesPerSequence === 3) { - b1 = buf[i2 + 1]; - b2 = buf[i2 + 2]; + b1 = buf[i3 + 1]; + b2 = buf[i3 + 2]; if ((b1 & 192) === 128 && (b2 & 192) === 128) { - c = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; - if (c <= 2047 || c >= 55296 && c <= 57343) { - c = null; + c2 = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; + if (c2 <= 2047 || c2 >= 55296 && c2 <= 57343) { + c2 = null; } } } else if (bytesPerSequence === 4) { - b1 = buf[i2 + 1]; - b2 = buf[i2 + 2]; - b3 = buf[i2 + 3]; + b1 = buf[i3 + 1]; + b2 = buf[i3 + 2]; + b3 = buf[i3 + 3]; if ((b1 & 192) === 128 && (b2 & 192) === 128 && (b3 & 192) === 128) { - c = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; - if (c <= 65535 || c >= 1114112) { - c = null; + c2 = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; + if (c2 <= 65535 || c2 >= 1114112) { + c2 = null; } } } - if (c === null) { - c = 65533; + if (c2 === null) { + c2 = 65533; bytesPerSequence = 1; - } else if (c > 65535) { - c -= 65536; - str2 += String.fromCharCode(c >>> 10 & 1023 | 55296); - c = 56320 | c & 1023; + } else if (c2 > 65535) { + c2 -= 65536; + str2 += String.fromCharCode(c2 >>> 10 & 1023 | 55296); + c2 = 56320 | c2 & 1023; } - str2 += String.fromCharCode(c); - i2 += bytesPerSequence; + str2 += String.fromCharCode(c2); + i3 += bytesPerSequence; } return str2; } @@ -13059,27 +13222,27 @@ return utf8TextDecoder.decode(buf.subarray(pos, end)); } function writeUtf8(buf, str2, pos) { - for (var i2 = 0, c, lead; i2 < str2.length; i2++) { - c = str2.charCodeAt(i2); - if (c > 55295 && c < 57344) { + for (var i3 = 0, c2, lead; i3 < str2.length; i3++) { + c2 = str2.charCodeAt(i3); + if (c2 > 55295 && c2 < 57344) { if (lead) { - if (c < 56320) { + if (c2 < 56320) { buf[pos++] = 239; buf[pos++] = 191; buf[pos++] = 189; - lead = c; + lead = c2; continue; } else { - c = lead - 55296 << 10 | c - 56320 | 65536; + c2 = lead - 55296 << 10 | c2 - 56320 | 65536; lead = null; } } else { - if (c > 56319 || i2 + 1 === str2.length) { + if (c2 > 56319 || i3 + 1 === str2.length) { buf[pos++] = 239; buf[pos++] = 191; buf[pos++] = 189; } else { - lead = c; + lead = c2; } continue; } @@ -13089,21 +13252,21 @@ buf[pos++] = 189; lead = null; } - if (c < 128) { - buf[pos++] = c; + if (c2 < 128) { + buf[pos++] = c2; } else { - if (c < 2048) { - buf[pos++] = c >> 6 | 192; + if (c2 < 2048) { + buf[pos++] = c2 >> 6 | 192; } else { - if (c < 65536) { - buf[pos++] = c >> 12 | 224; + if (c2 < 65536) { + buf[pos++] = c2 >> 12 | 224; } else { - buf[pos++] = c >> 18 | 240; - buf[pos++] = c >> 12 & 63 | 128; + buf[pos++] = c2 >> 18 | 240; + buf[pos++] = c2 >> 12 & 63 | 128; } - buf[pos++] = c >> 6 & 63 | 128; + buf[pos++] = c2 >> 6 & 63 | 128; } - buf[pos++] = c & 63 | 128; + buf[pos++] = c2 & 63 | 128; } } return pos; @@ -13116,112 +13279,235 @@ "node_modules/@mapbox/point-geometry/index.js"(exports2, module2) { "use strict"; module2.exports = Point; - function Point(x, y) { - this.x = x; - this.y = y; + function Point(x2, y2) { + this.x = x2; + this.y = y2; } Point.prototype = { + /** + * Clone this point, returning a new point that can be modified + * without affecting the old one. + * @return {Point} the clone + */ clone: function() { return new Point(this.x, this.y); }, - add: function(p) { - return this.clone()._add(p); - }, - sub: function(p) { - return this.clone()._sub(p); - }, - multByPoint: function(p) { - return this.clone()._multByPoint(p); - }, - divByPoint: function(p) { - return this.clone()._divByPoint(p); - }, - mult: function(k) { - return this.clone()._mult(k); - }, - div: function(k) { - return this.clone()._div(k); - }, - rotate: function(a) { - return this.clone()._rotate(a); - }, - rotateAround: function(a, p) { - return this.clone()._rotateAround(a, p); - }, - matMult: function(m) { - return this.clone()._matMult(m); - }, + /** + * Add this point's x & y coordinates to another point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + add: function(p2) { + return this.clone()._add(p2); + }, + /** + * Subtract this point's x & y coordinates to from point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + sub: function(p2) { + return this.clone()._sub(p2); + }, + /** + * Multiply this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + multByPoint: function(p2) { + return this.clone()._multByPoint(p2); + }, + /** + * Divide this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + divByPoint: function(p2) { + return this.clone()._divByPoint(p2); + }, + /** + * Multiply this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + mult: function(k2) { + return this.clone()._mult(k2); + }, + /** + * Divide this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + div: function(k2) { + return this.clone()._div(k2); + }, + /** + * Rotate this point around the 0, 0 origin by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @return {Point} output point + */ + rotate: function(a2) { + return this.clone()._rotate(a2); + }, + /** + * Rotate this point around p point by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @param {Point} p Point to rotate around + * @return {Point} output point + */ + rotateAround: function(a2, p2) { + return this.clone()._rotateAround(a2, p2); + }, + /** + * Multiply this point by a 4x1 transformation matrix + * @param {Array} m transformation matrix + * @return {Point} output point + */ + matMult: function(m2) { + return this.clone()._matMult(m2); + }, + /** + * Calculate this point but as a unit vector from 0, 0, meaning + * that the distance from the resulting point to the 0, 0 + * coordinate will be equal to 1 and the angle from the resulting + * point to the 0, 0 coordinate will be the same as before. + * @return {Point} unit vector point + */ unit: function() { return this.clone()._unit(); }, + /** + * Compute a perpendicular point, where the new y coordinate + * is the old x coordinate and the new x coordinate is the old y + * coordinate multiplied by -1 + * @return {Point} perpendicular point + */ perp: function() { return this.clone()._perp(); }, + /** + * Return a version of this point with the x & y coordinates + * rounded to integers. + * @return {Point} rounded point + */ round: function() { return this.clone()._round(); }, + /** + * Return the magitude of this point: this is the Euclidean + * distance from the 0, 0 coordinate to this point's x and y + * coordinates. + * @return {Number} magnitude + */ mag: function() { return Math.sqrt(this.x * this.x + this.y * this.y); }, + /** + * Judge whether this point is equal to another point, returning + * true or false. + * @param {Point} other the other point + * @return {boolean} whether the points are equal + */ equals: function(other) { return this.x === other.x && this.y === other.y; }, - dist: function(p) { - return Math.sqrt(this.distSqr(p)); - }, - distSqr: function(p) { - var dx = p.x - this.x, dy = p.y - this.y; + /** + * Calculate the distance from this point to another point + * @param {Point} p the other point + * @return {Number} distance + */ + dist: function(p2) { + return Math.sqrt(this.distSqr(p2)); + }, + /** + * Calculate the distance from this point to another point, + * without the square root step. Useful if you're comparing + * relative distances. + * @param {Point} p the other point + * @return {Number} distance + */ + distSqr: function(p2) { + var dx = p2.x - this.x, dy = p2.y - this.y; return dx * dx + dy * dy; }, + /** + * Get the angle from the 0, 0 coordinate to this point, in radians + * coordinates. + * @return {Number} angle + */ angle: function() { return Math.atan2(this.y, this.x); }, - angleTo: function(b) { - return Math.atan2(this.y - b.y, this.x - b.x); - }, - angleWith: function(b) { - return this.angleWithSep(b.x, b.y); - }, - angleWithSep: function(x, y) { + /** + * Get the angle from this point to another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleTo: function(b2) { + return Math.atan2(this.y - b2.y, this.x - b2.x); + }, + /** + * Get the angle between this point and another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleWith: function(b2) { + return this.angleWithSep(b2.x, b2.y); + }, + /* + * Find the angle of the two vectors, solving the formula for + * the cross product a x b = |a||b|sin(θ) for θ. + * @param {Number} x the x-coordinate + * @param {Number} y the y-coordinate + * @return {Number} the angle in radians + */ + angleWithSep: function(x2, y2) { return Math.atan2( - this.x * y - this.y * x, - this.x * x + this.y * y + this.x * y2 - this.y * x2, + this.x * x2 + this.y * y2 ); }, - _matMult: function(m) { - var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y; - this.x = x; - this.y = y; + _matMult: function(m2) { + var x2 = m2[0] * this.x + m2[1] * this.y, y2 = m2[2] * this.x + m2[3] * this.y; + this.x = x2; + this.y = y2; return this; }, - _add: function(p) { - this.x += p.x; - this.y += p.y; + _add: function(p2) { + this.x += p2.x; + this.y += p2.y; return this; }, - _sub: function(p) { - this.x -= p.x; - this.y -= p.y; + _sub: function(p2) { + this.x -= p2.x; + this.y -= p2.y; return this; }, - _mult: function(k) { - this.x *= k; - this.y *= k; + _mult: function(k2) { + this.x *= k2; + this.y *= k2; return this; }, - _div: function(k) { - this.x /= k; - this.y /= k; + _div: function(k2) { + this.x /= k2; + this.y /= k2; return this; }, - _multByPoint: function(p) { - this.x *= p.x; - this.y *= p.y; + _multByPoint: function(p2) { + this.x *= p2.x; + this.y *= p2.y; return this; }, - _divByPoint: function(p) { - this.x /= p.x; - this.y /= p.y; + _divByPoint: function(p2) { + this.x /= p2.x; + this.y /= p2.y; return this; }, _unit: function() { @@ -13229,21 +13515,21 @@ return this; }, _perp: function() { - var y = this.y; + var y2 = this.y; this.y = this.x; - this.x = -y; + this.x = -y2; return this; }, _rotate: function(angle2) { - var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = cos2 * this.x - sin2 * this.y, y = sin2 * this.x + cos2 * this.y; - this.x = x; - this.y = y; + var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x2 = cos2 * this.x - sin2 * this.y, y2 = sin2 * this.x + cos2 * this.y; + this.x = x2; + this.y = y2; return this; }, - _rotateAround: function(angle2, p) { - var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = p.x + cos2 * (this.x - p.x) - sin2 * (this.y - p.y), y = p.y + sin2 * (this.x - p.x) + cos2 * (this.y - p.y); - this.x = x; - this.y = y; + _rotateAround: function(angle2, p2) { + var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x2 = p2.x + cos2 * (this.x - p2.x) - sin2 * (this.y - p2.y), y2 = p2.y + sin2 * (this.x - p2.x) + cos2 * (this.y - p2.y); + this.x = x2; + this.y = y2; return this; }, _round: function() { @@ -13252,14 +13538,14 @@ return this; } }; - Point.convert = function(a) { - if (a instanceof Point) { - return a; + Point.convert = function(a2) { + if (a2 instanceof Point) { + return a2; } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); + if (Array.isArray(a2)) { + return new Point(a2[0], a2[1]); } - return a; + return a2; }; } }); @@ -13270,13 +13556,13 @@ "use strict"; var Point = require_point_geometry(); module2.exports = VectorTileFeature; - function VectorTileFeature(pbf, end, extent, keys, values) { + function VectorTileFeature(pbf, end, extent, keys2, values) { this.properties = {}; this.extent = extent; this.type = 0; this._pbf = pbf; this._geometry = -1; - this._keys = keys; + this._keys = keys2; this._values = values; pbf.readFields(readFeature, this, end); } @@ -13301,7 +13587,7 @@ VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; - var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; + var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x2 = 0, y2 = 0, lines = [], line; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); @@ -13310,14 +13596,14 @@ } length--; if (cmd === 1 || cmd === 2) { - x += pbf.readSVarint(); - y += pbf.readSVarint(); + x2 += pbf.readSVarint(); + y2 += pbf.readSVarint(); if (cmd === 1) { if (line) lines.push(line); line = []; } - line.push(new Point(x, y)); + line.push(new Point(x2, y2)); } else if (cmd === 7) { if (line) { line.push(line[0].clone()); @@ -13333,7 +13619,7 @@ VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; - var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x12 = Infinity, x2 = -Infinity, y12 = Infinity, y2 = -Infinity; + var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x2 = 0, y2 = 0, x12 = Infinity, x22 = -Infinity, y12 = Infinity, y22 = -Infinity; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); @@ -13342,52 +13628,52 @@ } length--; if (cmd === 1 || cmd === 2) { - x += pbf.readSVarint(); - y += pbf.readSVarint(); - if (x < x12) - x12 = x; - if (x > x2) - x2 = x; - if (y < y12) - y12 = y; - if (y > y2) - y2 = y; + x2 += pbf.readSVarint(); + y2 += pbf.readSVarint(); + if (x2 < x12) + x12 = x2; + if (x2 > x22) + x22 = x2; + if (y2 < y12) + y12 = y2; + if (y2 > y22) + y22 = y2; } else if (cmd !== 7) { throw new Error("unknown command " + cmd); } } - return [x12, y12, x2, y2]; + return [x12, y12, x22, y22]; }; - VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { - var size = this.extent * Math.pow(2, z), x05 = this.extent * x, y05 = this.extent * y, coords = this.loadGeometry(), type3 = VectorTileFeature.types[this.type], i2, j2; + VectorTileFeature.prototype.toGeoJSON = function(x2, y2, z2) { + var size = this.extent * Math.pow(2, z2), x05 = this.extent * x2, y05 = this.extent * y2, coords = this.loadGeometry(), type2 = VectorTileFeature.types[this.type], i3, j3; function project(line) { - for (var j3 = 0; j3 < line.length; j3++) { - var p = line[j3], y2 = 180 - (p.y + y05) * 360 / size; - line[j3] = [ - (p.x + x05) * 360 / size - 180, - 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + for (var j4 = 0; j4 < line.length; j4++) { + var p2 = line[j4], y22 = 180 - (p2.y + y05) * 360 / size; + line[j4] = [ + (p2.x + x05) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y22 * Math.PI / 180)) - 90 ]; } } switch (this.type) { case 1: var points = []; - for (i2 = 0; i2 < coords.length; i2++) { - points[i2] = coords[i2][0]; + for (i3 = 0; i3 < coords.length; i3++) { + points[i3] = coords[i3][0]; } coords = points; project(coords); break; case 2: - for (i2 = 0; i2 < coords.length; i2++) { - project(coords[i2]); + for (i3 = 0; i3 < coords.length; i3++) { + project(coords[i3]); } break; case 3: coords = classifyRings(coords); - for (i2 = 0; i2 < coords.length; i2++) { - for (j2 = 0; j2 < coords[i2].length; j2++) { - project(coords[i2][j2]); + for (i3 = 0; i3 < coords.length; i3++) { + for (j3 = 0; j3 < coords[i3].length; j3++) { + project(coords[i3][j3]); } } break; @@ -13395,12 +13681,12 @@ if (coords.length === 1) { coords = coords[0]; } else { - type3 = "Multi" + type3; + type2 = "Multi" + type2; } var result = { type: "Feature", geometry: { - type: type3, + type: type2, coordinates: coords }, properties: this.properties @@ -13415,8 +13701,8 @@ if (len <= 1) return [rings]; var polygons = [], polygon2, ccw; - for (var i2 = 0; i2 < len; i2++) { - var area = signedArea(rings[i2]); + for (var i3 = 0; i3 < len; i3++) { + var area = signedArea(rings[i3]); if (area === 0) continue; if (ccw === void 0) @@ -13424,9 +13710,9 @@ if (ccw === area < 0) { if (polygon2) polygons.push(polygon2); - polygon2 = [rings[i2]]; + polygon2 = [rings[i3]]; } else { - polygon2.push(rings[i2]); + polygon2.push(rings[i3]); } } if (polygon2) @@ -13435,9 +13721,9 @@ } function signedArea(ring) { var sum = 0; - for (var i2 = 0, len = ring.length, j2 = len - 1, p1, p2; i2 < len; j2 = i2++) { - p1 = ring[i2]; - p2 = ring[j2]; + for (var i3 = 0, len = ring.length, j3 = len - 1, p1, p2; i3 < len; j3 = i3++) { + p1 = ring[i3]; + p2 = ring[j3]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; @@ -13485,10 +13771,10 @@ } return value; } - VectorTileLayer.prototype.feature = function(i2) { - if (i2 < 0 || i2 >= this._features.length) + VectorTileLayer.prototype.feature = function(i3) { + if (i3 < 0 || i3 >= this._features.length) throw new Error("feature index out of bounds"); - this._pbf.pos = this._features[i2]; + this._pbf.pos = this._features[i3]; var end = this._pbf.readVarint() + this._pbf.pos; return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); }; @@ -13500,8 +13786,8 @@ "node_modules/@mapbox/vector-tile/lib/vectortile.js"(exports2, module2) { "use strict"; var VectorTileLayer = require_vectortilelayer(); - module2.exports = VectorTile2; - function VectorTile2(pbf, end) { + module2.exports = VectorTile3; + function VectorTile3(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { @@ -13533,12 +13819,12 @@ if (typeof opts === "function") opts = { cmp: opts }; var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false; - var cmp = opts.cmp && function(f2) { + var cmp = opts.cmp && function(f3) { return function(node) { - return function(a, b) { - var aobj = { key: a, value: node[a] }; - var bobj = { key: b, value: node[b] }; - return f2(aobj, bobj); + return function(a2, b2) { + var aobj = { key: a2, value: node[a2] }; + var bobj = { key: b2, value: node[b2] }; + return f3(aobj, bobj); }; }; }(opts.cmp); @@ -13553,13 +13839,13 @@ return isFinite(node) ? "" + node : "null"; if (typeof node !== "object") return JSON.stringify(node); - var i2, out; + var i3, out; if (Array.isArray(node)) { out = "["; - for (i2 = 0; i2 < node.length; i2++) { - if (i2) + for (i3 = 0; i3 < node.length; i3++) { + if (i3) out += ","; - out += stringify3(node[i2]) || "null"; + out += stringify3(node[i3]) || "null"; } return out + "]"; } @@ -13571,10 +13857,10 @@ throw new TypeError("Converting circular structure to JSON"); } var seenIndex = seen.push(node) - 1; - var keys = Object.keys(node).sort(cmp && cmp(node)); + var keys2 = Object.keys(node).sort(cmp && cmp(node)); out = ""; - for (i2 = 0; i2 < keys.length; i2++) { - var key = keys[i2]; + for (i3 = 0; i3 < keys2.length; i3++) { + var key = keys2[i3]; var value = stringify3(node[key]); if (!value) continue; @@ -13593,7 +13879,7 @@ var require_sexagesimal = __commonJS({ "node_modules/@mapbox/sexagesimal/index.js"(exports2, module2) { module2.exports = element; - module2.exports.pair = pair2; + module2.exports.pair = pair3; module2.exports.format = format2; module2.exports.formatPair = formatPair; module2.exports.coordToDMS = coordToDMS; @@ -13631,22 +13917,22 @@ return null; input = input.toUpperCase(); var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/; - var m = input.match(regex); - if (!m) + var m2 = input.match(regex); + if (!m2) return null; - var matched = m[0]; + var matched = m2[0]; var dim; - if (m[1] && m[5]) { - dim = m[1]; + if (m2[1] && m2[5]) { + dim = m2[1]; matched = matched.slice(0, -1); } else { - dim = m[1] || m[5]; + dim = m2[1] || m2[5]; } if (dim && dims.indexOf(dim) === -1) return null; - var deg = m[2] ? parseFloat(m[2]) : 0; - var min3 = m[3] ? parseFloat(m[3]) / 60 : 0; - var sec = m[4] ? parseFloat(m[4]) / 3600 : 0; + var deg = m2[2] ? parseFloat(m2[2]) : 0; + var min3 = m2[3] ? parseFloat(m2[3]) / 60 : 0; + var sec = m2[4] ? parseFloat(m2[4]) / 3600 : 0; var sign2 = deg < 0 ? -1 : 1; if (dim === "S" || dim === "W") sign2 *= -1; @@ -13657,7 +13943,7 @@ remain: input.slice(matched.length) }; } - function pair2(input, dims) { + function pair3(input, dims) { input = input.trim(); var one2 = search(input, dims); if (!one2) @@ -13672,11 +13958,11 @@ return [one2.val, two.val]; } } - function swapdim(a, b, dim) { + function swapdim(a2, b2, dim) { if (dim === "N" || dim === "S") - return [a, b]; + return [a2, b2]; if (dim === "W" || dim === "E") - return [b, a]; + return [b2, a2]; } } }); @@ -13698,8 +13984,8 @@ map: map2, pluck, isList, - isFunction, - isObject: isObject2, + isFunction: isFunction2, + isObject: isObject3, Global }; function make_assign() { @@ -13707,8 +13993,8 @@ return Object.assign; } else { return function shimAssign(obj, props1, props2, etc) { - for (var i2 = 1; i2 < arguments.length; i2++) { - each(Object(arguments[i2]), function(val, key) { + for (var i3 = 1; i3 < arguments.length; i3++) { + each(Object(arguments[i3]), function(val, key) { obj[key] = val; }); } @@ -13723,13 +14009,13 @@ return assign.apply(this, [Object.create(obj)].concat(assignArgsList)); }; } else { - let F2 = function() { + let F3 = function() { }; - var F = F2; + var F2 = F3; return function create3(obj, assignProps1, assignProps2, etc) { var assignArgsList = slice(arguments, 1); - F2.prototype = obj; - return assign.apply(this, [new F2()].concat(assignArgsList)); + F3.prototype = obj; + return assign.apply(this, [new F3()].concat(assignArgsList)); }; } } @@ -13760,17 +14046,17 @@ } function map2(obj, fn) { var res = isList(obj) ? [] : {}; - pluck(obj, function(v, k) { - res[k] = fn(v, k); + pluck(obj, function(v2, k2) { + res[k2] = fn(v2, k2); return false; }); return res; } function pluck(obj, fn) { if (isList(obj)) { - for (var i2 = 0; i2 < obj.length; i2++) { - if (fn(obj[i2], i2)) { - return obj[i2]; + for (var i3 = 0; i3 < obj.length; i3++) { + if (fn(obj[i3], i3)) { + return obj[i3]; } } } else { @@ -13786,10 +14072,10 @@ function isList(val) { return val != null && typeof val != "function" && typeof val.length == "number"; } - function isFunction(val) { + function isFunction2(val) { return val && {}.toString.call(val) === "[object Function]"; } - function isObject2(val) { + function isObject3(val) { return val && {}.toString.call(val) === "[object Object]"; } } @@ -13805,18 +14091,22 @@ var bind = util.bind; var create2 = util.create; var isList = util.isList; - var isFunction = util.isFunction; - var isObject2 = util.isObject; + var isFunction2 = util.isFunction; + var isObject3 = util.isObject; module2.exports = { createStore }; var storeAPI = { version: "2.0.12", enabled: false, + // get returns the value of the given key. If that value + // is undefined, it returns optionalDefaultValue instead. get: function(key, optionalDefaultValue) { var data = this.storage.read(this._namespacePrefix + key); return this._deserialize(data, optionalDefaultValue); }, + // set will store the given value at key and returns value. + // Calling set with value === undefined is equivalent to calling remove. set: function(key, value) { if (value === void 0) { return this.remove(key); @@ -13824,21 +14114,31 @@ this.storage.write(this._namespacePrefix + key, this._serialize(value)); return value; }, + // remove deletes the key and value stored at the given key. remove: function(key) { this.storage.remove(this._namespacePrefix + key); }, + // each will call the given callback once for each key-value pair + // in this store. each: function(callback) { var self2 = this; this.storage.each(function(val, namespacedKey) { callback.call(self2, self2._deserialize(val), (namespacedKey || "").replace(self2._namespaceRegexp, "")); }); }, + // clearAll will remove all the stored key-value pairs in this store. clearAll: function() { this.storage.clearAll(); }, + // additional functionality that can't live in plugins + // --------------------------------------------------- + // hasNamespace returns true if this store instance has the given namespace. hasNamespace: function(namespace) { return this._namespacePrefix == "__storejs_" + namespace + "_"; }, + // createStore creates a store.js instance with the first + // functioning storage in the list of storage candidates, + // and applies the the given mixins to the instance. createStore: function() { return createStore.apply(this, arguments); }, @@ -13883,7 +14183,7 @@ var ok = storage.read(testStr) === testStr; storage.remove(testStr); return ok; - } catch (e) { + } catch (e3) { return false; } }, @@ -13896,8 +14196,8 @@ if (!oldFn) { return; } - each(arguments, function(arg, i2) { - args[i2] = arg; + each(arguments, function(arg, i3) { + args[i3] = arg; }); return oldFn.apply(self2, args); } @@ -13915,7 +14215,7 @@ var val = ""; try { val = JSON.parse(strVal); - } catch (e) { + } catch (e3) { val = strVal; } return val !== void 0 ? val : defaultVal; @@ -13944,20 +14244,23 @@ return; } this.plugins.push(plugin); - if (!isFunction(plugin)) { + if (!isFunction2(plugin)) { throw new Error("Plugins must be function values that return objects"); } var pluginProperties = plugin.call(this); - if (!isObject2(pluginProperties)) { + if (!isObject3(pluginProperties)) { throw new Error("Plugins must return an object of function properties"); } each(pluginProperties, function(pluginFnProp, propName) { - if (!isFunction(pluginFnProp)) { + if (!isFunction2(pluginFnProp)) { throw new Error("Bad plugin property: " + propName + " from plugin " + plugin.name + ". Plugins should only return functions."); } self2._assignPluginFnProp(pluginFnProp, propName); }); }, + // Put deprecated properties in the private API, so as to not expose it to accidential + // discovery through inspection of the store object. + // Deprecated: addStorage addStorage: function(storage) { _warn("store.addStorage(storage) is deprecated. Use createStore([storages])"); this._addStorage(storage); @@ -13968,7 +14271,7 @@ }); store2.raw = {}; each(store2, function(prop, propName) { - if (isFunction(prop)) { + if (isFunction2(prop)) { store2.raw[propName] = bind(store2, prop); } }); @@ -14006,8 +14309,8 @@ return localStorage2().setItem(key, data); } function each(fn) { - for (var i2 = localStorage2().length - 1; i2 >= 0; i2--) { - var key = localStorage2().key(i2); + for (var i3 = localStorage2().length - 1; i3 >= 0; i3--) { + var key = localStorage2().key(i3); fn(read(key), key); } } @@ -14041,8 +14344,8 @@ globalStorage[key] = data; } function each(fn) { - for (var i2 = globalStorage.length - 1; i2 >= 0; i2--) { - var key = globalStorage.key(i2); + for (var i3 = globalStorage.length - 1; i3 >= 0; i3--) { + var key = globalStorage.key(i3); fn(globalStorage[key], key); } } @@ -14050,7 +14353,7 @@ return globalStorage.removeItem(key); } function clearAll() { - each(function(key, _) { + each(function(key, _2) { delete globalStorage[key]; }); } @@ -14098,8 +14401,8 @@ function each(callback) { _withStorageEl(function(storageEl) { var attributes = storageEl.XMLDocument.documentElement.attributes; - for (var i2 = attributes.length - 1; i2 >= 0; i2--) { - var attr = attributes[i2]; + for (var i3 = attributes.length - 1; i3 >= 0; i3--) { + var attr = attributes[i3]; callback(storageEl.getAttribute(attr.name), attr.name); } }); @@ -14115,8 +14418,8 @@ _withStorageEl(function(storageEl) { var attributes = storageEl.XMLDocument.documentElement.attributes; storageEl.load(storageName); - for (var i2 = attributes.length - 1; i2 >= 0; i2--) { - storageEl.removeAttribute(attributes[i2].name); + for (var i3 = attributes.length - 1; i3 >= 0; i3--) { + storageEl.removeAttribute(attributes[i3].name); } storageEl.save(storageName); }); @@ -14137,7 +14440,7 @@ storageContainer.close(); storageOwner = storageContainer.w.frames[0].document; storageEl = storageOwner.createElement("div"); - } catch (e) { + } catch (e3) { storageEl = doc.createElement("div"); storageOwner = doc.body; } @@ -14179,11 +14482,11 @@ } function each(callback) { var cookies = doc.cookie.split(/; ?/g); - for (var i2 = cookies.length - 1; i2 >= 0; i2--) { - if (!trim(cookies[i2])) { + for (var i3 = cookies.length - 1; i3 >= 0; i3--) { + if (!trim(cookies[i3])) { continue; } - var kvp = cookies[i2].split("="); + var kvp = cookies[i3].split("="); var key = unescape(kvp[0]); var val = unescape(kvp[1]); callback(val, key); @@ -14202,7 +14505,7 @@ doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; } function clearAll() { - each(function(_, key) { + each(function(_2, key) { remove2(key); }); } @@ -14235,8 +14538,8 @@ return sessionStorage().setItem(key, data); } function each(fn) { - for (var i2 = sessionStorage().length - 1; i2 >= 0; i2--) { - var key = sessionStorage().key(i2); + for (var i3 = sessionStorage().length - 1; i3 >= 0; i3--) { + var key = sessionStorage().key(i3); fn(read(key), key); } } @@ -14287,6 +14590,7 @@ var require_all = __commonJS({ "node_modules/store/storages/all.js"(exports2, module2) { module2.exports = [ + // Listed in order of usage preference require_localStorage(), require_oldFF_globalStorage(), require_oldIE_userDataStorage(), @@ -14311,8 +14615,8 @@ var rx_four = /(?:^|:|,)(?:\s*\[)+/g; var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; - function f(n2) { - return n2 < 10 ? "0" + n2 : n2; + function f(n3) { + return n3 < 10 ? "0" + n3 : n3; } function this_value() { return this.valueOf(); @@ -14331,15 +14635,15 @@ var rep; function quote(string) { rx_escapable.lastIndex = 0; - return rx_escapable.test(string) ? '"' + string.replace(rx_escapable, function(a) { - var c = meta[a]; - return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + return rx_escapable.test(string) ? '"' + string.replace(rx_escapable, function(a2) { + var c2 = meta[a2]; + return typeof c2 === "string" ? c2 : "\\u" + ("0000" + a2.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { - var i2; - var k; - var v; + var i3; + var k2; + var v2; var length; var mind = gap; var partial; @@ -14366,41 +14670,42 @@ partial = []; if (Object.prototype.toString.apply(value) === "[object Array]") { length = value.length; - for (i2 = 0; i2 < length; i2 += 1) { - partial[i2] = str(i2, value) || "null"; + for (i3 = 0; i3 < length; i3 += 1) { + partial[i3] = str(i3, value) || "null"; } - v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]"; + v2 = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]"; gap = mind; - return v; + return v2; } if (rep && typeof rep === "object") { length = rep.length; - for (i2 = 0; i2 < length; i2 += 1) { - if (typeof rep[i2] === "string") { - k = rep[i2]; - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); + for (i3 = 0; i3 < length; i3 += 1) { + if (typeof rep[i3] === "string") { + k2 = rep[i3]; + v2 = str(k2, value); + if (v2) { + partial.push(quote(k2) + (gap ? ": " : ":") + v2); } } } } else { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ": " : ":") + v); + for (k2 in value) { + if (Object.prototype.hasOwnProperty.call(value, k2)) { + v2 = str(k2, value); + if (v2) { + partial.push(quote(k2) + (gap ? ": " : ":") + v2); } } } } - v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}"; + v2 = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}"; gap = mind; - return v; + return v2; } } if (typeof JSON.stringify !== "function") { meta = { + // table of character substitutions "\b": "\\b", " ": "\\t", "\n": "\\n", @@ -14410,11 +14715,11 @@ "\\": "\\\\" }; JSON.stringify = function(value, replacer, space) { - var i2; + var i3; gap = ""; indent = ""; if (typeof space === "number") { - for (i2 = 0; i2 < space; i2 += 1) { + for (i3 = 0; i3 < space; i3 += 1) { indent += " "; } } else if (typeof space === "string") { @@ -14431,17 +14736,17 @@ JSON.parse = function(text, reviver) { var j; function walk(holder, key) { - var k; - var v; + var k2; + var v2; var value = holder[key]; if (value && typeof value === "object") { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== void 0) { - value[k] = v; + for (k2 in value) { + if (Object.prototype.hasOwnProperty.call(value, k2)) { + v2 = walk(value, k2); + if (v2 !== void 0) { + value[k2] = v2; } else { - delete value[k]; + delete value[k2]; } } } @@ -14451,8 +14756,8 @@ text = String(text); rx_dangerous.lastIndex = 0; if (rx_dangerous.test(text)) { - text = text.replace(rx_dangerous, function(a) { - return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + text = text.replace(rx_dangerous, function(a2) { + return "\\u" + ("0000" + a2.charCodeAt(0).toString(16)).slice(-4); }); } if (rx_one.test( @@ -14490,20 +14795,21 @@ }); // node_modules/whatwg-fetch/fetch.js - var global2 = typeof globalThis !== "undefined" && globalThis || typeof self !== "undefined" && self || typeof global2 !== "undefined" && global2; + var g = typeof globalThis !== "undefined" && globalThis || typeof self !== "undefined" && self || // eslint-disable-next-line no-undef + typeof global !== "undefined" && global || {}; var support = { - searchParams: "URLSearchParams" in global2, - iterable: "Symbol" in global2 && "iterator" in Symbol, - blob: "FileReader" in global2 && "Blob" in global2 && function() { + searchParams: "URLSearchParams" in g, + iterable: "Symbol" in g && "iterator" in Symbol, + blob: "FileReader" in g && "Blob" in g && function() { try { new Blob(); return true; - } catch (e) { + } catch (e3) { return false; } }(), - formData: "FormData" in global2, - arrayBuffer: "ArrayBuffer" in global2 + formData: "FormData" in g, + arrayBuffer: "ArrayBuffer" in g }; function isDataView(obj) { return obj && DataView.prototype.isPrototypeOf(obj); @@ -14563,6 +14869,9 @@ }, this); } else if (Array.isArray(headers)) { headers.forEach(function(header) { + if (header.length != 2) { + throw new TypeError("Headers constructor: expected name/value pair to be length 2, found" + header.length); + } this.append(header[0], header[1]); }, this); } else if (headers) { @@ -14622,6 +14931,8 @@ Headers.prototype[Symbol.iterator] = Headers.prototype.entries; } function consumed(body) { + if (body._noBody) + return; if (body.bodyUsed) { return Promise.reject(new TypeError("Already read")); } @@ -14646,14 +14957,16 @@ function readBlobAsText(blob) { var reader = new FileReader(); var promise = fileReaderReady(reader); - reader.readAsText(blob); + var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type); + var encoding = match ? match[1] : "utf-8"; + reader.readAsText(blob, encoding); return promise; } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf); var chars = new Array(view.length); - for (var i2 = 0; i2 < view.length; i2++) { - chars[i2] = String.fromCharCode(view[i2]); + for (var i3 = 0; i3 < view.length; i3++) { + chars[i3] = String.fromCharCode(view[i3]); } return chars.join(""); } @@ -14672,6 +14985,7 @@ this.bodyUsed = this.bodyUsed; this._bodyInit = body; if (!body) { + this._noBody = true; this._bodyText = ""; } else if (typeof body === "string") { this._bodyText = body; @@ -14715,27 +15029,28 @@ return Promise.resolve(new Blob([this._bodyText])); } }; - this.arrayBuffer = function() { - if (this._bodyArrayBuffer) { - var isConsumed = consumed(this); - if (isConsumed) { - return isConsumed; - } - if (ArrayBuffer.isView(this._bodyArrayBuffer)) { - return Promise.resolve( - this._bodyArrayBuffer.buffer.slice( - this._bodyArrayBuffer.byteOffset, - this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength - ) - ); - } else { - return Promise.resolve(this._bodyArrayBuffer); - } + } + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + var isConsumed = consumed(this); + if (isConsumed) { + return isConsumed; + } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) { + return Promise.resolve( + this._bodyArrayBuffer.buffer.slice( + this._bodyArrayBuffer.byteOffset, + this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength + ) + ); } else { - return this.blob().then(readBlobAsArrayBuffer); + return Promise.resolve(this._bodyArrayBuffer); } - }; - } + } else if (support.blob) { + return this.blob().then(readBlobAsArrayBuffer); + } else { + throw new Error("could not read as ArrayBuffer"); + } + }; this.text = function() { var rejected = consumed(this); if (rejected) { @@ -14761,7 +15076,7 @@ }; return this; } - var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"]; + var methods = ["CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE"]; function normalizeMethod(method) { var upcased = method.toUpperCase(); return methods.indexOf(upcased) > -1 ? upcased : method; @@ -14797,7 +15112,12 @@ } this.method = normalizeMethod(options2.method || this.method || "GET"); this.mode = options2.mode || this.mode || null; - this.signal = options2.signal || this.signal; + this.signal = options2.signal || this.signal || function() { + if ("AbortController" in g) { + var ctrl = new AbortController(); + return ctrl.signal; + } + }(); this.referrer = null; if ((this.method === "GET" || this.method === "HEAD") && body) { throw new TypeError("Body not allowed for GET or HEAD requests"); @@ -14807,10 +15127,10 @@ if (options2.cache === "no-store" || options2.cache === "no-cache") { var reParamSearch = /([?&])_=[^&]*/; if (reParamSearch.test(this.url)) { - this.url = this.url.replace(reParamSearch, "$1_=" + new Date().getTime()); + this.url = this.url.replace(reParamSearch, "$1_=" + (/* @__PURE__ */ new Date()).getTime()); } else { var reQueryString = /\?/; - this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + new Date().getTime(); + this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + (/* @__PURE__ */ new Date()).getTime(); } } } @@ -14840,7 +15160,11 @@ var key = parts.shift().trim(); if (key) { var value = parts.join(":").trim(); - headers.append(key, value); + try { + headers.append(key, value); + } catch (error) { + console.warn("Response " + error.message); + } } }); return headers; @@ -14855,6 +15179,9 @@ } this.type = "default"; this.status = options2.status === void 0 ? 200 : options2.status; + if (this.status < 200 || this.status > 599) { + throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599]."); + } this.ok = this.status >= 200 && this.status < 300; this.statusText = options2.statusText === void 0 ? "" : "" + options2.statusText; this.headers = new Headers(options2.headers); @@ -14871,7 +15198,8 @@ }); }; Response.error = function() { - var response = new Response(null, { status: 0, statusText: "" }); + var response = new Response(null, { status: 200, statusText: "" }); + response.status = 0; response.type = "error"; return response; }; @@ -14882,7 +15210,7 @@ } return new Response(null, { status, headers: { location: url } }); }; - var DOMException2 = global2.DOMException; + var DOMException2 = g.DOMException; try { new DOMException2(); } catch (err) { @@ -14934,8 +15262,8 @@ }; function fixUrl(url) { try { - return url === "" && global2.location.href ? global2.location.href : url; - } catch (e) { + return url === "" && g.location.href ? g.location.href : url; + } catch (e3) { return url; } } @@ -14948,14 +15276,21 @@ if ("responseType" in xhr) { if (support.blob) { xhr.responseType = "blob"; - } else if (support.arrayBuffer && request3.headers.get("Content-Type") && request3.headers.get("Content-Type").indexOf("application/octet-stream") !== -1) { + } else if (support.arrayBuffer) { xhr.responseType = "arraybuffer"; } } - if (init2 && typeof init2.headers === "object" && !(init2.headers instanceof Headers)) { + if (init2 && typeof init2.headers === "object" && !(init2.headers instanceof Headers || g.Headers && init2.headers instanceof g.Headers)) { + var names = []; Object.getOwnPropertyNames(init2.headers).forEach(function(name) { + names.push(normalizeName(name)); xhr.setRequestHeader(name, normalizeValue(init2.headers[name])); }); + request3.headers.forEach(function(value, name) { + if (names.indexOf(name) === -1) { + xhr.setRequestHeader(name, value); + } + }); } else { request3.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value); @@ -14973,11 +15308,11 @@ }); } fetch2.polyfill = true; - if (!global2.fetch) { - global2.fetch = fetch2; - global2.Headers = Headers; - global2.Request = Request; - global2.Response = Response; + if (!g.fetch) { + g.fetch = fetch2; + g.Headers = Headers; + g.Request = Request; + g.Response = Response; } // node_modules/abortcontroller-polyfill/dist/polyfill-patch-fetch.js @@ -14991,8 +15326,8 @@ } } function _defineProperties(target, props) { - for (var i2 = 0; i2 < props.length; i2++) { - var descriptor = props[i2]; + for (var i3 = 0; i3 < props.length; i3++) { + var descriptor = props[i3]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) @@ -15005,6 +15340,9 @@ _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); return Constructor; } function _inherits(subClass, superClass) { @@ -15018,21 +15356,24 @@ configurable: true } }); + Object.defineProperty(subClass, "prototype", { + writable: false + }); if (superClass) _setPrototypeOf(subClass, superClass); } - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { - return o2.__proto__ || Object.getPrototypeOf(o2); + function _getPrototypeOf(o2) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o3) { + return o3.__proto__ || Object.getPrototypeOf(o3); }; - return _getPrototypeOf(o); + return _getPrototypeOf(o2); } - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { - o2.__proto__ = p2; - return o2; + function _setPrototypeOf(o2, p2) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o3, p3) { + o3.__proto__ = p3; + return o3; }; - return _setPrototypeOf(o, p); + return _setPrototypeOf(o2, p2); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) @@ -15045,7 +15386,7 @@ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { })); return true; - } catch (e) { + } catch (e3) { return false; } } @@ -15058,6 +15399,8 @@ function _possibleConstructorReturn(self2, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self2); } @@ -15082,22 +15425,22 @@ } return object; } - function _get(target, property, receiver) { + function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; + _get = Reflect.get.bind(); } else { - _get = function _get2(target2, property2, receiver2) { - var base = _superPropBase(target2, property2); + _get = function _get2(target, property, receiver) { + var base = _superPropBase(target, property); if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property2); + var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { - return desc.get.call(receiver2); + return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } - return _get(target, property, receiver || target); + return _get.apply(this, arguments); } var Emitter = /* @__PURE__ */ function() { function Emitter2() { @@ -15110,25 +15453,25 @@ } _createClass(Emitter2, [{ key: "addEventListener", - value: function addEventListener(type3, callback, options2) { - if (!(type3 in this.listeners)) { - this.listeners[type3] = []; + value: function addEventListener(type2, callback, options2) { + if (!(type2 in this.listeners)) { + this.listeners[type2] = []; } - this.listeners[type3].push({ + this.listeners[type2].push({ callback, options: options2 }); } }, { key: "removeEventListener", - value: function removeEventListener(type3, callback) { - if (!(type3 in this.listeners)) { + value: function removeEventListener(type2, callback) { + if (!(type2 in this.listeners)) { return; } - var stack = this.listeners[type3]; - for (var i2 = 0, l = stack.length; i2 < l; i2++) { - if (stack[i2].callback === callback) { - stack.splice(i2, 1); + var stack = this.listeners[type2]; + for (var i3 = 0, l2 = stack.length; i3 < l2; i3++) { + if (stack[i3].callback === callback) { + stack.splice(i3, 1); return; } } @@ -15141,13 +15484,13 @@ } var stack = this.listeners[event.type]; var stackToCall = stack.slice(); - for (var i2 = 0, l = stackToCall.length; i2 < l; i2++) { - var listener = stackToCall[i2]; + for (var i3 = 0, l2 = stackToCall.length; i3 < l2; i3++) { + var listener = stackToCall[i3]; try { listener.callback.call(this, event); - } catch (e) { + } catch (e3) { Promise.resolve().then(function() { - throw e; + throw e3; }); } if (listener.options && listener.options.once) { @@ -15179,6 +15522,11 @@ writable: true, configurable: true }); + Object.defineProperty(_assertThisInitialized(_this), "reason", { + value: void 0, + writable: true, + configurable: true + }); return _this; } _createClass(AbortSignal2, [{ @@ -15211,11 +15559,11 @@ } _createClass(AbortController3, [{ key: "abort", - value: function abort() { + value: function abort(reason) { var event; try { event = new Event("abort"); - } catch (e) { + } catch (e3) { if (typeof document !== "undefined") { if (!document.createEvent) { event = document.createEventObject(); @@ -15232,6 +15580,21 @@ }; } } + var signalReason = reason; + if (signalReason === void 0) { + if (typeof document === "undefined") { + signalReason = new Error("This operation was aborted"); + signalReason.name = "AbortError"; + } else { + try { + signalReason = new DOMException("signal is aborted without reason"); + } catch (err) { + signalReason = new Error("This operation was aborted"); + signalReason.name = "AbortError"; + } + } + } + this.signal.reason = signalReason; this.signal.dispatchEvent(event); } }, { @@ -15306,7 +15669,7 @@ if (signal.aborted) { return Promise.reject(abortError); } - var cancellation = new Promise(function(_, reject) { + var cancellation = new Promise(function(_2, reject) { signal.addEventListener("abort", function() { return reject(abortError); }, { @@ -15354,6 +15717,7 @@ // modules/index.js var modules_exports = {}; __export(modules_exports, { + LocationManager: () => LocationManager, QAItem: () => QAItem, actionAddEntity: () => actionAddEntity, actionAddMember: () => actionAddMember, @@ -15412,7 +15776,6 @@ coreGraph: () => coreGraph, coreHistory: () => coreHistory, coreLocalizer: () => coreLocalizer, - coreLocations: () => coreLocations, coreTree: () => coreTree, coreUploader: () => coreUploader, coreValidator: () => coreValidator, @@ -15464,8 +15827,9 @@ geoVecSubtract: () => geoVecSubtract, geoViewportEdge: () => geoViewportEdge, geoZoomToScale: () => geoZoomToScale, + likelyRawNumberFormat: () => likelyRawNumberFormat, localizer: () => _mainLocalizer, - locationManager: () => _mainLocations, + locationManager: () => _sharedLocationManager, modeAddArea: () => modeAddArea, modeAddLine: () => modeAddLine, modeAddNote: () => modeAddNote, @@ -15546,6 +15910,7 @@ serviceKartaview: () => kartaview_default, serviceKeepRight: () => keepRight_default, serviceMapRules: () => maprules_default, + serviceMapilio: () => mapilio_default, serviceMapillary: () => mapillary_default, serviceNominatim: () => nominatim_default, serviceNsi: () => nsi_default, @@ -15555,6 +15920,7 @@ serviceStreetside: () => streetside_default, serviceTaginfo: () => taginfo_default, serviceVectorTile: () => vector_tile_default, + serviceVegbilder: () => vegbilder_default, serviceWikidata: () => wikidata_default, serviceWikipedia: () => wikipedia_default, services: () => services, @@ -15569,6 +15935,7 @@ svgLabels: () => svgLabels, svgLayers: () => svgLayers, svgLines: () => svgLines, + svgMapilioImages: () => svgMapilioImages, svgMapillaryImages: () => svgMapillaryImages, svgMapillarySigns: () => svgMapillarySigns, svgMarkerSegments: () => svgMarkerSegments, @@ -15586,6 +15953,7 @@ svgTagPattern: () => svgTagPattern, svgTouch: () => svgTouch, svgTurns: () => svgTurns, + svgVegbilder: () => svgVegbilder, svgVertices: () => svgVertices, t: () => _t, uiAccount: () => uiAccount, @@ -15610,9 +15978,10 @@ uiFieldAccess: () => uiFieldAccess, uiFieldAddress: () => uiFieldAddress, uiFieldCheck: () => uiFieldCheck, + uiFieldColour: () => uiFieldText, uiFieldCombo: () => uiFieldCombo, - uiFieldCycleway: () => uiFieldCycleway, uiFieldDefaultCheck: () => uiFieldCheck, + uiFieldDirectionalCombo: () => uiFieldDirectionalCombo, uiFieldEmail: () => uiFieldText, uiFieldHelp: () => uiFieldHelp, uiFieldIdentifier: () => uiFieldText, @@ -15655,6 +16024,7 @@ uiKeepRightEditor: () => uiKeepRightEditor, uiKeepRightHeader: () => uiKeepRightHeader, uiLasso: () => uiLasso, + uiLengthIndicator: () => uiLengthIndicator, uiLoading: () => uiLoading, uiMapInMap: () => uiMapInMap, uiModal: () => uiModal, @@ -15725,6 +16095,7 @@ utilArrayUniq: () => utilArrayUniq, utilArrayUniqBy: () => utilArrayUniqBy, utilAsyncMap: () => utilAsyncMap, + utilCleanOsmString: () => utilCleanOsmString, utilCleanTags: () => utilCleanTags, utilCombinedTags: () => utilCombinedTags, utilCompareIDs: () => utilCompareIDs, @@ -15848,8 +16219,8 @@ NNW: "SSE" }; function reverseKey(key) { - for (var i2 = 0; i2 < keyReplacements.length; ++i2) { - var replacement = keyReplacements[i2]; + for (var i3 = 0; i3 < keyReplacements.length; ++i3) { + var replacement = keyReplacements[i3]; if (replacement[0].test(key)) { return key.replace(replacement[0], replacement[1]); } @@ -15862,29 +16233,33 @@ if (turn_lanes.test(key)) { return value; } else if (key === "incline" && numeric.test(value)) { - return value.replace(numeric, function(_, sign2) { + return value.replace(numeric, function(_2, sign2) { return sign2 === "-" ? "" : "-"; }); } else if (options2 && options2.reverseOneway && key === "oneway") { return onewayReplacements[value] || value; } else if (includeAbsolute && directionKey.test(key)) { - if (compassReplacements[value]) - return compassReplacements[value]; - var degrees3 = parseFloat(value); - if (typeof degrees3 === "number" && !isNaN(degrees3)) { - if (degrees3 < 180) { - degrees3 += 180; + return value.split(";").map((value2) => { + if (compassReplacements[value2]) + return compassReplacements[value2]; + var degrees3 = Number(value2); + if (isFinite(degrees3)) { + if (degrees3 < 180) { + degrees3 += 180; + } else { + degrees3 -= 180; + } + return degrees3.toString(); } else { - degrees3 -= 180; + return valueReplacements[value2] || value2; } - return degrees3.toString(); - } + }).join(";"); } return valueReplacements[value] || value; } function reverseNodeTags(graph, nodeIDs) { - for (var i2 = 0; i2 < nodeIDs.length; i2++) { - var node = graph.hasEntity(nodeIDs[i2]); + for (var i3 = 0; i3 < nodeIDs.length; i3++) { + var node = graph.hasEntity(nodeIDs[i3]); if (!node || !Object.keys(node.tags).length) continue; var tags = {}; @@ -15939,21 +16314,28 @@ // modules/osm/tags.js function osmIsInterestingTag(key) { - return key !== "attribution" && key !== "created_by" && key !== "source" && key !== "odbl" && key.indexOf("source:") !== 0 && key.indexOf("source_ref") !== 0 && key.indexOf("tiger:") !== 0; + return key !== "attribution" && key !== "created_by" && key !== "source" && key !== "odbl" && key.indexOf("source:") !== 0 && key.indexOf("source_ref") !== 0 && // purposely exclude colon + key.indexOf("tiger:") !== 0; } var osmLifecyclePrefixes = { + // nonexistent, might be built proposed: true, planned: true, + // under maintentance or between groundbreaking and opening construction: true, + // existent but not functional disused: true, + // dilapidated to nonexistent abandoned: true, was: true, + // nonexistent, still may appear in imagery dismantled: true, razed: true, demolished: true, destroyed: true, removed: true, obliterated: true, + // existent occasionally, e.g. stormwater drainage basin intermittent: true }; function osmRemoveLifecyclePrefix(key) { @@ -15986,6 +16368,9 @@ turntable: true, wash: true }, + traffic_calming: { + island: true + }, waterway: { dam: true } @@ -15998,17 +16383,21 @@ var returnTags = {}; for (var realKey in tags) { const key = osmRemoveLifecyclePrefix(realKey); - if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) { + if (key in osmAreaKeys && !(tags[realKey] in osmAreaKeys[key])) { returnTags[realKey] = tags[realKey]; return returnTags; } - if (key in osmAreaKeysExceptions && tags[key] in osmAreaKeysExceptions[key]) { + if (key in osmAreaKeysExceptions && tags[realKey] in osmAreaKeysExceptions[key]) { returnTags[realKey] = tags[realKey]; return returnTags; } } return null; } + var osmLineTags = {}; + function osmSetLineTags(value) { + osmLineTags = value; + } var osmPointTags = {}; function osmSetPointTags(value) { osmPointTags = value; @@ -16060,6 +16449,8 @@ "yes": true }, "seamark:type": { + "two-way_route": true, + "recommended_traffic_lane": true, "separation_lane": true, "separation_roundabout": true }, @@ -16068,7 +16459,9 @@ "ditch": true, "drain": true, "fish_pass": true, + "pressurised": true, "river": true, + "spillway": true, "stream": true, "tidal_channel": true } @@ -16109,7 +16502,8 @@ "city_wall": true }, "man_made": { - "embankment": true + "embankment": true, + "quay": true }, "waterway": { "weir": true @@ -16171,36 +16565,37 @@ stream: true, tidal_channel: true }; + var allowUpperCaseTagValues = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale|traffic_sign/; // node_modules/d3-array/src/ascending.js - function ascending(a, b) { - return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + function ascending(a2, b2) { + return a2 == null || b2 == null ? NaN : a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN; } // node_modules/d3-array/src/descending.js - function descending(a, b) { - return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + function descending(a2, b2) { + return a2 == null || b2 == null ? NaN : b2 < a2 ? -1 : b2 > a2 ? 1 : b2 >= a2 ? 0 : NaN; } // node_modules/d3-array/src/bisector.js - function bisector(f2) { + function bisector(f3) { let compare1, compare2, delta; - if (f2.length !== 2) { + if (f3.length !== 2) { compare1 = ascending; - compare2 = (d, x) => ascending(f2(d), x); - delta = (d, x) => f2(d) - x; + compare2 = (d2, x2) => ascending(f3(d2), x2); + delta = (d2, x2) => f3(d2) - x2; } else { - compare1 = f2 === ascending || f2 === descending ? f2 : zero; - compare2 = f2; - delta = f2; + compare1 = f3 === ascending || f3 === descending ? f3 : zero; + compare2 = f3; + delta = f3; } - function left(a, x, lo = 0, hi = a.length) { + function left(a2, x2, lo = 0, hi = a2.length) { if (lo < hi) { - if (compare1(x, x) !== 0) + if (compare1(x2, x2) !== 0) return hi; do { const mid = lo + hi >>> 1; - if (compare2(a[mid], x) < 0) + if (compare2(a2[mid], x2) < 0) lo = mid + 1; else hi = mid; @@ -16208,13 +16603,13 @@ } return lo; } - function right(a, x, lo = 0, hi = a.length) { + function right(a2, x2, lo = 0, hi = a2.length) { if (lo < hi) { - if (compare1(x, x) !== 0) + if (compare1(x2, x2) !== 0) return hi; do { const mid = lo + hi >>> 1; - if (compare2(a[mid], x) <= 0) + if (compare2(a2[mid], x2) <= 0) lo = mid + 1; else hi = mid; @@ -16222,9 +16617,9 @@ } return lo; } - function center(a, x, lo = 0, hi = a.length) { - const i2 = left(a, x, lo, hi - 1); - return i2 > lo && delta(a[i2 - 1], x) > -delta(a[i2], x) ? i2 - 1 : i2; + function center(a2, x2, lo = 0, hi = a2.length) { + const i3 = left(a2, x2, lo, hi - 1); + return i3 > lo && delta(a2[i3 - 1], x2) > -delta(a2[i3], x2) ? i3 - 1 : i3; } return { left, center, right }; } @@ -16233,8 +16628,8 @@ } // node_modules/d3-array/src/number.js - function number(x) { - return x === null ? NaN : +x; + function number(x2) { + return x2 === null ? NaN : +x2; } function* numbers(values, valueof) { if (valueof === void 0) { @@ -16266,37 +16661,37 @@ this._partials = new Float64Array(32); this._n = 0; } - add(x) { - const p = this._partials; - let i2 = 0; - for (let j2 = 0; j2 < this._n && j2 < 32; j2++) { - const y = p[j2], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + add(x2) { + const p2 = this._partials; + let i3 = 0; + for (let j3 = 0; j3 < this._n && j3 < 32; j3++) { + const y2 = p2[j3], hi = x2 + y2, lo = Math.abs(x2) < Math.abs(y2) ? x2 - (hi - y2) : y2 - (hi - x2); if (lo) - p[i2++] = lo; - x = hi; + p2[i3++] = lo; + x2 = hi; } - p[i2] = x; - this._n = i2 + 1; + p2[i3] = x2; + this._n = i3 + 1; return this; } valueOf() { - const p = this._partials; - let n2 = this._n, x, y, lo, hi = 0; - if (n2 > 0) { - hi = p[--n2]; - while (n2 > 0) { - x = hi; - y = p[--n2]; - hi = x + y; - lo = y - (hi - x); + const p2 = this._partials; + let n3 = this._n, x2, y2, lo, hi = 0; + if (n3 > 0) { + hi = p2[--n3]; + while (n3 > 0) { + x2 = hi; + y2 = p2[--n3]; + hi = x2 + y2; + lo = y2 - (hi - x2); if (lo) break; } - if (n2 > 0 && (lo < 0 && p[n2 - 1] < 0 || lo > 0 && p[n2 - 1] > 0)) { - y = lo * 2; - x = hi + y; - if (y == x - hi) - hi = x; + if (n3 > 0 && (lo < 0 && p2[n3 - 1] < 0 || lo > 0 && p2[n3 - 1] > 0)) { + y2 = lo * 2; + x2 = hi + y2; + if (y2 == x2 - hi) + hi = x2; } } return hi; @@ -16309,15 +16704,15 @@ return ascendingDefined; if (typeof compare !== "function") throw new TypeError("compare is not a function"); - return (a, b) => { - const x = compare(a, b); - if (x || x === 0) - return x; - return (compare(b, b) === 0) - (compare(a, a) === 0); + return (a2, b2) => { + const x2 = compare(a2, b2); + if (x2 || x2 === 0) + return x2; + return (compare(b2, b2) === 0) - (compare(a2, a2) === 0); }; } - function ascendingDefined(a, b) { - return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0); + function ascendingDefined(a2, b2) { + return (a2 == null || !(a2 >= a2)) - (b2 == null || !(b2 >= b2)) || (a2 < b2 ? -1 : a2 > b2 ? 1 : 0); } // node_modules/d3-array/src/ticks.js @@ -16325,12 +16720,12 @@ var e5 = Math.sqrt(10); var e2 = Math.sqrt(2); function ticks(start2, stop, count) { - var reverse, i2 = -1, n2, ticks2, step; + var reverse, i3 = -1, n3, ticks2, step; stop = +stop, start2 = +start2, count = +count; if (start2 === stop && count > 0) return [start2]; if (reverse = stop < start2) - n2 = start2, start2 = stop, stop = n2; + n3 = start2, start2 = stop, stop = n3; if ((step = tickIncrement(start2, stop, count)) === 0 || !isFinite(step)) return []; if (step > 0) { @@ -16339,9 +16734,9 @@ ++r0; if (r1 * step > stop) --r1; - ticks2 = new Array(n2 = r1 - r0 + 1); - while (++i2 < n2) - ticks2[i2] = (r0 + i2) * step; + ticks2 = new Array(n3 = r1 - r0 + 1); + while (++i3 < n3) + ticks2[i3] = (r0 + i3) * step; } else { step = -step; let r0 = Math.round(start2 * step), r1 = Math.round(stop * step); @@ -16349,9 +16744,9 @@ ++r0; if (r1 / step > stop) --r1; - ticks2 = new Array(n2 = r1 - r0 + 1); - while (++i2 < n2) - ticks2[i2] = (r0 + i2) / step; + ticks2 = new Array(n3 = r1 - r0 + 1); + while (++i3 < n3) + ticks2[i3] = (r0 + i3) / step; } if (reverse) ticks2.reverse(); @@ -16413,60 +16808,60 @@ } // node_modules/d3-array/src/quickselect.js - function quickselect(array2, k, left = 0, right = array2.length - 1, compare) { + function quickselect(array2, k2, left = 0, right = array2.length - 1, compare) { compare = compare === void 0 ? ascendingDefined : compareDefined(compare); while (right > left) { if (right - left > 600) { - const n2 = right - left + 1; - const m = k - left + 1; - const z = Math.log(n2); - const s = 0.5 * Math.exp(2 * z / 3); - const sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1); - const newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd)); - const newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd)); - quickselect(array2, k, newLeft, newRight, compare); - } - const t = array2[k]; - let i2 = left; - let j2 = right; - swap(array2, left, k); - if (compare(array2[right], t) > 0) + const n3 = right - left + 1; + const m2 = k2 - left + 1; + const z2 = Math.log(n3); + const s2 = 0.5 * Math.exp(2 * z2 / 3); + const sd = 0.5 * Math.sqrt(z2 * s2 * (n3 - s2) / n3) * (m2 - n3 / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k2 - m2 * s2 / n3 + sd)); + const newRight = Math.min(right, Math.floor(k2 + (n3 - m2) * s2 / n3 + sd)); + quickselect(array2, k2, newLeft, newRight, compare); + } + const t2 = array2[k2]; + let i3 = left; + let j3 = right; + swap(array2, left, k2); + if (compare(array2[right], t2) > 0) swap(array2, left, right); - while (i2 < j2) { - swap(array2, i2, j2), ++i2, --j2; - while (compare(array2[i2], t) < 0) - ++i2; - while (compare(array2[j2], t) > 0) - --j2; - } - if (compare(array2[left], t) === 0) - swap(array2, left, j2); + while (i3 < j3) { + swap(array2, i3, j3), ++i3, --j3; + while (compare(array2[i3], t2) < 0) + ++i3; + while (compare(array2[j3], t2) > 0) + --j3; + } + if (compare(array2[left], t2) === 0) + swap(array2, left, j3); else - ++j2, swap(array2, j2, right); - if (j2 <= k) - left = j2 + 1; - if (k <= j2) - right = j2 - 1; + ++j3, swap(array2, j3, right); + if (j3 <= k2) + left = j3 + 1; + if (k2 <= j3) + right = j3 - 1; } return array2; } - function swap(array2, i2, j2) { - const t = array2[i2]; - array2[i2] = array2[j2]; - array2[j2] = t; + function swap(array2, i3, j3) { + const t2 = array2[i3]; + array2[i3] = array2[j3]; + array2[j3] = t2; } // node_modules/d3-array/src/quantile.js - function quantile(values, p, valueof) { + function quantile(values, p2, valueof) { values = Float64Array.from(numbers(values, valueof)); - if (!(n2 = values.length)) + if (!(n3 = values.length)) return; - if ((p = +p) <= 0 || n2 < 2) + if ((p2 = +p2) <= 0 || n3 < 2) return min(values); - if (p >= 1) + if (p2 >= 1) return max(values); - var n2, i2 = (n2 - 1) * p, i0 = Math.floor(i2), value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), value1 = min(values.subarray(i0 + 1)); - return value0 + (value1 - value0) * (i2 - i0); + var n3, i3 = (n3 - 1) * p2, i0 = Math.floor(i3), value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), value1 = min(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i3 - i0); } // node_modules/d3-array/src/median.js @@ -16484,12 +16879,29 @@ return Array.from(flatten(arrays)); } + // node_modules/d3-array/src/pairs.js + function pairs(values, pairof = pair) { + const pairs2 = []; + let previous; + let first = false; + for (const value of values) { + if (first) + pairs2.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs2; + } + function pair(a2, b2) { + return [a2, b2]; + } + // node_modules/d3-array/src/range.js function range(start2, stop, step) { - start2 = +start2, stop = +stop, step = (n2 = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n2 < 3 ? 1 : +step; - var i2 = -1, n2 = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range3 = new Array(n2); - while (++i2 < n2) { - range3[i2] = start2 + i2 * step; + start2 = +start2, stop = +stop, step = (n3 = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n3 < 3 ? 1 : +step; + var i3 = -1, n3 = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range3 = new Array(n3); + while (++i3 < n3) { + range3[i3] = start2 + i3 * step; } return range3; } @@ -16510,16 +16922,16 @@ var exp = Math.exp; var log = Math.log; var sin = Math.sin; - var sign = Math.sign || function(x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; + var sign = Math.sign || function(x2) { + return x2 > 0 ? 1 : x2 < 0 ? -1 : 0; }; var sqrt = Math.sqrt; var tan = Math.tan; - function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + function acos(x2) { + return x2 > 1 ? 0 : x2 < -1 ? pi : Math.acos(x2); } - function asin(x) { - return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); + function asin(x2) { + return x2 > 1 ? halfPi : x2 < -1 ? -halfPi : Math.asin(x2); } // node_modules/d3-geo/src/noop.js @@ -16537,9 +16949,9 @@ streamGeometry(object.geometry, stream); }, FeatureCollection: function(object, stream) { - var features2 = object.features, i2 = -1, n2 = features2.length; - while (++i2 < n2) - streamGeometry(features2[i2].geometry, stream); + var features = object.features, i3 = -1, n3 = features.length; + while (++i3 < n3) + streamGeometry(features[i3].geometry, stream); } }; var streamGeometryType = { @@ -16551,44 +16963,44 @@ stream.point(object[0], object[1], object[2]); }, MultiPoint: function(object, stream) { - var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length; - while (++i2 < n2) - object = coordinates[i2], stream.point(object[0], object[1], object[2]); + var coordinates = object.coordinates, i3 = -1, n3 = coordinates.length; + while (++i3 < n3) + object = coordinates[i3], stream.point(object[0], object[1], object[2]); }, LineString: function(object, stream) { streamLine(object.coordinates, stream, 0); }, MultiLineString: function(object, stream) { - var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length; - while (++i2 < n2) - streamLine(coordinates[i2], stream, 0); + var coordinates = object.coordinates, i3 = -1, n3 = coordinates.length; + while (++i3 < n3) + streamLine(coordinates[i3], stream, 0); }, Polygon: function(object, stream) { streamPolygon(object.coordinates, stream); }, MultiPolygon: function(object, stream) { - var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length; - while (++i2 < n2) - streamPolygon(coordinates[i2], stream); + var coordinates = object.coordinates, i3 = -1, n3 = coordinates.length; + while (++i3 < n3) + streamPolygon(coordinates[i3], stream); }, GeometryCollection: function(object, stream) { - var geometries = object.geometries, i2 = -1, n2 = geometries.length; - while (++i2 < n2) - streamGeometry(geometries[i2], stream); + var geometries = object.geometries, i3 = -1, n3 = geometries.length; + while (++i3 < n3) + streamGeometry(geometries[i3], stream); } }; function streamLine(coordinates, stream, closed) { - var i2 = -1, n2 = coordinates.length - closed, coordinate; + var i3 = -1, n3 = coordinates.length - closed, coordinate; stream.lineStart(); - while (++i2 < n2) - coordinate = coordinates[i2], stream.point(coordinate[0], coordinate[1], coordinate[2]); + while (++i3 < n3) + coordinate = coordinates[i3], stream.point(coordinate[0], coordinate[1], coordinate[2]); stream.lineEnd(); } function streamPolygon(coordinates, stream) { - var i2 = -1, n2 = coordinates.length; + var i3 = -1, n3 = coordinates.length; stream.polygonStart(); - while (++i2 < n2) - streamLine(coordinates[i2], stream, 1); + while (++i3 < n3) + streamLine(coordinates[i3], stream, 1); stream.polygonEnd(); } function stream_default(object, stream) { @@ -16640,8 +17052,8 @@ function areaPoint(lambda, phi) { lambda *= radians, phi *= radians; phi = phi / 2 + quarterPi; - var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos(phi), sinPhi = sin(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * cos(adLambda), v = k * sdLambda * sin(adLambda); - areaRingSum.add(atan2(v, u)); + var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos(phi), sinPhi = sin(phi), k2 = sinPhi0 * sinPhi, u2 = cosPhi0 * cosPhi + k2 * cos(adLambda), v2 = k2 * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v2, u2)); lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; } function area_default(object) { @@ -16658,21 +17070,21 @@ var lambda = spherical2[0], phi = spherical2[1], cosPhi = cos(phi); return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; } - function cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + function cartesianDot(a2, b2) { + return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2]; } - function cartesianCross(a, b) { - 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]]; + function cartesianCross(a2, b2) { + return [a2[1] * b2[2] - a2[2] * b2[1], a2[2] * b2[0] - a2[0] * b2[2], a2[0] * b2[1] - a2[1] * b2[0]]; } - function cartesianAddInPlace(a, b) { - a[0] += b[0], a[1] += b[1], a[2] += b[2]; + function cartesianAddInPlace(a2, b2) { + a2[0] += b2[0], a2[1] += b2[1], a2[2] += b2[2]; } - function cartesianScale(vector, k) { - return [vector[0] * k, vector[1] * k, vector[2] * k]; + function cartesianScale(vector, k2) { + return [vector[0] * k2, vector[1] * k2, vector[2] * k2]; } - function cartesianNormalizeInPlace(d) { - var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l, d[1] /= l, d[2] /= l; + function cartesianNormalizeInPlace(d2) { + var l2 = sqrt(d2[0] * d2[0] + d2[1] * d2[1] + d2[2] * d2[2]); + d2[0] /= l2, d2[1] /= l2, d2[2] /= l2; } // node_modules/d3-geo/src/bounds.js @@ -16723,9 +17135,9 @@ phi1 = phi; } function linePoint(lambda, phi) { - var p = cartesian([lambda * radians, phi * radians]); + var p2 = cartesian([lambda * radians, phi * radians]); if (p0) { - var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal); + var normal = cartesianCross(p0, p2), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal); cartesianNormalizeInPlace(inflection); inflection = spherical(inflection); var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs(delta) > 180; @@ -16774,7 +17186,7 @@ phi0 = phi; if (phi > phi1) phi1 = phi; - p0 = p, lambda2 = lambda; + p0 = p2, lambda2 = lambda; } function boundsLineStart() { boundsStream.point = linePoint; @@ -16808,34 +17220,34 @@ function angle(lambda04, lambda12) { return (lambda12 -= lambda04) < 0 ? lambda12 + 360 : lambda12; } - function rangeCompare(a, b) { - return a[0] - b[0]; + function rangeCompare(a2, b2) { + return a2[0] - b2[0]; } - function rangeContains(range3, x) { - return range3[0] <= range3[1] ? range3[0] <= x && x <= range3[1] : x < range3[0] || range3[1] < x; + function rangeContains(range3, x2) { + return range3[0] <= range3[1] ? range3[0] <= x2 && x2 <= range3[1] : x2 < range3[0] || range3[1] < x2; } function bounds_default(feature3) { - var i2, n2, a, b, merged, deltaMax, delta; + var i3, n3, a2, b2, merged, deltaMax, delta; phi1 = lambda1 = -(lambda02 = phi0 = Infinity); ranges = []; stream_default(feature3, boundsStream); - if (n2 = ranges.length) { + if (n3 = ranges.length) { ranges.sort(rangeCompare); - for (i2 = 1, a = ranges[0], merged = [a]; i2 < n2; ++i2) { - b = ranges[i2]; - if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) - a[1] = b[1]; - if (angle(b[0], a[1]) > angle(a[0], a[1])) - a[0] = b[0]; + for (i3 = 1, a2 = ranges[0], merged = [a2]; i3 < n3; ++i3) { + b2 = ranges[i3]; + if (rangeContains(a2, b2[0]) || rangeContains(a2, b2[1])) { + if (angle(a2[0], b2[1]) > angle(a2[0], a2[1])) + a2[1] = b2[1]; + if (angle(b2[0], a2[1]) > angle(a2[0], a2[1])) + a2[0] = b2[0]; } else { - merged.push(a = b); + merged.push(a2 = b2); } } - for (deltaMax = -Infinity, n2 = merged.length - 1, i2 = 0, a = merged[n2]; i2 <= n2; a = b, ++i2) { - b = merged[i2]; - if ((delta = angle(a[1], b[0])) > deltaMax) - deltaMax = delta, lambda02 = b[0], lambda1 = a[1]; + for (deltaMax = -Infinity, n3 = merged.length - 1, i3 = 0, a2 = merged[n3]; i3 <= n3; a2 = b2, ++i3) { + b2 = merged[i3]; + if ((delta = angle(a2[1], b2[0])) > deltaMax) + deltaMax = delta, lambda02 = b2[0], lambda1 = a2[1]; } } ranges = range2 = null; @@ -16843,13 +17255,13 @@ } // node_modules/d3-geo/src/compose.js - function compose_default(a, b) { - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); + function compose_default(a2, b2) { + function compose(x2, y2) { + return x2 = a2(x2, y2), b2(x2[0], x2[1]); } - if (a.invert && b.invert) - compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); + if (a2.invert && b2.invert) + compose.invert = function(x2, y2) { + return x2 = b2.invert(x2, y2), x2 && a2.invert(x2[0], x2[1]); }; return compose; } @@ -16875,17 +17287,17 @@ function rotationPhiGamma(deltaPhi, deltaGamma) { var cosDeltaPhi = cos(deltaPhi), sinDeltaPhi = sin(deltaPhi), cosDeltaGamma = cos(deltaGamma), sinDeltaGamma = sin(deltaGamma); function rotation(lambda, phi) { - var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaPhi + x * sinDeltaPhi; + var cosPhi = cos(phi), x2 = cos(lambda) * cosPhi, y2 = sin(lambda) * cosPhi, z2 = sin(phi), k2 = z2 * cosDeltaPhi + x2 * sinDeltaPhi; return [ - atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), - asin(k * cosDeltaGamma + y * sinDeltaGamma) + atan2(y2 * cosDeltaGamma - k2 * sinDeltaGamma, x2 * cosDeltaPhi - z2 * sinDeltaPhi), + asin(k2 * cosDeltaGamma + y2 * sinDeltaGamma) ]; } rotation.invert = function(lambda, phi) { - var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaGamma - y * sinDeltaGamma; + var cosPhi = cos(phi), x2 = cos(lambda) * cosPhi, y2 = sin(lambda) * cosPhi, z2 = sin(phi), k2 = z2 * cosDeltaGamma - y2 * sinDeltaGamma; return [ - atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), - asin(k * cosDeltaPhi - x * sinDeltaPhi) + atan2(y2 * cosDeltaGamma + z2 * sinDeltaGamma, x2 * cosDeltaPhi + k2 * sinDeltaPhi), + asin(k2 * cosDeltaPhi - x2 * sinDeltaPhi) ]; }; return rotation; @@ -16917,24 +17329,24 @@ if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; } - for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { - point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); - stream.point(point[0], point[1]); + for (var point2, t2 = t0; direction > 0 ? t2 > t1 : t2 < t1; t2 -= step) { + point2 = spherical([cosRadius, -sinRadius * cos(t2), -sinRadius * sin(t2)]); + stream.point(point2[0], point2[1]); } } - function circleRadius(cosRadius, point) { - point = cartesian(point), point[0] -= cosRadius; - cartesianNormalizeInPlace(point); - var radius = acos(-point[1]); - return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; + function circleRadius(cosRadius, point2) { + point2 = cartesian(point2), point2[0] -= cosRadius; + cartesianNormalizeInPlace(point2); + var radius = acos(-point2[1]); + return ((-point2[2] < 0 ? -radius : radius) + tau - epsilon) % tau; } // node_modules/d3-geo/src/clip/buffer.js function buffer_default() { var lines = [], line; return { - point: function(x, y, m) { - line.push([x, y, m]); + point: function(x2, y2, m2) { + line.push([x2, y2, m2]); }, lineStart: function() { lines.push(line = []); @@ -16954,13 +17366,13 @@ } // node_modules/d3-geo/src/pointEqual.js - function pointEqual_default(a, b) { - return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; + function pointEqual_default(a2, b2) { + return abs(a2[0] - b2[0]) < epsilon && abs(a2[1] - b2[1]) < epsilon; } // node_modules/d3-geo/src/clip/rejoin.js - function Intersection(point, points, other, entry) { - this.x = point; + function Intersection(point2, points, other, entry) { + this.x = point2; this.z = points; this.o = other; this.e = entry; @@ -16968,35 +17380,35 @@ this.n = this.p = null; } function rejoin_default(segments, compareIntersection2, startInside, interpolate, stream) { - var subject = [], clip = [], i2, n2; + var subject = [], clip = [], i3, n3; segments.forEach(function(segment) { - if ((n3 = segment.length - 1) <= 0) + if ((n4 = segment.length - 1) <= 0) return; - var n3, p02 = segment[0], p1 = segment[n3], x; + var n4, p02 = segment[0], p1 = segment[n4], x2; if (pointEqual_default(p02, p1)) { if (!p02[2] && !p1[2]) { stream.lineStart(); - for (i2 = 0; i2 < n3; ++i2) - stream.point((p02 = segment[i2])[0], p02[1]); + for (i3 = 0; i3 < n4; ++i3) + stream.point((p02 = segment[i3])[0], p02[1]); stream.lineEnd(); return; } p1[0] += 2 * epsilon; } - subject.push(x = new Intersection(p02, segment, null, true)); - clip.push(x.o = new Intersection(p02, null, x, false)); - subject.push(x = new Intersection(p1, segment, null, false)); - clip.push(x.o = new Intersection(p1, null, x, true)); + subject.push(x2 = new Intersection(p02, segment, null, true)); + clip.push(x2.o = new Intersection(p02, null, x2, false)); + subject.push(x2 = new Intersection(p1, segment, null, false)); + clip.push(x2.o = new Intersection(p1, null, x2, true)); }); if (!subject.length) return; clip.sort(compareIntersection2); link(subject); link(clip); - for (i2 = 0, n2 = clip.length; i2 < n2; ++i2) { - clip[i2].e = startInside = !startInside; + for (i3 = 0, n3 = clip.length; i3 < n3; ++i3) { + clip[i3].e = startInside = !startInside; } - var start2 = subject[0], points, point; + var start2 = subject[0], points, point2; while (1) { var current = start2, isSubject = true; while (current.v) @@ -17008,8 +17420,8 @@ current.v = current.o.v = true; if (current.e) { if (isSubject) { - for (i2 = 0, n2 = points.length; i2 < n2; ++i2) - stream.point((point = points[i2])[0], point[1]); + for (i3 = 0, n3 = points.length; i3 < n3; ++i3) + stream.point((point2 = points[i3])[0], point2[1]); } else { interpolate(current.x, current.n.x, 1, stream); } @@ -17017,8 +17429,8 @@ } else { if (isSubject) { points = current.p.z; - for (i2 = points.length - 1; i2 >= 0; --i2) - stream.point((point = points[i2])[0], point[1]); + for (i3 = points.length - 1; i3 >= 0; --i3) + stream.point((point2 = points[i3])[0], point2[1]); } else { interpolate(current.x, current.p.x, -1, stream); } @@ -17032,36 +17444,36 @@ } } function link(array2) { - if (!(n2 = array2.length)) + if (!(n3 = array2.length)) return; - var n2, i2 = 0, a = array2[0], b; - while (++i2 < n2) { - a.n = b = array2[i2]; - b.p = a; - a = b; + var n3, i3 = 0, a2 = array2[0], b2; + while (++i3 < n3) { + a2.n = b2 = array2[i3]; + b2.p = a2; + a2 = b2; } - a.n = b = array2[0]; - b.p = a; + a2.n = b2 = array2[0]; + b2.p = a2; } // node_modules/d3-geo/src/polygonContains.js - function longitude(point) { - return abs(point[0]) <= pi ? point[0] : sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); + function longitude(point2) { + return abs(point2[0]) <= pi ? point2[0] : sign(point2[0]) * ((abs(point2[0]) + pi) % tau - pi); } - function polygonContains_default(polygon2, point) { - var lambda = longitude(point), phi = point[1], sinPhi = sin(phi), normal = [sin(lambda), -cos(lambda), 0], angle2 = 0, winding = 0; + function polygonContains_default(polygon2, point2) { + var lambda = longitude(point2), phi = point2[1], sinPhi = sin(phi), normal = [sin(lambda), -cos(lambda), 0], angle2 = 0, winding = 0; var sum = new Adder(); if (sinPhi === 1) phi = halfPi + epsilon; else if (sinPhi === -1) phi = -halfPi - epsilon; - for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) { - if (!(m = (ring = polygon2[i2]).length)) + for (var i3 = 0, n3 = polygon2.length; i3 < n3; ++i3) { + if (!(m2 = (ring = polygon2[i3]).length)) continue; - var ring, m, point0 = ring[m - 1], lambda04 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi03 = sin(phi02), cosPhi03 = cos(phi02); - for (var j2 = 0; j2 < m; ++j2, lambda04 = lambda12, sinPhi03 = sinPhi1, cosPhi03 = cosPhi1, point0 = point1) { - var point1 = ring[j2], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin(phi12), cosPhi1 = cos(phi12), delta = lambda12 - lambda04, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi, k = sinPhi03 * sinPhi1; - sum.add(atan2(k * sign2 * sin(absDelta), cosPhi03 * cosPhi1 + k * cos(absDelta))); + var ring, m2, point0 = ring[m2 - 1], lambda04 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi03 = sin(phi02), cosPhi03 = cos(phi02); + for (var j3 = 0; j3 < m2; ++j3, lambda04 = lambda12, sinPhi03 = sinPhi1, cosPhi03 = cosPhi1, point0 = point1) { + var point1 = ring[j3], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin(phi12), cosPhi1 = cos(phi12), delta = lambda12 - lambda04, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi, k2 = sinPhi03 * sinPhi1; + sum.add(atan2(k2 * sign2 * sin(absDelta), cosPhi03 * cosPhi1 + k2 * cos(absDelta))); angle2 += antimeridian ? delta + sign2 * tau : delta; if (antimeridian ^ lambda04 >= lambda ^ lambda12 >= lambda) { var arc = cartesianCross(cartesian(point0), cartesian(point1)); @@ -17083,7 +17495,7 @@ return function(sink) { var line = clipLine(sink), ringBuffer = buffer_default(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon2, segments, ring; var clip = { - point, + point: point2, lineStart, lineEnd, polygonStart: function() { @@ -17094,7 +17506,7 @@ polygon2 = []; }, polygonEnd: function() { - clip.point = point; + clip.point = point2; clip.lineStart = lineStart; clip.lineEnd = lineEnd; segments = merge(segments); @@ -17122,7 +17534,7 @@ sink.polygonEnd(); } }; - function point(lambda, phi) { + function point2(lambda, phi) { if (pointVisible(lambda, phi)) sink.point(lambda, phi); } @@ -17134,7 +17546,7 @@ line.lineStart(); } function lineEnd() { - clip.point = point; + clip.point = point2; line.lineEnd(); } function pointRing(lambda, phi) { @@ -17148,25 +17560,25 @@ function ringEnd() { pointRing(ring[0][0], ring[0][1]); ringSink.lineEnd(); - var clean2 = ringSink.clean(), ringSegments = ringBuffer.result(), i2, n2 = ringSegments.length, m, segment, point2; + var clean2 = ringSink.clean(), ringSegments = ringBuffer.result(), i3, n3 = ringSegments.length, m2, segment, point3; ring.pop(); polygon2.push(ring); ring = null; - if (!n2) + if (!n3) return; if (clean2 & 1) { segment = ringSegments[0]; - if ((m = segment.length - 1) > 0) { + if ((m2 = segment.length - 1) > 0) { if (!polygonStarted) sink.polygonStart(), polygonStarted = true; sink.lineStart(); - for (i2 = 0; i2 < m; ++i2) - sink.point((point2 = segment[i2])[0], point2[1]); + for (i3 = 0; i3 < m2; ++i3) + sink.point((point3 = segment[i3])[0], point3[1]); sink.lineEnd(); } return; } - if (n2 > 1 && clean2 & 2) + if (n3 > 1 && clean2 & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); segments.push(ringSegments.filter(validSegment)); } @@ -17176,8 +17588,8 @@ function validSegment(segment) { return segment.length > 1; } - function compareIntersection(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); + function compareIntersection(a2, b2) { + return ((a2 = a2.x)[0] < 0 ? a2[1] - halfPi - epsilon : halfPi - a2[1]) - ((b2 = b2.x)[0] < 0 ? b2[1] - halfPi - epsilon : halfPi - b2[1]); } // node_modules/d3-geo/src/clip/antimeridian.js @@ -17275,17 +17687,17 @@ clean2 = 1; }, point: function(lambda, phi) { - var point1 = [lambda, phi], point2, v = visible(lambda, phi), c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; - if (!point0 && (v00 = v0 = v)) + var point1 = [lambda, phi], point2, v2 = visible(lambda, phi), c2 = smallRadius ? v2 ? 0 : code(lambda, phi) : v2 ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v2)) stream.lineStart(); - if (v !== v0) { + if (v2 !== v0) { point2 = intersect2(point0, point1); if (!point2 || pointEqual_default(point0, point2) || pointEqual_default(point1, point2)) point1[2] = 1; } - if (v !== v0) { + if (v2 !== v0) { clean2 = 0; - if (v) { + if (v2) { stream.lineStart(); point2 = intersect2(point1, point0); stream.point(point2[0], point2[1]); @@ -17295,74 +17707,76 @@ stream.lineEnd(); } point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - if (!(c & c0) && (t = intersect2(point1, point0, true))) { + } else if (notHemisphere && point0 && smallRadius ^ v2) { + var t2; + if (!(c2 & c0) && (t2 = intersect2(point1, point0, true))) { clean2 = 0; if (smallRadius) { stream.lineStart(); - stream.point(t[0][0], t[0][1]); - stream.point(t[1][0], t[1][1]); + stream.point(t2[0][0], t2[0][1]); + stream.point(t2[1][0], t2[1][1]); stream.lineEnd(); } else { - stream.point(t[1][0], t[1][1]); + stream.point(t2[1][0], t2[1][1]); stream.lineEnd(); stream.lineStart(); - stream.point(t[0][0], t[0][1], 3); + stream.point(t2[0][0], t2[0][1], 3); } } } - if (v && (!point0 || !pointEqual_default(point0, point1))) { + if (v2 && (!point0 || !pointEqual_default(point0, point1))) { stream.point(point1[0], point1[1]); } - point0 = point1, v0 = v, c0 = c; + point0 = point1, v0 = v2, c0 = c2; }, lineEnd: function() { if (v0) stream.lineEnd(); point0 = null; }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. clean: function() { return clean2 | (v00 && v0) << 1; } }; } - function intersect2(a, b, two) { - var pa = cartesian(a), pb = cartesian(b); - var n1 = [1, 0, 0], n2 = cartesianCross(pa, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; + function intersect2(a2, b2, two) { + var pa = cartesian(a2), pb = cartesian(b2); + var n1 = [1, 0, 0], n22 = cartesianCross(pa, pb), n2n2 = cartesianDot(n22, n22), n1n2 = n22[0], determinant = n2n2 - n1n2 * n1n2; if (!determinant) - return !two && a; - var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A = cartesianScale(n1, c1), B = cartesianScale(n2, c2); - cartesianAddInPlace(A, B); - var u = n1xn2, w = cartesianDot(A, u), uu = cartesianDot(u, u), t2 = w * w - uu * (cartesianDot(A, A) - 1); + return !two && a2; + var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n22), A2 = cartesianScale(n1, c1), B2 = cartesianScale(n22, c2); + cartesianAddInPlace(A2, B2); + var u2 = n1xn2, w2 = cartesianDot(A2, u2), uu = cartesianDot(u2, u2), t2 = w2 * w2 - uu * (cartesianDot(A2, A2) - 1); if (t2 < 0) return; - var t = sqrt(t2), q = cartesianScale(u, (-w - t) / uu); - cartesianAddInPlace(q, A); - q = spherical(q); + var t3 = sqrt(t2), q2 = cartesianScale(u2, (-w2 - t3) / uu); + cartesianAddInPlace(q2, A2); + q2 = spherical(q2); if (!two) - return q; - var lambda04 = a[0], lambda12 = b[0], phi02 = a[1], phi12 = b[1], z; + return q2; + var lambda04 = a2[0], lambda12 = b2[0], phi02 = a2[1], phi12 = b2[1], z2; if (lambda12 < lambda04) - z = lambda04, lambda04 = lambda12, lambda12 = z; + z2 = lambda04, lambda04 = lambda12, lambda12 = z2; var delta2 = lambda12 - lambda04, polar = abs(delta2 - pi) < epsilon, meridian = polar || delta2 < epsilon; if (!polar && phi12 < phi02) - z = phi02, phi02 = phi12, phi12 = z; - if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs(q[0] - lambda04) < epsilon ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi ^ (lambda04 <= q[0] && q[0] <= lambda12)) { - var q1 = cartesianScale(u, (-w + t) / uu); - cartesianAddInPlace(q1, A); - return [q, spherical(q1)]; + z2 = phi02, phi02 = phi12, phi12 = z2; + if (meridian ? polar ? phi02 + phi12 > 0 ^ q2[1] < (abs(q2[0] - lambda04) < epsilon ? phi02 : phi12) : phi02 <= q2[1] && q2[1] <= phi12 : delta2 > pi ^ (lambda04 <= q2[0] && q2[0] <= lambda12)) { + var q1 = cartesianScale(u2, (-w2 + t3) / uu); + cartesianAddInPlace(q1, A2); + return [q2, spherical(q1)]; } } function code(lambda, phi) { - var r = smallRadius ? radius : pi - radius, code2 = 0; - if (lambda < -r) + var r2 = smallRadius ? radius : pi - radius, code2 = 0; + if (lambda < -r2) code2 |= 1; - else if (lambda > r) + else if (lambda > r2) code2 |= 2; - if (phi < -r) + if (phi < -r2) code2 |= 4; - else if (phi > r) + else if (phi > r2) code2 |= 8; return code2; } @@ -17370,72 +17784,72 @@ } // node_modules/d3-geo/src/clip/line.js - function line_default(a, b, x05, y05, x12, y12) { - var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r; - r = x05 - ax; - if (!dx && r > 0) + function line_default(a2, b2, x05, y05, x12, y12) { + var ax = a2[0], ay = a2[1], bx = b2[0], by = b2[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r2; + r2 = x05 - ax; + if (!dx && r2 > 0) return; - r /= dx; + r2 /= dx; if (dx < 0) { - if (r < t0) + if (r2 < t0) return; - if (r < t1) - t1 = r; + if (r2 < t1) + t1 = r2; } else if (dx > 0) { - if (r > t1) + if (r2 > t1) return; - if (r > t0) - t0 = r; + if (r2 > t0) + t0 = r2; } - r = x12 - ax; - if (!dx && r < 0) + r2 = x12 - ax; + if (!dx && r2 < 0) return; - r /= dx; + r2 /= dx; if (dx < 0) { - if (r > t1) + if (r2 > t1) return; - if (r > t0) - t0 = r; + if (r2 > t0) + t0 = r2; } else if (dx > 0) { - if (r < t0) + if (r2 < t0) return; - if (r < t1) - t1 = r; + if (r2 < t1) + t1 = r2; } - r = y05 - ay; - if (!dy && r > 0) + r2 = y05 - ay; + if (!dy && r2 > 0) return; - r /= dy; + r2 /= dy; if (dy < 0) { - if (r < t0) + if (r2 < t0) return; - if (r < t1) - t1 = r; + if (r2 < t1) + t1 = r2; } else if (dy > 0) { - if (r > t1) + if (r2 > t1) return; - if (r > t0) - t0 = r; + if (r2 > t0) + t0 = r2; } - r = y12 - ay; - if (!dy && r < 0) + r2 = y12 - ay; + if (!dy && r2 < 0) return; - r /= dy; + r2 /= dy; if (dy < 0) { - if (r > t1) + if (r2 > t1) return; - if (r > t0) - t0 = r; + if (r2 > t0) + t0 = r2; } else if (dy > 0) { - if (r < t0) + if (r2 < t0) return; - if (r < t1) - t1 = r; + if (r2 < t1) + t1 = r2; } if (t0 > 0) - a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + a2[0] = ax + t0 * dx, a2[1] = ay + t0 * dy; if (t1 < 1) - b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + b2[0] = ax + t1 * dx, b2[1] = ay + t1 * dy; return true; } @@ -17443,47 +17857,47 @@ var clipMax = 1e9; var clipMin = -clipMax; function clipRectangle(x05, y05, x12, y12) { - function visible(x, y) { - return x05 <= x && x <= x12 && y05 <= y && y <= y12; + function visible(x2, y2) { + return x05 <= x2 && x2 <= x12 && y05 <= y2 && y2 <= y12; } function interpolate(from, to, direction, stream) { - var a = 0, a1 = 0; - if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) { + var a2 = 0, a1 = 0; + if (from == null || (a2 = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) { do - stream.point(a === 0 || a === 3 ? x05 : x12, a > 1 ? y12 : y05); - while ((a = (a + direction + 4) % 4) !== a1); + stream.point(a2 === 0 || a2 === 3 ? x05 : x12, a2 > 1 ? y12 : y05); + while ((a2 = (a2 + direction + 4) % 4) !== a1); } else { stream.point(to[0], to[1]); } } - function corner(p, direction) { - return abs(p[0] - x05) < epsilon ? direction > 0 ? 0 : 3 : abs(p[0] - x12) < epsilon ? direction > 0 ? 2 : 1 : abs(p[1] - y05) < epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; + function corner(p2, direction) { + return abs(p2[0] - x05) < epsilon ? direction > 0 ? 0 : 3 : abs(p2[0] - x12) < epsilon ? direction > 0 ? 2 : 1 : abs(p2[1] - y05) < epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; } - function compareIntersection2(a, b) { - return comparePoint(a.x, b.x); + function compareIntersection2(a2, b2) { + return comparePoint(a2.x, b2.x); } - function comparePoint(a, b) { - var ca = corner(a, 1), cb = corner(b, 1); - return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + function comparePoint(a2, b2) { + var ca = corner(a2, 1), cb = corner(b2, 1); + return ca !== cb ? ca - cb : ca === 0 ? b2[1] - a2[1] : ca === 1 ? a2[0] - b2[0] : ca === 2 ? a2[1] - b2[1] : b2[0] - a2[0]; } return function(stream) { var activeStream = stream, bufferStream = buffer_default(), segments, polygon2, ring, x__, y__, v__, x_, y_, v_, first, clean2; var clipStream = { - point, + point: point2, lineStart, lineEnd, polygonStart, polygonEnd }; - function point(x, y) { - if (visible(x, y)) - activeStream.point(x, y); + function point2(x2, y2) { + if (visible(x2, y2)) + activeStream.point(x2, y2); } function polygonInside() { var winding = 0; - for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) { - for (var ring2 = polygon2[i2], j2 = 1, m = ring2.length, point2 = ring2[0], a0, a1, b0 = point2[0], b1 = point2[1]; j2 < m; ++j2) { - a0 = b0, a1 = b1, point2 = ring2[j2], b0 = point2[0], b1 = point2[1]; + for (var i3 = 0, n3 = polygon2.length; i3 < n3; ++i3) { + for (var ring2 = polygon2[i3], j3 = 1, m2 = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j3 < m2; ++j3) { + a0 = b0, a1 = b1, point3 = ring2[j3], b0 = point3[0], b1 = point3[1]; if (a1 <= y12) { if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x05 - a0)) ++winding; @@ -17529,43 +17943,43 @@ bufferStream.rejoin(); segments.push(bufferStream.result()); } - clipStream.point = point; + clipStream.point = point2; if (v_) activeStream.lineEnd(); } - function linePoint2(x, y) { - var v = visible(x, y); + function linePoint2(x2, y2) { + var v2 = visible(x2, y2); if (polygon2) - ring.push([x, y]); + ring.push([x2, y2]); if (first) { - x__ = x, y__ = y, v__ = v; + x__ = x2, y__ = y2, v__ = v2; first = false; - if (v) { + if (v2) { activeStream.lineStart(); - activeStream.point(x, y); + activeStream.point(x2, y2); } } else { - if (v && v_) - activeStream.point(x, y); + if (v2 && v_) + activeStream.point(x2, y2); else { - var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; - if (line_default(a, b, x05, y05, x12, y12)) { + var a2 = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b2 = [x2 = Math.max(clipMin, Math.min(clipMax, x2)), y2 = Math.max(clipMin, Math.min(clipMax, y2))]; + if (line_default(a2, b2, x05, y05, x12, y12)) { if (!v_) { activeStream.lineStart(); - activeStream.point(a[0], a[1]); + activeStream.point(a2[0], a2[1]); } - activeStream.point(b[0], b[1]); - if (!v) + activeStream.point(b2[0], b2[1]); + if (!v2) activeStream.lineEnd(); clean2 = false; - } else if (v) { + } else if (v2) { activeStream.lineStart(); - activeStream.point(x, y); + activeStream.point(x2, y2); clean2 = false; } } } - x_ = x, y_ = y, v_ = v; + x_ = x2, y_ = y2, v_ = v2; } return clipStream; }; @@ -17598,8 +18012,8 @@ } function lengthPoint(lambda, phi) { lambda *= radians, phi *= radians; - var sinPhi = sin(phi), cosPhi = cos(phi), delta = abs(lambda - lambda03), cosDelta = cos(delta), sinDelta = sin(delta), x = cosPhi * sinDelta, y = cosPhi02 * sinPhi - sinPhi02 * cosPhi * cosDelta, z = sinPhi02 * sinPhi + cosPhi02 * cosPhi * cosDelta; - lengthSum.add(atan2(sqrt(x * x + y * y), z)); + var sinPhi = sin(phi), cosPhi = cos(phi), delta = abs(lambda - lambda03), cosDelta = cos(delta), sinDelta = sin(delta), x2 = cosPhi * sinDelta, y2 = cosPhi02 * sinPhi - sinPhi02 * cosPhi * cosDelta, z2 = sinPhi02 * sinPhi + cosPhi02 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x2 * x2 + y2 * y2), z2)); lambda03 = lambda, sinPhi02 = sinPhi, cosPhi02 = cosPhi; } function length_default(object) { @@ -17609,7 +18023,7 @@ } // node_modules/d3-geo/src/identity.js - var identity_default = (x) => x; + var identity_default = (x2) => x2; // node_modules/d3-geo/src/path/area.js var areaSum2 = new Adder(); @@ -17640,13 +18054,13 @@ function areaRingStart2() { areaStream2.point = areaPointFirst2; } - function areaPointFirst2(x, y) { + function areaPointFirst2(x2, y2) { areaStream2.point = areaPoint2; - x00 = x0 = x, y00 = y0 = y; + x00 = x0 = x2, y00 = y0 = y2; } - function areaPoint2(x, y) { - areaRingSum2.add(y0 * x - x0 * y); - x0 = x, y0 = y; + function areaPoint2(x2, y2) { + areaRingSum2.add(y0 * x2 - x0 * y2); + x0 = x2, y0 = y2; } function areaRingEnd2() { areaPoint2(x00, y00); @@ -17670,15 +18084,15 @@ return bounds; } }; - function boundsPoint2(x, y) { - if (x < x02) - x02 = x; - if (x > x1) - x1 = x; - if (y < y02) - y02 = y; - if (y > y1) - y1 = y; + function boundsPoint2(x2, y2) { + if (x2 < x02) + x02 = x2; + if (x2 > x1) + x1 = x2; + if (y2 < y02) + y02 = y2; + if (y2 > y1) + y1 = y2; } var bounds_default2 = boundsStream2; @@ -17715,24 +18129,24 @@ return centroid; } }; - function centroidPoint(x, y) { - X0 += x; - Y0 += y; + function centroidPoint(x2, y2) { + X0 += x2; + Y0 += y2; ++Z0; } function centroidLineStart() { centroidStream.point = centroidPointFirstLine; } - function centroidPointFirstLine(x, y) { + function centroidPointFirstLine(x2, y2) { centroidStream.point = centroidPointLine; - centroidPoint(x03 = x, y03 = y); + centroidPoint(x03 = x2, y03 = y2); } - function centroidPointLine(x, y) { - var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy); - X1 += z * (x03 + x) / 2; - Y1 += z * (y03 + y) / 2; - Z1 += z; - centroidPoint(x03 = x, y03 = y); + function centroidPointLine(x2, y2) { + var dx = x2 - x03, dy = y2 - y03, z2 = sqrt(dx * dx + dy * dy); + X1 += z2 * (x03 + x2) / 2; + Y1 += z2 * (y03 + y2) / 2; + Z1 += z2; + centroidPoint(x03 = x2, y03 = y2); } function centroidLineEnd() { centroidStream.point = centroidPoint; @@ -17743,20 +18157,20 @@ function centroidRingEnd() { centroidPointRing(x002, y002); } - function centroidPointFirstRing(x, y) { + function centroidPointFirstRing(x2, y2) { centroidStream.point = centroidPointRing; - centroidPoint(x002 = x03 = x, y002 = y03 = y); - } - function centroidPointRing(x, y) { - var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy); - X1 += z * (x03 + x) / 2; - Y1 += z * (y03 + y) / 2; - Z1 += z; - z = y03 * x - x03 * y; - X2 += z * (x03 + x); - Y2 += z * (y03 + y); - Z2 += z * 3; - centroidPoint(x03 = x, y03 = y); + centroidPoint(x002 = x03 = x2, y002 = y03 = y2); + } + function centroidPointRing(x2, y2) { + var dx = x2 - x03, dy = y2 - y03, z2 = sqrt(dx * dx + dy * dy); + X1 += z2 * (x03 + x2) / 2; + Y1 += z2 * (y03 + y2) / 2; + Z1 += z2; + z2 = y03 * x2 - x03 * y2; + X2 += z2 * (x03 + x2); + Y2 += z2 * (y03 + y2); + Z2 += z2 * 3; + centroidPoint(x03 = x2, y03 = y2); } var centroid_default = centroidStream; @@ -17766,8 +18180,8 @@ } PathContext.prototype = { _radius: 4.5, - pointRadius: function(_) { - return this._radius = _, this; + pointRadius: function(_2) { + return this._radius = _2, this; }, polygonStart: function() { this._line = 0; @@ -17783,20 +18197,20 @@ this._context.closePath(); this._point = NaN; }, - point: function(x, y) { + point: function(x2, y2) { switch (this._point) { case 0: { - this._context.moveTo(x, y); + this._context.moveTo(x2, y2); this._point = 1; break; } case 1: { - this._context.lineTo(x, y); + this._context.lineTo(x2, y2); break; } default: { - this._context.moveTo(x + this._radius, y); - this._context.arc(x, y, this._radius, 0, tau); + this._context.moveTo(x2 + this._radius, y2); + this._context.arc(x2, y2, this._radius, 0, tau); break; } } @@ -17833,14 +18247,14 @@ return length; } }; - function lengthPointFirst2(x, y) { + function lengthPointFirst2(x2, y2) { lengthStream2.point = lengthPoint2; - x003 = x04 = x, y003 = y04 = y; + x003 = x04 = x2, y003 = y04 = y2; } - function lengthPoint2(x, y) { - x04 -= x, y04 -= y; + function lengthPoint2(x2, y2) { + x04 -= x2, y04 -= y2; lengthSum2.add(sqrt(x04 * x04 + y04 * y04)); - x04 = x, y04 = y; + x04 = x2, y04 = y2; } var measure_default = lengthStream2; @@ -17851,9 +18265,9 @@ PathString.prototype = { _radius: 4.5, _circle: circle(4.5), - pointRadius: function(_) { - if ((_ = +_) !== this._radius) - this._radius = _, this._circle = null; + pointRadius: function(_2) { + if ((_2 = +_2) !== this._radius) + this._radius = _2, this._circle = null; return this; }, polygonStart: function() { @@ -17870,21 +18284,21 @@ this._string.push("Z"); this._point = NaN; }, - point: function(x, y) { + point: function(x2, y2) { switch (this._point) { case 0: { - this._string.push("M", x, ",", y); + this._string.push("M", x2, ",", y2); this._point = 1; break; } case 1: { - this._string.push("L", x, ",", y); + this._string.push("L", x2, ",", y2); break; } default: { if (this._circle == null) this._circle = circle(this._radius); - this._string.push("M", x, ",", y, this._circle); + this._string.push("M", x2, ",", y2, this._circle); break; } } @@ -17930,21 +18344,21 @@ stream_default(object, projectionStream(centroid_default)); return centroid_default.result(); }; - path.projection = function(_) { - return arguments.length ? (projectionStream = _ == null ? (projection2 = null, identity_default) : (projection2 = _).stream, path) : projection2; + path.projection = function(_2) { + return arguments.length ? (projectionStream = _2 == null ? (projection2 = null, identity_default) : (projection2 = _2).stream, path) : projection2; }; - path.context = function(_) { + path.context = function(_2) { if (!arguments.length) return context; - contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _); + contextStream = _2 == null ? (context = null, new PathString()) : new PathContext(context = _2); if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); return path; }; - path.pointRadius = function(_) { + path.pointRadius = function(_2) { if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + pointRadius = typeof _2 === "function" ? _2 : (contextStream.pointRadius(+_2), +_2); return path; }; return path.projection(projection2).context(context); @@ -17958,19 +18372,19 @@ } function transformer(methods2) { return function(stream) { - var s = new TransformStream(); + var s2 = new TransformStream(); for (var key in methods2) - s[key] = methods2[key]; - s.stream = stream; - return s; + s2[key] = methods2[key]; + s2.stream = stream; + return s2; }; } function TransformStream() { } TransformStream.prototype = { constructor: TransformStream, - point: function(x, y) { - this.stream.point(x, y); + point: function(x2, y2) { + this.stream.point(x2, y2); }, sphere: function() { this.stream.sphere(); @@ -18002,24 +18416,24 @@ return projection2; } function fitExtent(projection2, extent, object) { - return fit(projection2, function(b) { - var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; - projection2.scale(150 * k).translate([x, y]); + return fit(projection2, function(b2) { + var w2 = extent[1][0] - extent[0][0], h2 = extent[1][1] - extent[0][1], k2 = Math.min(w2 / (b2[1][0] - b2[0][0]), h2 / (b2[1][1] - b2[0][1])), x2 = +extent[0][0] + (w2 - k2 * (b2[1][0] + b2[0][0])) / 2, y2 = +extent[0][1] + (h2 - k2 * (b2[1][1] + b2[0][1])) / 2; + projection2.scale(150 * k2).translate([x2, y2]); }, object); } function fitSize(projection2, size, object) { return fitExtent(projection2, [[0, 0], size], object); } function fitWidth(projection2, width, object) { - return fit(projection2, function(b) { - var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1]; - projection2.scale(150 * k).translate([x, y]); + return fit(projection2, function(b2) { + var w2 = +width, k2 = w2 / (b2[1][0] - b2[0][0]), x2 = (w2 - k2 * (b2[1][0] + b2[0][0])) / 2, y2 = -k2 * b2[0][1]; + projection2.scale(150 * k2).translate([x2, y2]); }, object); } function fitHeight(projection2, height, object) { - return fit(projection2, function(b) { - var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2; - projection2.scale(150 * k).translate([x, y]); + return fit(projection2, function(b2) { + var h2 = +height, k2 = h2 / (b2[1][1] - b2[0][1]), x2 = -k2 * b2[0][0], y2 = (h2 - k2 * (b2[1][1] + b2[0][1])) / 2; + projection2.scale(150 * k2).translate([x2, y2]); }, object); } @@ -18031,9 +18445,9 @@ } function resampleNone(project) { return transformer({ - point: function(x, y) { - x = project(x, y); - this.stream.point(x[0], x[1]); + point: function(x2, y2) { + x2 = project(x2, y2); + this.stream.point(x2[0], x2[1]); } }); } @@ -18041,18 +18455,18 @@ function resampleLineTo(x05, y05, lambda04, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream) { var dx = x12 - x05, dy = y12 - y05, d2 = dx * dx + dy * dy; if (d2 > 4 * delta2 && depth--) { - var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = sqrt(a * a + b * b + c * c), phi2 = asin(c /= m), lambda22 = abs(abs(c) - 1) < epsilon || abs(lambda04 - lambda12) < epsilon ? (lambda04 + lambda12) / 2 : atan2(b, a), p = project(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x05, dy2 = y2 - y05, dz = dy * dx2 - dx * dy2; + var a2 = a0 + a1, b2 = b0 + b1, c2 = c0 + c1, m2 = sqrt(a2 * a2 + b2 * b2 + c2 * c2), phi2 = asin(c2 /= m2), lambda22 = abs(abs(c2) - 1) < epsilon || abs(lambda04 - lambda12) < epsilon ? (lambda04 + lambda12) / 2 : atan2(b2, a2), p2 = project(lambda22, phi2), x2 = p2[0], y2 = p2[1], dx2 = x2 - x05, dy2 = y2 - y05, dz = dy * dx2 - dx * dy2; if (dz * dz / d2 > delta2 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { - resampleLineTo(x05, y05, lambda04, a0, b0, c0, x2, y2, lambda22, a /= m, b /= m, c, depth, stream); + resampleLineTo(x05, y05, lambda04, a0, b0, c0, x2, y2, lambda22, a2 /= m2, b2 /= m2, c2, depth, stream); stream.point(x2, y2); - resampleLineTo(x2, y2, lambda22, a, b, c, x12, y12, lambda12, a1, b1, c1, depth, stream); + resampleLineTo(x2, y2, lambda22, a2, b2, c2, x12, y12, lambda12, a1, b1, c1, depth, stream); } } } return function(stream) { var lambda003, x004, y004, a00, b00, c00, lambda04, x05, y05, a0, b0, c0; var resampleStream = { - point, + point: point2, lineStart, lineEnd, polygonStart: function() { @@ -18064,9 +18478,9 @@ resampleStream.lineStart = lineStart; } }; - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); + function point2(x2, y2) { + x2 = project(x2, y2); + stream.point(x2[0], x2[1]); } function lineStart() { x05 = NaN; @@ -18074,12 +18488,12 @@ stream.lineStart(); } function linePoint2(lambda, phi) { - var c = cartesian([lambda, phi]), p = project(lambda, phi); - resampleLineTo(x05, y05, lambda04, a0, b0, c0, x05 = p[0], y05 = p[1], lambda04 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + var c2 = cartesian([lambda, phi]), p2 = project(lambda, phi); + resampleLineTo(x05, y05, lambda04, a0, b0, c0, x05 = p2[0], y05 = p2[1], lambda04 = lambda, a0 = c2[0], b0 = c2[1], c0 = c2[2], maxDepth, stream); stream.point(x05, y05); } function lineEnd() { - resampleStream.point = point; + resampleStream.point = point2; stream.lineEnd(); } function ringStart() { @@ -18102,40 +18516,40 @@ // node_modules/d3-geo/src/projection/index.js var transformRadians = transformer({ - point: function(x, y) { - this.stream.point(x * radians, y * radians); + point: function(x2, y2) { + this.stream.point(x2 * radians, y2 * radians); } }); function transformRotate(rotate) { return transformer({ - point: function(x, y) { - var r = rotate(x, y); - return this.stream.point(r[0], r[1]); + point: function(x2, y2) { + var r2 = rotate(x2, y2); + return this.stream.point(r2[0], r2[1]); } }); } - function scaleTranslate(k, dx, dy, sx, sy) { - function transform2(x, y) { - x *= sx; - y *= sy; - return [dx + k * x, dy - k * y]; + function scaleTranslate(k2, dx, dy, sx, sy) { + function transform2(x2, y2) { + x2 *= sx; + y2 *= sy; + return [dx + k2 * x2, dy - k2 * y2]; } - transform2.invert = function(x, y) { - return [(x - dx) / k * sx, (dy - y) / k * sy]; + transform2.invert = function(x2, y2) { + return [(x2 - dx) / k2 * sx, (dy - y2) / k2 * sy]; }; return transform2; } - function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + function scaleTranslateRotate(k2, dx, dy, sx, sy, alpha) { if (!alpha) - return scaleTranslate(k, dx, dy, sx, sy); - var cosAlpha = cos(alpha), sinAlpha = sin(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k; - function transform2(x, y) { - x *= sx; - y *= sy; - return [a * x - b * y + dx, dy - b * x - a * y]; + return scaleTranslate(k2, dx, dy, sx, sy); + var cosAlpha = cos(alpha), sinAlpha = sin(alpha), a2 = cosAlpha * k2, b2 = sinAlpha * k2, ai = cosAlpha / k2, bi = sinAlpha / k2, ci = (sinAlpha * dy - cosAlpha * dx) / k2, fi = (sinAlpha * dx + cosAlpha * dy) / k2; + function transform2(x2, y2) { + x2 *= sx; + y2 *= sy; + return [a2 * x2 - b2 * y2 + dx, dy - b2 * x2 - a2 * y2]; } - transform2.invert = function(x, y) { - return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + transform2.invert = function(x2, y2) { + return [sx * (ai * x2 - bi * y2 + ci), sy * (fi - bi * x2 - ai * y2)]; }; return transform2; } @@ -18145,52 +18559,52 @@ })(); } function projectionMutator(projectAt) { - var project, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = antimeridian_default, x05 = null, y05, x12, y12, postclip = identity_default, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream; - function projection2(point) { - return projectRotateTransform(point[0] * radians, point[1] * radians); + var project, k2 = 150, x2 = 480, y2 = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = antimeridian_default, x05 = null, y05, x12, y12, postclip = identity_default, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream; + function projection2(point2) { + return projectRotateTransform(point2[0] * radians, point2[1] * radians); } - function invert(point) { - point = projectRotateTransform.invert(point[0], point[1]); - return point && [point[0] * degrees, point[1] * degrees]; + function invert(point2) { + point2 = projectRotateTransform.invert(point2[0], point2[1]); + return point2 && [point2[0] * degrees, point2[1] * degrees]; } projection2.stream = function(stream) { return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); }; - projection2.preclip = function(_) { - return arguments.length ? (preclip = _, theta = void 0, reset()) : preclip; + projection2.preclip = function(_2) { + return arguments.length ? (preclip = _2, theta = void 0, reset()) : preclip; }; - projection2.postclip = function(_) { - return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip; + projection2.postclip = function(_2) { + return arguments.length ? (postclip = _2, x05 = y05 = x12 = y12 = null, reset()) : postclip; }; - projection2.clipAngle = function(_) { - return arguments.length ? (preclip = +_ ? circle_default(theta = _ * radians) : (theta = null, antimeridian_default), reset()) : theta * degrees; + projection2.clipAngle = function(_2) { + return arguments.length ? (preclip = +_2 ? circle_default(theta = _2 * radians) : (theta = null, antimeridian_default), reset()) : theta * degrees; }; - projection2.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]]; + projection2.clipExtent = function(_2) { + return arguments.length ? (postclip = _2 == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_2[0][0], y05 = +_2[0][1], x12 = +_2[1][0], y12 = +_2[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]]; }; - projection2.scale = function(_) { - return arguments.length ? (k = +_, recenter()) : k; + projection2.scale = function(_2) { + return arguments.length ? (k2 = +_2, recenter()) : k2; }; - projection2.translate = function(_) { - return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + projection2.translate = function(_2) { + return arguments.length ? (x2 = +_2[0], y2 = +_2[1], recenter()) : [x2, y2]; }; - projection2.center = function(_) { - return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + projection2.center = function(_2) { + return arguments.length ? (lambda = _2[0] % 360 * radians, phi = _2[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; }; - projection2.rotate = function(_) { - return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + projection2.rotate = function(_2) { + return arguments.length ? (deltaLambda = _2[0] % 360 * radians, deltaPhi = _2[1] % 360 * radians, deltaGamma = _2.length > 2 ? _2[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; }; - projection2.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + projection2.angle = function(_2) { + return arguments.length ? (alpha = _2 % 360 * radians, recenter()) : alpha * degrees; }; - projection2.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + projection2.reflectX = function(_2) { + return arguments.length ? (sx = _2 ? -1 : 1, recenter()) : sx < 0; }; - projection2.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + projection2.reflectY = function(_2) { + return arguments.length ? (sy = _2 ? -1 : 1, recenter()) : sy < 0; }; - projection2.precision = function(_) { - return arguments.length ? (projectResample = resample_default(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + projection2.precision = function(_2) { + return arguments.length ? (projectResample = resample_default(projectTransform, delta2 = _2 * _2), reset()) : sqrt(delta2); }; projection2.fitExtent = function(extent, object) { return fitExtent(projection2, extent, object); @@ -18205,7 +18619,7 @@ return fitHeight(projection2, height, object); }; function recenter() { - var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform2 = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + var center = scaleTranslateRotate(k2, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform2 = scaleTranslateRotate(k2, x2 - center[0], y2 - center[1], sx, sy, alpha); rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); projectTransform = compose_default(project, transform2); projectRotateTransform = compose_default(rotate, projectTransform); @@ -18227,88 +18641,88 @@ function mercatorRaw(lambda, phi) { return [lambda, log(tan((halfPi + phi) / 2))]; } - mercatorRaw.invert = function(x, y) { - return [x, 2 * atan(exp(y)) - halfPi]; + mercatorRaw.invert = function(x2, y2) { + return [x2, 2 * atan(exp(y2)) - halfPi]; }; function mercator_default() { return mercatorProjection(mercatorRaw).scale(961 / tau); } function mercatorProjection(project) { - var m = projection(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x05 = null, y05, x12, y12; - m.scale = function(_) { - return arguments.length ? (scale(_), reclip()) : scale(); + var m2 = projection(project), center = m2.center, scale = m2.scale, translate = m2.translate, clipExtent = m2.clipExtent, x05 = null, y05, x12, y12; + m2.scale = function(_2) { + return arguments.length ? (scale(_2), reclip()) : scale(); }; - m.translate = function(_) { - return arguments.length ? (translate(_), reclip()) : translate(); + m2.translate = function(_2) { + return arguments.length ? (translate(_2), reclip()) : translate(); }; - m.center = function(_) { - return arguments.length ? (center(_), reclip()) : center(); + m2.center = function(_2) { + return arguments.length ? (center(_2), reclip()) : center(); }; - m.clipExtent = function(_) { - return arguments.length ? (_ == null ? x05 = y05 = x12 = y12 = null : (x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x05 == null ? null : [[x05, y05], [x12, y12]]; + m2.clipExtent = function(_2) { + return arguments.length ? (_2 == null ? x05 = y05 = x12 = y12 = null : (x05 = +_2[0][0], y05 = +_2[0][1], x12 = +_2[1][0], y12 = +_2[1][1]), reclip()) : x05 == null ? null : [[x05, y05], [x12, y12]]; }; function reclip() { - var k = pi * scale(), t = m(rotation_default(m.rotate()).invert([0, 0])); - return clipExtent(x05 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x05), y05], [Math.min(t[0] + k, x12), y12]] : [[x05, Math.max(t[1] - k, y05)], [x12, Math.min(t[1] + k, y12)]]); + var k2 = pi * scale(), t2 = m2(rotation_default(m2.rotate()).invert([0, 0])); + return clipExtent(x05 == null ? [[t2[0] - k2, t2[1] - k2], [t2[0] + k2, t2[1] + k2]] : project === mercatorRaw ? [[Math.max(t2[0] - k2, x05), y05], [Math.min(t2[0] + k2, x12), y12]] : [[x05, Math.max(t2[1] - k2, y05)], [x12, Math.min(t2[1] + k2, y12)]]); } return reclip(); } // node_modules/d3-geo/src/projection/identity.js function identity_default2() { - var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x05 = null, y05, x12, y12, kx = 1, ky = 1, transform2 = transformer({ - point: function(x, y) { - var p = projection2([x, y]); - this.stream.point(p[0], p[1]); + var k2 = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x05 = null, y05, x12, y12, kx = 1, ky = 1, transform2 = transformer({ + point: function(x2, y2) { + var p2 = projection2([x2, y2]); + this.stream.point(p2[0], p2[1]); } }), postclip = identity_default, cache, cacheStream; function reset() { - kx = k * sx; - ky = k * sy; + kx = k2 * sx; + ky = k2 * sy; cache = cacheStream = null; return projection2; } - function projection2(p) { - var x = p[0] * kx, y = p[1] * ky; + function projection2(p2) { + var x2 = p2[0] * kx, y2 = p2[1] * ky; if (alpha) { - var t = y * ca - x * sa; - x = x * ca + y * sa; - y = t; + var t2 = y2 * ca - x2 * sa; + x2 = x2 * ca + y2 * sa; + y2 = t2; } - return [x + tx, y + ty]; + return [x2 + tx, y2 + ty]; } - projection2.invert = function(p) { - var x = p[0] - tx, y = p[1] - ty; + projection2.invert = function(p2) { + var x2 = p2[0] - tx, y2 = p2[1] - ty; if (alpha) { - var t = y * ca + x * sa; - x = x * ca - y * sa; - y = t; + var t2 = y2 * ca + x2 * sa; + x2 = x2 * ca - y2 * sa; + y2 = t2; } - return [x / kx, y / ky]; + return [x2 / kx, y2 / ky]; }; projection2.stream = function(stream) { return cache && cacheStream === stream ? cache : cache = transform2(postclip(cacheStream = stream)); }; - projection2.postclip = function(_) { - return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip; + projection2.postclip = function(_2) { + return arguments.length ? (postclip = _2, x05 = y05 = x12 = y12 = null, reset()) : postclip; }; - projection2.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]]; + projection2.clipExtent = function(_2) { + return arguments.length ? (postclip = _2 == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_2[0][0], y05 = +_2[0][1], x12 = +_2[1][0], y12 = +_2[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]]; }; - projection2.scale = function(_) { - return arguments.length ? (k = +_, reset()) : k; + projection2.scale = function(_2) { + return arguments.length ? (k2 = +_2, reset()) : k2; }; - projection2.translate = function(_) { - return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + projection2.translate = function(_2) { + return arguments.length ? (tx = +_2[0], ty = +_2[1], reset()) : [tx, ty]; }; - projection2.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; + projection2.angle = function(_2) { + return arguments.length ? (alpha = _2 % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; }; - projection2.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + projection2.reflectX = function(_2) { + return arguments.length ? (sx = _2 ? -1 : 1, reset()) : sx < 0; }; - projection2.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + projection2.reflectY = function(_2) { + return arguments.length ? (sy = _2 ? -1 : 1, reset()) : sy < 0; }; projection2.fitExtent = function(extent, object) { return fitExtent(projection2, extent, object); @@ -18327,19 +18741,19 @@ // modules/geo/geo.js var TAU = 2 * Math.PI; - var EQUATORIAL_RADIUS = 6356752314245179e-9; - var POLAR_RADIUS = 6378137; + var EQUATORIAL_RADIUS = 6378137; + var POLAR_RADIUS = 63567523e-1; function geoLatToMeters(dLat) { return dLat * (TAU * POLAR_RADIUS / 360); } function geoLonToMeters(dLon, atLat) { return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180))); } - function geoMetersToLat(m) { - return m / (TAU * POLAR_RADIUS / 360); + function geoMetersToLat(m2) { + return m2 / (TAU * POLAR_RADIUS / 360); } - function geoMetersToLon(m, atLat) { - return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180))); + function geoMetersToLon(m2, atLat) { + return Math.abs(atLat) >= 90 ? 0 : m2 / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180))); } function geoMetersToOffset(meters, tileSize) { tileSize = tileSize || 256; @@ -18355,28 +18769,28 @@ -offset[1] * TAU * POLAR_RADIUS / tileSize ]; } - function geoSphericalDistance(a, b) { - var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2); - var y = geoLatToMeters(a[1] - b[1]); - return Math.sqrt(x * x + y * y); + function geoSphericalDistance(a2, b2) { + var x2 = geoLonToMeters(a2[0] - b2[0], (a2[1] + b2[1]) / 2); + var y2 = geoLatToMeters(a2[1] - b2[1]); + return Math.sqrt(x2 * x2 + y2 * y2); } - function geoScaleToZoom(k, tileSize) { + function geoScaleToZoom(k2, tileSize) { tileSize = tileSize || 256; var log2ts = Math.log(tileSize) * Math.LOG2E; - return Math.log(k * TAU) / Math.LN2 - log2ts; + return Math.log(k2 * TAU) / Math.LN2 - log2ts; } - function geoZoomToScale(z, tileSize) { + function geoZoomToScale(z2, tileSize) { tileSize = tileSize || 256; - return tileSize * Math.pow(2, z) / TAU; + return tileSize * Math.pow(2, z2) / TAU; } - function geoSphericalClosestNode(nodes, point) { + function geoSphericalClosestNode(nodes, point2) { var minDistance = Infinity, distance; var indexOfMin; - for (var i2 in nodes) { - distance = geoSphericalDistance(nodes[i2].loc, point); + for (var i3 in nodes) { + distance = geoSphericalDistance(nodes[i3].loc, point2); if (distance < minDistance) { minDistance = distance; - indexOfMin = i2; + indexOfMin = i3; } } if (indexOfMin !== void 0) { @@ -18489,150 +18903,150 @@ // node_modules/d3-polygon/src/area.js function area_default3(polygon2) { - var i2 = -1, n2 = polygon2.length, a, b = polygon2[n2 - 1], area = 0; - while (++i2 < n2) { - a = b; - b = polygon2[i2]; - area += a[1] * b[0] - a[0] * b[1]; + var i3 = -1, n3 = polygon2.length, a2, b2 = polygon2[n3 - 1], area = 0; + while (++i3 < n3) { + a2 = b2; + b2 = polygon2[i3]; + area += a2[1] * b2[0] - a2[0] * b2[1]; } return area / 2; } // node_modules/d3-polygon/src/centroid.js function centroid_default2(polygon2) { - var i2 = -1, n2 = polygon2.length, x = 0, y = 0, a, b = polygon2[n2 - 1], c, k = 0; - while (++i2 < n2) { - a = b; - b = polygon2[i2]; - k += c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; + var i3 = -1, n3 = polygon2.length, x2 = 0, y2 = 0, a2, b2 = polygon2[n3 - 1], c2, k2 = 0; + while (++i3 < n3) { + a2 = b2; + b2 = polygon2[i3]; + k2 += c2 = a2[0] * b2[1] - b2[0] * a2[1]; + x2 += (a2[0] + b2[0]) * c2; + y2 += (a2[1] + b2[1]) * c2; } - return k *= 3, [x / k, y / k]; + return k2 *= 3, [x2 / k2, y2 / k2]; } // node_modules/d3-polygon/src/cross.js - function cross_default(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + function cross_default(a2, b2, c2) { + return (b2[0] - a2[0]) * (c2[1] - a2[1]) - (b2[1] - a2[1]) * (c2[0] - a2[0]); } // node_modules/d3-polygon/src/hull.js - function lexicographicOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; + function lexicographicOrder(a2, b2) { + return a2[0] - b2[0] || a2[1] - b2[1]; } function computeUpperHullIndexes(points) { - const n2 = points.length, indexes = [0, 1]; - let size = 2, i2; - for (i2 = 2; i2 < n2; ++i2) { - while (size > 1 && cross_default(points[indexes[size - 2]], points[indexes[size - 1]], points[i2]) <= 0) + const n3 = points.length, indexes = [0, 1]; + let size = 2, i3; + for (i3 = 2; i3 < n3; ++i3) { + while (size > 1 && cross_default(points[indexes[size - 2]], points[indexes[size - 1]], points[i3]) <= 0) --size; - indexes[size++] = i2; + indexes[size++] = i3; } return indexes.slice(0, size); } function hull_default(points) { - if ((n2 = points.length) < 3) + if ((n3 = points.length) < 3) return null; - var i2, n2, sortedPoints = new Array(n2), flippedPoints = new Array(n2); - for (i2 = 0; i2 < n2; ++i2) - sortedPoints[i2] = [+points[i2][0], +points[i2][1], i2]; + var i3, n3, sortedPoints = new Array(n3), flippedPoints = new Array(n3); + for (i3 = 0; i3 < n3; ++i3) + sortedPoints[i3] = [+points[i3][0], +points[i3][1], i3]; sortedPoints.sort(lexicographicOrder); - for (i2 = 0; i2 < n2; ++i2) - flippedPoints[i2] = [sortedPoints[i2][0], -sortedPoints[i2][1]]; + for (i3 = 0; i3 < n3; ++i3) + flippedPoints[i3] = [sortedPoints[i3][0], -sortedPoints[i3][1]]; var upperIndexes = computeUpperHullIndexes(sortedPoints), lowerIndexes = computeUpperHullIndexes(flippedPoints); var skipLeft = lowerIndexes[0] === upperIndexes[0], skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], hull = []; - for (i2 = upperIndexes.length - 1; i2 >= 0; --i2) - hull.push(points[sortedPoints[upperIndexes[i2]][2]]); - for (i2 = +skipLeft; i2 < lowerIndexes.length - skipRight; ++i2) - hull.push(points[sortedPoints[lowerIndexes[i2]][2]]); + for (i3 = upperIndexes.length - 1; i3 >= 0; --i3) + hull.push(points[sortedPoints[upperIndexes[i3]][2]]); + for (i3 = +skipLeft; i3 < lowerIndexes.length - skipRight; ++i3) + hull.push(points[sortedPoints[lowerIndexes[i3]][2]]); return hull; } // modules/geo/vector.js - function geoVecEqual(a, b, epsilon3) { + function geoVecEqual(a2, b2, epsilon3) { if (epsilon3) { - return Math.abs(a[0] - b[0]) <= epsilon3 && Math.abs(a[1] - b[1]) <= epsilon3; + return Math.abs(a2[0] - b2[0]) <= epsilon3 && Math.abs(a2[1] - b2[1]) <= epsilon3; } else { - return a[0] === b[0] && a[1] === b[1]; + return a2[0] === b2[0] && a2[1] === b2[1]; } } - function geoVecAdd(a, b) { - return [a[0] + b[0], a[1] + b[1]]; + function geoVecAdd(a2, b2) { + return [a2[0] + b2[0], a2[1] + b2[1]]; } - function geoVecSubtract(a, b) { - return [a[0] - b[0], a[1] - b[1]]; + function geoVecSubtract(a2, b2) { + return [a2[0] - b2[0], a2[1] - b2[1]]; } - function geoVecScale(a, mag) { - return [a[0] * mag, a[1] * mag]; + function geoVecScale(a2, mag) { + return [a2[0] * mag, a2[1] * mag]; } - function geoVecFloor(a) { - return [Math.floor(a[0]), Math.floor(a[1])]; + function geoVecFloor(a2) { + return [Math.floor(a2[0]), Math.floor(a2[1])]; } - function geoVecInterp(a, b, t) { + function geoVecInterp(a2, b2, t2) { return [ - a[0] + (b[0] - a[0]) * t, - a[1] + (b[1] - a[1]) * t + a2[0] + (b2[0] - a2[0]) * t2, + a2[1] + (b2[1] - a2[1]) * t2 ]; } - function geoVecLength(a, b) { - return Math.sqrt(geoVecLengthSquare(a, b)); + function geoVecLength(a2, b2) { + return Math.sqrt(geoVecLengthSquare(a2, b2)); } - function geoVecLengthSquare(a, b) { - b = b || [0, 0]; - var x = a[0] - b[0]; - var y = a[1] - b[1]; - return x * x + y * y; + function geoVecLengthSquare(a2, b2) { + b2 = b2 || [0, 0]; + var x2 = a2[0] - b2[0]; + var y2 = a2[1] - b2[1]; + return x2 * x2 + y2 * y2; } - function geoVecNormalize(a) { - var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]); + function geoVecNormalize(a2) { + var length = Math.sqrt(a2[0] * a2[0] + a2[1] * a2[1]); if (length !== 0) { - return geoVecScale(a, 1 / length); + return geoVecScale(a2, 1 / length); } return [0, 0]; } - function geoVecAngle(a, b) { - return Math.atan2(b[1] - a[1], b[0] - a[0]); + function geoVecAngle(a2, b2) { + return Math.atan2(b2[1] - a2[1], b2[0] - a2[0]); } - function geoVecDot(a, b, origin) { + function geoVecDot(a2, b2, origin) { origin = origin || [0, 0]; - var p = geoVecSubtract(a, origin); - var q = geoVecSubtract(b, origin); - return p[0] * q[0] + p[1] * q[1]; + var p2 = geoVecSubtract(a2, origin); + var q2 = geoVecSubtract(b2, origin); + return p2[0] * q2[0] + p2[1] * q2[1]; } - function geoVecNormalizedDot(a, b, origin) { + function geoVecNormalizedDot(a2, b2, origin) { origin = origin || [0, 0]; - var p = geoVecNormalize(geoVecSubtract(a, origin)); - var q = geoVecNormalize(geoVecSubtract(b, origin)); - return geoVecDot(p, q); + var p2 = geoVecNormalize(geoVecSubtract(a2, origin)); + var q2 = geoVecNormalize(geoVecSubtract(b2, origin)); + return geoVecDot(p2, q2); } - function geoVecCross(a, b, origin) { + function geoVecCross(a2, b2, origin) { origin = origin || [0, 0]; - var p = geoVecSubtract(a, origin); - var q = geoVecSubtract(b, origin); - return p[0] * q[1] - p[1] * q[0]; + var p2 = geoVecSubtract(a2, origin); + var q2 = geoVecSubtract(b2, origin); + return p2[0] * q2[1] - p2[1] * q2[0]; } - function geoVecProject(a, points) { + function geoVecProject(a2, points) { var min3 = Infinity; var idx; var target; - for (var i2 = 0; i2 < points.length - 1; i2++) { - var o = points[i2]; - var s = geoVecSubtract(points[i2 + 1], o); - var v = geoVecSubtract(a, o); - var proj = geoVecDot(v, s) / geoVecDot(s, s); - var p; + for (var i3 = 0; i3 < points.length - 1; i3++) { + var o2 = points[i3]; + var s2 = geoVecSubtract(points[i3 + 1], o2); + var v2 = geoVecSubtract(a2, o2); + var proj = geoVecDot(v2, s2) / geoVecDot(s2, s2); + var p2; if (proj < 0) { - p = o; + p2 = o2; } else if (proj > 1) { - p = points[i2 + 1]; + p2 = points[i3 + 1]; } else { - p = [o[0] + proj * s[0], o[1] + proj * s[1]]; + p2 = [o2[0] + proj * s2[0], o2[1] + proj * s2[1]]; } - var dist = geoVecLength(p, a); + var dist = geoVecLength(p2, a2); if (dist < min3) { min3 = dist; - idx = i2 + 1; - target = p; + idx = i3 + 1; + target = p2; } } if (idx !== void 0) { @@ -18643,52 +19057,52 @@ } // modules/geo/geom.js - function geoAngle(a, b, projection2) { - return geoVecAngle(projection2(a.loc), projection2(b.loc)); + function geoAngle(a2, b2, projection2) { + return geoVecAngle(projection2(a2.loc), projection2(b2.loc)); } - function geoEdgeEqual(a, b) { - return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0]; + function geoEdgeEqual(a2, b2) { + return a2[0] === b2[0] && a2[1] === b2[1] || a2[0] === b2[1] && a2[1] === b2[0]; } function geoRotate(points, angle2, around) { - return points.map(function(point) { - var radial = geoVecSubtract(point, around); + return points.map(function(point2) { + var radial = geoVecSubtract(point2, around); return [ radial[0] * Math.cos(angle2) - radial[1] * Math.sin(angle2) + around[0], radial[0] * Math.sin(angle2) + radial[1] * Math.cos(angle2) + around[1] ]; }); } - function geoChooseEdge(nodes, point, projection2, activeID) { + function geoChooseEdge(nodes, point2, projection2, activeID) { var dist = geoVecLength; - var points = nodes.map(function(n2) { - return projection2(n2.loc); + var points = nodes.map(function(n3) { + return projection2(n3.loc); }); - var ids = nodes.map(function(n2) { - return n2.id; + var ids = nodes.map(function(n3) { + return n3.id; }); var min3 = Infinity; var idx; var loc; - for (var i2 = 0; i2 < points.length - 1; i2++) { - if (ids[i2] === activeID || ids[i2 + 1] === activeID) + for (var i3 = 0; i3 < points.length - 1; i3++) { + if (ids[i3] === activeID || ids[i3 + 1] === activeID) continue; - var o = points[i2]; - var s = geoVecSubtract(points[i2 + 1], o); - var v = geoVecSubtract(point, o); - var proj = geoVecDot(v, s) / geoVecDot(s, s); - var p; + var o2 = points[i3]; + var s2 = geoVecSubtract(points[i3 + 1], o2); + var v2 = geoVecSubtract(point2, o2); + var proj = geoVecDot(v2, s2) / geoVecDot(s2, s2); + var p2; if (proj < 0) { - p = o; + p2 = o2; } else if (proj > 1) { - p = points[i2 + 1]; + p2 = points[i3 + 1]; } else { - p = [o[0] + proj * s[0], o[1] + proj * s[1]]; + p2 = [o2[0] + proj * s2[0], o2[1] + proj * s2[1]]; } - var d = dist(p, point); - if (d < min3) { - min3 = d; - idx = i2 + 1; - loc = projection2.invert(p); + var d2 = dist(p2, point2); + if (d2 < min3) { + min3 = d2; + idx = i3 + 1; + loc = projection2.invert(p2); } } if (idx !== void 0) { @@ -18700,26 +19114,26 @@ function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) { var actives = []; var inactives = []; - var j2, k, n1, n2, segment; - for (j2 = 0; j2 < activeNodes.length - 1; j2++) { - n1 = activeNodes[j2]; - n2 = activeNodes[j2 + 1]; - segment = [n1.loc, n2.loc]; - if (n1.id === activeID || n2.id === activeID) { + var j3, k2, n1, n22, segment; + for (j3 = 0; j3 < activeNodes.length - 1; j3++) { + n1 = activeNodes[j3]; + n22 = activeNodes[j3 + 1]; + segment = [n1.loc, n22.loc]; + if (n1.id === activeID || n22.id === activeID) { actives.push(segment); } } - for (j2 = 0; j2 < inactiveNodes.length - 1; j2++) { - n1 = inactiveNodes[j2]; - n2 = inactiveNodes[j2 + 1]; - segment = [n1.loc, n2.loc]; + for (j3 = 0; j3 < inactiveNodes.length - 1; j3++) { + n1 = inactiveNodes[j3]; + n22 = inactiveNodes[j3 + 1]; + segment = [n1.loc, n22.loc]; inactives.push(segment); } - for (j2 = 0; j2 < actives.length; j2++) { - for (k = 0; k < inactives.length; k++) { - var p = actives[j2]; - var q = inactives[k]; - var hit = geoLineIntersection(p, q); + for (j3 = 0; j3 < actives.length; j3++) { + for (k2 = 0; k2 < inactives.length; k2++) { + var p2 = actives[j3]; + var q2 = inactives[k2]; + var hit = geoLineIntersection(p2, q2); if (hit) { return true; } @@ -18730,28 +19144,28 @@ function geoHasSelfIntersections(nodes, activeID) { var actives = []; var inactives = []; - var j2, k; - for (j2 = 0; j2 < nodes.length - 1; j2++) { - var n1 = nodes[j2]; - var n2 = nodes[j2 + 1]; - var segment = [n1.loc, n2.loc]; - if (n1.id === activeID || n2.id === activeID) { + var j3, k2; + for (j3 = 0; j3 < nodes.length - 1; j3++) { + var n1 = nodes[j3]; + var n22 = nodes[j3 + 1]; + var segment = [n1.loc, n22.loc]; + if (n1.id === activeID || n22.id === activeID) { actives.push(segment); } else { inactives.push(segment); } } - for (j2 = 0; j2 < actives.length; j2++) { - for (k = 0; k < inactives.length; k++) { - var p = actives[j2]; - var q = inactives[k]; - if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) { + for (j3 = 0; j3 < actives.length; j3++) { + for (k2 = 0; k2 < inactives.length; k2++) { + var p2 = actives[j3]; + var q2 = inactives[k2]; + if (geoVecEqual(p2[1], q2[0]) || geoVecEqual(p2[0], q2[1]) || geoVecEqual(p2[0], q2[0]) || geoVecEqual(p2[1], q2[1])) { continue; } - var hit = geoLineIntersection(p, q); + var hit = geoLineIntersection(p2, q2); if (hit) { var epsilon3 = 1e-8; - if (geoVecEqual(p[1], hit, epsilon3) || geoVecEqual(p[0], hit, epsilon3) || geoVecEqual(q[1], hit, epsilon3) || geoVecEqual(q[0], hit, epsilon3)) { + if (geoVecEqual(p2[1], hit, epsilon3) || geoVecEqual(p2[0], hit, epsilon3) || geoVecEqual(q2[1], hit, epsilon3) || geoVecEqual(q2[0], hit, epsilon3)) { continue; } else { return true; @@ -18761,31 +19175,31 @@ } return false; } - function geoLineIntersection(a, b) { - var p = [a[0][0], a[0][1]]; - var p2 = [a[1][0], a[1][1]]; - var q = [b[0][0], b[0][1]]; - var q2 = [b[1][0], b[1][1]]; - var r = geoVecSubtract(p2, p); - var s = geoVecSubtract(q2, q); - var uNumerator = geoVecCross(geoVecSubtract(q, p), r); - var denominator = geoVecCross(r, s); + function geoLineIntersection(a2, b2) { + var p2 = [a2[0][0], a2[0][1]]; + var p22 = [a2[1][0], a2[1][1]]; + var q2 = [b2[0][0], b2[0][1]]; + var q22 = [b2[1][0], b2[1][1]]; + var r2 = geoVecSubtract(p22, p2); + var s2 = geoVecSubtract(q22, q2); + var uNumerator = geoVecCross(geoVecSubtract(q2, p2), r2); + var denominator = geoVecCross(r2, s2); if (uNumerator && denominator) { - var u = uNumerator / denominator; - var t = geoVecCross(geoVecSubtract(q, p), s) / denominator; - if (t >= 0 && t <= 1 && u >= 0 && u <= 1) { - return geoVecInterp(p, p2, t); + var u2 = uNumerator / denominator; + var t2 = geoVecCross(geoVecSubtract(q2, p2), s2) / denominator; + if (t2 >= 0 && t2 <= 1 && u2 >= 0 && u2 <= 1) { + return geoVecInterp(p2, p22, t2); } } return null; } function geoPathIntersections(path1, path2) { var intersections = []; - for (var i2 = 0; i2 < path1.length - 1; i2++) { - for (var j2 = 0; j2 < path2.length - 1; j2++) { - var a = [path1[i2], path1[i2 + 1]]; - var b = [path2[j2], path2[j2 + 1]]; - var hit = geoLineIntersection(a, b); + for (var i3 = 0; i3 < path1.length - 1; i3++) { + for (var j3 = 0; j3 < path2.length - 1; j3++) { + var a2 = [path1[i3], path1[i3 + 1]]; + var b2 = [path2[j3], path2[j3 + 1]]; + var hit = geoLineIntersection(a2, b2); if (hit) { intersections.push(hit); } @@ -18794,11 +19208,11 @@ return intersections; } function geoPathHasIntersections(path1, path2) { - for (var i2 = 0; i2 < path1.length - 1; i2++) { - for (var j2 = 0; j2 < path2.length - 1; j2++) { - var a = [path1[i2], path1[i2 + 1]]; - var b = [path2[j2], path2[j2 + 1]]; - var hit = geoLineIntersection(a, b); + for (var i3 = 0; i3 < path1.length - 1; i3++) { + for (var j3 = 0; j3 < path2.length - 1; j3++) { + var a2 = [path1[i3], path1[i3 + 1]]; + var b2 = [path2[j3], path2[j3 + 1]]; + var hit = geoLineIntersection(a2, b2); if (hit) { return true; } @@ -18806,30 +19220,30 @@ } return false; } - function geoPointInPolygon(point, polygon2) { - var x = point[0]; - var y = point[1]; + function geoPointInPolygon(point2, polygon2) { + var x2 = point2[0]; + var y2 = point2[1]; var inside = false; - for (var i2 = 0, j2 = polygon2.length - 1; i2 < polygon2.length; j2 = i2++) { - var xi = polygon2[i2][0]; - var yi = polygon2[i2][1]; - var xj = polygon2[j2][0]; - var yj = polygon2[j2][1]; - var intersect2 = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; + for (var i3 = 0, j3 = polygon2.length - 1; i3 < polygon2.length; j3 = i3++) { + var xi = polygon2[i3][0]; + var yi = polygon2[i3][1]; + var xj = polygon2[j3][0]; + var yj = polygon2[j3][1]; + var intersect2 = yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi; if (intersect2) inside = !inside; } return inside; } function geoPolygonContainsPolygon(outer, inner) { - return inner.every(function(point) { - return geoPointInPolygon(point, outer); + return inner.every(function(point2) { + return geoPointInPolygon(point2, outer); }); } function geoPolygonIntersectsPolygon(outer, inner, checkSegments) { function testPoints(outer2, inner2) { - return inner2.some(function(point) { - return geoPointInPolygon(point, outer2); + return inner2.some(function(point2) { + return geoPointInPolygon(point2, outer2); }); } return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner); @@ -18841,12 +19255,12 @@ var ssrExtent = []; var ssrAngle = 0; var c1 = hull[0]; - for (var i2 = 0; i2 <= hull.length - 1; i2++) { - var c2 = i2 === hull.length - 1 ? hull[0] : hull[i2 + 1]; + for (var i3 = 0; i3 <= hull.length - 1; i3++) { + var c2 = i3 === hull.length - 1 ? hull[0] : hull[i3 + 1]; var angle2 = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]); var poly = geoRotate(hull, -angle2, centroid); - var extent = poly.reduce(function(extent2, point) { - return extent2.extend(geoExtent(point)); + var extent = poly.reduce(function(extent2, point2) { + return extent2.extend(geoExtent(point2)); }, geoExtent()); var area = extent.area(); if (area < minArea) { @@ -18863,29 +19277,29 @@ } function geoPathLength(path) { var length = 0; - for (var i2 = 0; i2 < path.length - 1; i2++) { - length += geoVecLength(path[i2], path[i2 + 1]); + for (var i3 = 0; i3 < path.length - 1; i3++) { + length += geoVecLength(path[i3], path[i3 + 1]); } return length; } - function geoViewportEdge(point, dimensions) { + function geoViewportEdge(point2, dimensions) { var pad2 = [80, 20, 50, 20]; - var x = 0; - var y = 0; - if (point[0] > dimensions[0] - pad2[1]) { - x = -10; + var x2 = 0; + var y2 = 0; + if (point2[0] > dimensions[0] - pad2[1]) { + x2 = -10; } - if (point[0] < pad2[3]) { - x = 10; + if (point2[0] < pad2[3]) { + x2 = 10; } - if (point[1] > dimensions[1] - pad2[2]) { - y = -10; + if (point2[1] > dimensions[1] - pad2[2]) { + y2 = -10; } - if (point[1] < pad2[0]) { - y = 10; + if (point2[1] < pad2[0]) { + y2 = 10; } - if (x || y) { - return [x, y]; + if (x2 || y2) { + return [x2, y2]; } else { return null; } @@ -18895,86 +19309,86 @@ var noop2 = { value: () => { } }; function dispatch() { - for (var i2 = 0, n2 = arguments.length, _ = {}, t; i2 < n2; ++i2) { - if (!(t = arguments[i2] + "") || t in _ || /[\s.]/.test(t)) - throw new Error("illegal type: " + t); - _[t] = []; + for (var i3 = 0, n3 = arguments.length, _2 = {}, t2; i3 < n3; ++i3) { + if (!(t2 = arguments[i3] + "") || t2 in _2 || /[\s.]/.test(t2)) + throw new Error("illegal type: " + t2); + _2[t2] = []; } - return new Dispatch(_); + return new Dispatch(_2); } - function Dispatch(_) { - this._ = _; + function Dispatch(_2) { + this._ = _2; } function parseTypenames(typenames, types) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i2 = t.indexOf("."); - if (i2 >= 0) - name = t.slice(i2 + 1), t = t.slice(0, i2); - if (t && !types.hasOwnProperty(t)) - throw new Error("unknown type: " + t); - return { type: t, name }; + return typenames.trim().split(/^|\s+/).map(function(t2) { + var name = "", i3 = t2.indexOf("."); + if (i3 >= 0) + name = t2.slice(i3 + 1), t2 = t2.slice(0, i3); + if (t2 && !types.hasOwnProperty(t2)) + throw new Error("unknown type: " + t2); + return { type: t2, name }; }); } Dispatch.prototype = dispatch.prototype = { constructor: Dispatch, on: function(typename, callback) { - var _ = this._, T = parseTypenames(typename + "", _), t, i2 = -1, n2 = T.length; + var _2 = this._, T2 = parseTypenames(typename + "", _2), t2, i3 = -1, n3 = T2.length; if (arguments.length < 2) { - while (++i2 < n2) - if ((t = (typename = T[i2]).type) && (t = get(_[t], typename.name))) - return t; + while (++i3 < n3) + if ((t2 = (typename = T2[i3]).type) && (t2 = get(_2[t2], typename.name))) + return t2; return; } if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); - while (++i2 < n2) { - if (t = (typename = T[i2]).type) - _[t] = set(_[t], typename.name, callback); + while (++i3 < n3) { + if (t2 = (typename = T2[i3]).type) + _2[t2] = set(_2[t2], typename.name, callback); else if (callback == null) - for (t in _) - _[t] = set(_[t], typename.name, null); + for (t2 in _2) + _2[t2] = set(_2[t2], typename.name, null); } return this; }, copy: function() { - var copy2 = {}, _ = this._; - for (var t in _) - copy2[t] = _[t].slice(); + var copy2 = {}, _2 = this._; + for (var t2 in _2) + copy2[t2] = _2[t2].slice(); return new Dispatch(copy2); }, - call: function(type3, that) { - if ((n2 = arguments.length - 2) > 0) - for (var args = new Array(n2), i2 = 0, n2, t; i2 < n2; ++i2) - args[i2] = arguments[i2 + 2]; - if (!this._.hasOwnProperty(type3)) - throw new Error("unknown type: " + type3); - for (t = this._[type3], i2 = 0, n2 = t.length; i2 < n2; ++i2) - t[i2].value.apply(that, args); + call: function(type2, that) { + if ((n3 = arguments.length - 2) > 0) + for (var args = new Array(n3), i3 = 0, n3, t2; i3 < n3; ++i3) + args[i3] = arguments[i3 + 2]; + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (t2 = this._[type2], i3 = 0, n3 = t2.length; i3 < n3; ++i3) + t2[i3].value.apply(that, args); }, - apply: function(type3, that, args) { - if (!this._.hasOwnProperty(type3)) - throw new Error("unknown type: " + type3); - for (var t = this._[type3], i2 = 0, n2 = t.length; i2 < n2; ++i2) - t[i2].value.apply(that, args); + apply: function(type2, that, args) { + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (var t2 = this._[type2], i3 = 0, n3 = t2.length; i3 < n3; ++i3) + t2[i3].value.apply(that, args); } }; - function get(type3, name) { - for (var i2 = 0, n2 = type3.length, c; i2 < n2; ++i2) { - if ((c = type3[i2]).name === name) { - return c.value; + function get(type2, name) { + for (var i3 = 0, n3 = type2.length, c2; i3 < n3; ++i3) { + if ((c2 = type2[i3]).name === name) { + return c2.value; } } } - function set(type3, name, callback) { - for (var i2 = 0, n2 = type3.length; i2 < n2; ++i2) { - if (type3[i2].name === name) { - type3[i2] = noop2, type3 = type3.slice(0, i2).concat(type3.slice(i2 + 1)); + function set(type2, name, callback) { + for (var i3 = 0, n3 = type2.length; i3 < n3; ++i3) { + if (type2[i3].name === name) { + type2[i3] = noop2, type2 = type2.slice(0, i3).concat(type2.slice(i3 + 1)); break; } } if (callback != null) - type3.push({ name, value: callback }); - return type3; + type2.push({ name, value: callback }); + return type2; } var dispatch_default = dispatch; @@ -18990,9 +19404,9 @@ // node_modules/d3-selection/src/namespace.js function namespace_default(name) { - var prefix = name += "", i2 = prefix.indexOf(":"); - if (i2 >= 0 && (prefix = name.slice(0, i2)) !== "xmlns") - name = name.slice(i2 + 1); + var prefix = name += "", i3 = prefix.indexOf(":"); + if (i3 >= 0 && (prefix = name.slice(0, i3)) !== "xmlns") + name = name.slice(i3 + 1); return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; } @@ -19026,12 +19440,12 @@ function select_default(select) { if (typeof select !== "function") select = selector_default(select); - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) { - if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) { + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, subgroup = subgroups[j3] = new Array(n3), node, subnode, i3 = 0; i3 < n3; ++i3) { + if ((node = group[i3]) && (subnode = select.call(node, node.__data__, i3, group))) { if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i2] = subnode; + subgroup[i3] = subnode; } } } @@ -19039,8 +19453,8 @@ } // node_modules/d3-selection/src/array.js - function array(x) { - return x == null ? [] : Array.isArray(x) ? x : Array.from(x); + function array(x2) { + return x2 == null ? [] : Array.isArray(x2) ? x2 : Array.from(x2); } // node_modules/d3-selection/src/selectorAll.js @@ -19064,10 +19478,10 @@ select = arrayAll(select); else select = selectorAll_default(select); - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) { - if (node = group[i2]) { - subgroups.push(select.call(node, node.__data__, i2, group)); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, node, i3 = 0; i3 < n3; ++i3) { + if (node = group[i3]) { + subgroups.push(select.call(node, node.__data__, i3, group)); parents.push(node); } } @@ -19119,9 +19533,9 @@ function filter_default(match) { if (typeof match !== "function") match = matcher_default(match); - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) { - if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) { + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, subgroup = subgroups[j3] = [], node, i3 = 0; i3 < n3; ++i3) { + if ((node = group[i3]) && match.call(node, node.__data__, i3, group)) { subgroup.push(node); } } @@ -19162,54 +19576,54 @@ }; // node_modules/d3-selection/src/constant.js - function constant_default(x) { + function constant_default(x2) { return function() { - return x; + return x2; }; } // node_modules/d3-selection/src/selection/data.js function bindIndex(parent, group, enter, update, exit, data) { - var i2 = 0, node, groupLength = group.length, dataLength = data.length; - for (; i2 < dataLength; ++i2) { - if (node = group[i2]) { - node.__data__ = data[i2]; - update[i2] = node; + var i3 = 0, node, groupLength = group.length, dataLength = data.length; + for (; i3 < dataLength; ++i3) { + if (node = group[i3]) { + node.__data__ = data[i3]; + update[i3] = node; } else { - enter[i2] = new EnterNode(parent, data[i2]); + enter[i3] = new EnterNode(parent, data[i3]); } } - for (; i2 < groupLength; ++i2) { - if (node = group[i2]) { - exit[i2] = node; + for (; i3 < groupLength; ++i3) { + if (node = group[i3]) { + exit[i3] = node; } } } function bindKey(parent, group, enter, update, exit, data, key) { - var i2, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; - for (i2 = 0; i2 < groupLength; ++i2) { - if (node = group[i2]) { - keyValues[i2] = keyValue = key.call(node, node.__data__, i2, group) + ""; + var i3, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; + for (i3 = 0; i3 < groupLength; ++i3) { + if (node = group[i3]) { + keyValues[i3] = keyValue = key.call(node, node.__data__, i3, group) + ""; if (nodeByKeyValue.has(keyValue)) { - exit[i2] = node; + exit[i3] = node; } else { nodeByKeyValue.set(keyValue, node); } } } - for (i2 = 0; i2 < dataLength; ++i2) { - keyValue = key.call(parent, data[i2], i2, data) + ""; + for (i3 = 0; i3 < dataLength; ++i3) { + keyValue = key.call(parent, data[i3], i3, data) + ""; if (node = nodeByKeyValue.get(keyValue)) { - update[i2] = node; - node.__data__ = data[i2]; + update[i3] = node; + node.__data__ = data[i3]; nodeByKeyValue.delete(keyValue); } else { - enter[i2] = new EnterNode(parent, data[i2]); + enter[i3] = new EnterNode(parent, data[i3]); } } - for (i2 = 0; i2 < groupLength; ++i2) { - if ((node = group[i2]) && nodeByKeyValue.get(keyValues[i2]) === node) { - exit[i2] = node; + for (i3 = 0; i3 < groupLength; ++i3) { + if ((node = group[i3]) && nodeByKeyValue.get(keyValues[i3]) === node) { + exit[i3] = node; } } } @@ -19222,8 +19636,8 @@ var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; if (typeof value !== "function") value = constant_default(value); - for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j2 = 0; j2 < m; ++j2) { - var parent = parents[j2], group = groups[j2], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j2, parents)), dataLength = data.length, enterGroup = enter[j2] = new Array(dataLength), updateGroup = update[j2] = new Array(dataLength), exitGroup = exit[j2] = new Array(groupLength); + for (var m2 = groups.length, update = new Array(m2), enter = new Array(m2), exit = new Array(m2), j3 = 0; j3 < m2; ++j3) { + var parent = parents[j3], group = groups[j3], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j3, parents)), dataLength = data.length, enterGroup = enter[j3] = new Array(dataLength), updateGroup = update[j3] = new Array(dataLength), exitGroup = exit[j3] = new Array(groupLength); bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { if (previous = enterGroup[i0]) { @@ -19274,24 +19688,24 @@ // node_modules/d3-selection/src/selection/merge.js function merge_default(context) { var selection2 = context.selection ? context.selection() : context; - for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) { - for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) { - if (node = group0[i2] || group1[i2]) { - merge3[i2] = node; + for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j3 = 0; j3 < m2; ++j3) { + for (var group0 = groups0[j3], group1 = groups1[j3], n3 = group0.length, merge2 = merges[j3] = new Array(n3), node, i3 = 0; i3 < n3; ++i3) { + if (node = group0[i3] || group1[i3]) { + merge2[i3] = node; } } } - for (; j2 < m0; ++j2) { - merges[j2] = groups0[j2]; + for (; j3 < m0; ++j3) { + merges[j3] = groups0[j3]; } return new Selection(merges, this._parents); } // node_modules/d3-selection/src/selection/order.js function order_default() { - for (var groups = this._groups, j2 = -1, m = groups.length; ++j2 < m; ) { - for (var group = groups[j2], i2 = group.length - 1, next = group[i2], node; --i2 >= 0; ) { - if (node = group[i2]) { + for (var groups = this._groups, j3 = -1, m2 = groups.length; ++j3 < m2; ) { + for (var group = groups[j3], i3 = group.length - 1, next = group[i3], node; --i3 >= 0; ) { + if (node = group[i3]) { if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); next = node; @@ -19305,21 +19719,21 @@ function sort_default(compare) { if (!compare) compare = ascending2; - function compareNode(a, b) { - return a && b ? compare(a.__data__, b.__data__) : !a - !b; + function compareNode(a2, b2) { + return a2 && b2 ? compare(a2.__data__, b2.__data__) : !a2 - !b2; } - for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, sortgroup = sortgroups[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) { - if (node = group[i2]) { - sortgroup[i2] = node; + for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, sortgroup = sortgroups[j3] = new Array(n3), node, i3 = 0; i3 < n3; ++i3) { + if (node = group[i3]) { + sortgroup[i3] = node; } } sortgroup.sort(compareNode); } return new Selection(sortgroups, this._parents).order(); } - function ascending2(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + function ascending2(a2, b2) { + return a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN; } // node_modules/d3-selection/src/selection/call.js @@ -19337,9 +19751,9 @@ // node_modules/d3-selection/src/selection/node.js function node_default() { - for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) { - for (var group = groups[j2], i2 = 0, n2 = group.length; i2 < n2; ++i2) { - var node = group[i2]; + for (var groups = this._groups, j3 = 0, m2 = groups.length; j3 < m2; ++j3) { + for (var group = groups[j3], i3 = 0, n3 = group.length; i3 < n3; ++i3) { + var node = group[i3]; if (node) return node; } @@ -19362,10 +19776,10 @@ // node_modules/d3-selection/src/selection/each.js function each_default(callback) { - for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) { - for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) { - if (node = group[i2]) - callback.call(node, node.__data__, i2, group); + for (var groups = this._groups, j3 = 0, m2 = groups.length; j3 < m2; ++j3) { + for (var group = groups[j3], i3 = 0, n3 = group.length, node; i3 < n3; ++i3) { + if (node = group[i3]) + callback.call(node, node.__data__, i3, group); } } return this; @@ -19394,20 +19808,20 @@ } function attrFunction(name, value) { return function() { - var v = value.apply(this, arguments); - if (v == null) + var v2 = value.apply(this, arguments); + if (v2 == null) this.removeAttribute(name); else - this.setAttribute(name, v); + this.setAttribute(name, v2); }; } function attrFunctionNS(fullname, value) { return function() { - var v = value.apply(this, arguments); - if (v == null) + var v2 = value.apply(this, arguments); + if (v2 == null) this.removeAttributeNS(fullname.space, fullname.local); else - this.setAttributeNS(fullname.space, fullname.local, v); + this.setAttributeNS(fullname.space, fullname.local, v2); }; } function attr_default(name, value) { @@ -19437,11 +19851,11 @@ } function styleFunction(name, value, priority) { return function() { - var v = value.apply(this, arguments); - if (v == null) + var v2 = value.apply(this, arguments); + if (v2 == null) this.style.removeProperty(name); else - this.style.setProperty(name, v, priority); + this.style.setProperty(name, v2, priority); }; } function style_default(name, value, priority) { @@ -19464,11 +19878,11 @@ } function propertyFunction(name, value) { return function() { - var v = value.apply(this, arguments); - if (v == null) + var v2 = value.apply(this, arguments); + if (v2 == null) delete this[name]; else - this[name] = v; + this[name] = v2; }; } function property_default(name, value) { @@ -19488,16 +19902,16 @@ } ClassList.prototype = { add: function(name) { - var i2 = this._names.indexOf(name); - if (i2 < 0) { + var i3 = this._names.indexOf(name); + if (i3 < 0) { this._names.push(name); this._node.setAttribute("class", this._names.join(" ")); } }, remove: function(name) { - var i2 = this._names.indexOf(name); - if (i2 >= 0) { - this._names.splice(i2, 1); + var i3 = this._names.indexOf(name); + if (i3 >= 0) { + this._names.splice(i3, 1); this._node.setAttribute("class", this._names.join(" ")); } }, @@ -19506,14 +19920,14 @@ } }; function classedAdd(node, names) { - var list = classList(node), i2 = -1, n2 = names.length; - while (++i2 < n2) - list.add(names[i2]); + var list = classList(node), i3 = -1, n3 = names.length; + while (++i3 < n3) + list.add(names[i3]); } function classedRemove(node, names) { - var list = classList(node), i2 = -1, n2 = names.length; - while (++i2 < n2) - list.remove(names[i2]); + var list = classList(node), i3 = -1, n3 = names.length; + while (++i3 < n3) + list.remove(names[i3]); } function classedTrue(names) { return function() { @@ -19533,9 +19947,9 @@ function classed_default(name, value) { var names = classArray(name + ""); if (arguments.length < 2) { - var list = classList(this.node()), i2 = -1, n2 = names.length; - while (++i2 < n2) - if (!list.contains(names[i2])) + var list = classList(this.node()), i3 = -1, n3 = names.length; + while (++i3 < n3) + if (!list.contains(names[i3])) return false; return true; } @@ -19553,8 +19967,8 @@ } function textFunction(value) { return function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; + var v2 = value.apply(this, arguments); + this.textContent = v2 == null ? "" : v2; }; } function text_default(value) { @@ -19572,8 +19986,8 @@ } function htmlFunction(value) { return function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; + var v2 = value.apply(this, arguments); + this.innerHTML = v2 == null ? "" : v2; }; } function html_default(value) { @@ -19652,11 +20066,11 @@ }; } function parseTypenames2(typenames) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i2 = t.indexOf("."); - if (i2 >= 0) - name = t.slice(i2 + 1), t = t.slice(0, i2); - return { type: t, name }; + return typenames.trim().split(/^|\s+/).map(function(t2) { + var name = "", i3 = t2.indexOf("."); + if (i3 >= 0) + name = t2.slice(i3 + 1), t2 = t2.slice(0, i3); + return { type: t2, name }; }); } function onRemove(typename) { @@ -19664,92 +20078,92 @@ var on = this.__on; if (!on) return; - for (var j2 = 0, i2 = -1, m = on.length, o; j2 < m; ++j2) { - if (o = on[j2], (!typename.type || o.type === typename.type) && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.options); + for (var j3 = 0, i3 = -1, m2 = on.length, o2; j3 < m2; ++j3) { + if (o2 = on[j3], (!typename.type || o2.type === typename.type) && o2.name === typename.name) { + this.removeEventListener(o2.type, o2.listener, o2.options); } else { - on[++i2] = o; + on[++i3] = o2; } } - if (++i2) - on.length = i2; + if (++i3) + on.length = i3; else delete this.__on; }; } function onAdd(typename, value, options2) { return function() { - var on = this.__on, o, listener = contextListener(value); + var on = this.__on, o2, listener = contextListener(value); if (on) - for (var j2 = 0, m = on.length; j2 < m; ++j2) { - if ((o = on[j2]).type === typename.type && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.options); - this.addEventListener(o.type, o.listener = listener, o.options = options2); - o.value = value; + for (var j3 = 0, m2 = on.length; j3 < m2; ++j3) { + if ((o2 = on[j3]).type === typename.type && o2.name === typename.name) { + this.removeEventListener(o2.type, o2.listener, o2.options); + this.addEventListener(o2.type, o2.listener = listener, o2.options = options2); + o2.value = value; return; } } this.addEventListener(typename.type, listener, options2); - o = { type: typename.type, name: typename.name, value, listener, options: options2 }; + o2 = { type: typename.type, name: typename.name, value, listener, options: options2 }; if (!on) - this.__on = [o]; + this.__on = [o2]; else - on.push(o); + on.push(o2); }; } function on_default(typename, value, options2) { - var typenames = parseTypenames2(typename + ""), i2, n2 = typenames.length, t; + var typenames = parseTypenames2(typename + ""), i3, n3 = typenames.length, t2; if (arguments.length < 2) { var on = this.node().__on; if (on) - for (var j2 = 0, m = on.length, o; j2 < m; ++j2) { - for (i2 = 0, o = on[j2]; i2 < n2; ++i2) { - if ((t = typenames[i2]).type === o.type && t.name === o.name) { - return o.value; + for (var j3 = 0, m2 = on.length, o2; j3 < m2; ++j3) { + for (i3 = 0, o2 = on[j3]; i3 < n3; ++i3) { + if ((t2 = typenames[i3]).type === o2.type && t2.name === o2.name) { + return o2.value; } } } return; } on = value ? onAdd : onRemove; - for (i2 = 0; i2 < n2; ++i2) - this.each(on(typenames[i2], value, options2)); + for (i3 = 0; i3 < n3; ++i3) + this.each(on(typenames[i3], value, options2)); return this; } // node_modules/d3-selection/src/selection/dispatch.js - function dispatchEvent(node, type3, params) { + function dispatchEvent(node, type2, params) { var window2 = window_default(node), event = window2.CustomEvent; if (typeof event === "function") { - event = new event(type3, params); + event = new event(type2, params); } else { event = window2.document.createEvent("Event"); if (params) - event.initEvent(type3, params.bubbles, params.cancelable), event.detail = params.detail; + event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail; else - event.initEvent(type3, false, false); + event.initEvent(type2, false, false); } node.dispatchEvent(event); } - function dispatchConstant(type3, params) { + function dispatchConstant(type2, params) { return function() { - return dispatchEvent(this, type3, params); + return dispatchEvent(this, type2, params); }; } - function dispatchFunction(type3, params) { + function dispatchFunction(type2, params) { return function() { - return dispatchEvent(this, type3, params.apply(this, arguments)); + return dispatchEvent(this, type2, params.apply(this, arguments)); }; } - function dispatch_default2(type3, params) { - return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type3, params)); + function dispatch_default2(type2, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params)); } // node_modules/d3-selection/src/selection/iterator.js function* iterator_default() { - for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) { - for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) { - if (node = group[i2]) + for (var groups = this._groups, j3 = 0, m2 = groups.length; j3 < m2; ++j3) { + for (var group = groups[j3], i3 = 0, n3 = group.length, node; i3 < n3; ++i3) { + if (node = group[i3]) yield node; } } @@ -19828,10 +20242,10 @@ if (node) { var svg2 = node.ownerSVGElement || node; if (svg2.createSVGPoint) { - var point = svg2.createSVGPoint(); - point.x = event.clientX, point.y = event.clientY; - point = point.matrixTransform(node.getScreenCTM().inverse()); - return [point.x, point.y]; + var point2 = svg2.createSVGPoint(); + point2.x = event.clientX, point2.y = event.clientY; + point2 = point2.matrixTransform(node.getScreenCTM().inverse()); + return [point2.x, point2.y]; } if (node.getBoundingClientRect) { var rect = node.getBoundingClientRect(); @@ -19884,33 +20298,33 @@ } // node_modules/d3-drag/src/constant.js - var constant_default2 = (x) => () => x; + var constant_default2 = (x2) => () => x2; // node_modules/d3-drag/src/event.js - function DragEvent(type3, { + function DragEvent(type2, { sourceEvent, subject, target, identifier, active, - x, - y, + x: x2, + y: y2, dx, dy, - dispatch: dispatch10 + dispatch: dispatch14 }) { Object.defineProperties(this, { - type: { value: type3, enumerable: true, configurable: true }, + type: { value: type2, enumerable: true, configurable: true }, sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, subject: { value: subject, enumerable: true, configurable: true }, target: { value: target, enumerable: true, configurable: true }, identifier: { value: identifier, enumerable: true, configurable: true }, active: { value: active, enumerable: true, configurable: true }, - x: { value: x, enumerable: true, configurable: true }, - y: { value: y, enumerable: true, configurable: true }, + x: { value: x2, enumerable: true, configurable: true }, + y: { value: y2, enumerable: true, configurable: true }, dx: { value: dx, enumerable: true, configurable: true }, dy: { value: dy, enumerable: true, configurable: true }, - _: { value: dispatch10 } + _: { value: dispatch14 } }); } DragEvent.prototype.on = function() { @@ -19925,8 +20339,8 @@ function defaultContainer() { return this.parentNode; } - function defaultSubject(event, d) { - return d == null ? { x: event.x, y: event.y } : d; + function defaultSubject(event, d2) { + return d2 == null ? { x: event.x, y: event.y } : d2; } function defaultTouchable() { return navigator.maxTouchPoints || "ontouchstart" in this; @@ -19936,10 +20350,10 @@ function drag(selection2) { selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } - function mousedowned(event, d) { - if (touchending || !filter2.call(this, event, d)) + function mousedowned(event, d2) { + if (touchending || !filter2.call(this, event, d2)) return; - var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + var gesture = beforestart(this, container.call(this, event, d2), event, d2, "mouse"); if (!gesture) return; select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture); @@ -19964,105 +20378,105 @@ noevent_default(event); gestures.mouse("end", event); } - function touchstarted(event, d) { - if (!filter2.call(this, event, d)) + function touchstarted(event, d2) { + if (!filter2.call(this, event, d2)) return; - var touches = event.changedTouches, c = container.call(this, event, d), n2 = touches.length, i2, gesture; - for (i2 = 0; i2 < n2; ++i2) { - if (gesture = beforestart(this, c, event, d, touches[i2].identifier, touches[i2])) { + var touches = event.changedTouches, c2 = container.call(this, event, d2), n3 = touches.length, i3, gesture; + for (i3 = 0; i3 < n3; ++i3) { + if (gesture = beforestart(this, c2, event, d2, touches[i3].identifier, touches[i3])) { nopropagation(event); - gesture("start", event, touches[i2]); + gesture("start", event, touches[i3]); } } } function touchmoved(event) { - var touches = event.changedTouches, n2 = touches.length, i2, gesture; - for (i2 = 0; i2 < n2; ++i2) { - if (gesture = gestures[touches[i2].identifier]) { + var touches = event.changedTouches, n3 = touches.length, i3, gesture; + for (i3 = 0; i3 < n3; ++i3) { + if (gesture = gestures[touches[i3].identifier]) { noevent_default(event); - gesture("drag", event, touches[i2]); + gesture("drag", event, touches[i3]); } } } function touchended(event) { - var touches = event.changedTouches, n2 = touches.length, i2, gesture; + var touches = event.changedTouches, n3 = touches.length, i3, gesture; if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, 500); - for (i2 = 0; i2 < n2; ++i2) { - if (gesture = gestures[touches[i2].identifier]) { + for (i3 = 0; i3 < n3; ++i3) { + if (gesture = gestures[touches[i3].identifier]) { nopropagation(event); - gesture("end", event, touches[i2]); + gesture("end", event, touches[i3]); } } } - function beforestart(that, container2, event, d, identifier, touch) { - var dispatch10 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; - if ((s = subject.call(that, new DragEvent("beforestart", { + function beforestart(that, container2, event, d2, identifier, touch) { + var dispatch14 = listeners.copy(), p2 = pointer_default(touch || event, container2), dx, dy, s2; + if ((s2 = subject.call(that, new DragEvent("beforestart", { sourceEvent: event, target: drag, identifier, active, - x: p[0], - y: p[1], + x: p2[0], + y: p2[1], dx: 0, dy: 0, - dispatch: dispatch10 - }), d)) == null) + dispatch: dispatch14 + }), d2)) == null) return; - dx = s.x - p[0] || 0; - dy = s.y - p[1] || 0; - return function gesture(type3, event2, touch2) { - var p02 = p, n2; - switch (type3) { + dx = s2.x - p2[0] || 0; + dy = s2.y - p2[1] || 0; + return function gesture(type2, event2, touch2) { + var p02 = p2, n3; + switch (type2) { case "start": - gestures[identifier] = gesture, n2 = active++; + gestures[identifier] = gesture, n3 = active++; break; case "end": delete gestures[identifier], --active; case "drag": - p = pointer_default(touch2 || event2, container2), n2 = active; + p2 = pointer_default(touch2 || event2, container2), n3 = active; break; } - dispatch10.call( - type3, + dispatch14.call( + type2, that, - new DragEvent(type3, { + new DragEvent(type2, { sourceEvent: event2, - subject: s, + subject: s2, target: drag, identifier, - active: n2, - x: p[0] + dx, - y: p[1] + dy, - dx: p[0] - p02[0], - dy: p[1] - p02[1], - dispatch: dispatch10 + active: n3, + x: p2[0] + dx, + y: p2[1] + dy, + dx: p2[0] - p02[0], + dy: p2[1] - p02[1], + dispatch: dispatch14 }), - d + d2 ); }; } - drag.filter = function(_) { - return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2; + drag.filter = function(_2) { + return arguments.length ? (filter2 = typeof _2 === "function" ? _2 : constant_default2(!!_2), drag) : filter2; }; - drag.container = function(_) { - return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container; + drag.container = function(_2) { + return arguments.length ? (container = typeof _2 === "function" ? _2 : constant_default2(_2), drag) : container; }; - drag.subject = function(_) { - return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject; + drag.subject = function(_2) { + return arguments.length ? (subject = typeof _2 === "function" ? _2 : constant_default2(_2), drag) : subject; }; - drag.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable; + drag.touchable = function(_2) { + return arguments.length ? (touchable = typeof _2 === "function" ? _2 : constant_default2(!!_2), drag) : touchable; }; drag.on = function() { var value = listeners.on.apply(listeners, arguments); return value === listeners ? drag : value; }; - drag.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + drag.clickDistance = function(_2) { + return arguments.length ? (clickDistance2 = (_2 = +_2) * _2, drag) : Math.sqrt(clickDistance2); }; return drag; } @@ -20252,6 +20666,7 @@ return this.rgb().displayable(); }, hex: color_formatHex, + // Deprecated! Use color.formatHex. formatHex: color_formatHex, formatHex8: color_formatHex8, formatHsl: color_formatHsl, @@ -20271,43 +20686,43 @@ return this.rgb().formatRgb(); } function color(format2) { - var m, l; + var m2, l2; format2 = (format2 + "").trim().toLowerCase(); - return (m = reHex.exec(format2)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format2)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format2)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format2)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format2)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; + return (m2 = reHex.exec(format2)) ? (l2 = m2[1].length, m2 = parseInt(m2[1], 16), l2 === 6 ? rgbn(m2) : l2 === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l2 === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l2 === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; } - function rgbn(n2) { - return new Rgb(n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255, 1); + function rgbn(n3) { + return new Rgb(n3 >> 16 & 255, n3 >> 8 & 255, n3 & 255, 1); } - function rgba(r, g, b, a) { - if (a <= 0) - r = g = b = NaN; - return new Rgb(r, g, b, a); + function rgba(r2, g3, b2, a2) { + if (a2 <= 0) + r2 = g3 = b2 = NaN; + return new Rgb(r2, g3, b2, a2); } - function rgbConvert(o) { - if (!(o instanceof Color)) - o = color(o); - if (!o) + function rgbConvert(o2) { + if (!(o2 instanceof Color)) + o2 = color(o2); + if (!o2) return new Rgb(); - o = o.rgb(); - return new Rgb(o.r, o.g, o.b, o.opacity); + o2 = o2.rgb(); + return new Rgb(o2.r, o2.g, o2.b, o2.opacity); } - function rgb(r, g, b, opacity) { - return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + function rgb(r2, g3, b2, opacity) { + return arguments.length === 1 ? rgbConvert(r2) : new Rgb(r2, g3, b2, opacity == null ? 1 : opacity); } - function Rgb(r, g, b, opacity) { - this.r = +r; - this.g = +g; - this.b = +b; + function Rgb(r2, g3, b2, opacity) { + this.r = +r2; + this.g = +g3; + this.b = +b2; this.opacity = +opacity; } define_default(Rgb, rgb, extend(Color, { - brighter(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + brighter(k2) { + k2 = k2 == null ? brighter : Math.pow(brighter, k2); + return new Rgb(this.r * k2, this.g * k2, this.b * k2, this.opacity); }, - darker(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + darker(k2) { + k2 = k2 == null ? darker : Math.pow(darker, k2); + return new Rgb(this.r * k2, this.g * k2, this.b * k2, this.opacity); }, rgb() { return this; @@ -20319,6 +20734,7 @@ return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); }, hex: rgb_formatHex, + // Deprecated! Use color.formatHex. formatHex: rgb_formatHex, formatHex8: rgb_formatHex8, formatRgb: rgb_formatRgb, @@ -20331,8 +20747,8 @@ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; } function rgb_formatRgb() { - const a = clampa(this.opacity); - return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`; + const a2 = clampa(this.opacity); + return `${a2 === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? ")" : `, ${a2})`}`; } function clampa(opacity) { return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); @@ -20344,64 +20760,64 @@ value = clampi(value); return (value < 16 ? "0" : "") + value.toString(16); } - function hsla(h, s, l, a) { - if (a <= 0) - h = s = l = NaN; - else if (l <= 0 || l >= 1) - h = s = NaN; - else if (s <= 0) - h = NaN; - return new Hsl(h, s, l, a); - } - function hslConvert(o) { - if (o instanceof Hsl) - return new Hsl(o.h, o.s, o.l, o.opacity); - if (!(o instanceof Color)) - o = color(o); - if (!o) + function hsla(h2, s2, l2, a2) { + if (a2 <= 0) + h2 = s2 = l2 = NaN; + else if (l2 <= 0 || l2 >= 1) + h2 = s2 = NaN; + else if (s2 <= 0) + h2 = NaN; + return new Hsl(h2, s2, l2, a2); + } + function hslConvert(o2) { + if (o2 instanceof Hsl) + return new Hsl(o2.h, o2.s, o2.l, o2.opacity); + if (!(o2 instanceof Color)) + o2 = color(o2); + if (!o2) return new Hsl(); - if (o instanceof Hsl) - return o; - o = o.rgb(); - var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max3 = Math.max(r, g, b), h = NaN, s = max3 - min3, l = (max3 + min3) / 2; - if (s) { - if (r === max3) - h = (g - b) / s + (g < b) * 6; - else if (g === max3) - h = (b - r) / s + 2; + if (o2 instanceof Hsl) + return o2; + o2 = o2.rgb(); + var r2 = o2.r / 255, g3 = o2.g / 255, b2 = o2.b / 255, min3 = Math.min(r2, g3, b2), max3 = Math.max(r2, g3, b2), h2 = NaN, s2 = max3 - min3, l2 = (max3 + min3) / 2; + if (s2) { + if (r2 === max3) + h2 = (g3 - b2) / s2 + (g3 < b2) * 6; + else if (g3 === max3) + h2 = (b2 - r2) / s2 + 2; else - h = (r - g) / s + 4; - s /= l < 0.5 ? max3 + min3 : 2 - max3 - min3; - h *= 60; + h2 = (r2 - g3) / s2 + 4; + s2 /= l2 < 0.5 ? max3 + min3 : 2 - max3 - min3; + h2 *= 60; } else { - s = l > 0 && l < 1 ? 0 : h; + s2 = l2 > 0 && l2 < 1 ? 0 : h2; } - return new Hsl(h, s, l, o.opacity); + return new Hsl(h2, s2, l2, o2.opacity); } - function hsl(h, s, l, opacity) { - return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + function hsl(h2, s2, l2, opacity) { + return arguments.length === 1 ? hslConvert(h2) : new Hsl(h2, s2, l2, opacity == null ? 1 : opacity); } - function Hsl(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; + function Hsl(h2, s2, l2, opacity) { + this.h = +h2; + this.s = +s2; + this.l = +l2; this.opacity = +opacity; } define_default(Hsl, hsl, extend(Color, { - brighter(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); + brighter(k2) { + k2 = k2 == null ? brighter : Math.pow(brighter, k2); + return new Hsl(this.h, this.s, this.l * k2, this.opacity); }, - darker(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); + darker(k2) { + k2 = k2 == null ? darker : Math.pow(darker, k2); + return new Hsl(this.h, this.s, this.l * k2, this.opacity); }, rgb() { - var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; + var h2 = this.h % 360 + (this.h < 0) * 360, s2 = isNaN(h2) || isNaN(this.s) ? 0 : this.s, l2 = this.l, m2 = l2 + (l2 < 0.5 ? l2 : 1 - l2) * s2, m1 = 2 * l2 - m2; return new Rgb( - hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), - hsl2rgb(h, m1, m2), - hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + hsl2rgb(h2 >= 240 ? h2 - 240 : h2 + 120, m1, m2), + hsl2rgb(h2, m1, m2), + hsl2rgb(h2 < 120 ? h2 + 240 : h2 - 120, m1, m2), this.opacity ); }, @@ -20412,8 +20828,8 @@ return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); }, formatHsl() { - const a = clampa(this.opacity); - return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; + const a2 = clampa(this.opacity); + return `${a2 === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? ")" : `, ${a2})`}`; } })); function clamph(value) { @@ -20423,8 +20839,8 @@ function clampt(value) { return Math.max(0, Math.min(1, value || 0)); } - function hsl2rgb(h, m1, m2) { - return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; + function hsl2rgb(h2, m1, m2) { + return (h2 < 60 ? m1 + (m2 - m1) * h2 / 60 : h2 < 180 ? m2 : h2 < 240 ? m1 + (m2 - m1) * (240 - h2) / 60 : m1) * 255; } // node_modules/d3-interpolate/src/basis.js @@ -20433,56 +20849,56 @@ return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; } function basis_default(values) { - var n2 = values.length - 1; - return function(t) { - var i2 = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n2 - 1) : Math.floor(t * n2), v1 = values[i2], v2 = values[i2 + 1], v0 = i2 > 0 ? values[i2 - 1] : 2 * v1 - v2, v3 = i2 < n2 - 1 ? values[i2 + 2] : 2 * v2 - v1; - return basis((t - i2 / n2) * n2, v0, v1, v2, v3); + var n3 = values.length - 1; + return function(t2) { + var i3 = t2 <= 0 ? t2 = 0 : t2 >= 1 ? (t2 = 1, n3 - 1) : Math.floor(t2 * n3), v1 = values[i3], v2 = values[i3 + 1], v0 = i3 > 0 ? values[i3 - 1] : 2 * v1 - v2, v3 = i3 < n3 - 1 ? values[i3 + 2] : 2 * v2 - v1; + return basis((t2 - i3 / n3) * n3, v0, v1, v2, v3); }; } // node_modules/d3-interpolate/src/basisClosed.js function basisClosed_default(values) { - var n2 = values.length; - return function(t) { - var i2 = Math.floor(((t %= 1) < 0 ? ++t : t) * n2), v0 = values[(i2 + n2 - 1) % n2], v1 = values[i2 % n2], v2 = values[(i2 + 1) % n2], v3 = values[(i2 + 2) % n2]; - return basis((t - i2 / n2) * n2, v0, v1, v2, v3); + var n3 = values.length; + return function(t2) { + var i3 = Math.floor(((t2 %= 1) < 0 ? ++t2 : t2) * n3), v0 = values[(i3 + n3 - 1) % n3], v1 = values[i3 % n3], v2 = values[(i3 + 1) % n3], v3 = values[(i3 + 2) % n3]; + return basis((t2 - i3 / n3) * n3, v0, v1, v2, v3); }; } // node_modules/d3-interpolate/src/constant.js - var constant_default3 = (x) => () => x; + var constant_default3 = (x2) => () => x2; // node_modules/d3-interpolate/src/color.js - function linear(a, d) { - return function(t) { - return a + t * d; + function linear(a2, d2) { + return function(t2) { + return a2 + t2 * d2; }; } - function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); + function exponential(a2, b2, y2) { + return a2 = Math.pow(a2, y2), b2 = Math.pow(b2, y2) - a2, y2 = 1 / y2, function(t2) { + return Math.pow(a2 + t2 * b2, y2); }; } - function gamma(y) { - return (y = +y) === 1 ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : constant_default3(isNaN(a) ? b : a); + function gamma(y2) { + return (y2 = +y2) === 1 ? nogamma : function(a2, b2) { + return b2 - a2 ? exponential(a2, b2, y2) : constant_default3(isNaN(a2) ? b2 : a2); }; } - function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : constant_default3(isNaN(a) ? b : a); + function nogamma(a2, b2) { + var d2 = b2 - a2; + return d2 ? linear(a2, d2) : constant_default3(isNaN(a2) ? b2 : a2); } // node_modules/d3-interpolate/src/rgb.js - var rgb_default = function rgbGamma(y) { - var color2 = gamma(y); + var rgb_default = function rgbGamma(y2) { + var color2 = gamma(y2); function rgb2(start2, end) { - var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); - return function(t) { - start2.r = r(t); - start2.g = g(t); - start2.b = b(t); - start2.opacity = opacity(t); + var r2 = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g3 = color2(start2.g, end.g), b2 = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); + return function(t2) { + start2.r = r2(t2); + start2.g = g3(t2); + start2.b = b2(t2); + start2.opacity = opacity(t2); return start2 + ""; }; } @@ -20491,21 +20907,21 @@ }(1); function rgbSpline(spline) { return function(colors) { - var n2 = colors.length, r = new Array(n2), g = new Array(n2), b = new Array(n2), i2, color2; - for (i2 = 0; i2 < n2; ++i2) { - color2 = rgb(colors[i2]); - r[i2] = color2.r || 0; - g[i2] = color2.g || 0; - b[i2] = color2.b || 0; - } - r = spline(r); - g = spline(g); - b = spline(b); + var n3 = colors.length, r2 = new Array(n3), g3 = new Array(n3), b2 = new Array(n3), i3, color2; + for (i3 = 0; i3 < n3; ++i3) { + color2 = rgb(colors[i3]); + r2[i3] = color2.r || 0; + g3[i3] = color2.g || 0; + b2[i3] = color2.b || 0; + } + r2 = spline(r2); + g3 = spline(g3); + b2 = spline(b2); color2.opacity = 1; - return function(t) { - color2.r = r(t); - color2.g = g(t); - color2.b = b(t); + return function(t2) { + color2.r = r2(t2); + color2.g = g3(t2); + color2.b = b2(t2); return color2 + ""; }; }; @@ -20514,129 +20930,129 @@ var rgbBasisClosed = rgbSpline(basisClosed_default); // node_modules/d3-interpolate/src/numberArray.js - function numberArray_default(a, b) { - if (!b) - b = []; - var n2 = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i2; - return function(t) { - for (i2 = 0; i2 < n2; ++i2) - c[i2] = a[i2] * (1 - t) + b[i2] * t; - return c; + function numberArray_default(a2, b2) { + if (!b2) + b2 = []; + var n3 = a2 ? Math.min(b2.length, a2.length) : 0, c2 = b2.slice(), i3; + return function(t2) { + for (i3 = 0; i3 < n3; ++i3) + c2[i3] = a2[i3] * (1 - t2) + b2[i3] * t2; + return c2; }; } - function isNumberArray(x) { - return ArrayBuffer.isView(x) && !(x instanceof DataView); + function isNumberArray(x2) { + return ArrayBuffer.isView(x2) && !(x2 instanceof DataView); } // node_modules/d3-interpolate/src/array.js - function genericArray(a, b) { - var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i2; - for (i2 = 0; i2 < na; ++i2) - x[i2] = value_default(a[i2], b[i2]); - for (; i2 < nb; ++i2) - c[i2] = b[i2]; - return function(t) { - for (i2 = 0; i2 < na; ++i2) - c[i2] = x[i2](t); - return c; + function genericArray(a2, b2) { + var nb = b2 ? b2.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x2 = new Array(na), c2 = new Array(nb), i3; + for (i3 = 0; i3 < na; ++i3) + x2[i3] = value_default(a2[i3], b2[i3]); + for (; i3 < nb; ++i3) + c2[i3] = b2[i3]; + return function(t2) { + for (i3 = 0; i3 < na; ++i3) + c2[i3] = x2[i3](t2); + return c2; }; } // node_modules/d3-interpolate/src/date.js - function date_default(a, b) { - var d = new Date(); - return a = +a, b = +b, function(t) { - return d.setTime(a * (1 - t) + b * t), d; + function date_default(a2, b2) { + var d2 = /* @__PURE__ */ new Date(); + return a2 = +a2, b2 = +b2, function(t2) { + return d2.setTime(a2 * (1 - t2) + b2 * t2), d2; }; } // node_modules/d3-interpolate/src/number.js - function number_default(a, b) { - return a = +a, b = +b, function(t) { - return a * (1 - t) + b * t; + function number_default(a2, b2) { + return a2 = +a2, b2 = +b2, function(t2) { + return a2 * (1 - t2) + b2 * t2; }; } // node_modules/d3-interpolate/src/object.js - function object_default(a, b) { - var i2 = {}, c = {}, k; - if (a === null || typeof a !== "object") - a = {}; - if (b === null || typeof b !== "object") - b = {}; - for (k in b) { - if (k in a) { - i2[k] = value_default(a[k], b[k]); + function object_default(a2, b2) { + var i3 = {}, c2 = {}, k2; + if (a2 === null || typeof a2 !== "object") + a2 = {}; + if (b2 === null || typeof b2 !== "object") + b2 = {}; + for (k2 in b2) { + if (k2 in a2) { + i3[k2] = value_default(a2[k2], b2[k2]); } else { - c[k] = b[k]; + c2[k2] = b2[k2]; } } - return function(t) { - for (k in i2) - c[k] = i2[k](t); - return c; + return function(t2) { + for (k2 in i3) + c2[k2] = i3[k2](t2); + return c2; }; } // node_modules/d3-interpolate/src/string.js var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; var reB = new RegExp(reA.source, "g"); - function zero2(b) { + function zero2(b2) { return function() { - return b; + return b2; }; } - function one(b) { - return function(t) { - return b(t) + ""; + function one(b2) { + return function(t2) { + return b2(t2) + ""; }; } - function string_default(a, b) { - var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i2 = -1, s = [], q = []; - a = a + "", b = b + ""; - while ((am = reA.exec(a)) && (bm = reB.exec(b))) { + function string_default(a2, b2) { + var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i3 = -1, s2 = [], q2 = []; + a2 = a2 + "", b2 = b2 + ""; + while ((am = reA.exec(a2)) && (bm = reB.exec(b2))) { if ((bs = bm.index) > bi) { - bs = b.slice(bi, bs); - if (s[i2]) - s[i2] += bs; + bs = b2.slice(bi, bs); + if (s2[i3]) + s2[i3] += bs; else - s[++i2] = bs; + s2[++i3] = bs; } if ((am = am[0]) === (bm = bm[0])) { - if (s[i2]) - s[i2] += bm; + if (s2[i3]) + s2[i3] += bm; else - s[++i2] = bm; + s2[++i3] = bm; } else { - s[++i2] = null; - q.push({ i: i2, x: number_default(am, bm) }); + s2[++i3] = null; + q2.push({ i: i3, x: number_default(am, bm) }); } bi = reB.lastIndex; } - if (bi < b.length) { - bs = b.slice(bi); - if (s[i2]) - s[i2] += bs; + if (bi < b2.length) { + bs = b2.slice(bi); + if (s2[i3]) + s2[i3] += bs; else - s[++i2] = bs; + s2[++i3] = bs; } - return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) { - for (var i3 = 0, o; i3 < b; ++i3) - s[(o = q[i3]).i] = o.x(t); - return s.join(""); + return s2.length < 2 ? q2[0] ? one(q2[0].x) : zero2(b2) : (b2 = q2.length, function(t2) { + for (var i4 = 0, o2; i4 < b2; ++i4) + s2[(o2 = q2[i4]).i] = o2.x(t2); + return s2.join(""); }); } // node_modules/d3-interpolate/src/value.js - function value_default(a, b) { - var t = typeof b, c; - return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b); + function value_default(a2, b2) { + var t2 = typeof b2, c2; + return b2 == null || t2 === "boolean" ? constant_default3(b2) : (t2 === "number" ? number_default : t2 === "string" ? (c2 = color(b2)) ? (b2 = c2, rgb_default) : string_default : b2 instanceof color ? rgb_default : b2 instanceof Date ? date_default : isNumberArray(b2) ? numberArray_default : Array.isArray(b2) ? genericArray : typeof b2.valueOf !== "function" && typeof b2.toString !== "function" || isNaN(b2) ? object_default : number_default)(a2, b2); } // node_modules/d3-interpolate/src/round.js - function round_default(a, b) { - return a = +a, b = +b, function(t) { - return Math.round(a * (1 - t) + b * t); + function round_default(a2, b2) { + return a2 = +a2, b2 = +b2, function(t2) { + return Math.round(a2 * (1 - t2) + b2 * t2); }; } @@ -20650,20 +21066,20 @@ scaleX: 1, scaleY: 1 }; - function decompose_default(a, b, c, d, e, f2) { + function decompose_default(a2, b2, c2, d2, e3, f3) { var scaleX, scaleY, skewX; - if (scaleX = Math.sqrt(a * a + b * b)) - a /= scaleX, b /= scaleX; - if (skewX = a * c + b * d) - c -= a * skewX, d -= b * skewX; - if (scaleY = Math.sqrt(c * c + d * d)) - c /= scaleY, d /= scaleY, skewX /= scaleY; - if (a * d < b * c) - a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + if (scaleX = Math.sqrt(a2 * a2 + b2 * b2)) + a2 /= scaleX, b2 /= scaleX; + if (skewX = a2 * c2 + b2 * d2) + c2 -= a2 * skewX, d2 -= b2 * skewX; + if (scaleY = Math.sqrt(c2 * c2 + d2 * d2)) + c2 /= scaleY, d2 /= scaleY, skewX /= scaleY; + if (a2 * d2 < b2 * c2) + a2 = -a2, b2 = -b2, skewX = -skewX, scaleX = -scaleX; return { - translateX: e, - translateY: f2, - rotate: Math.atan2(b, a) * degrees2, + translateX: e3, + translateY: f3, + rotate: Math.atan2(b2, a2) * degrees2, skewX: Math.atan(skewX) * degrees2, scaleX, scaleY @@ -20673,8 +21089,8 @@ // node_modules/d3-interpolate/src/transform/parse.js var svgNode; function parseCss(value) { - const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); - return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f); + const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f); } function parseSvg(value) { if (value == null) @@ -20690,56 +21106,56 @@ // node_modules/d3-interpolate/src/transform/index.js function interpolateTransform(parse, pxComma, pxParen, degParen) { - function pop(s) { - return s.length ? s.pop() + " " : ""; + function pop(s2) { + return s2.length ? s2.pop() + " " : ""; } - function translate(xa, ya, xb, yb, s, q) { + function translate(xa, ya, xb, yb, s2, q2) { if (xa !== xb || ya !== yb) { - var i2 = s.push("translate(", null, pxComma, null, pxParen); - q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) }); + var i3 = s2.push("translate(", null, pxComma, null, pxParen); + q2.push({ i: i3 - 4, x: number_default(xa, xb) }, { i: i3 - 2, x: number_default(ya, yb) }); } else if (xb || yb) { - s.push("translate(" + xb + pxComma + yb + pxParen); + s2.push("translate(" + xb + pxComma + yb + pxParen); } } - function rotate(a, b, s, q) { - if (a !== b) { - if (a - b > 180) - b += 360; - else if (b - a > 180) - a += 360; - q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) }); - } else if (b) { - s.push(pop(s) + "rotate(" + b + degParen); + function rotate(a2, b2, s2, q2) { + if (a2 !== b2) { + if (a2 - b2 > 180) + b2 += 360; + else if (b2 - a2 > 180) + a2 += 360; + q2.push({ i: s2.push(pop(s2) + "rotate(", null, degParen) - 2, x: number_default(a2, b2) }); + } else if (b2) { + s2.push(pop(s2) + "rotate(" + b2 + degParen); } } - function skewX(a, b, s, q) { - if (a !== b) { - q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) }); - } else if (b) { - s.push(pop(s) + "skewX(" + b + degParen); + function skewX(a2, b2, s2, q2) { + if (a2 !== b2) { + q2.push({ i: s2.push(pop(s2) + "skewX(", null, degParen) - 2, x: number_default(a2, b2) }); + } else if (b2) { + s2.push(pop(s2) + "skewX(" + b2 + degParen); } } - function scale(xa, ya, xb, yb, s, q) { + function scale(xa, ya, xb, yb, s2, q2) { if (xa !== xb || ya !== yb) { - var i2 = s.push(pop(s) + "scale(", null, ",", null, ")"); - q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) }); + var i3 = s2.push(pop(s2) + "scale(", null, ",", null, ")"); + q2.push({ i: i3 - 4, x: number_default(xa, xb) }, { i: i3 - 2, x: number_default(ya, yb) }); } else if (xb !== 1 || yb !== 1) { - s.push(pop(s) + "scale(" + xb + "," + yb + ")"); - } - } - return function(a, b) { - var s = [], q = []; - a = parse(a), b = parse(b); - translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); - rotate(a.rotate, b.rotate, s, q); - skewX(a.skewX, b.skewX, s, q); - scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); - a = b = null; - return function(t) { - var i2 = -1, n2 = q.length, o; - while (++i2 < n2) - s[(o = q[i2]).i] = o.x(t); - return s.join(""); + s2.push(pop(s2) + "scale(" + xb + "," + yb + ")"); + } + } + return function(a2, b2) { + var s2 = [], q2 = []; + a2 = parse(a2), b2 = parse(b2); + translate(a2.translateX, a2.translateY, b2.translateX, b2.translateY, s2, q2); + rotate(a2.rotate, b2.rotate, s2, q2); + skewX(a2.skewX, b2.skewX, s2, q2); + scale(a2.scaleX, a2.scaleY, b2.scaleX, b2.scaleY, s2, q2); + a2 = b2 = null; + return function(t2) { + var i3 = -1, n3 = q2.length, o2; + while (++i3 < n3) + s2[(o2 = q2[i3]).i] = o2.x(t2); + return s2.join(""); }; }; } @@ -20748,54 +21164,54 @@ // node_modules/d3-interpolate/src/zoom.js var epsilon22 = 1e-12; - function cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; + function cosh(x2) { + return ((x2 = Math.exp(x2)) + 1 / x2) / 2; } - function sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; + function sinh(x2) { + return ((x2 = Math.exp(x2)) - 1 / x2) / 2; } - function tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); + function tanh(x2) { + return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1); } var zoom_default = function zoomRho(rho, rho2, rho4) { function zoom(p02, p1) { - var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i2, S; + var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i3, S2; if (d2 < epsilon22) { - S = Math.log(w1 / w0) / rho; - i2 = function(t) { + S2 = Math.log(w1 / w0) / rho; + i3 = function(t2) { return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(rho * t * S) + ux0 + t2 * dx, + uy0 + t2 * dy, + w0 * Math.exp(rho * t2 * S2) ]; }; } else { var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / rho; - i2 = function(t) { - var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + S2 = (r1 - r0) / rho; + i3 = function(t2) { + var s2 = t2 * S2, coshr0 = cosh(r0), u2 = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s2 + r0) - sinh(r0)); return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / cosh(rho * s + r0) + ux0 + u2 * dx, + uy0 + u2 * dy, + w0 * coshr0 / cosh(rho * s2 + r0) ]; }; } - i2.duration = S * 1e3 * rho / Math.SQRT2; - return i2; + i3.duration = S2 * 1e3 * rho / Math.SQRT2; + return i3; } - zoom.rho = function(_) { - var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; - return zoomRho(_1, _2, _4); + zoom.rho = function(_2) { + var _1 = Math.max(1e-3, +_2), _22 = _1 * _1, _4 = _22 * _22; + return zoomRho(_1, _22, _4); }; return zoom; }(Math.SQRT2, 2, 4); // node_modules/d3-interpolate/src/quantize.js - function quantize_default(interpolator, n2) { - var samples = new Array(n2); - for (var i2 = 0; i2 < n2; ++i2) - samples[i2] = interpolator(i2 / (n2 - 1)); + function quantize_default(interpolator, n3) { + var samples = new Array(n3); + for (var i3 = 0; i3 < n3; ++i3) + samples[i3] = interpolator(i3 / (n3 - 1)); return samples; } @@ -20810,8 +21226,8 @@ var clockNow = 0; var clockSkew = 0; var clock = typeof performance === "object" && performance.now ? performance : Date; - var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f2) { - setTimeout(f2, 17); + var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f3) { + setTimeout(f3, 17); }; function now() { return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); @@ -20848,18 +21264,18 @@ } }; function timer(callback, delay, time) { - var t = new Timer(); - t.restart(callback, delay, time); - return t; + var t2 = new Timer(); + t2.restart(callback, delay, time); + return t2; } function timerFlush() { now(); ++frame; - var t = taskHead, e; - while (t) { - if ((e = clockNow - t._time) >= 0) - t._call.call(void 0, e); - t = t._next; + var t2 = taskHead, e3; + while (t2) { + if ((e3 = clockNow - t2._time) >= 0) + t2._call.call(void 0, e3); + t2 = t2._next; } --frame; } @@ -20914,13 +21330,13 @@ // node_modules/d3-timer/src/timeout.js function timeout_default(callback, delay, time) { - var t = new Timer(); + var t2 = new Timer(); delay = delay == null ? 0 : +delay; - t.restart((elapsed) => { - t.stop(); + t2.restart((elapsed) => { + t2.stop(); callback(elapsed + delay); }, delay, time); - return t; + return t2; } // node_modules/d3-transition/src/transition/schedule.js @@ -20942,7 +21358,9 @@ create(node, id2, { name, index, + // For context during callback. group, + // For context during callback. on: emptyOn, tween: emptyTween, time: timing.time, @@ -20982,25 +21400,25 @@ start2(elapsed - self2.delay); } function start2(elapsed) { - var i2, j2, n2, o; + var i3, j3, n3, o2; if (self2.state !== SCHEDULED) return stop(); - for (i2 in schedules) { - o = schedules[i2]; - if (o.name !== self2.name) + for (i3 in schedules) { + o2 = schedules[i3]; + if (o2.name !== self2.name) continue; - if (o.state === STARTED) + if (o2.state === STARTED) return timeout_default(start2); - if (o.state === RUNNING) { - o.state = ENDED; - o.timer.stop(); - o.on.call("interrupt", node, node.__data__, o.index, o.group); - delete schedules[i2]; - } else if (+i2 < id2) { - o.state = ENDED; - o.timer.stop(); - o.on.call("cancel", node, node.__data__, o.index, o.group); - delete schedules[i2]; + if (o2.state === RUNNING) { + o2.state = ENDED; + o2.timer.stop(); + o2.on.call("interrupt", node, node.__data__, o2.index, o2.group); + delete schedules[i3]; + } else if (+i3 < id2) { + o2.state = ENDED; + o2.timer.stop(); + o2.on.call("cancel", node, node.__data__, o2.index, o2.group); + delete schedules[i3]; } } timeout_default(function() { @@ -21015,18 +21433,18 @@ if (self2.state !== STARTING) return; self2.state = STARTED; - tween = new Array(n2 = self2.tween.length); - for (i2 = 0, j2 = -1; i2 < n2; ++i2) { - if (o = self2.tween[i2].value.call(node, node.__data__, self2.index, self2.group)) { - tween[++j2] = o; + tween = new Array(n3 = self2.tween.length); + for (i3 = 0, j3 = -1; i3 < n3; ++i3) { + if (o2 = self2.tween[i3].value.call(node, node.__data__, self2.index, self2.group)) { + tween[++j3] = o2; } } - tween.length = j2 + 1; + tween.length = j3 + 1; } function tick(elapsed) { - var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i2 = -1, n2 = tween.length; - while (++i2 < n2) { - tween[i2].call(node, t); + var t2 = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i3 = -1, n3 = tween.length; + while (++i3 < n3) { + tween[i3].call(node, t2); } if (self2.state === ENDING) { self2.on.call("end", node, node.__data__, self2.index, self2.group); @@ -21037,7 +21455,7 @@ self2.state = ENDED; self2.timer.stop(); delete schedules[id2]; - for (var i2 in schedules) + for (var i3 in schedules) return; delete node.__transition; } @@ -21045,12 +21463,12 @@ // node_modules/d3-transition/src/interrupt.js function interrupt_default(node, name) { - var schedules = node.__transition, schedule, active, empty2 = true, i2; + var schedules = node.__transition, schedule, active, empty2 = true, i3; if (!schedules) return; name = name == null ? null : name + ""; - for (i2 in schedules) { - if ((schedule = schedules[i2]).name !== name) { + for (i3 in schedules) { + if ((schedule = schedules[i3]).name !== name) { empty2 = false; continue; } @@ -21058,7 +21476,7 @@ schedule.state = ENDED; schedule.timer.stop(); schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); - delete schedules[i2]; + delete schedules[i3]; } if (empty2) delete node.__transition; @@ -21078,10 +21496,10 @@ var schedule = set2(this, id2), tween = schedule.tween; if (tween !== tween0) { tween1 = tween0 = tween; - for (var i2 = 0, n2 = tween1.length; i2 < n2; ++i2) { - if (tween1[i2].name === name) { + for (var i3 = 0, n3 = tween1.length; i3 < n3; ++i3) { + if (tween1[i3].name === name) { tween1 = tween1.slice(); - tween1.splice(i2, 1); + tween1.splice(i3, 1); break; } } @@ -21097,14 +21515,14 @@ var schedule = set2(this, id2), tween = schedule.tween; if (tween !== tween0) { tween1 = (tween0 = tween).slice(); - for (var t = { name, value }, i2 = 0, n2 = tween1.length; i2 < n2; ++i2) { - if (tween1[i2].name === name) { - tween1[i2] = t; + for (var t2 = { name, value }, i3 = 0, n3 = tween1.length; i3 < n3; ++i3) { + if (tween1[i3].name === name) { + tween1[i3] = t2; break; } } - if (i2 === n2) - tween1.push(t); + if (i3 === n3) + tween1.push(t2); } schedule.tween = tween1; }; @@ -21114,9 +21532,9 @@ name += ""; if (arguments.length < 2) { var tween = get2(this.node(), id2).tween; - for (var i2 = 0, n2 = tween.length, t; i2 < n2; ++i2) { - if ((t = tween[i2]).name === name) { - return t.value; + for (var i3 = 0, n3 = tween.length, t2; i3 < n3; ++i3) { + if ((t2 = tween[i3]).name === name) { + return t2.value; } } return null; @@ -21135,9 +21553,9 @@ } // node_modules/d3-transition/src/transition/interpolate.js - function interpolate_default(a, b) { - var c; - return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b); + function interpolate_default(a2, b2) { + var c2; + return (typeof b2 === "number" ? number_default : b2 instanceof color ? rgb_default : (c2 = color(b2)) ? (b2 = c2, rgb_default) : string_default)(a2, b2); } // node_modules/d3-transition/src/transition/attr.js @@ -21188,27 +21606,27 @@ }; } function attr_default2(name, value) { - var fullname = namespace_default(name), i2 = fullname === "transform" ? interpolateTransformSvg : interpolate_default; - return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i2, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i2, value)); + var fullname = namespace_default(name), i3 = fullname === "transform" ? interpolateTransformSvg : interpolate_default; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i3, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i3, value)); } // node_modules/d3-transition/src/transition/attrTween.js - function attrInterpolate(name, i2) { - return function(t) { - this.setAttribute(name, i2.call(this, t)); + function attrInterpolate(name, i3) { + return function(t2) { + this.setAttribute(name, i3.call(this, t2)); }; } - function attrInterpolateNS(fullname, i2) { - return function(t) { - this.setAttributeNS(fullname.space, fullname.local, i2.call(this, t)); + function attrInterpolateNS(fullname, i3) { + return function(t2) { + this.setAttributeNS(fullname.space, fullname.local, i3.call(this, t2)); }; } function attrTweenNS(fullname, value) { var t0, i0; function tween() { - var i2 = value.apply(this, arguments); - if (i2 !== i0) - t0 = (i0 = i2) && attrInterpolateNS(fullname, i2); + var i3 = value.apply(this, arguments); + if (i3 !== i0) + t0 = (i0 = i3) && attrInterpolateNS(fullname, i3); return t0; } tween._value = value; @@ -21217,9 +21635,9 @@ function attrTween(name, value) { var t0, i0; function tween() { - var i2 = value.apply(this, arguments); - if (i2 !== i0) - t0 = (i0 = i2) && attrInterpolate(name, i2); + var i3 = value.apply(this, arguments); + if (i3 !== i0) + t0 = (i0 = i3) && attrInterpolate(name, i3); return t0; } tween._value = value; @@ -21285,10 +21703,10 @@ // node_modules/d3-transition/src/transition/easeVarying.js function easeVarying(id2, value) { return function() { - var v = value.apply(this, arguments); - if (typeof v !== "function") + var v2 = value.apply(this, arguments); + if (typeof v2 !== "function") throw new Error(); - set2(this, id2).ease = v; + set2(this, id2).ease = v2; }; } function easeVarying_default(value) { @@ -21301,9 +21719,9 @@ function filter_default2(match) { if (typeof match !== "function") match = matcher_default(match); - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) { - if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) { + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, subgroup = subgroups[j3] = [], node, i3 = 0; i3 < n3; ++i3) { + if ((node = group[i3]) && match.call(node, node.__data__, i3, group)) { subgroup.push(node); } } @@ -21315,26 +21733,26 @@ function merge_default2(transition2) { if (transition2._id !== this._id) throw new Error(); - for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) { - for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) { - if (node = group0[i2] || group1[i2]) { - merge3[i2] = node; + for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j3 = 0; j3 < m2; ++j3) { + for (var group0 = groups0[j3], group1 = groups1[j3], n3 = group0.length, merge2 = merges[j3] = new Array(n3), node, i3 = 0; i3 < n3; ++i3) { + if (node = group0[i3] || group1[i3]) { + merge2[i3] = node; } } } - for (; j2 < m0; ++j2) { - merges[j2] = groups0[j2]; + for (; j3 < m0; ++j3) { + merges[j3] = groups0[j3]; } return new Transition(merges, this._parents, this._name, this._id); } // node_modules/d3-transition/src/transition/on.js function start(name) { - return (name + "").trim().split(/^|\s+/).every(function(t) { - var i2 = t.indexOf("."); - if (i2 >= 0) - t = t.slice(0, i2); - return !t || t === "start"; + return (name + "").trim().split(/^|\s+/).every(function(t2) { + var i3 = t2.indexOf("."); + if (i3 >= 0) + t2 = t2.slice(0, i3); + return !t2 || t2 === "start"; }); } function onFunction(id2, name, listener) { @@ -21355,8 +21773,8 @@ function removeFunction(id2) { return function() { var parent = this.parentNode; - for (var i2 in this.__transition) - if (+i2 !== id2) + for (var i3 in this.__transition) + if (+i3 !== id2) return; if (parent) parent.removeChild(this); @@ -21371,13 +21789,13 @@ var name = this._name, id2 = this._id; if (typeof select !== "function") select = selector_default(select); - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) { - if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) { + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, subgroup = subgroups[j3] = new Array(n3), node, subnode, i3 = 0; i3 < n3; ++i3) { + if ((node = group[i3]) && (subnode = select.call(node, node.__data__, i3, group))) { if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i2] = subnode; - schedule_default(subgroup[i2], name, id2, i2, subgroup, get2(node, id2)); + subgroup[i3] = subnode; + schedule_default(subgroup[i3], name, id2, i3, subgroup, get2(node, id2)); } } } @@ -21389,12 +21807,12 @@ var name = this._name, id2 = this._id; if (typeof select !== "function") select = selectorAll_default(select); - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) { - if (node = group[i2]) { - for (var children2 = select.call(node, node.__data__, i2, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) { - if (child = children2[k]) { - schedule_default(child, name, id2, k, children2, inherit2); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, node, i3 = 0; i3 < n3; ++i3) { + if (node = group[i3]) { + for (var children2 = select.call(node, node.__data__, i3, group), child, inherit2 = get2(node, id2), k2 = 0, l2 = children2.length; k2 < l2; ++k2) { + if (child = children2[k2]) { + schedule_default(child, name, id2, k2, children2, inherit2); } } subgroups.push(children2); @@ -21450,23 +21868,23 @@ }; } function style_default2(name, value, priority) { - var i2 = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; - return value == null ? this.styleTween(name, styleNull(name, i2)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i2, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i2, value), priority).on("end.style." + name, null); + var i3 = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; + return value == null ? this.styleTween(name, styleNull(name, i3)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i3, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i3, value), priority).on("end.style." + name, null); } // node_modules/d3-transition/src/transition/styleTween.js - function styleInterpolate(name, i2, priority) { - return function(t) { - this.style.setProperty(name, i2.call(this, t), priority); + function styleInterpolate(name, i3, priority) { + return function(t2) { + this.style.setProperty(name, i3.call(this, t2), priority); }; } function styleTween(name, value, priority) { - var t, i0; + var t2, i0; function tween() { - var i2 = value.apply(this, arguments); - if (i2 !== i0) - t = (i0 = i2) && styleInterpolate(name, i2, priority); - return t; + var i3 = value.apply(this, arguments); + if (i3 !== i0) + t2 = (i0 = i3) && styleInterpolate(name, i3, priority); + return t2; } tween._value = value; return tween; @@ -21499,17 +21917,17 @@ } // node_modules/d3-transition/src/transition/textTween.js - function textInterpolate(i2) { - return function(t) { - this.textContent = i2.call(this, t); + function textInterpolate(i3) { + return function(t2) { + this.textContent = i3.call(this, t2); }; } function textTween(value) { var t0, i0; function tween() { - var i2 = value.apply(this, arguments); - if (i2 !== i0) - t0 = (i0 = i2) && textInterpolate(i2); + var i3 = value.apply(this, arguments); + if (i3 !== i0) + t0 = (i0 = i3) && textInterpolate(i3); return t0; } tween._value = value; @@ -21529,11 +21947,11 @@ // node_modules/d3-transition/src/transition/transition.js function transition_default() { var name = this._name, id0 = this._id, id1 = newId(); - for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) { - if (node = group[i2]) { + for (var groups = this._groups, m2 = groups.length, j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, node, i3 = 0; i3 < n3; ++i3) { + if (node = group[i3]) { var inherit2 = get2(node, id0); - schedule_default(node, name, id1, i2, group, { + schedule_default(node, name, id1, i3, group, { time: inherit2.time + inherit2.delay + inherit2.duration, delay: 0, duration: inherit2.duration, @@ -21617,16 +22035,17 @@ }; // node_modules/d3-ease/src/linear.js - var linear2 = (t) => +t; + var linear2 = (t2) => +t2; // node_modules/d3-ease/src/cubic.js - function cubicInOut(t) { - return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + function cubicInOut(t2) { + return ((t2 *= 2) <= 1 ? t2 * t2 * t2 : (t2 -= 2) * t2 * t2 + 2) / 2; } // node_modules/d3-transition/src/selection/transition.js var defaultTiming = { time: null, + // Set on use. delay: 0, duration: 250, ease: cubicInOut @@ -21647,10 +22066,10 @@ } else { id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; } - for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) { - for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) { - if (node = group[i2]) { - schedule_default(node, name, id2, i2, group, timing || inherit(node, id2)); + for (var groups = this._groups, m2 = groups.length, j3 = 0; j3 < m2; ++j3) { + for (var group = groups[j3], n3 = group.length, node, i3 = 0; i3 < n3; ++i3) { + if (node = group[i3]) { + schedule_default(node, name, id2, i3, group, timing || inherit(node, id2)); } } } @@ -21662,61 +22081,61 @@ selection_default.prototype.transition = transition_default2; // node_modules/d3-zoom/src/constant.js - var constant_default4 = (x) => () => x; + var constant_default4 = (x2) => () => x2; // node_modules/d3-zoom/src/event.js - function ZoomEvent(type3, { + function ZoomEvent(type2, { sourceEvent, target, transform: transform2, - dispatch: dispatch10 + dispatch: dispatch14 }) { Object.defineProperties(this, { - type: { value: type3, enumerable: true, configurable: true }, + type: { value: type2, enumerable: true, configurable: true }, sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, target: { value: target, enumerable: true, configurable: true }, transform: { value: transform2, enumerable: true, configurable: true }, - _: { value: dispatch10 } + _: { value: dispatch14 } }); } // node_modules/d3-zoom/src/transform.js - function Transform(k, x, y) { - this.k = k; - this.x = x; - this.y = y; + function Transform(k2, x2, y2) { + this.k = k2; + this.x = x2; + this.y = y2; } Transform.prototype = { constructor: Transform, - scale: function(k) { - return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + scale: function(k2) { + return k2 === 1 ? this : new Transform(this.k * k2, this.x, this.y); }, - translate: function(x, y) { - return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + translate: function(x2, y2) { + return x2 === 0 & y2 === 0 ? this : new Transform(this.k, this.x + this.k * x2, this.y + this.k * y2); }, - apply: function(point) { - return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + apply: function(point2) { + return [point2[0] * this.k + this.x, point2[1] * this.k + this.y]; }, - applyX: function(x) { - return x * this.k + this.x; + applyX: function(x2) { + return x2 * this.k + this.x; }, - applyY: function(y) { - return y * this.k + this.y; + applyY: function(y2) { + return y2 * this.k + this.y; }, invert: function(location) { return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; }, - invertX: function(x) { - return (x - this.x) / this.k; + invertX: function(x2) { + return (x2 - this.x) / this.k; }, - invertY: function(y) { - return (y - this.y) / this.k; + invertY: function(y2) { + return (y2 - this.y) / this.k; }, - rescaleX: function(x) { - return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + rescaleX: function(x2) { + return x2.copy().domain(x2.range().map(this.invertX, this).map(x2.invert, x2)); }, - rescaleY: function(y) { - return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + rescaleY: function(y2) { + return y2.copy().domain(y2.range().map(this.invertY, this).map(y2.invert, y2)); }, toString: function() { return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; @@ -21745,16 +22164,16 @@ return (!event.ctrlKey || event.type === "wheel") && !event.button; } function defaultExtent() { - var e = this; - if (e instanceof SVGElement) { - e = e.ownerSVGElement || e; - if (e.hasAttribute("viewBox")) { - e = e.viewBox.baseVal; - return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + var e3 = this; + if (e3 instanceof SVGElement) { + e3 = e3.ownerSVGElement || e3; + if (e3.hasAttribute("viewBox")) { + e3 = e3.viewBox.baseVal; + return [[e3.x, e3.y], [e3.x + e3.width, e3.y + e3.height]]; } - return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + return [[0, 0], [e3.width.baseVal.value, e3.height.baseVal.value]]; } - return [[0, 0], [e.clientWidth, e.clientHeight]]; + return [[0, 0], [e3.clientWidth, e3.clientHeight]]; } function defaultTransform() { return this.__zoom || identity2; @@ -21777,72 +22196,72 @@ function zoom(selection2) { selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } - zoom.transform = function(collection, transform2, point, event) { + zoom.transform = function(collection, transform2, point2, event) { var selection2 = collection.selection ? collection.selection() : collection; selection2.property("__zoom", defaultTransform); if (collection !== selection2) { - schedule(collection, transform2, point, event); + schedule(collection, transform2, point2, event); } else { selection2.interrupt().each(function() { gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); }); } }; - zoom.scaleBy = function(selection2, k, p, event) { + zoom.scaleBy = function(selection2, k2, p2, event) { zoom.scaleTo(selection2, function() { - var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + var k0 = this.__zoom.k, k1 = typeof k2 === "function" ? k2.apply(this, arguments) : k2; return k0 * k1; - }, p, event); + }, p2, event); }; - zoom.scaleTo = function(selection2, k, p, event) { + zoom.scaleTo = function(selection2, k2, p2, event) { zoom.transform(selection2, function() { - var e = extent.apply(this, arguments), t0 = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent); - }, p, event); + var e3 = extent.apply(this, arguments), t0 = this.__zoom, p02 = p2 == null ? centroid(e3) : typeof p2 === "function" ? p2.apply(this, arguments) : p2, p1 = t0.invert(p02), k1 = typeof k2 === "function" ? k2.apply(this, arguments) : k2; + return constrain(translate(scale(t0, k1), p02, p1), e3, translateExtent); + }, p2, event); }; - zoom.translateBy = function(selection2, x, y, event) { + zoom.translateBy = function(selection2, x2, y2, event) { zoom.transform(selection2, function() { return constrain(this.__zoom.translate( - typeof x === "function" ? x.apply(this, arguments) : x, - typeof y === "function" ? y.apply(this, arguments) : y + typeof x2 === "function" ? x2.apply(this, arguments) : x2, + typeof y2 === "function" ? y2.apply(this, arguments) : y2 ), extent.apply(this, arguments), translateExtent); }, null, event); }; - zoom.translateTo = function(selection2, x, y, p, event) { + zoom.translateTo = function(selection2, x2, y2, p2, event) { zoom.transform(selection2, function() { - var e = extent.apply(this, arguments), t = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate( - typeof x === "function" ? -x.apply(this, arguments) : -x, - typeof y === "function" ? -y.apply(this, arguments) : -y - ), e, translateExtent); - }, p, event); + var e3 = extent.apply(this, arguments), t2 = this.__zoom, p02 = p2 == null ? centroid(e3) : typeof p2 === "function" ? p2.apply(this, arguments) : p2; + return constrain(identity2.translate(p02[0], p02[1]).scale(t2.k).translate( + typeof x2 === "function" ? -x2.apply(this, arguments) : -x2, + typeof y2 === "function" ? -y2.apply(this, arguments) : -y2 + ), e3, translateExtent); + }, p2, event); }; - function scale(transform2, k) { - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); - return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + function scale(transform2, k2) { + k2 = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k2)); + return k2 === transform2.k ? transform2 : new Transform(k2, transform2.x, transform2.y); } function translate(transform2, p02, p1) { - var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k; - return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y); + var x2 = p02[0] - p1[0] * transform2.k, y2 = p02[1] - p1[1] * transform2.k; + return x2 === transform2.x && y2 === transform2.y ? transform2 : new Transform(transform2.k, x2, y2); } function centroid(extent2) { return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; } - function schedule(transition2, transform2, point, event) { + function schedule(transition2, transform2, point2, event) { transition2.on("start.zoom", function() { gesture(this, arguments).event(event).start(); }).on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }).tween("zoom", function() { - var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); - return function(t) { - if (t === 1) - t = b; + var that = this, args = arguments, g3 = gesture(that, args).event(event), e3 = extent.apply(that, args), p2 = point2 == null ? centroid(e3) : typeof point2 === "function" ? point2.apply(that, args) : point2, w2 = Math.max(e3[1][0] - e3[0][0], e3[1][1] - e3[0][1]), a2 = that.__zoom, b2 = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i3 = interpolate(a2.invert(p2).concat(w2 / a2.k), b2.invert(p2).concat(w2 / b2.k)); + return function(t2) { + if (t2 === 1) + t2 = b2; else { - var l = i2(t), k = w / l[2]; - t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + var l2 = i3(t2), k2 = w2 / l2[2]; + t2 = new Transform(k2, p2[0] - l2[0] * k2, p2[1] - l2[1] * k2); } - g.zoom(null, t); + g3.zoom(null, t2); }; }); } @@ -21888,68 +22307,68 @@ } return this; }, - emit: function(type3) { - var d = select_default2(this.that).datum(); + emit: function(type2) { + var d2 = select_default2(this.that).datum(); listeners.call( - type3, + type2, this.that, - new ZoomEvent(type3, { + new ZoomEvent(type2, { sourceEvent: this.sourceEvent, target: zoom, - type: type3, + type: type2, transform: this.that.__zoom, dispatch: listeners }), - d + d2 ); } }; function wheeled(event, ...args) { if (!filter2.apply(this, arguments)) return; - var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event); - if (g.wheel) { - if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { - g.mouse[1] = t.invert(g.mouse[0] = p); + var g3 = gesture(this, args).event(event), t2 = this.__zoom, k2 = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t2.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p2 = pointer_default(event); + if (g3.wheel) { + if (g3.mouse[0][0] !== p2[0] || g3.mouse[0][1] !== p2[1]) { + g3.mouse[1] = t2.invert(g3.mouse[0] = p2); } - clearTimeout(g.wheel); - } else if (t.k === k) + clearTimeout(g3.wheel); + } else if (t2.k === k2) return; else { - g.mouse = [p, t.invert(p)]; + g3.mouse = [p2, t2.invert(p2)]; interrupt_default(this); - g.start(); + g3.start(); } noevent_default2(event); - g.wheel = setTimeout(wheelidled, wheelDelay); - g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + g3.wheel = setTimeout(wheelidled, wheelDelay); + g3.zoom("mouse", constrain(translate(scale(t2, k2), g3.mouse[0], g3.mouse[1]), g3.extent, translateExtent)); function wheelidled() { - g.wheel = null; - g.end(); + g3.wheel = null; + g3.end(); } } function mousedowned(event, ...args) { if (touchending || !filter2.apply(this, arguments)) return; - var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x05 = event.clientX, y05 = event.clientY; + var currentTarget = event.currentTarget, g3 = gesture(this, args, true).event(event), v2 = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p2 = pointer_default(event, currentTarget), x05 = event.clientX, y05 = event.clientY; nodrag_default(event.view); nopropagation2(event); - g.mouse = [p, this.__zoom.invert(p)]; + g3.mouse = [p2, this.__zoom.invert(p2)]; interrupt_default(this); - g.start(); + g3.start(); function mousemoved(event2) { noevent_default2(event2); - if (!g.moved) { + if (!g3.moved) { var dx = event2.clientX - x05, dy = event2.clientY - y05; - g.moved = dx * dx + dy * dy > clickDistance2; + g3.moved = dx * dx + dy * dy > clickDistance2; } - g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); + g3.event(event2).zoom("mouse", constrain(translate(g3.that.__zoom, g3.mouse[0] = pointer_default(event2, currentTarget), g3.mouse[1]), g3.extent, translateExtent)); } function mouseupped(event2) { - v.on("mousemove.zoom mouseup.zoom", null); - yesdrag(event2.view, g.moved); + v2.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event2.view, g3.moved); noevent_default2(event2); - g.event(event2).end(); + g3.event(event2).end(); } } function dblclicked(event, ...args) { @@ -21965,120 +22384,120 @@ function touchstarted(event, ...args) { if (!filter2.apply(this, arguments)) return; - var touches = event.touches, n2 = touches.length, g = gesture(this, args, event.changedTouches.length === n2).event(event), started, i2, t, p; + var touches = event.touches, n3 = touches.length, g3 = gesture(this, args, event.changedTouches.length === n3).event(event), started, i3, t2, p2; nopropagation2(event); - for (i2 = 0; i2 < n2; ++i2) { - t = touches[i2], p = pointer_default(t, this); - p = [p, this.__zoom.invert(p), t.identifier]; - if (!g.touch0) - g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; - else if (!g.touch1 && g.touch0[2] !== p[2]) - g.touch1 = p, g.taps = 0; + for (i3 = 0; i3 < n3; ++i3) { + t2 = touches[i3], p2 = pointer_default(t2, this); + p2 = [p2, this.__zoom.invert(p2), t2.identifier]; + if (!g3.touch0) + g3.touch0 = p2, started = true, g3.taps = 1 + !!touchstarting; + else if (!g3.touch1 && g3.touch0[2] !== p2[2]) + g3.touch1 = p2, g3.taps = 0; } if (touchstarting) touchstarting = clearTimeout(touchstarting); if (started) { - if (g.taps < 2) - touchfirst = p[0], touchstarting = setTimeout(function() { + if (g3.taps < 2) + touchfirst = p2[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); interrupt_default(this); - g.start(); + g3.start(); } } function touchmoved(event, ...args) { if (!this.__zooming) return; - var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t, p, l; + var g3 = gesture(this, args).event(event), touches = event.changedTouches, n3 = touches.length, i3, t2, p2, l2; noevent_default2(event); - for (i2 = 0; i2 < n2; ++i2) { - t = touches[i2], p = pointer_default(t, this); - if (g.touch0 && g.touch0[2] === t.identifier) - g.touch0[0] = p; - else if (g.touch1 && g.touch1[2] === t.identifier) - g.touch1[0] = p; - } - t = g.that.__zoom; - if (g.touch1) { - var p02 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; - t = scale(t, Math.sqrt(dp / dl)); - p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2]; - l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - } else if (g.touch0) - p = g.touch0[0], l = g.touch0[1]; + for (i3 = 0; i3 < n3; ++i3) { + t2 = touches[i3], p2 = pointer_default(t2, this); + if (g3.touch0 && g3.touch0[2] === t2.identifier) + g3.touch0[0] = p2; + else if (g3.touch1 && g3.touch1[2] === t2.identifier) + g3.touch1[0] = p2; + } + t2 = g3.that.__zoom; + if (g3.touch1) { + var p02 = g3.touch0[0], l0 = g3.touch0[1], p1 = g3.touch1[0], l1 = g3.touch1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t2 = scale(t2, Math.sqrt(dp / dl)); + p2 = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2]; + l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g3.touch0) + p2 = g3.touch0[0], l2 = g3.touch0[1]; else return; - g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + g3.zoom("touch", constrain(translate(t2, p2, l2), g3.extent, translateExtent)); } function touchended(event, ...args) { if (!this.__zooming) return; - var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t; + var g3 = gesture(this, args).event(event), touches = event.changedTouches, n3 = touches.length, i3, t2; nopropagation2(event); if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, touchDelay); - for (i2 = 0; i2 < n2; ++i2) { - t = touches[i2]; - if (g.touch0 && g.touch0[2] === t.identifier) - delete g.touch0; - else if (g.touch1 && g.touch1[2] === t.identifier) - delete g.touch1; - } - if (g.touch1 && !g.touch0) - g.touch0 = g.touch1, delete g.touch1; - if (g.touch0) - g.touch0[1] = this.__zoom.invert(g.touch0[0]); + for (i3 = 0; i3 < n3; ++i3) { + t2 = touches[i3]; + if (g3.touch0 && g3.touch0[2] === t2.identifier) + delete g3.touch0; + else if (g3.touch1 && g3.touch1[2] === t2.identifier) + delete g3.touch1; + } + if (g3.touch1 && !g3.touch0) + g3.touch0 = g3.touch1, delete g3.touch1; + if (g3.touch0) + g3.touch0[1] = this.__zoom.invert(g3.touch0[0]); else { - g.end(); - if (g.taps === 2) { - t = pointer_default(t, this); - if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { - var p = select_default2(this).on("dblclick.zoom"); - if (p) - p.apply(this, arguments); + g3.end(); + if (g3.taps === 2) { + t2 = pointer_default(t2, this); + if (Math.hypot(touchfirst[0] - t2[0], touchfirst[1] - t2[1]) < tapDistance) { + var p2 = select_default2(this).on("dblclick.zoom"); + if (p2) + p2.apply(this, arguments); } } } } - zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta; + zoom.wheelDelta = function(_2) { + return arguments.length ? (wheelDelta = typeof _2 === "function" ? _2 : constant_default4(+_2), zoom) : wheelDelta; }; - zoom.filter = function(_) { - return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2; + zoom.filter = function(_2) { + return arguments.length ? (filter2 = typeof _2 === "function" ? _2 : constant_default4(!!_2), zoom) : filter2; }; - zoom.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable; + zoom.touchable = function(_2) { + return arguments.length ? (touchable = typeof _2 === "function" ? _2 : constant_default4(!!_2), zoom) : touchable; }; - zoom.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + zoom.extent = function(_2) { + return arguments.length ? (extent = typeof _2 === "function" ? _2 : constant_default4([[+_2[0][0], +_2[0][1]], [+_2[1][0], +_2[1][1]]]), zoom) : extent; }; - zoom.scaleExtent = function(_) { - return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + zoom.scaleExtent = function(_2) { + return arguments.length ? (scaleExtent[0] = +_2[0], scaleExtent[1] = +_2[1], zoom) : [scaleExtent[0], scaleExtent[1]]; }; - zoom.translateExtent = function(_) { - 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]]]; + zoom.translateExtent = function(_2) { + return arguments.length ? (translateExtent[0][0] = +_2[0][0], translateExtent[1][0] = +_2[1][0], translateExtent[0][1] = +_2[0][1], translateExtent[1][1] = +_2[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; }; - zoom.constrain = function(_) { - return arguments.length ? (constrain = _, zoom) : constrain; + zoom.constrain = function(_2) { + return arguments.length ? (constrain = _2, zoom) : constrain; }; - zoom.duration = function(_) { - return arguments.length ? (duration = +_, zoom) : duration; + zoom.duration = function(_2) { + return arguments.length ? (duration = +_2, zoom) : duration; }; - zoom.interpolate = function(_) { - return arguments.length ? (interpolate = _, zoom) : interpolate; + zoom.interpolate = function(_2) { + return arguments.length ? (interpolate = _2, zoom) : interpolate; }; zoom.on = function() { var value = listeners.on.apply(listeners, arguments); return value === listeners ? zoom : value; }; - zoom.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + zoom.clickDistance = function(_2) { + return arguments.length ? (clickDistance2 = (_2 = +_2) * _2, zoom) : Math.sqrt(clickDistance2); }; - zoom.tapDistance = function(_) { - return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + zoom.tapDistance = function(_2) { + return arguments.length ? (tapDistance = +_2, zoom) : tapDistance; }; return zoom; } @@ -22086,48 +22505,48 @@ // modules/geo/raw_mercator.js function geoRawMercator() { var project = mercatorRaw; - var k = 512 / Math.PI; - var x = 0; - var y = 0; + var k2 = 512 / Math.PI; + var x2 = 0; + var y2 = 0; var clipExtent = [[0, 0], [0, 0]]; - function projection2(point) { - point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180); - return [point[0] * k + x, y - point[1] * k]; + function projection2(point2) { + point2 = project(point2[0] * Math.PI / 180, point2[1] * Math.PI / 180); + return [point2[0] * k2 + x2, y2 - point2[1] * k2]; } - projection2.invert = function(point) { - point = project.invert((point[0] - x) / k, (y - point[1]) / k); - return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI]; + projection2.invert = function(point2) { + point2 = project.invert((point2[0] - x2) / k2, (y2 - point2[1]) / k2); + return point2 && [point2[0] * 180 / Math.PI, point2[1] * 180 / Math.PI]; }; - projection2.scale = function(_) { + projection2.scale = function(_2) { if (!arguments.length) - return k; - k = +_; + return k2; + k2 = +_2; return projection2; }; - projection2.translate = function(_) { + projection2.translate = function(_2) { if (!arguments.length) - return [x, y]; - x = +_[0]; - y = +_[1]; + return [x2, y2]; + x2 = +_2[0]; + y2 = +_2[1]; return projection2; }; - projection2.clipExtent = function(_) { + projection2.clipExtent = function(_2) { if (!arguments.length) return clipExtent; - clipExtent = _; + clipExtent = _2; return projection2; }; projection2.transform = function(obj) { if (!arguments.length) - return identity2.translate(x, y).scale(k); - x = +obj.x; - y = +obj.y; - k = +obj.k; + return identity2.translate(x2, y2).scale(k2); + x2 = +obj.x; + y2 = +obj.y; + k2 = +obj.k; return projection2; }; projection2.stream = transform_default({ - point: function(x2, y2) { - var vec = projection2([x2, y2]); + point: function(x3, y3) { + var vec = projection2([x3, y3]); this.stream.point(vec[0], vec[1]); } }).stream; @@ -22135,11 +22554,11 @@ } // modules/geo/ortho.js - function geoOrthoNormalizedDotProduct(a, b, origin) { - if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) { + function geoOrthoNormalizedDotProduct(a2, b2, origin) { + if (geoVecEqual(origin, a2) || geoVecEqual(origin, b2)) { return 1; } - return geoVecNormalizedDot(a, b, origin); + return geoVecNormalizedDot(a2, b2, origin); } function geoOrthoFilterDotProduct(dotp, epsilon3, lowerThreshold, upperThreshold, allowStraightAngles) { var val = Math.abs(dotp); @@ -22157,16 +22576,16 @@ var score = 0; var first = isClosed ? 0 : 1; var last = isClosed ? points.length : points.length - 1; - var coords = points.map(function(p) { - return p.coord; + var coords = points.map(function(p2) { + return p2.coord; }); var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); var upperThreshold = Math.cos(threshold * Math.PI / 180); - for (var i2 = first; i2 < last; i2++) { - var a = coords[(i2 - 1 + coords.length) % coords.length]; - var origin = coords[i2]; - var b = coords[(i2 + 1) % coords.length]; - var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold); + for (var i3 = first; i3 < last; i3++) { + var a2 = coords[(i3 - 1 + coords.length) % coords.length]; + var origin = coords[i3]; + var b2 = coords[(i3 + 1) % coords.length]; + var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a2, b2, origin), epsilon3, lowerThreshold, upperThreshold); if (dotp === null) continue; score = score + 2 * Math.min(Math.abs(dotp - 1), Math.min(Math.abs(dotp), Math.abs(dotp + 1))); @@ -22177,11 +22596,11 @@ var max3 = -Infinity; var first = isClosed ? 0 : 1; var last = isClosed ? coords.length : coords.length - 1; - for (var i2 = first; i2 < last; i2++) { - var a = coords[(i2 - 1 + coords.length) % coords.length]; - var origin = coords[i2]; - var b = coords[(i2 + 1) % coords.length]; - var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin); + for (var i3 = first; i3 < last; i3++) { + var a2 = coords[(i3 - 1 + coords.length) % coords.length]; + var origin = coords[i3]; + var b2 = coords[(i3 + 1) % coords.length]; + var normalizedDotP = geoOrthoNormalizedDotProduct(a2, b2, origin); var angle2 = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI; if (angle2 > 45) angle2 = 90 - angle2; @@ -22200,11 +22619,11 @@ var last = isClosed ? coords.length : coords.length - 1; var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); var upperThreshold = Math.cos(threshold * Math.PI / 180); - for (var i2 = first; i2 < last; i2++) { - var a = coords[(i2 - 1 + coords.length) % coords.length]; - var origin = coords[i2]; - var b = coords[(i2 + 1) % coords.length]; - var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold, allowStraightAngles); + for (var i3 = first; i3 < last; i3++) { + var a2 = coords[(i3 - 1 + coords.length) % coords.length]; + var origin = coords[i3]; + var b2 = coords[(i3 + 1) % coords.length]; + var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a2, b2, origin), epsilon3, lowerThreshold, upperThreshold, allowStraightAngles); if (dotp === null) continue; if (Math.abs(dotp) > 0) @@ -22215,63 +22634,63 @@ } // modules/util/array.js - function utilArrayIdentical(a, b) { - if (a === b) + function utilArrayIdentical(a2, b2) { + if (a2 === b2) return true; - var i2 = a.length; - if (i2 !== b.length) + var i3 = a2.length; + if (i3 !== b2.length) return false; - while (i2--) { - if (a[i2] !== b[i2]) + while (i3--) { + if (a2[i3] !== b2[i3]) return false; } return true; } - function utilArrayDifference(a, b) { - var other = new Set(b); - return Array.from(new Set(a)).filter(function(v) { - return !other.has(v); + function utilArrayDifference(a2, b2) { + var other = new Set(b2); + return Array.from(new Set(a2)).filter(function(v2) { + return !other.has(v2); }); } - function utilArrayIntersection(a, b) { - var other = new Set(b); - return Array.from(new Set(a)).filter(function(v) { - return other.has(v); + function utilArrayIntersection(a2, b2) { + var other = new Set(b2); + return Array.from(new Set(a2)).filter(function(v2) { + return other.has(v2); }); } - function utilArrayUnion(a, b) { - var result = new Set(a); - b.forEach(function(v) { - result.add(v); + function utilArrayUnion(a2, b2) { + var result = new Set(a2); + b2.forEach(function(v2) { + result.add(v2); }); return Array.from(result); } - function utilArrayUniq(a) { - return Array.from(new Set(a)); + function utilArrayUniq(a2) { + return Array.from(new Set(a2)); } - function utilArrayChunk(a, chunkSize) { + function utilArrayChunk(a2, chunkSize) { if (!chunkSize || chunkSize < 0) - return [a.slice()]; - var result = new Array(Math.ceil(a.length / chunkSize)); - return Array.from(result, function(item, i2) { - return a.slice(i2 * chunkSize, i2 * chunkSize + chunkSize); + return [a2.slice()]; + var result = new Array(Math.ceil(a2.length / chunkSize)); + return Array.from(result, function(item, i3) { + return a2.slice(i3 * chunkSize, i3 * chunkSize + chunkSize); }); } - function utilArrayFlatten(a) { - return a.reduce(function(acc, val) { + function utilArrayFlatten(a2) { + return a2.reduce(function(acc, val) { return acc.concat(val); }, []); } - function utilArrayGroupBy(a, key) { - return a.reduce(function(acc, item) { + function utilArrayGroupBy(a2, key) { + return a2.reduce(function(acc, item) { var group = typeof key === "function" ? key(item) : item[key]; (acc[group] = acc[group] || []).push(item); return acc; }, {}); } - function utilArrayUniqBy(a, key) { + function utilArrayUniqBy(a2, key) { var seen = /* @__PURE__ */ new Set(); - return a.reduce(function(acc, item) { + return a2.reduce(function(acc, item) { var val = typeof key === "function" ? key(item) : item[key]; if (val && !seen.has(val)) { seen.add(val); @@ -22297,24 +22716,24 @@ if (arabicRegex.test(inputText)) { inputText = (0, import_alif_toolkit.WordShaper)(inputText); } - for (var n2 = 0; n2 < inputText.length; n2++) { - var c = inputText[n2]; - if (arabicMath.test(c)) { + for (var n3 = 0; n3 < inputText.length; n3++) { + var c2 = inputText[n3]; + if (arabicMath.test(c2)) { ret += rtlBuffer.reverse().join(""); - rtlBuffer = [c]; + rtlBuffer = [c2]; } else { if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) { ret += rtlBuffer.reverse().join(""); rtlBuffer = []; } - if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) { - rtlBuffer[rtlBuffer.length - 1] += c; - } else if (rtlRegex.test(c) || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) { - rtlBuffer.push(c); - } else if (c === " " && rtlBuffer.length) { + if ((thaanaVowel.test(c2) || hebrewSign.test(c2) || arabicDiacritics.test(c2)) && rtlBuffer.length) { + rtlBuffer[rtlBuffer.length - 1] += c2; + } else if (rtlRegex.test(c2) || c2.charCodeAt(0) >= 64336 && c2.charCodeAt(0) <= 65023 || c2.charCodeAt(0) >= 65136 && c2.charCodeAt(0) <= 65279) { + rtlBuffer.push(c2); + } else if (c2 === " " && rtlBuffer.length) { rtlBuffer = [rtlBuffer.reverse().join("") + " "]; } else { - ret += rtlBuffer.reverse().join("") + c; + ret += rtlBuffer.reverse().join("") + c2; rtlBuffer = []; } } @@ -22327,48 +22746,81 @@ var _storage; try { _storage = localStorage; - } catch (e) { + } catch (e3) { } _storage = _storage || (() => { - let s = {}; + let s2 = {}; return { - getItem: (k) => s[k], - setItem: (k, v) => s[k] = v, - removeItem: (k) => delete s[k] + getItem: (k2) => s2[k2], + setItem: (k2, v2) => s2[k2] = v2, + removeItem: (k2) => delete s2[k2] }; })(); var _listeners = {}; - function corePreferences(k, v) { + function corePreferences(k2, v2) { try { - if (v === void 0) - return _storage.getItem(k); - else if (v === null) - _storage.removeItem(k); + if (v2 === void 0) + return _storage.getItem(k2); + else if (v2 === null) + _storage.removeItem(k2); else - _storage.setItem(k, v); - if (_listeners[k]) { - _listeners[k].forEach((handler) => handler(v)); + _storage.setItem(k2, v2); + if (_listeners[k2]) { + _listeners[k2].forEach((handler) => handler(v2)); } return true; - } catch (e) { + } catch (e3) { if (typeof console !== "undefined") { console.error("localStorage quota exceeded"); } return false; } } - corePreferences.onChange = function(k, handler) { - _listeners[k] = _listeners[k] || []; - _listeners[k].push(handler); + corePreferences.onChange = function(k2, handler) { + _listeners[k2] = _listeners[k2] || []; + _listeners[k2].push(handler); }; // modules/core/file_fetcher.js var import_vparse = __toESM(require_vparse()); + // config/id.js + var presetsCdnUrl = "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@{presets_version}/"; + var ociCdnUrl = "https://cdn.jsdelivr.net/npm/osm-community-index@{version}/"; + var wmfSitematrixCdnUrl = "https://cdn.jsdelivr.net/npm/wmf-sitematrix@{version}/"; + var nsiCdnUrl = "https://cdn.jsdelivr.net/npm/name-suggestion-index@{version}/"; + var defaultOsmApiConnections = { + live: { + url: "https://www.openstreetmap.org", + client_id: "0tmNTmd0Jo1dQp4AUmMBLtGiD9YpMuXzHefitcuVStc", + client_secret: "BTlNrNxIPitHdL4sP2clHw5KLoee9aKkA7dQbc0Bj7Q" + }, + dev: { + url: "https://api06.dev.openstreetmap.org", + client_id: "Ee1wWJ6UlpERbF6BfTNOpwn0R8k_06mvMXdDUkeHMgw", + client_secret: "OnfWFC-JkZNHyYdr_viNn_h_RTZXRslKcUxllOXqf5g" + } + }; + var osmApiConnections = []; + if (false) { + osmApiConnections.push({ + url: null, + client_id: null, + client_secret: null + }); + } else if (false) { + osmApiConnections.push(defaultOsmApiConnections[null]); + } else { + osmApiConnections.push(defaultOsmApiConnections.live); + osmApiConnections.push(defaultOsmApiConnections.dev); + } + var taginfoApiUrl = "https://taginfo.openstreetmap.org/api/4/"; + var nominatimApiUrl = "https://nominatim.openstreetmap.org/"; + // package.json var package_default = { name: "iD", - version: "2.22.0", + version: "2.27.0", description: "A friendly editor for OpenStreetMap", main: "dist/iD.min.js", repository: "github:openstreetmap/iD", @@ -22384,13 +22836,13 @@ build: "run-s build:css build:data build:js", "build:css": "node scripts/build_css.js", "build:data": "shx mkdir -p dist/data && node scripts/build_data.js", - "build:stats": "esbuild-visualizer --metadata dist/esbuild.json --exclude *.png --filename docs/statistics.html", + "build:stats": "node config/esbuild.config.mjs --stats && esbuild-visualizer --metadata dist/esbuild.json --exclude *.png --filename docs/statistics.html && shx rm dist/esbuild.json", "build:js": "node config/esbuild.config.mjs", "build:js:watch": "node config/esbuild.config.mjs --watch", clean: "shx rm -f dist/esbuild.json dist/*.js dist/*.map dist/*.css dist/img/*.svg", dist: "run-p dist:**", "dist:mapillary": "shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/", - "dist:pannellum": "shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/", + "dist:pannellum": "shx mkdir -p dist/pannellum && shx cp -R node_modules/pannellum/build/* dist/pannellum/", "dist:min": "node config/esbuild.config.min.mjs", "dist:svg:iD": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "iD-%s" --symbol-sprite dist/img/iD-sprite.svg "svg/iD-sprite/**/*.svg"', "dist:svg:community": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "community-%s" --symbol-sprite dist/img/community-sprite.svg node_modules/osm-community-index/dist/img/*.svg', @@ -22398,82 +22850,88 @@ "dist:svg:maki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "maki-%s" --symbol-sprite dist/img/maki-sprite.svg node_modules/@mapbox/maki/icons/*.svg', "dist:svg:mapillary:signs": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg", "dist:svg:mapillary:objects": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-object-sprite.svg node_modules/mapillary_sprite_source/package_objects/*.svg", - "dist:svg:temaki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "temaki-%s" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg', + "dist:svg:roentgen": 'svg-sprite --shape-id-generator "roentgen-%s" --shape-dim-width 16 --shape-dim-height 16 --symbol --symbol-dest . --symbol-sprite dist/img/roentgen-sprite.svg svg/roentgen/*.svg', + "dist:svg:temaki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "temaki-%s" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@rapideditor/temaki/icons/*.svg', imagery: "node scripts/update_imagery.js", - lint: "eslint scripts test/spec modules", + lint: "eslint config scripts test/spec modules --ext js,mjs", "lint:fix": "eslint scripts test/spec modules --fix", - start: "run-s build:js start:server", + start: "run-s start:watch", + "start:single-build": "run-p build:js start:server", "start:watch": "run-p build:js:watch start:server", "start:server": "node scripts/server.js", test: "npm-run-all -s lint build test:spec", - "test:spec": "karma start karma.conf.js", + "test:spec": "karma start config/karma.conf.js", translations: "node scripts/update_locales.js" }, dependencies: { - "@ideditor/country-coder": "~5.0.3", - "@ideditor/location-conflation": "~1.0.2", "@mapbox/geojson-area": "^0.2.2", "@mapbox/sexagesimal": "1.2.0", "@mapbox/vector-tile": "^1.3.1", - "@tmcw/togeojson": "^5.2.1", + "@rapideditor/country-coder": "~5.2.0", + "@rapideditor/location-conflation": "~1.2.1", + "@tmcw/togeojson": "^5.8.1", + "@turf/bbox": "^6.0.0", "@turf/bbox-clip": "^6.0.0", - "abortcontroller-polyfill": "^1.4.0", + "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.2.9", - "core-js-bundle": "^3.19.0", + "core-js-bundle": "^3.32.0", diacritics: "1.3.0", + exifr: "^7.1.3", "fast-deep-equal": "~3.1.1", "fast-json-stable-stringify": "2.1.0", "lodash-es": "~4.17.15", - marked: "~4.1.0", + marked: "~7.0.3", "node-diff3": "~3.1.0", - "osm-auth": "~2.0.0", + "osm-auth": "~2.2.0", pannellum: "2.5.6", pbf: "^3.2.1", "polygon-clipping": "~0.15.1", rbush: "3.0.1", - "whatwg-fetch": "^3.4.1", - "which-polygon": "2.2.0" + "whatwg-fetch": "^3.6.17", + "which-polygon": "2.2.1" }, devDependencies: { - "@fortawesome/fontawesome-svg-core": "~6.2.0", - "@fortawesome/free-brands-svg-icons": "~6.2.0", - "@fortawesome/free-regular-svg-icons": "~6.2.0", - "@fortawesome/free-solid-svg-icons": "~6.2.0", - "@ideditor/temaki": "~5.1.0", - "@mapbox/maki": "^8.0.0", - autoprefixer: "^10.0.1", - btoa: "^1.2.1", - chai: "^4.3.4", + "@fortawesome/fontawesome-svg-core": "~6.4.2", + "@fortawesome/free-brands-svg-icons": "~6.4.2", + "@fortawesome/free-regular-svg-icons": "~6.4.2", + "@fortawesome/free-solid-svg-icons": "~6.4.2", + "@mapbox/maki": "^8.0.1", + "@openstreetmap/id-tagging-schema": "^6.3.0", + "@rapideditor/temaki": "~5.4.0", + "@transifex/api": "^5.4.0", + autoprefixer: "^10.4.15", + chai: "^4.3.7", chalk: "^4.1.2", - "cldr-core": "^41.0.0", - "cldr-localenames-full": "^41.0.0", + "cldr-core": "^43.0.0", + "cldr-localenames-full": "^43.1.0", "concat-files": "^0.1.1", - d3: "~7.6.1", + d3: "~7.8.5", + dotenv: "^16.3.1", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - esbuild: "^0.15.7", - "esbuild-visualizer": "^0.3.1", - eslint: "^8.8.0", + esbuild: "^0.19.2", + "esbuild-visualizer": "^0.4.1", + eslint: "^8.47.0", "fetch-mock": "^9.11.0", gaze: "^1.1.3", - glob: "^8.0.3", + glob: "^10.3.3", happen: "^0.3.2", "js-yaml": "^4.0.0", "json-stringify-pretty-compact": "^3.0.0", - karma: "^6.3.5", - "karma-chrome-launcher": "^3.1.0", + karma: "^6.4.2", + "karma-chrome-launcher": "^3.2.0", "karma-coverage": "2.1.1", "karma-mocha": "^2.0.1", "karma-remap-istanbul": "^0.6.0", mapillary_sprite_source: "^1.8.0", "mapillary-js": "4.1.1", - minimist: "^1.2.3", - mocha: "^10.0.0", + minimist: "^1.2.8", + mocha: "^10.2.0", "name-suggestion-index": "~6.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.12", "npm-run-all": "^4.0.0", - "osm-community-index": "~5.2.0", - postcss: "^8.1.1", + "osm-community-index": "~5.5.4", + postcss: "^8.4.27", "postcss-selector-prepend": "^0.5.0", shelljs: "^0.8.0", shx: "^0.3.0", @@ -22481,7 +22939,7 @@ "sinon-chai": "^3.7.0", smash: "0.0", "static-server": "^2.2.1", - "svg-sprite": "1.5.4", + "svg-sprite": "2.0.2", vparse: "~1.1.0" }, engines: { @@ -22496,31 +22954,33 @@ var _mainFileFetcher = coreFileFetcher(); function coreFileFetcher() { const ociVersion = package_default.dependencies["osm-community-index"] || package_default.devDependencies["osm-community-index"]; - const v = (0, import_vparse.default)(ociVersion); - const vMinor = `${v.major}.${v.minor}`; + const v2 = (0, import_vparse.default)(ociVersion); + const ociVersionMinor = `${v2.major}.${v2.minor}`; + const presetsVersion = package_default.devDependencies["@openstreetmap/id-tagging-schema"]; let _this = {}; let _inflight4 = {}; let _fileMap = { "address_formats": "data/address_formats.min.json", - "deprecated": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/deprecated.min.json", - "discarded": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/discarded.min.json", "imagery": "data/imagery.min.json", "intro_graph": "data/intro_graph.min.json", "keepRight": "data/keepRight.min.json", "languages": "data/languages.min.json", "locales": "locales/index.min.json", - "oci_defaults": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/defaults.min.json`, - "oci_features": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/featureCollection.min.json`, - "oci_resources": `https://cdn.jsdelivr.net/npm/osm-community-index@${vMinor}/dist/resources.min.json`, - "preset_categories": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_categories.min.json", - "preset_defaults": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_defaults.min.json", - "preset_fields": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/fields.min.json", - "preset_presets": "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/presets.min.json", "phone_formats": "data/phone_formats.min.json", "qa_data": "data/qa_data.min.json", "shortcuts": "data/shortcuts.min.json", "territory_languages": "data/territory_languages.min.json", - "wmf_sitematrix": "https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json" + "oci_defaults": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/defaults.min.json", + "oci_features": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/featureCollection.min.json", + "oci_resources": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/resources.min.json", + "presets_package": presetsCdnUrl.replace("{presets_version}", presetsVersion) + "package.json", + "deprecated": presetsCdnUrl + "dist/deprecated.min.json", + "discarded": presetsCdnUrl + "dist/discarded.min.json", + "preset_categories": presetsCdnUrl + "dist/preset_categories.min.json", + "preset_defaults": presetsCdnUrl + "dist/preset_defaults.min.json", + "preset_fields": presetsCdnUrl + "dist/fields.min.json", + "preset_presets": presetsCdnUrl + "dist/presets.min.json", + "wmf_sitematrix": wmfSitematrixCdnUrl.replace("{version}", "0.1") + "wikipedia.min.json" }; let _cachedData = {}; _this.cache = () => _cachedData; @@ -22533,6 +22993,16 @@ if (!url) { return Promise.reject(`Unknown data file for "${which}"`); } + if (url.includes("{presets_version}")) { + return _this.get("presets_package").then((result) => { + const presetsVersion2 = result.version; + return getUrl(url.replace("{presets_version}", presetsVersion2), which); + }); + } else { + return getUrl(url); + } + }; + function getUrl(url, which) { let prom = _inflight4[url]; if (!prom) { _inflight4[url] = prom = fetch(url).then((response) => { @@ -22555,7 +23025,7 @@ }); } return prom; - }; + } _this.fileMap = function(val) { if (!arguments.length) return _fileMap; @@ -22585,10 +23055,9 @@ return _this; } - // node_modules/@ideditor/country-coder/dist/country-coder.mjs + // node_modules/@rapideditor/country-coder/dist/country-coder.mjs var import_which_polygon = __toESM(require_which_polygon(), 1); - var type = "FeatureCollection"; - var features = [ + var borders_default = { type: "FeatureCollection", features: [ { type: "Feature", properties: { wikidata: "Q21", nameEn: "England", aliases: ["GB-ENG"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.03913, 51.13217], [-7.74976, 48.64773], [1.17405, 50.74239], [2.18458, 51.52087], [2.56575, 51.85301], [0.792, 57.56437], [-2.30613, 55.62698], [-2.17058, 55.45916], [-2.6095, 55.28488], [-2.63532, 55.19452], [-3.02906, 55.04606], [-3.09361, 54.94924], [-3.38407, 54.94278], [-4.1819, 54.57861], [-3.5082, 53.54318], [-3.08228, 53.25526], [-3.03675, 53.25092], [-2.92329, 53.19383], [-2.92022, 53.17685], [-2.98598, 53.15589], [-2.90649, 53.10964], [-2.87469, 53.12337], [-2.89131, 53.09374], [-2.83133, 52.99184], [-2.7251, 52.98389], [-2.72221, 52.92969], [-2.80549, 52.89428], [-2.85897, 52.94487], [-2.92401, 52.93836], [-2.97243, 52.9651], [-3.13576, 52.895], [-3.15744, 52.84947], [-3.16105, 52.79599], [-3.08734, 52.77504], [-3.01001, 52.76636], [-2.95581, 52.71794], [-3.01724, 52.72083], [-3.04398, 52.65435], [-3.13648, 52.58208], [-3.12926, 52.5286], [-3.09746, 52.53077], [-3.08662, 52.54811], [-3.00929, 52.57774], [-2.99701, 52.551], [-3.03603, 52.49969], [-3.13359, 52.49174], [-3.22971, 52.45344], [-3.22754, 52.42526], [-3.04687, 52.34504], [-2.95364, 52.3501], [-2.99701, 52.323], [-3.00785, 52.2753], [-3.09289, 52.20546], [-3.12638, 52.08114], [-2.97111, 51.90456], [-2.8818, 51.93196], [-2.78742, 51.88833], [-2.74277, 51.84367], [-2.66234, 51.83555], [-2.66336, 51.59504], [-3.20563, 51.31615], [-6.03913, 51.13217]]]] } }, { type: "Feature", properties: { wikidata: "Q22", nameEn: "Scotland", aliases: ["GB-SCT"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.792, 57.56437], [-0.3751, 61.32236], [-14.78497, 57.60709], [-6.82333, 55.83103], [-4.69044, 54.3629], [-3.38407, 54.94278], [-3.09361, 54.94924], [-3.02906, 55.04606], [-2.63532, 55.19452], [-2.6095, 55.28488], [-2.17058, 55.45916], [-2.30613, 55.62698], [0.792, 57.56437]]]] } }, { type: "Feature", properties: { wikidata: "Q25", nameEn: "Wales", aliases: ["GB-WLS"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.5082, 53.54318], [-5.37267, 53.63269], [-6.03913, 51.13217], [-3.20563, 51.31615], [-2.66336, 51.59504], [-2.66234, 51.83555], [-2.74277, 51.84367], [-2.78742, 51.88833], [-2.8818, 51.93196], [-2.97111, 51.90456], [-3.12638, 52.08114], [-3.09289, 52.20546], [-3.00785, 52.2753], [-2.99701, 52.323], [-2.95364, 52.3501], [-3.04687, 52.34504], [-3.22754, 52.42526], [-3.22971, 52.45344], [-3.13359, 52.49174], [-3.03603, 52.49969], [-2.99701, 52.551], [-3.00929, 52.57774], [-3.08662, 52.54811], [-3.09746, 52.53077], [-3.12926, 52.5286], [-3.13648, 52.58208], [-3.04398, 52.65435], [-3.01724, 52.72083], [-2.95581, 52.71794], [-3.01001, 52.76636], [-3.08734, 52.77504], [-3.16105, 52.79599], [-3.15744, 52.84947], [-3.13576, 52.895], [-2.97243, 52.9651], [-2.92401, 52.93836], [-2.85897, 52.94487], [-2.80549, 52.89428], [-2.72221, 52.92969], [-2.7251, 52.98389], [-2.83133, 52.99184], [-2.89131, 53.09374], [-2.87469, 53.12337], [-2.90649, 53.10964], [-2.98598, 53.15589], [-2.92022, 53.17685], [-2.92329, 53.19383], [-3.03675, 53.25092], [-3.08228, 53.25526], [-3.5082, 53.54318]]]] } }, @@ -22610,7 +23079,7 @@ { type: "Feature", properties: { wikidata: "Q7835", nameEn: "Crimea", country: "RU", groups: ["151", "150", "UN"], level: "subterritory", callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.5, 44], [36.4883, 45.0488], [36.475, 45.2411], [36.5049, 45.3136], [36.6545, 45.3417], [36.6645, 45.4514], [35.0498, 45.7683], [34.9601, 45.7563], [34.7991, 45.8101], [34.8015, 45.9005], [34.7548, 45.907], [34.6668, 45.9714], [34.6086, 45.9935], [34.5589, 45.9935], [34.5201, 45.951], [34.4873, 45.9427], [34.4415, 45.9599], [34.4122, 46.0025], [34.3391, 46.0611], [34.2511, 46.0532], [34.181, 46.068], [34.1293, 46.1049], [34.0731, 46.1177], [34.0527, 46.1084], [33.9155, 46.1594], [33.8523, 46.1986], [33.7972, 46.2048], [33.7405, 46.1855], [33.646, 46.2303], [33.6152, 46.2261], [33.6385, 46.1415], [33.6147, 46.1356], [33.5732, 46.1032], [33.5909, 46.0601], [33.5597, 46.0307], [31.5, 45.5], [33.5, 44]]]] } }, { type: "Feature", properties: { wikidata: "Q12837", nameEn: "Iberia", level: "sharedLandform" }, geometry: null }, { type: "Feature", properties: { wikidata: "Q14056", nameEn: "Jan Mayen", aliases: ["NO-22"], country: "NO", groups: ["SJ", "154", "150", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-9.18243, 72.23144], [-10.71459, 70.09565], [-5.93364, 70.76368], [-9.18243, 72.23144]]]] } }, - { type: "Feature", properties: { wikidata: "Q19188", nameEn: "Mainland China", country: "CN", groups: ["030", "142", "UN"], callingCodes: ["86"] }, geometry: { type: "MultiPolygon", coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.56434, 24.49266], [120.49232, 25.22863], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]] } }, + { type: "Feature", properties: { wikidata: "Q19188", nameEn: "Mainland China", country: "CN", groups: ["030", "142", "UN"], callingCodes: ["86"] }, geometry: { type: "MultiPolygon", coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.6333, 24.46259], [119.42295, 25.0886], [119.98511, 25.37624], [119.78816, 26.2348], [120.0693, 26.3959], [120.5128, 26.536], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]] } }, { type: "Feature", properties: { wikidata: "Q22890", nameEn: "Ireland", level: "sharedLandform" }, geometry: null }, { type: "Feature", properties: { wikidata: "Q23666", nameEn: "Great Britain", country: "GB", level: "sharedLandform" }, geometry: null }, { type: "Feature", properties: { wikidata: "Q23681", nameEn: "Northern Cyprus", groups: ["Q644636", "145", "142"], driveSide: "left", callingCodes: ["90 392"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.67678, 35.03866], [33.67742, 35.05963], [33.68474, 35.06602], [33.69095, 35.06237], [33.70861, 35.07644], [33.7161, 35.07279], [33.70209, 35.04882], [33.71482, 35.03722], [33.73824, 35.05321], [33.76106, 35.04253], [33.78581, 35.05104], [33.82067, 35.07826], [33.84168, 35.06823], [33.8541, 35.07201], [33.87479, 35.08881], [33.87097, 35.09389], [33.87622, 35.10457], [33.87224, 35.12293], [33.88561, 35.12449], [33.88943, 35.12007], [33.88737, 35.11408], [33.89853, 35.11377], [33.91789, 35.08688], [33.91299, 35.07579], [33.90247, 35.07686], [33.89485, 35.06873], [33.88367, 35.07877], [33.85261, 35.0574], [33.8355, 35.05777], [33.82051, 35.0667], [33.8012, 35.04786], [33.81524, 35.04192], [33.83055, 35.02865], [33.82875, 35.01685], [33.84045, 35.00616], [33.85216, 35.00579], [33.85891, 35.001], [33.85621, 34.98956], [33.83505, 34.98108], [33.84811, 34.97075], [33.86432, 34.97592], [33.90075, 34.96623], [33.98684, 34.76642], [35.48515, 34.70851], [35.51152, 36.10954], [32.82353, 35.70297], [32.46489, 35.48584], [32.60361, 35.16647], [32.64864, 35.19967], [32.70947, 35.18328], [32.70779, 35.14127], [32.85733, 35.07742], [32.86406, 35.1043], [32.94471, 35.09422], [33.01192, 35.15639], [33.08249, 35.17319], [33.11105, 35.15639], [33.15138, 35.19504], [33.27068, 35.16815], [33.3072, 35.16816], [33.31955, 35.18096], [33.35056, 35.18328], [33.34964, 35.17803], [33.35596, 35.17942], [33.35612, 35.17402], [33.36569, 35.17479], [33.3717, 35.1788], [33.37248, 35.18698], [33.38575, 35.2018], [33.4076, 35.20062], [33.41675, 35.16325], [33.46813, 35.10564], [33.48136, 35.0636], [33.47825, 35.04103], [33.45178, 35.02078], [33.45256, 35.00288], [33.47666, 35.00701], [33.48915, 35.06594], [33.53975, 35.08151], [33.57478, 35.06049], [33.567, 35.04803], [33.59658, 35.03635], [33.61215, 35.0527], [33.63765, 35.03869], [33.67678, 35.03866]]]] } }, @@ -22765,7 +23234,7 @@ { type: "Feature", properties: { iso1A2: "CD", iso1A3: "COD", iso1N3: "180", wikidata: "Q974", nameEn: "Democratic Republic of the Congo", aliases: ["ZR"], groups: ["017", "202", "002", "UN"], callingCodes: ["243"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.44012, 5.07349], [27.09575, 5.22305], [26.93064, 5.13535], [26.85579, 5.03887], [26.74572, 5.10685], [26.48595, 5.04984], [26.13371, 5.25594], [25.86073, 5.19455], [25.53271, 5.37431], [25.34558, 5.29101], [25.31256, 5.03668], [24.71816, 4.90509], [24.46719, 5.0915], [23.38847, 4.60013], [22.94817, 4.82392], [22.89094, 4.79321], [22.84691, 4.69887], [22.78526, 4.71423], [22.6928, 4.47285], [22.60915, 4.48821], [22.5431, 4.22041], [22.45504, 4.13039], [22.27682, 4.11347], [22.10721, 4.20723], [21.6405, 4.317], [21.55904, 4.25553], [21.25744, 4.33676], [21.21341, 4.29285], [21.11214, 4.33895], [21.08793, 4.39603], [20.90383, 4.44877], [20.60184, 4.42394], [18.62755, 3.47564], [18.63857, 3.19342], [18.10683, 2.26876], [18.08034, 1.58553], [17.85887, 1.04327], [17.86989, 0.58873], [17.95255, 0.48128], [17.93877, 0.32424], [17.81204, 0.23884], [17.66051, -0.26535], [17.72112, -0.52707], [17.32438, -0.99265], [16.97999, -1.12762], [16.70724, -1.45815], [16.50336, -1.8795], [16.16173, -2.16586], [16.22785, -2.59528], [16.1755, -3.25014], [16.21407, -3.2969], [15.89448, -3.9513], [15.53081, -4.042], [15.48121, -4.22062], [15.41785, -4.28381], [15.32693, -4.27282], [15.25411, -4.31121], [15.1978, -4.32388], [14.83101, -4.80838], [14.67948, -4.92093], [14.5059, -4.84956], [14.41499, -4.8825], [14.37366, -4.56125], [14.47284, -4.42941], [14.3957, -4.36623], [14.40672, -4.28381], [13.9108, -4.50906], [13.81162, -4.41842], [13.71794, -4.44864], [13.70417, -4.72601], [13.50305, -4.77818], [13.41764, -4.89897], [13.11182, -4.5942], [13.09648, -4.63739], [13.11195, -4.67745], [12.8733, -4.74346], [12.70868, -4.95505], [12.63465, -4.94632], [12.60251, -5.01715], [12.46297, -5.09408], [12.49815, -5.14058], [12.51589, -5.1332], [12.53586, -5.14658], [12.53599, -5.1618], [12.52301, -5.17481], [12.52318, -5.74353], [12.26557, -5.74031], [12.20376, -5.76338], [11.95767, -5.94705], [12.42245, -6.07585], [13.04371, -5.87078], [16.55507, -5.85631], [16.96282, -7.21787], [17.5828, -8.13784], [18.33635, -8.00126], [19.33698, -7.99743], [19.5469, -7.00195], [20.30218, -6.98955], [20.31846, -6.91953], [20.61689, -6.90876], [20.56263, -7.28566], [21.79824, -7.29628], [21.84856, -9.59871], [22.19039, -9.94628], [22.32604, -10.76291], [22.17954, -10.85884], [22.25951, -11.24911], [22.54205, -11.05784], [23.16602, -11.10577], [23.45631, -10.946], [23.86868, -11.02856], [24.00027, -10.89356], [24.34528, -11.06816], [24.42612, -11.44975], [25.34069, -11.19707], [25.33058, -11.65767], [26.01777, -11.91488], [26.88687, -12.01868], [27.04351, -11.61312], [27.22541, -11.60323], [27.21025, -11.76157], [27.59932, -12.22123], [28.33199, -12.41375], [29.01918, -13.41353], [29.60531, -13.21685], [29.65078, -13.41844], [29.81551, -13.44683], [29.8139, -12.14898], [29.48404, -12.23604], [29.4992, -12.43843], [29.18592, -12.37921], [28.48357, -11.87532], [28.37241, -11.57848], [28.65032, -10.65133], [28.62795, -9.92942], [28.68532, -9.78], [28.56208, -9.49122], [28.51627, -9.44726], [28.52636, -9.35379], [28.36562, -9.30091], [28.38526, -9.23393], [28.9711, -8.66935], [28.88917, -8.4831], [30.79243, -8.27382], [30.2567, -7.14121], [29.52552, -6.2731], [29.43673, -4.44845], [29.23708, -3.75856], [29.21463, -3.3514], [29.25633, -3.05471], [29.17258, -2.99385], [29.16037, -2.95457], [29.09797, -2.91935], [29.09119, -2.87871], [29.0505, -2.81774], [29.00404, -2.81978], [29.00167, -2.78523], [29.04081, -2.7416], [29.00357, -2.70596], [28.94346, -2.69124], [28.89793, -2.66111], [28.90226, -2.62385], [28.89288, -2.55848], [28.87943, -2.55165], [28.86193, -2.53185], [28.86209, -2.5231], [28.87497, -2.50887], [28.88846, -2.50493], [28.89342, -2.49017], [28.89132, -2.47557], [28.86846, -2.44866], [28.86826, -2.41888], [28.89601, -2.37321], [28.95642, -2.37321], [29.00051, -2.29001], [29.105, -2.27043], [29.17562, -2.12278], [29.11847, -1.90576], [29.24458, -1.69663], [29.24323, -1.66826], [29.36322, -1.50887], [29.45038, -1.5054], [29.53062, -1.40499], [29.59061, -1.39016], [29.58388, -0.89821], [29.63006, -0.8997], [29.62708, -0.71055], [29.67176, -0.55714], [29.67474, -0.47969], [29.65091, -0.46777], [29.72687, -0.08051], [29.7224, 0.07291], [29.77454, 0.16675], [29.81922, 0.16824], [29.87284, 0.39166], [29.97413, 0.52124], [29.95477, 0.64486], [29.98307, 0.84295], [30.1484, 0.89805], [30.22139, 0.99635], [30.24671, 1.14974], [30.48503, 1.21675], [31.30127, 2.11006], [31.28042, 2.17853], [31.20148, 2.2217], [31.1985, 2.29462], [31.12104, 2.27676], [31.07934, 2.30207], [31.06593, 2.35862], [30.96911, 2.41071], [30.91102, 2.33332], [30.83059, 2.42559], [30.74271, 2.43601], [30.75612, 2.5863], [30.8857, 2.83923], [30.8574, 2.9508], [30.77101, 3.04897], [30.84251, 3.26908], [30.93486, 3.40737], [30.94081, 3.50847], [30.85153, 3.48867], [30.85997, 3.5743], [30.80713, 3.60506], [30.78512, 3.67097], [30.56277, 3.62703], [30.57378, 3.74567], [30.55396, 3.84451], [30.47691, 3.83353], [30.27658, 3.95653], [30.22374, 3.93896], [30.1621, 4.10586], [30.06964, 4.13221], [29.79666, 4.37809], [29.82087, 4.56246], [29.49726, 4.7007], [29.43341, 4.50101], [29.22207, 4.34297], [29.03054, 4.48784], [28.8126, 4.48784], [28.6651, 4.42638], [28.20719, 4.35614], [27.79551, 4.59976], [27.76469, 4.79284], [27.65462, 4.89375], [27.56656, 4.89375], [27.44012, 5.07349]]]] } }, { type: "Feature", properties: { iso1A2: "CF", iso1A3: "CAF", iso1N3: "140", wikidata: "Q929", nameEn: "Central African Republic", groups: ["017", "202", "002", "UN"], callingCodes: ["236"] }, geometry: { type: "MultiPolygon", coordinates: [[[[22.87758, 10.91915], [22.45889, 11.00246], [21.72139, 10.64136], [21.71479, 10.29932], [21.63553, 10.217], [21.52766, 10.2105], [21.34934, 9.95907], [21.26348, 9.97642], [20.82979, 9.44696], [20.36748, 9.11019], [19.06421, 9.00367], [18.86388, 8.87971], [19.11044, 8.68172], [18.79783, 8.25929], [18.67455, 8.22226], [18.62612, 8.14163], [18.64153, 8.08714], [18.6085, 8.05009], [18.02731, 8.01085], [17.93926, 7.95853], [17.67288, 7.98905], [16.8143, 7.53971], [16.6668, 7.67281], [16.658, 7.75353], [16.59415, 7.76444], [16.58315, 7.88657], [16.41583, 7.77971], [16.40703, 7.68809], [15.79942, 7.44149], [15.73118, 7.52006], [15.49743, 7.52179], [15.23397, 7.25135], [15.04717, 6.77085], [14.96311, 6.75693], [14.79966, 6.39043], [14.80122, 6.34866], [14.74206, 6.26356], [14.56149, 6.18928], [14.43073, 6.08867], [14.42917, 6.00508], [14.49455, 5.91683], [14.60974, 5.91838], [14.62375, 5.70466], [14.58951, 5.59777], [14.62531, 5.51411], [14.52724, 5.28319], [14.57083, 5.23979], [14.65489, 5.21343], [14.73383, 4.6135], [15.00825, 4.41458], [15.08609, 4.30282], [15.10644, 4.1362], [15.17482, 4.05131], [15.07686, 4.01805], [15.73522, 3.24348], [15.77725, 3.26835], [16.05449, 3.02306], [16.08252, 2.45708], [16.19357, 2.21537], [16.50126, 2.84739], [16.46701, 2.92512], [16.57598, 3.47999], [16.68283, 3.54257], [17.01746, 3.55136], [17.35649, 3.63045], [17.46876, 3.70515], [17.60966, 3.63705], [17.83421, 3.61068], [17.85842, 3.53378], [18.05656, 3.56893], [18.14902, 3.54476], [18.17323, 3.47665], [18.24148, 3.50302], [18.2723, 3.57992], [18.39558, 3.58212], [18.49245, 3.63924], [18.58711, 3.49423], [18.62755, 3.47564], [20.60184, 4.42394], [20.90383, 4.44877], [21.08793, 4.39603], [21.11214, 4.33895], [21.21341, 4.29285], [21.25744, 4.33676], [21.55904, 4.25553], [21.6405, 4.317], [22.10721, 4.20723], [22.27682, 4.11347], [22.45504, 4.13039], [22.5431, 4.22041], [22.60915, 4.48821], [22.6928, 4.47285], [22.78526, 4.71423], [22.84691, 4.69887], [22.89094, 4.79321], [22.94817, 4.82392], [23.38847, 4.60013], [24.46719, 5.0915], [24.71816, 4.90509], [25.31256, 5.03668], [25.34558, 5.29101], [25.53271, 5.37431], [25.86073, 5.19455], [26.13371, 5.25594], [26.48595, 5.04984], [26.74572, 5.10685], [26.85579, 5.03887], [26.93064, 5.13535], [27.09575, 5.22305], [27.44012, 5.07349], [27.26886, 5.25876], [27.23017, 5.37167], [27.28621, 5.56382], [27.22705, 5.62889], [27.22705, 5.71254], [26.51721, 6.09655], [26.58259, 6.1987], [26.32729, 6.36272], [26.38022, 6.63493], [25.90076, 7.09549], [25.37461, 7.33024], [25.35281, 7.42595], [25.20337, 7.50312], [25.20649, 7.61115], [25.29214, 7.66675], [25.25319, 7.8487], [24.98855, 7.96588], [24.85156, 8.16933], [24.35965, 8.26177], [24.13238, 8.36959], [24.25691, 8.69288], [23.51905, 8.71749], [23.59065, 8.99743], [23.44744, 8.99128], [23.4848, 9.16959], [23.56263, 9.19418], [23.64358, 9.28637], [23.64981, 9.44303], [23.62179, 9.53823], [23.69155, 9.67566], [23.67164, 9.86923], [23.3128, 10.45214], [23.02221, 10.69235], [22.87758, 10.91915]]]] } }, { type: "Feature", properties: { iso1A2: "CG", iso1A3: "COG", iso1N3: "178", wikidata: "Q971", nameEn: "Republic of the Congo", groups: ["017", "202", "002", "UN"], callingCodes: ["242"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.62755, 3.47564], [18.58711, 3.49423], [18.49245, 3.63924], [18.39558, 3.58212], [18.2723, 3.57992], [18.24148, 3.50302], [18.17323, 3.47665], [18.14902, 3.54476], [18.05656, 3.56893], [17.85842, 3.53378], [17.83421, 3.61068], [17.60966, 3.63705], [17.46876, 3.70515], [17.35649, 3.63045], [17.01746, 3.55136], [16.68283, 3.54257], [16.57598, 3.47999], [16.46701, 2.92512], [16.50126, 2.84739], [16.19357, 2.21537], [16.15568, 2.18955], [16.08563, 2.19733], [16.05294, 1.9811], [16.14634, 1.70259], [16.02647, 1.65591], [16.02959, 1.76483], [15.48942, 1.98265], [15.34776, 1.91264], [15.22634, 2.03243], [15.00996, 1.98887], [14.61145, 2.17866], [13.29457, 2.16106], [13.13461, 1.57238], [13.25447, 1.32339], [13.15519, 1.23368], [13.89582, 1.4261], [14.25186, 1.39842], [14.48179, 0.9152], [14.26066, 0.57255], [14.10909, 0.58563], [13.88648, 0.26652], [13.90632, -0.2287], [14.06862, -0.20826], [14.2165, -0.38261], [14.41887, -0.44799], [14.52569, -0.57818], [14.41838, -1.89412], [14.25932, -1.97624], [14.23518, -2.15671], [14.16202, -2.23916], [14.23829, -2.33715], [14.10442, -2.49268], [13.85846, -2.46935], [13.92073, -2.35581], [13.75884, -2.09293], [13.47977, -2.43224], [13.02759, -2.33098], [12.82172, -1.91091], [12.61312, -1.8129], [12.44656, -1.92025], [12.47925, -2.32626], [12.04895, -2.41704], [11.96866, -2.33559], [11.74605, -2.39936], [11.57637, -2.33379], [11.64487, -2.61865], [11.5359, -2.85654], [11.64798, -2.81146], [11.80365, -3.00424], [11.70558, -3.0773], [11.70227, -3.17465], [11.96554, -3.30267], [11.8318, -3.5812], [11.92719, -3.62768], [11.87083, -3.71571], [11.68608, -3.68942], [11.57949, -3.52798], [11.48764, -3.51089], [11.22301, -3.69888], [11.12647, -3.94169], [10.75913, -4.39519], [11.50888, -5.33417], [12.00924, -5.02627], [12.16068, -4.90089], [12.20901, -4.75642], [12.25587, -4.79437], [12.32324, -4.78415], [12.40964, -4.60609], [12.64835, -4.55937], [12.76844, -4.38709], [12.87096, -4.40315], [12.91489, -4.47907], [13.09648, -4.63739], [13.11182, -4.5942], [13.41764, -4.89897], [13.50305, -4.77818], [13.70417, -4.72601], [13.71794, -4.44864], [13.81162, -4.41842], [13.9108, -4.50906], [14.40672, -4.28381], [14.3957, -4.36623], [14.47284, -4.42941], [14.37366, -4.56125], [14.41499, -4.8825], [14.5059, -4.84956], [14.67948, -4.92093], [14.83101, -4.80838], [15.1978, -4.32388], [15.25411, -4.31121], [15.32693, -4.27282], [15.41785, -4.28381], [15.48121, -4.22062], [15.53081, -4.042], [15.89448, -3.9513], [16.21407, -3.2969], [16.1755, -3.25014], [16.22785, -2.59528], [16.16173, -2.16586], [16.50336, -1.8795], [16.70724, -1.45815], [16.97999, -1.12762], [17.32438, -0.99265], [17.72112, -0.52707], [17.66051, -0.26535], [17.81204, 0.23884], [17.93877, 0.32424], [17.95255, 0.48128], [17.86989, 0.58873], [17.85887, 1.04327], [18.08034, 1.58553], [18.10683, 2.26876], [18.63857, 3.19342], [18.62755, 3.47564]]]] } }, - { type: "Feature", properties: { iso1A2: "CH", iso1A3: "CHE", iso1N3: "756", wikidata: "Q39", nameEn: "Switzerland", groups: ["155", "150", "UN"], callingCodes: ["41"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]] } }, + { type: "Feature", geometry: { type: "MultiPolygon", coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.35512, 47.57014], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]] }, properties: { iso1A2: "CH", iso1A3: "CHE", iso1N3: "756", wikidata: "Q39", nameEn: "Switzerland", groups: ["155", "150", "UN"], callingCodes: ["41"] } }, { type: "Feature", properties: { iso1A2: "CI", iso1A3: "CIV", iso1N3: "384", wikidata: "Q1008", nameEn: "C\xF4te d'Ivoire", groups: ["011", "202", "002", "UN"], callingCodes: ["225"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-7.52774, 3.7105], [-3.34019, 4.17519], [-3.10675, 5.08515], [-3.11073, 5.12675], [-3.063, 5.13665], [-2.96554, 5.10397], [-2.95261, 5.12477], [-2.75502, 5.10657], [-2.73074, 5.1364], [-2.77625, 5.34621], [-2.72737, 5.34789], [-2.76614, 5.60963], [-2.85378, 5.65156], [-2.93132, 5.62137], [-2.96671, 5.6415], [-2.95323, 5.71865], [-3.01896, 5.71697], [-3.25999, 6.62521], [-3.21954, 6.74407], [-3.23327, 6.81744], [-2.95438, 7.23737], [-2.97822, 7.27165], [-2.92339, 7.60847], [-2.79467, 7.86002], [-2.78395, 7.94974], [-2.74819, 7.92613], [-2.67787, 8.02055], [-2.61232, 8.02645], [-2.62901, 8.11495], [-2.49037, 8.20872], [-2.58243, 8.7789], [-2.66357, 9.01771], [-2.77799, 9.04949], [-2.69814, 9.22717], [-2.68802, 9.49343], [-2.76494, 9.40778], [-2.93012, 9.57403], [-3.00765, 9.74019], [-3.16609, 9.85147], [-3.19306, 9.93781], [-3.27228, 9.84981], [-3.31779, 9.91125], [-3.69703, 9.94279], [-4.25999, 9.76012], [-4.31392, 9.60062], [-4.6426, 9.70696], [-4.96621, 9.89132], [-4.96453, 9.99923], [-5.12465, 10.29788], [-5.39602, 10.2929], [-5.51058, 10.43177], [-5.65135, 10.46767], [-5.78124, 10.43952], [-5.99478, 10.19694], [-6.18851, 10.24244], [-6.1731, 10.46983], [-6.24795, 10.74248], [-6.325, 10.68624], [-6.40646, 10.69922], [-6.42847, 10.5694], [-6.52974, 10.59104], [-6.63541, 10.66893], [-6.68164, 10.35074], [-6.93921, 10.35291], [-7.01186, 10.25111], [-6.97444, 10.21644], [-7.00966, 10.15794], [-7.0603, 10.14711], [-7.13331, 10.24877], [-7.3707, 10.24677], [-7.44555, 10.44602], [-7.52261, 10.4655], [-7.54462, 10.40921], [-7.63048, 10.46334], [-7.92107, 10.15577], [-7.97971, 10.17117], [-8.01225, 10.1021], [-8.11921, 10.04577], [-8.15652, 9.94288], [-8.09434, 9.86936], [-8.14657, 9.55062], [-8.03463, 9.39604], [-7.85056, 9.41812], [-7.90777, 9.20456], [-7.73862, 9.08422], [-7.92518, 8.99332], [-7.95503, 8.81146], [-7.69882, 8.66148], [-7.65653, 8.36873], [-7.92518, 8.50652], [-8.22991, 8.48438], [-8.2411, 8.24196], [-8.062, 8.16071], [-7.98675, 8.20134], [-7.99919, 8.11023], [-7.94695, 8.00925], [-8.06449, 8.04989], [-8.13414, 7.87991], [-8.09931, 7.78626], [-8.21374, 7.54466], [-8.4003, 7.6285], [-8.47114, 7.55676], [-8.41935, 7.51203], [-8.37458, 7.25794], [-8.29249, 7.1691], [-8.31736, 6.82837], [-8.59456, 6.50612], [-8.48652, 6.43797], [-8.45666, 6.49977], [-8.38453, 6.35887], [-8.3298, 6.36381], [-8.17557, 6.28222], [-8.00642, 6.31684], [-7.90692, 6.27728], [-7.83478, 6.20309], [-7.8497, 6.08932], [-7.79747, 6.07696], [-7.78254, 5.99037], [-7.70294, 5.90625], [-7.67309, 5.94337], [-7.48155, 5.80974], [-7.46165, 5.84934], [-7.43677, 5.84687], [-7.43926, 5.74787], [-7.37209, 5.61173], [-7.43428, 5.42355], [-7.36463, 5.32944], [-7.46165, 5.26256], [-7.48901, 5.14118], [-7.55369, 5.08667], [-7.53876, 4.94294], [-7.59349, 4.8909], [-7.53259, 4.35145], [-7.52774, 3.7105]]]] } }, { type: "Feature", properties: { iso1A2: "CK", iso1A3: "COK", iso1N3: "184", wikidata: "Q26988", nameEn: "Cook Islands", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["682"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-168.15106, -10.26955], [-156.45576, -31.75456], [-156.48634, -15.52824], [-156.50903, -7.4975], [-168.15106, -10.26955]]]] } }, { type: "Feature", properties: { iso1A2: "CL", iso1A3: "CHL", iso1N3: "152", wikidata: "Q298", nameEn: "Chile", groups: ["005", "419", "019", "UN"], callingCodes: ["56"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-68.60702, -52.65781], [-68.41683, -52.33516], [-69.97824, -52.00845], [-71.99889, -51.98018], [-72.33873, -51.59954], [-72.31343, -50.58411], [-73.15765, -50.78337], [-73.55259, -49.92488], [-73.45156, -49.79461], [-73.09655, -49.14342], [-72.56894, -48.81116], [-72.54042, -48.52392], [-72.27662, -48.28727], [-72.50478, -47.80586], [-71.94152, -47.13595], [-71.68577, -46.55385], [-71.75614, -45.61611], [-71.35687, -45.22075], [-72.06985, -44.81756], [-71.26418, -44.75684], [-71.16436, -44.46244], [-71.81318, -44.38097], [-71.64206, -43.64774], [-72.14828, -42.85321], [-72.15541, -42.15941], [-71.74901, -42.11711], [-71.92726, -40.72714], [-71.37826, -38.91474], [-70.89532, -38.6923], [-71.24279, -37.20264], [-70.95047, -36.4321], [-70.38008, -36.02375], [-70.49416, -35.24145], [-69.87386, -34.13344], [-69.88099, -33.34489], [-70.55832, -31.51559], [-70.14479, -30.36595], [-69.8596, -30.26131], [-69.99507, -29.28351], [-69.80969, -29.07185], [-69.66709, -28.44055], [-69.22504, -27.95042], [-68.77586, -27.16029], [-68.43363, -27.08414], [-68.27677, -26.90626], [-68.59048, -26.49861], [-68.56909, -26.28146], [-68.38372, -26.15353], [-68.57622, -25.32505], [-68.38372, -25.08636], [-68.56909, -24.69831], [-68.24825, -24.42596], [-67.33563, -24.04237], [-66.99632, -22.99839], [-67.18382, -22.81525], [-67.54284, -22.89771], [-67.85114, -22.87076], [-68.18816, -21.28614], [-68.40403, -20.94562], [-68.53957, -20.91542], [-68.55383, -20.7355], [-68.44023, -20.62701], [-68.7276, -20.46178], [-68.74273, -20.08817], [-68.57132, -20.03134], [-68.54611, -19.84651], [-68.66761, -19.72118], [-68.41218, -19.40499], [-68.61989, -19.27584], [-68.80602, -19.08355], [-68.87082, -19.06003], [-68.94987, -18.93302], [-69.07432, -18.28259], [-69.14807, -18.16893], [-69.07496, -18.03715], [-69.28671, -17.94844], [-69.34126, -17.72753], [-69.46623, -17.60518], [-69.46897, -17.4988], [-69.66483, -17.65083], [-69.79087, -17.65563], [-69.82868, -17.72048], [-69.75305, -17.94605], [-69.81607, -18.12582], [-69.96732, -18.25992], [-70.16394, -18.31737], [-70.31267, -18.31258], [-70.378, -18.3495], [-70.59118, -18.35072], [-113.52687, -26.52828], [-68.11646, -58.14883], [-66.07313, -55.19618], [-67.11046, -54.94199], [-67.46182, -54.92205], [-68.01394, -54.8753], [-68.60733, -54.9125], [-68.60702, -52.65781]]]] } }, @@ -22830,7 +23299,7 @@ { type: "Feature", properties: { iso1A2: "HU", iso1A3: "HUN", iso1N3: "348", wikidata: "Q28", nameEn: "Hungary", groups: ["EU", "151", "150", "UN"], callingCodes: ["36"] }, geometry: { type: "MultiPolygon", coordinates: [[[[21.72525, 48.34628], [21.67134, 48.3989], [21.6068, 48.50365], [21.44063, 48.58456], [21.11516, 48.49546], [20.83248, 48.5824], [20.5215, 48.53336], [20.29943, 48.26104], [20.24312, 48.2784], [19.92452, 48.1283], [19.63338, 48.25006], [19.52489, 48.19791], [19.47957, 48.09437], [19.28182, 48.08336], [19.23924, 48.0595], [19.01952, 48.07052], [18.82176, 48.04206], [18.76134, 47.97499], [18.76821, 47.87469], [18.8506, 47.82308], [18.74074, 47.8157], [18.66521, 47.76772], [18.56496, 47.76588], [18.29305, 47.73541], [18.02938, 47.75665], [17.71215, 47.7548], [17.23699, 48.02094], [17.16001, 48.00636], [17.09786, 47.97336], [17.11022, 47.92461], [17.08275, 47.87719], [17.00997, 47.86245], [17.07039, 47.81129], [17.05048, 47.79377], [17.08893, 47.70928], [16.87538, 47.68895], [16.86509, 47.72268], [16.82938, 47.68432], [16.7511, 47.67878], [16.72089, 47.73469], [16.65679, 47.74197], [16.61183, 47.76171], [16.54779, 47.75074], [16.53514, 47.73837], [16.55129, 47.72268], [16.4222, 47.66537], [16.58699, 47.61772], [16.64193, 47.63114], [16.71059, 47.52692], [16.64821, 47.50155], [16.6718, 47.46139], [16.57152, 47.40868], [16.52414, 47.41007], [16.49908, 47.39416], [16.45104, 47.41181], [16.47782, 47.25918], [16.44142, 47.25079], [16.43663, 47.21127], [16.41739, 47.20649], [16.42801, 47.18422], [16.4523, 47.18812], [16.46442, 47.16845], [16.44932, 47.14418], [16.52863, 47.13974], [16.46134, 47.09395], [16.52176, 47.05747], [16.43936, 47.03548], [16.51369, 47.00084], [16.28202, 47.00159], [16.27594, 46.9643], [16.22403, 46.939], [16.19904, 46.94134], [16.10983, 46.867], [16.14365, 46.8547], [16.15711, 46.85434], [16.21892, 46.86961], [16.2365, 46.87775], [16.2941, 46.87137], [16.34547, 46.83836], [16.3408, 46.80641], [16.31303, 46.79838], [16.30966, 46.7787], [16.37816, 46.69975], [16.42641, 46.69228], [16.41863, 46.66238], [16.38594, 46.6549], [16.39217, 46.63673], [16.50139, 46.56684], [16.52885, 46.53303], [16.52604, 46.5051], [16.59527, 46.47524], [16.6639, 46.45203], [16.7154, 46.39523], [16.8541, 46.36255], [16.8903, 46.28122], [17.14592, 46.16697], [17.35672, 45.95209], [17.56821, 45.93728], [17.66545, 45.84207], [17.87377, 45.78522], [17.99805, 45.79671], [18.08869, 45.76511], [18.12439, 45.78905], [18.44368, 45.73972], [18.57483, 45.80772], [18.6792, 45.92057], [18.80211, 45.87995], [18.81394, 45.91329], [18.99712, 45.93537], [19.01284, 45.96529], [19.0791, 45.96458], [19.10388, 46.04015], [19.14543, 45.9998], [19.28826, 45.99694], [19.52473, 46.1171], [19.56113, 46.16824], [19.66007, 46.19005], [19.81491, 46.1313], [19.93508, 46.17553], [20.01816, 46.17696], [20.03533, 46.14509], [20.09713, 46.17315], [20.26068, 46.12332], [20.28324, 46.1438], [20.35573, 46.16629], [20.45377, 46.14405], [20.49718, 46.18721], [20.63863, 46.12728], [20.76085, 46.21002], [20.74574, 46.25467], [20.86797, 46.28884], [21.06572, 46.24897], [21.16872, 46.30118], [21.28061, 46.44941], [21.26929, 46.4993], [21.33214, 46.63035], [21.43926, 46.65109], [21.5151, 46.72147], [21.48935, 46.7577], [21.52028, 46.84118], [21.59307, 46.86935], [21.59581, 46.91628], [21.68645, 46.99595], [21.648, 47.03902], [21.78395, 47.11104], [21.94463, 47.38046], [22.01055, 47.37767], [22.03389, 47.42508], [22.00917, 47.50492], [22.31816, 47.76126], [22.41979, 47.7391], [22.46559, 47.76583], [22.67247, 47.7871], [22.76617, 47.8417], [22.77991, 47.87211], [22.89849, 47.95851], [22.84276, 47.98602], [22.87847, 48.04665], [22.81804, 48.11363], [22.73427, 48.12005], [22.66835, 48.09162], [22.58733, 48.10813], [22.59007, 48.15121], [22.49806, 48.25189], [22.38133, 48.23726], [22.2083, 48.42534], [22.14689, 48.4005], [21.83339, 48.36242], [21.8279, 48.33321], [21.72525, 48.34628]]]] } }, { type: "Feature", properties: { iso1A2: "IC", wikidata: "Q5813", nameEn: "Canary Islands", country: "ES", groups: ["Q3320166", "Q105472", "EU", "039", "150", "UN"], isoStatus: "excRes", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-12.00985, 30.24121], [-25.3475, 27.87574], [-14.43883, 27.02969], [-12.00985, 30.24121]]]] } }, { type: "Feature", properties: { iso1A2: "ID", iso1A3: "IDN", iso1N3: "360", wikidata: "Q252", nameEn: "Indonesia", aliases: ["RI"] }, geometry: null }, - { type: "Feature", properties: { iso1A2: "IE", iso1A3: "IRL", iso1N3: "372", wikidata: "Q27", nameEn: "Republic of Ireland", groups: ["EU", "Q22890", "154", "150", "UN"], driveSide: "left", callingCodes: ["353"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-22.01468, 48.19557], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]] } }, + { type: "Feature", geometry: { type: "MultiPolygon", coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-11.75, 54], [-11, 51], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]] }, properties: { iso1A2: "IE", iso1A3: "IRL", iso1N3: "372", wikidata: "Q27", nameEn: "Republic of Ireland", groups: ["EU", "Q22890", "154", "150", "UN"], driveSide: "left", callingCodes: ["353"] } }, { type: "Feature", properties: { iso1A2: "IL", iso1A3: "ISR", iso1N3: "376", wikidata: "Q801", nameEn: "Israel", groups: ["145", "142", "UN"], callingCodes: ["972"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.052, 31.46619], [34.29262, 31.70393], [34.48681, 31.59711], [34.56797, 31.54197], [34.48892, 31.48365], [34.40077, 31.40926], [34.36505, 31.36404], [34.37381, 31.30598], [34.36523, 31.28963], [34.29417, 31.24194], [34.26742, 31.21998], [34.92298, 29.45305], [34.97718, 29.54294], [34.98207, 29.58147], [35.02147, 29.66343], [35.14108, 30.07374], [35.19183, 30.34636], [35.16218, 30.43535], [35.19595, 30.50297], [35.21379, 30.60401], [35.29311, 30.71365], [35.33456, 30.81224], [35.33984, 30.8802], [35.41371, 30.95565], [35.43658, 31.12444], [35.40316, 31.25535], [35.47672, 31.49578], [35.39675, 31.49572], [35.22921, 31.37445], [35.13033, 31.3551], [35.02459, 31.35979], [34.92571, 31.34337], [34.88932, 31.37093], [34.87833, 31.39321], [34.89756, 31.43891], [34.93258, 31.47816], [34.94356, 31.50743], [34.9415, 31.55601], [34.95249, 31.59813], [35.00879, 31.65426], [35.08226, 31.69107], [35.10782, 31.71594], [35.11895, 31.71454], [35.12933, 31.7325], [35.13931, 31.73012], [35.15119, 31.73634], [35.15474, 31.73352], [35.16478, 31.73242], [35.18023, 31.72067], [35.20538, 31.72388], [35.21937, 31.71578], [35.22392, 31.71899], [35.23972, 31.70896], [35.24315, 31.71244], [35.2438, 31.7201], [35.24981, 31.72543], [35.25182, 31.73945], [35.26319, 31.74846], [35.25225, 31.7678], [35.26058, 31.79064], [35.25573, 31.81362], [35.26404, 31.82567], [35.251, 31.83085], [35.25753, 31.8387], [35.24816, 31.8458], [35.2304, 31.84222], [35.2249, 31.85433], [35.22817, 31.8638], [35.22567, 31.86745], [35.22294, 31.87889], [35.22014, 31.88264], [35.2136, 31.88241], [35.21276, 31.88153], [35.21016, 31.88237], [35.20945, 31.8815], [35.20791, 31.8821], [35.20673, 31.88151], [35.20381, 31.86716], [35.21128, 31.863], [35.216, 31.83894], [35.21469, 31.81835], [35.19461, 31.82687], [35.18169, 31.82542], [35.18603, 31.80901], [35.14174, 31.81325], [35.07677, 31.85627], [35.05617, 31.85685], [35.01978, 31.82944], [34.9724, 31.83352], [34.99712, 31.85569], [35.03489, 31.85919], [35.03978, 31.89276], [35.03489, 31.92448], [35.00124, 31.93264], [34.98682, 31.96935], [35.00261, 32.027], [34.9863, 32.09551], [34.99437, 32.10962], [34.98507, 32.12606], [34.99039, 32.14626], [34.96009, 32.17503], [34.95703, 32.19522], [34.98885, 32.20758], [35.01841, 32.23981], [35.02939, 32.2671], [35.01119, 32.28684], [35.01772, 32.33863], [35.04243, 32.35008], [35.05142, 32.3667], [35.0421, 32.38242], [35.05311, 32.4024], [35.05423, 32.41754], [35.07059, 32.4585], [35.08564, 32.46948], [35.09236, 32.47614], [35.10024, 32.47856], [35.10882, 32.4757], [35.15937, 32.50466], [35.2244, 32.55289], [35.25049, 32.52453], [35.29306, 32.50947], [35.30685, 32.51024], [35.35212, 32.52047], [35.40224, 32.50136], [35.42034, 32.46009], [35.41598, 32.45593], [35.41048, 32.43706], [35.42078, 32.41562], [35.55807, 32.38674], [35.55494, 32.42687], [35.57485, 32.48669], [35.56614, 32.64393], [35.59813, 32.65159], [35.61669, 32.67999], [35.66527, 32.681], [35.68467, 32.70715], [35.75983, 32.74803], [35.78745, 32.77938], [35.83758, 32.82817], [35.84021, 32.8725], [35.87012, 32.91976], [35.89298, 32.9456], [35.87188, 32.98028], [35.84802, 33.1031], [35.81911, 33.11077], [35.81911, 33.1336], [35.84285, 33.16673], [35.83846, 33.19397], [35.81647, 33.2028], [35.81295, 33.24841], [35.77513, 33.27342], [35.813, 33.3172], [35.77477, 33.33609], [35.62019, 33.27278], [35.62283, 33.24226], [35.58502, 33.26653], [35.58326, 33.28381], [35.56523, 33.28969], [35.55555, 33.25844], [35.54544, 33.25513], [35.54808, 33.236], [35.5362, 33.23196], [35.54228, 33.19865], [35.52573, 33.11921], [35.50335, 33.114], [35.50272, 33.09056], [35.448, 33.09264], [35.43059, 33.06659], [35.35223, 33.05617], [35.31429, 33.10515], [35.1924, 33.08743], [35.10645, 33.09318], [34.78515, 33.20368], [33.62659, 31.82938], [34.052, 31.46619]]]] } }, { type: "Feature", properties: { iso1A2: "IM", iso1A3: "IMN", iso1N3: "833", wikidata: "Q9676", nameEn: "Isle of Man", country: "GB", groups: ["Q185086", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01624", "44 07624", "44 07524", "44 07924"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.98763, 54.07351], [-4.1819, 54.57861], [-5.6384, 53.81157], [-3.98763, 54.07351]]]] } }, { type: "Feature", properties: { iso1A2: "IN", iso1A3: "IND", iso1N3: "356", wikidata: "Q668", nameEn: "India" }, geometry: null }, @@ -22957,7 +23426,7 @@ { type: "Feature", properties: { iso1A2: "TR", iso1A3: "TUR", iso1N3: "792", wikidata: "Q43", nameEn: "Turkey", groups: ["145", "142", "UN"], callingCodes: ["90"] }, geometry: { type: "MultiPolygon", coordinates: [[[[41.54366, 41.52185], [40.89217, 41.72528], [34.8305, 42.4581], [28.32297, 41.98371], [28.02971, 41.98066], [27.91479, 41.97902], [27.83492, 41.99709], [27.81235, 41.94803], [27.69949, 41.97515], [27.55191, 41.90928], [27.52379, 41.93756], [27.45478, 41.96591], [27.27411, 42.10409], [27.22376, 42.10152], [27.19251, 42.06028], [27.08486, 42.08735], [27.03277, 42.0809], [26.95638, 42.00741], [26.79143, 41.97386], [26.62996, 41.97644], [26.56051, 41.92995], [26.57961, 41.90024], [26.53968, 41.82653], [26.36952, 41.82265], [26.33589, 41.76802], [26.32952, 41.73637], [26.35957, 41.71149], [26.47958, 41.67037], [26.5209, 41.62592], [26.59196, 41.60491], [26.59742, 41.48058], [26.61767, 41.42281], [26.62997, 41.34613], [26.5837, 41.32131], [26.5209, 41.33993], [26.39861, 41.25053], [26.32259, 41.24929], [26.31928, 41.07386], [26.3606, 41.02027], [26.33297, 40.98388], [26.35894, 40.94292], [26.32259, 40.94042], [26.28623, 40.93005], [26.29441, 40.89119], [26.26169, 40.9168], [26.20856, 40.86048], [26.21351, 40.83298], [26.15685, 40.80709], [26.12854, 40.77339], [26.12495, 40.74283], [26.08638, 40.73214], [26.0754, 40.72772], [26.03489, 40.73051], [25.94795, 40.72797], [26.04292, 40.3958], [25.61285, 40.17161], [25.94257, 39.39358], [26.43357, 39.43096], [26.70773, 39.0312], [26.61814, 38.81372], [26.21136, 38.65436], [26.32173, 38.48731], [26.24183, 38.44695], [26.21136, 38.17558], [27.05537, 37.9131], [27.16428, 37.72343], [26.99377, 37.69034], [26.95583, 37.64989], [27.14757, 37.32], [27.20312, 36.94571], [27.45627, 36.9008], [27.24613, 36.71622], [27.46117, 36.53789], [27.89482, 36.69898], [27.95037, 36.46155], [28.23708, 36.56812], [29.30783, 36.01033], [29.48192, 36.18377], [29.61002, 36.1731], [29.61805, 36.14179], [29.69611, 36.10365], [29.73302, 35.92555], [32.82353, 35.70297], [35.51152, 36.10954], [35.931, 35.92109], [35.98499, 35.94107], [36.00514, 35.94113], [36.01844, 35.92403], [35.99829, 35.88242], [36.11827, 35.85923], [36.13919, 35.83692], [36.14029, 35.81015], [36.1623, 35.80925], [36.17441, 35.92076], [36.19973, 35.95195], [36.25366, 35.96264], [36.27678, 35.94839], [36.29769, 35.96086], [36.28338, 36.00273], [36.30099, 36.00985], [36.33956, 35.98687], [36.37474, 36.01163], [36.39206, 36.22088], [36.4617, 36.20461], [36.50463, 36.2419], [36.6125, 36.22592], [36.68672, 36.23677], [36.65653, 36.33861], [36.6081, 36.33772], [36.54206, 36.49539], [36.58829, 36.58295], [36.57398, 36.65186], [36.62681, 36.71189], [36.61581, 36.74629], [36.66727, 36.82901], [36.99557, 36.75997], [36.99886, 36.74012], [37.04399, 36.73483], [37.04619, 36.71101], [37.01647, 36.69512], [37.02088, 36.66422], [37.08279, 36.63495], [37.10894, 36.6704], [37.16177, 36.66069], [37.21988, 36.6736], [37.47253, 36.63243], [37.49103, 36.66904], [37.68048, 36.75065], [37.81974, 36.76055], [38.21064, 36.91842], [38.38859, 36.90064], [38.55908, 36.84429], [38.74042, 36.70629], [39.03217, 36.70911], [39.21538, 36.66834], [39.81589, 36.75538], [40.69136, 37.0996], [40.90856, 37.13147], [41.21937, 37.07665], [41.515, 37.08084], [42.00894, 37.17209], [42.18225, 37.28569], [42.19301, 37.31323], [42.2112, 37.32491], [42.22257, 37.31395], [42.22381, 37.30238], [42.20454, 37.28715], [42.21548, 37.28026], [42.23683, 37.2863], [42.26039, 37.27017], [42.2824, 37.2798], [42.34735, 37.22548], [42.32313, 37.17814], [42.35724, 37.10998], [42.56725, 37.14878], [42.78887, 37.38615], [42.93705, 37.32015], [43.11403, 37.37436], [43.30083, 37.30629], [43.33508, 37.33105], [43.50787, 37.24436], [43.56702, 37.25675], [43.63085, 37.21957], [43.7009, 37.23692], [43.8052, 37.22825], [43.82699, 37.19477], [43.84878, 37.22205], [43.90949, 37.22453], [44.02002, 37.33229], [44.13521, 37.32486], [44.2613, 37.25055], [44.27998, 37.16501], [44.22239, 37.15756], [44.18503, 37.09551], [44.25975, 36.98119], [44.30645, 36.97373], [44.35937, 37.02843], [44.35315, 37.04955], [44.38117, 37.05825], [44.42631, 37.05825], [44.63179, 37.19229], [44.76698, 37.16162], [44.78319, 37.1431], [44.7868, 37.16644], [44.75986, 37.21549], [44.81021, 37.2915], [44.58449, 37.45018], [44.61401, 37.60165], [44.56887, 37.6429], [44.62096, 37.71985], [44.55498, 37.783], [44.45948, 37.77065], [44.3883, 37.85433], [44.22509, 37.88859], [44.42476, 38.25763], [44.50115, 38.33939], [44.44386, 38.38295], [44.38309, 38.36117], [44.3119, 38.37887], [44.3207, 38.49799], [44.32058, 38.62752], [44.28065, 38.6465], [44.26155, 38.71427], [44.30322, 38.81581], [44.18863, 38.93881], [44.20946, 39.13975], [44.1043, 39.19842], [44.03667, 39.39223], [44.22452, 39.4169], [44.29818, 39.378], [44.37921, 39.4131], [44.42832, 39.4131], [44.41849, 39.56659], [44.48111, 39.61579], [44.47298, 39.68788], [44.6137, 39.78393], [44.65422, 39.72163], [44.71806, 39.71124], [44.81043, 39.62677], [44.80977, 39.65768], [44.75779, 39.7148], [44.61845, 39.8281], [44.46635, 39.97733], [44.26973, 40.04866], [44.1778, 40.02845], [44.1057, 40.03555], [43.92307, 40.01787], [43.65688, 40.11199], [43.65221, 40.14889], [43.71136, 40.16673], [43.59928, 40.34019], [43.60862, 40.43267], [43.54791, 40.47413], [43.63664, 40.54159], [43.7425, 40.66805], [43.74872, 40.7365], [43.67712, 40.84846], [43.67712, 40.93084], [43.58683, 40.98961], [43.47319, 41.02251], [43.44984, 41.0988], [43.4717, 41.12611], [43.44973, 41.17666], [43.36118, 41.2028], [43.23096, 41.17536], [43.1945, 41.25242], [43.13373, 41.25503], [43.21707, 41.30331], [43.02956, 41.37891], [42.8785, 41.50516], [42.84899, 41.47265], [42.78995, 41.50126], [42.84471, 41.58912], [42.72794, 41.59714], [42.59202, 41.58183], [42.51772, 41.43606], [42.26387, 41.49346], [41.95134, 41.52466], [41.81939, 41.43621], [41.7124, 41.47417], [41.7148, 41.4932], [41.54366, 41.52185]]]] } }, { type: "Feature", properties: { iso1A2: "TT", iso1A3: "TTO", iso1N3: "780", wikidata: "Q754", nameEn: "Trinidad and Tobago", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 868"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.62505, 11.18974], [-62.08693, 10.04435], [-60.89962, 9.81445], [-60.07172, 11.77667], [-61.62505, 11.18974]]]] } }, { type: "Feature", properties: { iso1A2: "TV", iso1A3: "TUV", iso1N3: "798", wikidata: "Q672", nameEn: "Tuvalu", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["688"] }, geometry: { type: "MultiPolygon", coordinates: [[[[174, -5], [174, -11.5], [179.99999, -11.5], [179.99999, -5], [174, -5]]]] } }, - { type: "Feature", properties: { iso1A2: "TW", iso1A3: "TWN", iso1N3: "158", wikidata: "Q865", nameEn: "Taiwan", aliases: ["RC"], groups: ["030", "142"], callingCodes: ["886"] }, geometry: { type: "MultiPolygon", coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.49232, 25.22863], [118.56434, 24.49266], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]] } }, + { type: "Feature", properties: { iso1A2: "TW", iso1A3: "TWN", iso1N3: "158", wikidata: "Q865", nameEn: "Taiwan", aliases: ["RC"], groups: ["030", "142"], callingCodes: ["886"] }, geometry: { type: "MultiPolygon", coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.5128, 26.536], [120.0693, 26.3959], [119.78816, 26.2348], [119.98511, 25.37624], [119.42295, 25.0886], [118.6333, 24.46259], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]] } }, { type: "Feature", properties: { iso1A2: "TZ", iso1A3: "TZA", iso1N3: "834", wikidata: "Q924", nameEn: "Tanzania", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["255"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.80408, -0.99911], [30.76635, -0.9852], [30.70631, -1.01175], [30.64166, -1.06601], [30.47194, -1.0555], [30.45116, -1.10641], [30.50889, -1.16412], [30.57123, -1.33264], [30.71974, -1.43244], [30.84079, -1.64652], [30.80802, -1.91477], [30.89303, -2.08223], [30.83915, -2.35795], [30.54501, -2.41404], [30.41789, -2.66266], [30.52747, -2.65841], [30.40662, -2.86151], [30.4987, -2.9573], [30.57926, -2.89791], [30.6675, -2.98987], [30.83823, -2.97837], [30.84165, -3.25152], [30.45915, -3.56532], [30.22042, -4.01738], [30.03323, -4.26631], [29.88172, -4.35743], [29.82885, -4.36153], [29.77289, -4.41733], [29.75109, -4.45836], [29.63827, -4.44681], [29.43673, -4.44845], [29.52552, -6.2731], [30.2567, -7.14121], [30.79243, -8.27382], [31.00796, -8.58615], [31.37533, -8.60769], [31.57147, -8.70619], [31.57147, -8.81388], [31.71158, -8.91386], [31.81587, -8.88618], [31.94663, -8.93846], [31.94196, -9.02303], [31.98866, -9.07069], [32.08206, -9.04609], [32.16146, -9.05993], [32.25486, -9.13371], [32.43543, -9.11988], [32.49147, -9.14754], [32.53661, -9.24281], [32.75611, -9.28583], [32.76233, -9.31963], [32.95389, -9.40138], [32.99397, -9.36712], [33.14925, -9.49322], [33.31581, -9.48554], [33.48052, -9.62442], [33.76677, -9.58516], [33.93298, -9.71647], [33.9638, -9.62206], [33.95829, -9.54066], [34.03865, -9.49398], [34.54499, -10.0678], [34.51911, -10.12279], [34.57581, -10.56271], [34.65946, -10.6828], [34.67047, -10.93796], [34.61161, -11.01611], [34.63305, -11.11731], [34.79375, -11.32245], [34.91153, -11.39799], [34.96296, -11.57354], [35.63599, -11.55927], [35.82767, -11.41081], [36.19094, -11.57593], [36.19094, -11.70008], [36.62068, -11.72884], [36.80309, -11.56836], [37.3936, -11.68949], [37.76614, -11.53352], [37.8388, -11.3123], [37.93618, -11.26228], [38.21598, -11.27289], [38.47258, -11.4199], [38.88996, -11.16978], [39.24395, -11.17433], [39.58249, -10.96043], [40.00295, -10.80255], [40.44265, -10.4618], [40.74206, -10.25691], [40.14328, -4.64201], [39.62121, -4.68136], [39.44306, -4.93877], [39.21631, -4.67835], [37.81321, -3.69179], [37.75036, -3.54243], [37.63099, -3.50723], [37.5903, -3.42735], [37.71745, -3.304], [37.67199, -3.06222], [34.0824, -1.02264], [34.03084, -1.05101], [34.02286, -1.00779], [33.93107, -0.99298], [30.80408, -0.99911]]]] } }, { type: "Feature", properties: { iso1A2: "UA", iso1A3: "UKR", iso1N3: "804", wikidata: "Q212", nameEn: "Ukraine", groups: ["151", "150", "UN"], callingCodes: ["380"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.57318, 46.10317], [33.61467, 46.13561], [33.63854, 46.14147], [33.61517, 46.22615], [33.646, 46.23028], [33.74047, 46.18555], [33.79715, 46.20482], [33.85234, 46.19863], [33.91549, 46.15938], [34.05272, 46.10838], [34.07311, 46.11769], [34.12929, 46.10494], [34.181, 46.06804], [34.25111, 46.0532], [34.33912, 46.06114], [34.41221, 46.00245], [34.44155, 45.95995], [34.48729, 45.94267], [34.52011, 45.95097], [34.55889, 45.99347], [34.60861, 45.99347], [34.66679, 45.97136], [34.75479, 45.90705], [34.80153, 45.90047], [34.79905, 45.81009], [34.96015, 45.75634], [35.23066, 45.79231], [37.62608, 46.82615], [38.12112, 46.86078], [38.3384, 46.98085], [38.22955, 47.12069], [38.23049, 47.2324], [38.32112, 47.2585], [38.33074, 47.30508], [38.22225, 47.30788], [38.28954, 47.39255], [38.28679, 47.53552], [38.35062, 47.61631], [38.76379, 47.69346], [38.79628, 47.81109], [38.87979, 47.87719], [39.73935, 47.82876], [39.82213, 47.96396], [39.77544, 48.04206], [39.88256, 48.04482], [39.83724, 48.06501], [39.94847, 48.22811], [40.00752, 48.22445], [39.99241, 48.31768], [39.97325, 48.31399], [39.9693, 48.29904], [39.95248, 48.29972], [39.91465, 48.26743], [39.90041, 48.3049], [39.84273, 48.30947], [39.84136, 48.33321], [39.94847, 48.35055], [39.88794, 48.44226], [39.86196, 48.46633], [39.84548, 48.57821], [39.79764, 48.58668], [39.67226, 48.59368], [39.71765, 48.68673], [39.73104, 48.7325], [39.79466, 48.83739], [39.97182, 48.79398], [40.08168, 48.87443], [40.03636, 48.91957], [39.98967, 48.86901], [39.78368, 48.91596], [39.74874, 48.98675], [39.72649, 48.9754], [39.71353, 48.98959], [39.6683, 48.99454], [39.6836, 49.05121], [39.93437, 49.05709], [40.01988, 49.1761], [40.22176, 49.25683], [40.18331, 49.34996], [40.14912, 49.37681], [40.1141, 49.38798], [40.03087, 49.45452], [40.03636, 49.52321], [40.16683, 49.56865], [40.13249, 49.61672], [39.84548, 49.56064], [39.65047, 49.61761], [39.59142, 49.73758], [39.44496, 49.76067], [39.27968, 49.75976], [39.1808, 49.88911], [38.9391, 49.79524], [38.90477, 49.86787], [38.73311, 49.90238], [38.68677, 50.00904], [38.65688, 49.97176], [38.35408, 50.00664], [38.32524, 50.08866], [38.18517, 50.08161], [38.21675, 49.98104], [38.02999, 49.90592], [38.02999, 49.94482], [37.90776, 50.04194], [37.79515, 50.08425], [37.75807, 50.07896], [37.61113, 50.21976], [37.62879, 50.24481], [37.62486, 50.29966], [37.47243, 50.36277], [37.48204, 50.46079], [37.08468, 50.34935], [36.91762, 50.34963], [36.69377, 50.26982], [36.64571, 50.218], [36.56655, 50.2413], [36.58371, 50.28563], [36.47817, 50.31457], [36.30101, 50.29088], [36.20763, 50.3943], [36.06893, 50.45205], [35.8926, 50.43829], [35.80388, 50.41356], [35.73659, 50.35489], [35.61711, 50.35707], [35.58003, 50.45117], [35.47463, 50.49247], [35.39464, 50.64751], [35.48116, 50.66405], [35.47704, 50.77274], [35.41367, 50.80227], [35.39307, 50.92145], [35.32598, 50.94524], [35.40837, 51.04119], [35.31774, 51.08434], [35.20375, 51.04723], [35.12685, 51.16191], [35.14058, 51.23162], [34.97304, 51.2342], [34.82472, 51.17483], [34.6874, 51.18], [34.6613, 51.25053], [34.38802, 51.2746], [34.31661, 51.23936], [34.23009, 51.26429], [34.33446, 51.363], [34.22048, 51.4187], [34.30562, 51.5205], [34.17599, 51.63253], [34.07765, 51.67065], [34.42922, 51.72852], [34.41136, 51.82793], [34.09413, 52.00835], [34.11199, 52.14087], [34.05239, 52.20132], [33.78789, 52.37204], [33.55718, 52.30324], [33.48027, 52.31499], [33.51323, 52.35779], [33.18913, 52.3754], [32.89937, 52.2461], [32.85405, 52.27888], [32.69475, 52.25535], [32.54781, 52.32423], [32.3528, 52.32842], [32.38988, 52.24946], [32.33083, 52.23685], [32.34044, 52.1434], [32.2777, 52.10266], [32.23331, 52.08085], [32.08813, 52.03319], [31.92159, 52.05144], [31.96141, 52.08015], [31.85018, 52.11305], [31.81722, 52.09955], [31.7822, 52.11406], [31.38326, 52.12991], [31.25142, 52.04131], [31.13332, 52.1004], [30.95589, 52.07775], [30.90897, 52.00699], [30.76443, 51.89739], [30.68804, 51.82806], [30.51946, 51.59649], [30.64992, 51.35014], [30.56203, 51.25655], [30.36153, 51.33984], [30.34642, 51.42555], [30.17888, 51.51025], [29.77376, 51.4461], [29.7408, 51.53417], [29.54372, 51.48372], [29.49773, 51.39814], [29.42357, 51.4187], [29.32881, 51.37843], [29.25191, 51.49828], [29.25603, 51.57089], [29.20659, 51.56918], [29.16402, 51.64679], [29.1187, 51.65872], [28.99098, 51.56833], [28.95528, 51.59222], [28.81795, 51.55552], [28.76027, 51.48802], [28.78224, 51.45294], [28.75615, 51.41442], [28.73143, 51.46236], [28.69161, 51.44695], [28.64429, 51.5664], [28.47051, 51.59734], [28.37592, 51.54505], [28.23452, 51.66988], [28.10658, 51.57857], [27.95827, 51.56065], [27.91844, 51.61952], [27.85253, 51.62293], [27.76052, 51.47604], [27.67125, 51.50854], [27.71932, 51.60672], [27.55727, 51.63486], [27.51058, 51.5854], [27.47212, 51.61184], [27.24828, 51.60161], [27.26613, 51.65957], [27.20948, 51.66713], [27.20602, 51.77291], [26.99422, 51.76933], [26.9489, 51.73788], [26.80043, 51.75777], [26.69759, 51.82284], [26.46962, 51.80501], [26.39367, 51.87315], [26.19084, 51.86781], [26.00408, 51.92967], [25.83217, 51.92587], [25.80574, 51.94556], [25.73673, 51.91973], [25.46163, 51.92205], [25.20228, 51.97143], [24.98784, 51.91273], [24.37123, 51.88222], [24.29021, 51.80841], [24.3163, 51.75063], [24.13075, 51.66979], [23.99907, 51.58369], [23.8741, 51.59734], [23.91118, 51.63316], [23.7766, 51.66809], [23.60906, 51.62122], [23.6736, 51.50255], [23.62751, 51.50512], [23.69905, 51.40871], [23.63858, 51.32182], [23.80678, 51.18405], [23.90376, 51.07697], [23.92217, 51.00836], [24.04576, 50.90196], [24.14524, 50.86128], [24.0952, 50.83262], [23.99254, 50.83847], [23.95925, 50.79271], [24.0595, 50.71625], [24.0996, 50.60752], [24.07048, 50.5071], [24.03668, 50.44507], [23.99563, 50.41289], [23.79445, 50.40481], [23.71382, 50.38248], [23.67635, 50.33385], [23.28221, 50.0957], [22.99329, 49.84249], [22.83179, 49.69875], [22.80261, 49.69098], [22.78304, 49.65543], [22.64534, 49.53094], [22.69444, 49.49378], [22.748, 49.32759], [22.72009, 49.20288], [22.86336, 49.10513], [22.89122, 49.00725], [22.56155, 49.08865], [22.54338, 49.01424], [22.48296, 48.99172], [22.42934, 48.92857], [22.34151, 48.68893], [22.21379, 48.6218], [22.16023, 48.56548], [22.14689, 48.4005], [22.2083, 48.42534], [22.38133, 48.23726], [22.49806, 48.25189], [22.59007, 48.15121], [22.58733, 48.10813], [22.66835, 48.09162], [22.73427, 48.12005], [22.81804, 48.11363], [22.87847, 48.04665], [22.84276, 47.98602], [22.89849, 47.95851], [22.94301, 47.96672], [22.92241, 48.02002], [23.0158, 47.99338], [23.08858, 48.00716], [23.1133, 48.08061], [23.15999, 48.12188], [23.27397, 48.08245], [23.33577, 48.0237], [23.4979, 47.96858], [23.52803, 48.01818], [23.5653, 48.00499], [23.63894, 48.00293], [23.66262, 47.98786], [23.75188, 47.99705], [23.80904, 47.98142], [23.8602, 47.9329], [23.89352, 47.94512], [23.94192, 47.94868], [23.96337, 47.96672], [23.98553, 47.96076], [24.00801, 47.968], [24.02999, 47.95087], [24.06466, 47.95317], [24.11281, 47.91487], [24.22566, 47.90231], [24.34926, 47.9244], [24.43578, 47.97131], [24.61994, 47.95062], [24.70632, 47.84428], [24.81893, 47.82031], [24.88896, 47.7234], [25.11144, 47.75203], [25.23778, 47.89403], [25.63878, 47.94924], [25.77723, 47.93919], [26.05901, 47.9897], [26.17711, 47.99246], [26.33504, 48.18418], [26.55202, 48.22445], [26.62823, 48.25804], [26.6839, 48.35828], [26.79239, 48.29071], [26.82809, 48.31629], [26.71274, 48.40388], [26.85556, 48.41095], [26.93384, 48.36558], [27.03821, 48.37653], [27.0231, 48.42485], [27.08078, 48.43214], [27.13434, 48.37288], [27.27855, 48.37534], [27.32159, 48.4434], [27.37604, 48.44398], [27.37741, 48.41026], [27.44333, 48.41209], [27.46942, 48.454], [27.5889, 48.49224], [27.59027, 48.46311], [27.6658, 48.44034], [27.74422, 48.45926], [27.79225, 48.44244], [27.81902, 48.41874], [27.87533, 48.4037], [27.88391, 48.36699], [27.95883, 48.32368], [28.04527, 48.32661], [28.09873, 48.3124], [28.07504, 48.23494], [28.17666, 48.25963], [28.19314, 48.20749], [28.2856, 48.23202], [28.32508, 48.23384], [28.35519, 48.24957], [28.36996, 48.20543], [28.34912, 48.1787], [28.30586, 48.1597], [28.30609, 48.14018], [28.34009, 48.13147], [28.38712, 48.17567], [28.43701, 48.15832], [28.42454, 48.12047], [28.48428, 48.0737], [28.53921, 48.17453], [28.69896, 48.13106], [28.85232, 48.12506], [28.8414, 48.03392], [28.9306, 47.96255], [29.1723, 47.99013], [29.19839, 47.89261], [29.27804, 47.88893], [29.20663, 47.80367], [29.27255, 47.79953], [29.22242, 47.73607], [29.22414, 47.60012], [29.11743, 47.55001], [29.18603, 47.43387], [29.3261, 47.44664], [29.39889, 47.30179], [29.47854, 47.30366], [29.48678, 47.36043], [29.5733, 47.36508], [29.59665, 47.25521], [29.54996, 47.24962], [29.57696, 47.13581], [29.49732, 47.12878], [29.53044, 47.07851], [29.61038, 47.09932], [29.62137, 47.05069], [29.57056, 46.94766], [29.72986, 46.92234], [29.75458, 46.8604], [29.87405, 46.88199], [29.98814, 46.82358], [29.94522, 46.80055], [29.9743, 46.75325], [29.94409, 46.56002], [29.88916, 46.54302], [30.02511, 46.45132], [30.16794, 46.40967], [30.09103, 46.38694], [29.94114, 46.40114], [29.88329, 46.35851], [29.74496, 46.45605], [29.66359, 46.4215], [29.6763, 46.36041], [29.5939, 46.35472], [29.49914, 46.45889], [29.35357, 46.49505], [29.24886, 46.37912], [29.23547, 46.55435], [29.02409, 46.49582], [29.01241, 46.46177], [28.9306, 46.45699], [29.004, 46.31495], [28.98478, 46.31803], [28.94953, 46.25852], [29.06656, 46.19716], [28.94643, 46.09176], [29.00613, 46.04962], [28.98004, 46.00385], [28.74383, 45.96664], [28.78503, 45.83475], [28.69852, 45.81753], [28.70401, 45.78019], [28.52823, 45.73803], [28.47879, 45.66994], [28.51587, 45.6613], [28.54196, 45.58062], [28.49252, 45.56716], [28.51449, 45.49982], [28.43072, 45.48538], [28.41836, 45.51715], [28.30201, 45.54744], [28.21139, 45.46895], [28.28504, 45.43907], [28.34554, 45.32102], [28.5735, 45.24759], [28.71358, 45.22631], [28.78911, 45.24179], [28.81383, 45.3384], [28.94292, 45.28045], [28.96077, 45.33164], [29.24779, 45.43388], [29.42632, 45.44545], [29.59798, 45.38857], [29.68175, 45.26885], [29.65428, 45.25629], [29.69272, 45.19227], [30.04414, 45.08461], [31.62627, 45.50633], [33.54017, 46.0123], [33.59087, 46.06013], [33.57318, 46.10317]]]] } }, { type: "Feature", properties: { iso1A2: "UG", iso1A3: "UGA", iso1N3: "800", wikidata: "Q1036", nameEn: "Uganda", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["256"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.93107, -0.99298], [33.9264, -0.54188], [33.98449, -0.13079], [33.90936, 0.10581], [34.10067, 0.36372], [34.08727, 0.44713], [34.11408, 0.48884], [34.13493, 0.58118], [34.20196, 0.62289], [34.27345, 0.63182], [34.31516, 0.75693], [34.40041, 0.80266], [34.43349, 0.85254], [34.52369, 1.10692], [34.57427, 1.09868], [34.58029, 1.14712], [34.67562, 1.21265], [34.80223, 1.22754], [34.82606, 1.26626], [34.82606, 1.30944], [34.7918, 1.36752], [34.87819, 1.5596], [34.92734, 1.56109], [34.9899, 1.6668], [34.98692, 1.97348], [34.90947, 2.42447], [34.95267, 2.47209], [34.77244, 2.70272], [34.78137, 2.76223], [34.73967, 2.85447], [34.65774, 2.8753], [34.60114, 2.93034], [34.56242, 3.11478], [34.45815, 3.18319], [34.40006, 3.37949], [34.41794, 3.44342], [34.39112, 3.48802], [34.44922, 3.51627], [34.45815, 3.67385], [34.15429, 3.80464], [34.06046, 4.15235], [33.9873, 4.23316], [33.51264, 3.75068], [33.18356, 3.77812], [33.02852, 3.89296], [32.89746, 3.81339], [32.72021, 3.77327], [32.41337, 3.748], [32.20782, 3.6053], [32.19888, 3.50867], [32.08866, 3.53543], [32.08491, 3.56287], [32.05187, 3.589], [31.95907, 3.57408], [31.96205, 3.6499], [31.86821, 3.78664], [31.81459, 3.82083], [31.72075, 3.74354], [31.50776, 3.63652], [31.50478, 3.67814], [31.29476, 3.8015], [31.16666, 3.79853], [30.97601, 3.693], [30.85153, 3.48867], [30.94081, 3.50847], [30.93486, 3.40737], [30.84251, 3.26908], [30.77101, 3.04897], [30.8574, 2.9508], [30.8857, 2.83923], [30.75612, 2.5863], [30.74271, 2.43601], [30.83059, 2.42559], [30.91102, 2.33332], [30.96911, 2.41071], [31.06593, 2.35862], [31.07934, 2.30207], [31.12104, 2.27676], [31.1985, 2.29462], [31.20148, 2.2217], [31.28042, 2.17853], [31.30127, 2.11006], [30.48503, 1.21675], [30.24671, 1.14974], [30.22139, 0.99635], [30.1484, 0.89805], [29.98307, 0.84295], [29.95477, 0.64486], [29.97413, 0.52124], [29.87284, 0.39166], [29.81922, 0.16824], [29.77454, 0.16675], [29.7224, 0.07291], [29.72687, -0.08051], [29.65091, -0.46777], [29.67474, -0.47969], [29.67176, -0.55714], [29.62708, -0.71055], [29.63006, -0.8997], [29.58388, -0.89821], [29.59061, -1.39016], [29.82657, -1.31187], [29.912, -1.48269], [30.16369, -1.34303], [30.35212, -1.06896], [30.47194, -1.0555], [30.64166, -1.06601], [30.70631, -1.01175], [30.76635, -0.9852], [30.80408, -0.99911], [33.93107, -0.99298]]]] } }, @@ -22981,18 +23450,17 @@ { type: "Feature", properties: { iso1A2: "ZA", iso1A3: "ZAF", iso1N3: "710", wikidata: "Q258", nameEn: "South Africa", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["27"] }, geometry: { type: "MultiPolygon", coordinates: [[[[31.30611, -22.422], [31.16344, -22.32599], [31.08932, -22.34884], [30.86696, -22.28907], [30.6294, -22.32599], [30.48686, -22.31368], [30.38614, -22.34533], [30.28351, -22.35587], [30.2265, -22.2961], [30.13147, -22.30841], [29.92242, -22.19408], [29.76848, -22.14128], [29.64609, -22.12917], [29.37703, -22.19581], [29.21955, -22.17771], [29.18974, -22.18599], [29.15268, -22.21399], [29.10881, -22.21202], [29.0151, -22.22907], [28.91889, -22.44299], [28.63287, -22.55887], [28.34874, -22.5694], [28.04562, -22.8394], [28.04752, -22.90243], [27.93729, -22.96194], [27.93539, -23.04941], [27.74154, -23.2137], [27.6066, -23.21894], [27.52393, -23.37952], [27.33768, -23.40917], [26.99749, -23.65486], [26.84165, -24.24885], [26.51667, -24.47219], [26.46346, -24.60358], [26.39409, -24.63468], [25.8515, -24.75727], [25.84295, -24.78661], [25.88571, -24.87802], [25.72702, -25.25503], [25.69661, -25.29284], [25.6643, -25.4491], [25.58543, -25.6343], [25.33076, -25.76616], [25.12266, -25.75931], [25.01718, -25.72507], [24.8946, -25.80723], [24.67319, -25.81749], [24.44703, -25.73021], [24.36531, -25.773], [24.18287, -25.62916], [23.9244, -25.64286], [23.47588, -25.29971], [23.03497, -25.29971], [22.86012, -25.50572], [22.70808, -25.99186], [22.56365, -26.19668], [22.41921, -26.23078], [22.21206, -26.3773], [22.06192, -26.61882], [21.90703, -26.66808], [21.83291, -26.65959], [21.77114, -26.69015], [21.7854, -26.79199], [21.69322, -26.86152], [21.37869, -26.82083], [21.13353, -26.86661], [20.87031, -26.80047], [20.68596, -26.9039], [20.63275, -26.78181], [20.61754, -26.4692], [20.86081, -26.14892], [20.64795, -25.47827], [20.29826, -24.94869], [20.03678, -24.81004], [20.02809, -24.78725], [19.99817, -24.76768], [19.99882, -28.42622], [18.99885, -28.89165], [17.4579, -28.68718], [17.15405, -28.08573], [16.90446, -28.057], [16.59922, -28.53246], [16.46592, -28.57126], [16.45332, -28.63117], [12.51595, -32.27486], [38.88176, -48.03306], [34.51034, -26.91792], [32.35222, -26.86027], [32.29584, -26.852], [32.22302, -26.84136], [32.19409, -26.84032], [32.13315, -26.84345], [32.09664, -26.80721], [32.00893, -26.8096], [31.97463, -27.11057], [31.97592, -27.31675], [31.49834, -27.31549], [31.15027, -27.20151], [30.96088, -27.0245], [30.97757, -26.92706], [30.88826, -26.79622], [30.81101, -26.84722], [30.78927, -26.48271], [30.95819, -26.26303], [31.13073, -25.91558], [31.31237, -25.7431], [31.4175, -25.71886], [31.86881, -25.99973], [31.974, -25.95387], [31.92649, -25.84216], [32.00631, -25.65044], [31.97875, -25.46356], [32.01676, -25.38117], [32.03196, -25.10785], [31.9835, -24.29983], [31.90368, -24.18892], [31.87707, -23.95293], [31.77445, -23.90082], [31.70223, -23.72695], [31.67942, -23.60858], [31.56539, -23.47268], [31.55779, -23.176], [31.30611, -22.422]], [[29.33204, -29.45598], [29.28545, -29.58456], [29.12553, -29.76266], [29.16548, -29.91706], [28.9338, -30.05072], [28.80222, -30.10579], [28.68627, -30.12885], [28.399, -30.1592], [28.2319, -30.28476], [28.12073, -30.68072], [27.74814, -30.60635], [27.69467, -30.55862], [27.67819, -30.53437], [27.6521, -30.51707], [27.62137, -30.50509], [27.56781, -30.44562], [27.56901, -30.42504], [27.45452, -30.32239], [27.38108, -30.33456], [27.36649, -30.27246], [27.37293, -30.19401], [27.40778, -30.14577], [27.32555, -30.14785], [27.29603, -30.05473], [27.22719, -30.00718], [27.09489, -29.72796], [27.01016, -29.65439], [27.33464, -29.48161], [27.4358, -29.33465], [27.47254, -29.31968], [27.45125, -29.29708], [27.48679, -29.29349], [27.54258, -29.25575], [27.5158, -29.2261], [27.55974, -29.18954], [27.75458, -28.89839], [27.8907, -28.91612], [27.88933, -28.88156], [27.9392, -28.84864], [27.98675, -28.8787], [28.02503, -28.85991], [28.1317, -28.7293], [28.2348, -28.69471], [28.30518, -28.69531], [28.40612, -28.6215], [28.65091, -28.57025], [28.68043, -28.58744], [29.40524, -29.21246], [29.44883, -29.3772], [29.33204, -29.45598]]]] } }, { type: "Feature", properties: { iso1A2: "ZM", iso1A3: "ZMB", iso1N3: "894", wikidata: "Q953", nameEn: "Zambia", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["260"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.95389, -9.40138], [32.76233, -9.31963], [32.75611, -9.28583], [32.53661, -9.24281], [32.49147, -9.14754], [32.43543, -9.11988], [32.25486, -9.13371], [32.16146, -9.05993], [32.08206, -9.04609], [31.98866, -9.07069], [31.94196, -9.02303], [31.94663, -8.93846], [31.81587, -8.88618], [31.71158, -8.91386], [31.57147, -8.81388], [31.57147, -8.70619], [31.37533, -8.60769], [31.00796, -8.58615], [30.79243, -8.27382], [28.88917, -8.4831], [28.9711, -8.66935], [28.38526, -9.23393], [28.36562, -9.30091], [28.52636, -9.35379], [28.51627, -9.44726], [28.56208, -9.49122], [28.68532, -9.78], [28.62795, -9.92942], [28.65032, -10.65133], [28.37241, -11.57848], [28.48357, -11.87532], [29.18592, -12.37921], [29.4992, -12.43843], [29.48404, -12.23604], [29.8139, -12.14898], [29.81551, -13.44683], [29.65078, -13.41844], [29.60531, -13.21685], [29.01918, -13.41353], [28.33199, -12.41375], [27.59932, -12.22123], [27.21025, -11.76157], [27.22541, -11.60323], [27.04351, -11.61312], [26.88687, -12.01868], [26.01777, -11.91488], [25.33058, -11.65767], [25.34069, -11.19707], [24.42612, -11.44975], [24.34528, -11.06816], [24.00027, -10.89356], [24.02603, -11.15368], [23.98804, -12.13149], [24.06672, -12.29058], [23.90937, -12.844], [24.03339, -12.99091], [21.97988, -13.00148], [22.00323, -16.18028], [22.17217, -16.50269], [23.20038, -17.47563], [23.47474, -17.62877], [24.23619, -17.47489], [24.32811, -17.49082], [24.38712, -17.46818], [24.5621, -17.52963], [24.70864, -17.49501], [25.00198, -17.58221], [25.26433, -17.79571], [25.51646, -17.86232], [25.6827, -17.81987], [25.85738, -17.91403], [25.85892, -17.97726], [26.08925, -17.98168], [26.0908, -17.93021], [26.21601, -17.88608], [26.55918, -17.99638], [26.68403, -18.07411], [26.74314, -18.0199], [26.89926, -17.98756], [27.14196, -17.81398], [27.30736, -17.60487], [27.61377, -17.34378], [27.62795, -17.24365], [27.83141, -16.96274], [28.73725, -16.5528], [28.76199, -16.51575], [28.81454, -16.48611], [28.8501, -16.04537], [28.9243, -15.93987], [29.01298, -15.93805], [29.21955, -15.76589], [29.4437, -15.68702], [29.8317, -15.6126], [30.35574, -15.6513], [30.41902, -15.62269], [30.22098, -14.99447], [33.24249, -14.00019], [33.16749, -13.93992], [33.07568, -13.98447], [33.02977, -14.05022], [32.99042, -13.95689], [32.88985, -13.82956], [32.79015, -13.80755], [32.76962, -13.77224], [32.84528, -13.71576], [32.7828, -13.64805], [32.68654, -13.64268], [32.66468, -13.60019], [32.68436, -13.55769], [32.73683, -13.57682], [32.84176, -13.52794], [32.86113, -13.47292], [33.0078, -13.19492], [32.98289, -13.12671], [33.02181, -12.88707], [32.96733, -12.88251], [32.94397, -12.76868], [33.05917, -12.59554], [33.18837, -12.61377], [33.28177, -12.54692], [33.37517, -12.54085], [33.54485, -12.35996], [33.47636, -12.32498], [33.3705, -12.34931], [33.25998, -12.14242], [33.33937, -11.91252], [33.32692, -11.59248], [33.24252, -11.59302], [33.23663, -11.40637], [33.29267, -11.43536], [33.29267, -11.3789], [33.39697, -11.15296], [33.25998, -10.88862], [33.28022, -10.84428], [33.47636, -10.78465], [33.70675, -10.56896], [33.54797, -10.36077], [33.53863, -10.20148], [33.31297, -10.05133], [33.37902, -9.9104], [33.36581, -9.81063], [33.31517, -9.82364], [33.2095, -9.61099], [33.12144, -9.58929], [33.10163, -9.66525], [33.05485, -9.61316], [33.00256, -9.63053], [33.00476, -9.5133], [32.95389, -9.40138]]]] } }, { type: "Feature", properties: { iso1A2: "ZW", iso1A3: "ZWE", iso1N3: "716", wikidata: "Q954", nameEn: "Zimbabwe", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["263"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.41902, -15.62269], [30.35574, -15.6513], [29.8317, -15.6126], [29.4437, -15.68702], [29.21955, -15.76589], [29.01298, -15.93805], [28.9243, -15.93987], [28.8501, -16.04537], [28.81454, -16.48611], [28.76199, -16.51575], [28.73725, -16.5528], [27.83141, -16.96274], [27.62795, -17.24365], [27.61377, -17.34378], [27.30736, -17.60487], [27.14196, -17.81398], [26.89926, -17.98756], [26.74314, -18.0199], [26.68403, -18.07411], [26.55918, -17.99638], [26.21601, -17.88608], [26.0908, -17.93021], [26.08925, -17.98168], [25.85892, -17.97726], [25.85738, -17.91403], [25.6827, -17.81987], [25.51646, -17.86232], [25.26433, -17.79571], [25.23909, -17.90832], [25.31799, -18.07091], [25.39972, -18.12691], [25.53465, -18.39041], [25.68859, -18.56165], [25.79217, -18.6355], [25.82353, -18.82808], [25.94326, -18.90362], [25.99837, -19.02943], [25.96226, -19.08152], [26.17227, -19.53709], [26.72246, -19.92707], [27.21278, -20.08244], [27.29831, -20.28935], [27.28865, -20.49873], [27.69361, -20.48531], [27.72972, -20.51735], [27.69171, -21.08409], [27.91407, -21.31621], [28.01669, -21.57624], [28.29416, -21.59037], [28.49942, -21.66634], [28.58114, -21.63455], [29.07763, -21.81877], [29.04023, -21.85864], [29.02191, -21.90647], [29.02191, -21.95665], [29.04108, -22.00563], [29.08495, -22.04867], [29.14501, -22.07275], [29.1974, -22.07472], [29.24648, -22.05967], [29.3533, -22.18363], [29.37703, -22.19581], [29.64609, -22.12917], [29.76848, -22.14128], [29.92242, -22.19408], [30.13147, -22.30841], [30.2265, -22.2961], [30.28351, -22.35587], [30.38614, -22.34533], [30.48686, -22.31368], [30.6294, -22.32599], [30.86696, -22.28907], [31.08932, -22.34884], [31.16344, -22.32599], [31.30611, -22.422], [31.38336, -22.36919], [32.41234, -21.31246], [32.48236, -21.32873], [32.37115, -21.133], [32.51644, -20.91929], [32.48122, -20.63319], [32.55167, -20.56312], [32.66174, -20.56106], [32.85987, -20.27841], [32.85987, -20.16686], [32.93032, -20.03868], [33.01178, -20.02007], [33.06461, -19.77787], [32.95013, -19.67219], [32.84666, -19.68462], [32.84446, -19.48343], [32.78282, -19.47513], [32.77966, -19.36098], [32.85107, -19.29238], [32.87088, -19.09279], [32.84006, -19.0262], [32.72118, -19.02204], [32.69917, -18.94293], [32.73439, -18.92628], [32.70137, -18.84712], [32.82465, -18.77419], [32.9017, -18.7992], [32.95013, -18.69079], [32.88629, -18.58023], [32.88629, -18.51344], [33.02278, -18.4696], [33.03159, -18.35054], [32.94133, -17.99705], [33.0492, -17.60298], [32.98536, -17.55891], [32.96554, -17.48964], [33.0426, -17.3468], [33.00517, -17.30477], [32.96554, -17.11971], [32.84113, -16.92259], [32.91051, -16.89446], [32.97655, -16.70689], [32.78943, -16.70267], [32.69917, -16.66893], [32.71017, -16.59932], [32.42838, -16.4727], [32.28529, -16.43892], [32.02772, -16.43892], [31.91324, -16.41569], [31.90223, -16.34388], [31.67988, -16.19595], [31.42451, -16.15154], [31.30563, -16.01193], [31.13171, -15.98019], [30.97761, -16.05848], [30.91597, -15.99924], [30.42568, -15.9962], [30.41902, -15.62269]]]] } } - ]; - var borders_default = { type, features }; + ] }; var borders = borders_default; - var whichPolygonGetter = {}; - var featuresByCode = {}; + var _whichPolygon = {}; + var _featuresByCode = {}; var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi; function canonicalID(id2) { - const s = id2 || ""; - if (s.charAt(0) === ".") { - return s.toUpperCase(); + const s2 = id2 || ""; + if (s2.charAt(0) === ".") { + return s2.toUpperCase(); } else { - return s.replace(idFilterRegex, "").toUpperCase(); + return s2.replace(idFilterRegex, "").toUpperCase(); } } var levels = [ @@ -23013,8 +23481,9 @@ function loadDerivedDataAndCaches(borders2) { const identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"]; let geometryFeatures = []; - borders2.features.forEach((feature22) => { - feature22.properties.id = feature22.properties.iso1A2 || feature22.properties.m49 || feature22.properties.wikidata; + for (const feature22 of borders2.features) { + const props = feature22.properties; + props.id = props.iso1A2 || props.m49 || props.wikidata; loadM49(feature22); loadTLD(feature22); loadIsoStatus(feature22); @@ -23022,40 +23491,42 @@ loadGroups(feature22); loadFlag(feature22); cacheFeatureByIDs(feature22); - if (feature22.geometry) + if (feature22.geometry) { geometryFeatures.push(feature22); - }); - borders2.features.forEach((feature22) => { + } + } + for (const feature22 of borders2.features) { feature22.properties.groups = feature22.properties.groups.map((groupID) => { - return featuresByCode[groupID].properties.id; + return _featuresByCode[groupID].properties.id; }); loadMembersForGroupsOf(feature22); - }); - borders2.features.forEach((feature22) => { + } + for (const feature22 of borders2.features) { loadRoadSpeedUnit(feature22); loadRoadHeightUnit(feature22); loadDriveSide(feature22); loadCallingCodes(feature22); loadGroupGroups(feature22); - }); - borders2.features.forEach((feature22) => { + } + for (const feature22 of borders2.features) { feature22.properties.groups.sort((groupID1, groupID2) => { - return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level); + return levels.indexOf(_featuresByCode[groupID1].properties.level) - levels.indexOf(_featuresByCode[groupID2].properties.level); }); - if (feature22.properties.members) + if (feature22.properties.members) { feature22.properties.members.sort((id1, id2) => { - const diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level); + const diff = levels.indexOf(_featuresByCode[id1].properties.level) - levels.indexOf(_featuresByCode[id2].properties.level); if (diff === 0) { - return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]); + return borders2.features.indexOf(_featuresByCode[id1]) - borders2.features.indexOf(_featuresByCode[id2]); } return diff; }); - }); + } + } const geometryOnlyCollection = { type: "FeatureCollection", features: geometryFeatures }; - whichPolygonGetter = (0, import_which_polygon.default)(geometryOnlyCollection); + _whichPolygon = (0, import_which_polygon.default)(geometryOnlyCollection); function loadGroups(feature22) { const props = feature22.properties; if (!props.groups) { @@ -23107,9 +23578,9 @@ const featureLevelIndex = levels.indexOf(props.level); let sharedGroups = []; props.members.forEach((memberID, index) => { - const member = featuresByCode[memberID]; + const member = _featuresByCode[memberID]; const memberGroups = member.properties.groups.filter((groupID) => { - return groupID !== feature22.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level); + return groupID !== feature22.properties.id && featureLevelIndex < levels.indexOf(_featuresByCode[groupID].properties.level); }); if (index === 0) { sharedGroups = memberGroups; @@ -23117,13 +23588,15 @@ sharedGroups = sharedGroups.filter((groupID) => memberGroups.indexOf(groupID) !== -1); } }); - props.groups = props.groups.concat(sharedGroups.filter((groupID) => props.groups.indexOf(groupID) === -1)); - sharedGroups.forEach((groupID) => { - const groupFeature = featuresByCode[groupID]; + props.groups = props.groups.concat( + sharedGroups.filter((groupID) => props.groups.indexOf(groupID) === -1) + ); + for (const groupID of sharedGroups) { + const groupFeature = _featuresByCode[groupID]; if (groupFeature.properties.members.indexOf(props.id) === -1) { groupFeature.properties.members.push(props.id); } - }); + } } function loadRoadSpeedUnit(feature22) { const props = feature22.properties; @@ -23131,11 +23604,15 @@ if (!props.roadSpeedUnit) props.roadSpeedUnit = "km/h"; } else if (props.members) { - const vals = Array.from(new Set(props.members.map((id2) => { - const member = featuresByCode[id2]; - if (member.geometry) - return member.properties.roadSpeedUnit || "km/h"; - }).filter(Boolean))); + const vals = Array.from( + new Set( + props.members.map((id2) => { + const member = _featuresByCode[id2]; + if (member.geometry) + return member.properties.roadSpeedUnit || "km/h"; + }).filter(Boolean) + ) + ); if (vals.length === 1) props.roadSpeedUnit = vals[0]; } @@ -23146,11 +23623,15 @@ if (!props.roadHeightUnit) props.roadHeightUnit = "m"; } else if (props.members) { - const vals = Array.from(new Set(props.members.map((id2) => { - const member = featuresByCode[id2]; - if (member.geometry) - return member.properties.roadHeightUnit || "m"; - }).filter(Boolean))); + const vals = Array.from( + new Set( + props.members.map((id2) => { + const member = _featuresByCode[id2]; + if (member.geometry) + return member.properties.roadHeightUnit || "m"; + }).filter(Boolean) + ) + ); if (vals.length === 1) props.roadHeightUnit = vals[0]; } @@ -23161,11 +23642,15 @@ if (!props.driveSide) props.driveSide = "right"; } else if (props.members) { - const vals = Array.from(new Set(props.members.map((id2) => { - const member = featuresByCode[id2]; - if (member.geometry) - return member.properties.driveSide || "right"; - }).filter(Boolean))); + const vals = Array.from( + new Set( + props.members.map((id2) => { + const member = _featuresByCode[id2]; + if (member.geometry) + return member.properties.driveSide || "right"; + }).filter(Boolean) + ) + ); if (vals.length === 1) props.driveSide = vals[0]; } @@ -23173,13 +23658,17 @@ function loadCallingCodes(feature22) { const props = feature22.properties; if (!feature22.geometry && props.members) { - props.callingCodes = Array.from(new Set(props.members.reduce((array2, id2) => { - const member = featuresByCode[id2]; - if (member.geometry && member.properties.callingCodes) { - return array2.concat(member.properties.callingCodes); - } - return array2; - }, []))); + props.callingCodes = Array.from( + new Set( + props.members.reduce((array2, id2) => { + const member = _featuresByCode[id2]; + if (member.geometry && member.properties.callingCodes) { + return array2.concat(member.properties.callingCodes); + } + return array2; + }, []) + ) + ); } } function loadFlag(feature22) { @@ -23191,28 +23680,29 @@ feature22.properties.emojiFlag = flag; } function loadMembersForGroupsOf(feature22) { - feature22.properties.groups.forEach((groupID) => { - const groupFeature = featuresByCode[groupID]; + for (const groupID of feature22.properties.groups) { + const groupFeature = _featuresByCode[groupID]; if (!groupFeature.properties.members) { groupFeature.properties.members = []; } groupFeature.properties.members.push(feature22.properties.id); - }); + } } function cacheFeatureByIDs(feature22) { let ids = []; - identifierProps.forEach((prop) => { + for (const prop of identifierProps) { const id2 = feature22.properties[prop]; - if (id2) + if (id2) { ids.push(id2); - }); - (feature22.properties.aliases || []).forEach((alias) => { + } + } + for (const alias of feature22.properties.aliases || []) { ids.push(alias); - }); - ids.forEach((id2) => { - let cid = canonicalID(id2); - featuresByCode[cid] = feature22; - }); + } + for (const id2 of ids) { + const cid = canonicalID(id2); + _featuresByCode[cid] = feature22; + } } } function locArray(loc) { @@ -23225,17 +23715,17 @@ } function smallestFeature(loc) { const query = locArray(loc); - const featureProperties = whichPolygonGetter(query); + const featureProperties = _whichPolygon(query); if (!featureProperties) return null; - return featuresByCode[featureProperties.id]; + return _featuresByCode[featureProperties.id]; } function countryFeature(loc) { const feature22 = smallestFeature(loc); if (!feature22) return null; const countryCode = feature22.properties.country || feature22.properties.iso1A2; - return featuresByCode[countryCode] || null; + return _featuresByCode[countryCode] || null; } var defaultOpts = { level: void 0, @@ -23262,10 +23752,11 @@ } } } - const features2 = featuresContaining(loc); - const match = features2.find((feature22) => { + const features = featuresContaining(loc); + const match = features.find((feature22) => { let levelIndex = levels.indexOf(feature22.properties.level); - if (feature22.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) { + if (feature22.properties.level === targetLevel || // if no feature exists at the target level, return the first feature at the next level up + levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) { if (!withProp || feature22.properties[withProp]) { return feature22; } @@ -23286,10 +23777,10 @@ } else { stringID = canonicalID(id2); } - return featuresByCode[stringID] || null; + return _featuresByCode[stringID] || null; } - function smallestFeaturesForBbox(bbox) { - return whichPolygonGetter.bbox(bbox).map((props) => featuresByCode[props.id]); + function smallestFeaturesForBbox(bbox2) { + return _whichPolygon.bbox(bbox2).map((props) => _featuresByCode[props.id]); } function smallestOrMatchingFeature(query) { if (typeof query === "object") { @@ -23310,6 +23801,13 @@ return null; return match.properties.iso1A2 || null; } + function propertiesForQuery(query, property) { + const features = featuresContaining(query, false); + return features.map((feature22) => feature22.properties[property]).filter(Boolean); + } + function iso1A2Codes(query) { + return propertiesForQuery(query, "iso1A2"); + } function featuresContaining(query, strict) { let matchingFeatures; if (Array.isArray(query) && query.length === 4) { @@ -23326,44 +23824,44 @@ } else { returnFeatures = []; } - matchingFeatures.forEach((feature22) => { + for (const feature22 of matchingFeatures) { const properties = feature22.properties; - properties.groups.forEach((groupID) => { - const groupFeature = featuresByCode[groupID]; + for (const groupID of properties.groups) { + const groupFeature = _featuresByCode[groupID]; if (returnFeatures.indexOf(groupFeature) === -1) { returnFeatures.push(groupFeature); } - }); - }); + } + } return returnFeatures; } function featuresIn(id2, strict) { const feature22 = featureForID(id2); if (!feature22) return []; - let features2 = []; + let features = []; if (!strict) { - features2.push(feature22); + features.push(feature22); } const properties = feature22.properties; - (properties.members || []).forEach((memberID) => { - features2.push(featuresByCode[memberID]); - }); - return features2; + for (const memberID of properties.members || []) { + features.push(_featuresByCode[memberID]); + } + return features; } function aggregateFeature(id2) { - const features2 = featuresIn(id2, false); - if (features2.length === 0) + const features = featuresIn(id2, false); + if (features.length === 0) return null; let aggregateCoordinates = []; - features2.forEach((feature22) => { - if (feature22.geometry && feature22.geometry.type === "MultiPolygon" && feature22.geometry.coordinates) { + for (const feature22 of features) { + if (feature22.geometry?.type === "MultiPolygon" && feature22.geometry.coordinates) { aggregateCoordinates = aggregateCoordinates.concat(feature22.geometry.coordinates); } - }); + } return { type: "Feature", - properties: features2[0].properties, + properties: features[0].properties, geometry: { type: "MultiPolygon", coordinates: aggregateCoordinates @@ -23379,13 +23877,31 @@ return feature22 && feature22.properties.roadHeightUnit || null; } - // node_modules/@ideditor/location-conflation/index.mjs + // node_modules/@rapideditor/location-conflation/index.mjs var import_geojson_area = __toESM(require_geojson_area(), 1); var import_circle_to_polygon = __toESM(require_circle_to_polygon(), 1); var import_polygon_clipping = __toESM(require_polygon_clipping_umd(), 1); var import_geojson_precision = __toESM(require_geojson_precision(), 1); var import_json_stringify_pretty_compact = __toESM(require_json_stringify_pretty_compact(), 1); var location_conflation_default = class { + // constructor + // + // `fc` Optional FeatureCollection of known features + // + // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later. + // Each feature must have a filename-like `id`, for example: `something.geojson` + // + // { + // "type": "FeatureCollection" + // "features": [ + // { + // "type": "Feature", + // "id": "philly_metro.geojson", + // "properties": { … }, + // "geometry": { … } + // } + // ] + // } constructor(fc) { this._cache = {}; this._strict = true; @@ -23416,6 +23932,19 @@ world.properties.area = import_geojson_area.default.geometry(world.geometry) / 1e6; this._cache.Q2 = world; } + // validateLocation + // `location` The location to validate + // + // Pass a `location` value to validate + // + // Returns a result like: + // { + // type: 'point', 'geojson', or 'countrycoder' + // location: the queried location + // id: the stable identifier for the feature + // } + // or `null` if the location is invalid + // validateLocation(location) { if (Array.isArray(location) && (location.length === 2 || location.length === 3)) { const lon = location[0]; @@ -23443,6 +23972,20 @@ return null; } } + // resolveLocation + // `location` The location to resolve + // + // Pass a `location` value to resolve + // + // Returns a result like: + // { + // type: 'point', 'geojson', or 'countrycoder' + // location: the queried location + // id: a stable identifier for the feature + // feature: the resolved GeoJSON feature + // } + // or `null` if the location is invalid + // resolveLocation(location) { const valid = this.validateLocation(location); if (!valid) @@ -23463,6 +24006,7 @@ id: id2, properties: { id: id2, area: Number(area.toFixed(2)) }, geometry: (0, import_circle_to_polygon.default)([lon, lat], radius * 1e3, EDGES) + // km to m }, PRECISION); return Object.assign(valid, { feature: feature3 }); } else if (valid.type === "geojson") { @@ -23489,6 +24033,23 @@ return null; } } + // validateLocationSet + // `locationSet` the locationSet to validate + // + // Pass a locationSet Object to validate like: + // { + // include: [ Array of locations ], + // exclude: [ Array of locations ] + // } + // + // Returns a result like: + // { + // type: 'locationset' + // locationSet: the queried locationSet + // id: the stable identifier for the feature + // } + // or `null` if the locationSet is invalid + // validateLocationSet(locationSet) { locationSet = locationSet || {}; const validator = this.validateLocation.bind(this); @@ -23503,13 +24064,31 @@ } } include.sort(_sortLocations); - let id2 = "+[" + include.map((d) => d.id).join(",") + "]"; + let id2 = "+[" + include.map((d2) => d2.id).join(",") + "]"; if (exclude.length) { exclude.sort(_sortLocations); - id2 += "-[" + exclude.map((d) => d.id).join(",") + "]"; + id2 += "-[" + exclude.map((d2) => d2.id).join(",") + "]"; } return { type: "locationset", locationSet, id: id2 }; } + // resolveLocationSet + // `locationSet` the locationSet to resolve + // + // Pass a locationSet Object to validate like: + // { + // include: [ Array of locations ], + // exclude: [ Array of locations ] + // } + // + // Returns a result like: + // { + // type: 'locationset' + // locationSet: the queried locationSet + // id: the stable identifier for the feature + // feature: the resolved GeoJSON feature + // } + // or `null` if the locationSet is invalid + // resolveLocationSet(locationSet) { locationSet = locationSet || {}; const valid = this.validateLocationSet(locationSet); @@ -23525,8 +24104,8 @@ if (includes.length === 1 && excludes.length === 0) { return Object.assign(valid, { feature: includes[0].feature }); } - const includeGeoJSON = _clip(includes.map((d) => d.feature), "UNION"); - const excludeGeoJSON = _clip(excludes.map((d) => d.feature), "UNION"); + const includeGeoJSON = _clip(includes.map((d2) => d2.feature), "UNION"); + const excludeGeoJSON = _clip(excludes.map((d2) => d2.feature), "UNION"); let resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], "DIFFERENCE") : includeGeoJSON; const area = import_geojson_area.default.geometry(resultGeoJSON.geometry) / 1e6; resultGeoJSON.id = id2; @@ -23534,6 +24113,8 @@ this._cache[id2] = resultGeoJSON; return Object.assign(valid, { feature: resultGeoJSON }); } + // strict + // strict(val) { if (val === void 0) { return this._strict; @@ -23542,18 +24123,22 @@ return this; } } + // cache + // convenience method to access the internal cache cache() { return this._cache; } + // stringify + // convenience method to prettyStringify the given object stringify(obj, options2) { return (0, import_json_stringify_pretty_compact.default)(obj, options2); } }; - function _clip(features2, which) { - if (!Array.isArray(features2) || !features2.length) + function _clip(features, which) { + if (!Array.isArray(features) || !features.length) return null; const fn = { UNION: import_polygon_clipping.default.union, DIFFERENCE: import_polygon_clipping.default.difference }[which]; - const args = features2.map((feature3) => feature3.geometry.coordinates); + const args = features.map((feature3) => feature3.geometry.coordinates); const coords = fn.apply(null, args); return { type: "Feature", @@ -23564,1066 +24149,1404 @@ } }; function whichType(coords2) { - const a = Array.isArray(coords2); - const b = a && Array.isArray(coords2[0]); - const c = b && Array.isArray(coords2[0][0]); - const d = c && Array.isArray(coords2[0][0][0]); - return d ? "MultiPolygon" : "Polygon"; + const a2 = Array.isArray(coords2); + const b2 = a2 && Array.isArray(coords2[0]); + const c2 = b2 && Array.isArray(coords2[0][0]); + const d2 = c2 && Array.isArray(coords2[0][0][0]); + return d2 ? "MultiPolygon" : "Polygon"; } } function _cloneDeep(obj) { return JSON.parse(JSON.stringify(obj)); } - function _sortLocations(a, b) { + function _sortLocations(a2, b2) { const rank = { countrycoder: 1, geojson: 2, point: 3 }; - const aRank = rank[a.type]; - const bRank = rank[b.type]; - return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id); + const aRank = rank[a2.type]; + const bRank = rank[b2.type]; + return aRank > bRank ? 1 : aRank < bRank ? -1 : a2.id.localeCompare(b2.id); } - // modules/core/locations.js + // modules/core/LocationManager.js var import_which_polygon2 = __toESM(require_which_polygon()); var import_geojson_area2 = __toESM(require_geojson_area()); + var _loco = new location_conflation_default(); + var LocationManager = class { + /** + * @constructor + */ + constructor() { + this._wp = null; + this._resolved = /* @__PURE__ */ new Map(); + this._knownLocationSets = /* @__PURE__ */ new Map(); + this._locationIncludedIn = /* @__PURE__ */ new Map(); + this._locationExcludedIn = /* @__PURE__ */ new Map(); + const world = { locationSet: { include: ["Q2"] } }; + this._resolveLocationSet(world); + this._rebuildIndex(); + } + /** + * _validateLocationSet + * Pass an Object with a `locationSet` property. + * Validates the `locationSet` and sets a `locationSetID` property on the object. + * To avoid so much computation we only resolve the include and exclude regions, but not the locationSet itself. + * + * Use `_resolveLocationSet()` instead if you need to resolve geojson of locationSet, for example to render it. + * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets. + * + * @param `obj` Object to check, it should have `locationSet` property + */ + _validateLocationSet(obj) { + if (obj.locationSetID) + return; + try { + let locationSet = obj.locationSet; + if (!locationSet) { + throw new Error("object missing locationSet property"); + } + if (!locationSet.include) { + locationSet.include = ["Q2"]; + } + const locationSetID = _loco.validateLocationSet(locationSet).id; + obj.locationSetID = locationSetID; + if (this._knownLocationSets.has(locationSetID)) + return; + let area = 0; + (locationSet.include || []).forEach((location) => { + const locationID = _loco.validateLocation(location).id; + let geojson = this._resolved.get(locationID); + if (!geojson) { + geojson = _loco.resolveLocation(location).feature; + this._resolved.set(locationID, geojson); + } + area += geojson.properties.area; + let s2 = this._locationIncludedIn.get(locationID); + if (!s2) { + s2 = /* @__PURE__ */ new Set(); + this._locationIncludedIn.set(locationID, s2); + } + s2.add(locationSetID); + }); + (locationSet.exclude || []).forEach((location) => { + const locationID = _loco.validateLocation(location).id; + let geojson = this._resolved.get(locationID); + if (!geojson) { + geojson = _loco.resolveLocation(location).feature; + this._resolved.set(locationID, geojson); + } + area -= geojson.properties.area; + let s2 = this._locationExcludedIn.get(locationID); + if (!s2) { + s2 = /* @__PURE__ */ new Set(); + this._locationExcludedIn.set(locationID, s2); + } + s2.add(locationSetID); + }); + this._knownLocationSets.set(locationSetID, area); + } catch (err) { + obj.locationSet = { include: ["Q2"] }; + obj.locationSetID = "+[Q2]"; + } + } + /** + * _resolveLocationSet + * Does everything that `_validateLocationSet()` does, but then "resolves" the locationSet into GeoJSON. + * This step is a bit more computationally expensive, so really only needed if you intend to render the shape. + * + * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets. + * + * @param `obj` Object to check, it should have `locationSet` property + */ + _resolveLocationSet(obj) { + this._validateLocationSet(obj); + if (this._resolved.has(obj.locationSetID)) + return; + try { + const result = _loco.resolveLocationSet(obj.locationSet); + const locationSetID = result.id; + obj.locationSetID = locationSetID; + if (!result.feature.geometry.coordinates.length || !result.feature.properties.area) { + throw new Error(`locationSet ${locationSetID} resolves to an empty feature.`); + } + let geojson = JSON.parse(JSON.stringify(result.feature)); + geojson.id = locationSetID; + geojson.properties.id = locationSetID; + this._resolved.set(locationSetID, geojson); + } catch (err) { + obj.locationSet = { include: ["Q2"] }; + obj.locationSetID = "+[Q2]"; + } + } + /** + * _rebuildIndex + * Rebuilds the whichPolygon index with whatever features have been resolved into GeoJSON. + */ + _rebuildIndex() { + this._wp = (0, import_which_polygon2.default)({ features: [...this._resolved.values()] }); + } + /** + * mergeCustomGeoJSON + * Accepts a FeatureCollection-like object containing custom locations + * Each feature must have a filename-like `id`, for example: `something.geojson` + * { + * "type": "FeatureCollection" + * "features": [ + * { + * "type": "Feature", + * "id": "philly_metro.geojson", + * "properties": { … }, + * "geometry": { … } + * } + * ] + * } + * + * @param `fc` FeatureCollection-like Object containing custom locations + */ + mergeCustomGeoJSON(fc) { + if (!fc || fc.type !== "FeatureCollection" || !Array.isArray(fc.features)) + return; + fc.features.forEach((feature3) => { + feature3.properties = feature3.properties || {}; + let props = feature3.properties; + let id2 = feature3.id || props.id; + if (!id2 || !/^\S+\.geojson$/i.test(id2)) + return; + id2 = id2.toLowerCase(); + feature3.id = id2; + props.id = id2; + if (!props.area) { + const area = import_geojson_area2.default.geometry(feature3.geometry) / 1e6; + props.area = Number(area.toFixed(2)); + } + _loco._cache[id2] = feature3; + }); + } + /** + * mergeLocationSets + * Accepts an Array of Objects containing `locationSet` properties: + * [ + * { id: 'preset1', locationSet: {…} }, + * { id: 'preset2', locationSet: {…} }, + * … + * ] + * After validating, the Objects will be decorated with a `locationSetID` property: + * [ + * { id: 'preset1', locationSet: {…}, locationSetID: '+[Q2]' }, + * { id: 'preset2', locationSet: {…}, locationSetID: '+[Q30]' }, + * … + * ] + * + * @param `objects` Objects to check - they should have `locationSet` property + * @return Promise resolved true (this function used to be slow/async, now it's faster and sync) + */ + mergeLocationSets(objects) { + if (!Array.isArray(objects)) + return Promise.reject("nothing to do"); + objects.forEach((obj) => this._validateLocationSet(obj)); + this._rebuildIndex(); + return Promise.resolve(objects); + } + /** + * locationSetID + * Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world) + * (The locationSet doesn't necessarily need to be resolved to compute its `id`) + * + * @param `locationSet` A locationSet Object, e.g. `{ include: ['us'] }` + * @return String locationSetID, e.g. `+[Q30]` + */ + locationSetID(locationSet) { + let locationSetID; + try { + locationSetID = _loco.validateLocationSet(locationSet).id; + } catch (err) { + locationSetID = "+[Q2]"; + } + return locationSetID; + } + /** + * feature + * Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world') + * A GeoJSON feature: + * { + * type: 'Feature', + * id: '+[Q30]', + * properties: { id: '+[Q30]', area: 21817019.17, … }, + * geometry: { … } + * } + * + * @param `locationSetID` String identifier, e.g. `+[Q30]` + * @return GeoJSON object (fallback to world) + */ + feature(locationSetID = "+[Q2]") { + const feature3 = this._resolved.get(locationSetID); + return feature3 || this._resolved.get("+[Q2]"); + } + /** + * locationSetsAt + * Find all the locationSets valid at the given location. + * Results include the area (in km²) to facilitate sorting. + * + * Object of locationSetIDs to areas (in km²) + * { + * "+[Q2]": 511207893.3958111, + * "+[Q30]": 21817019.17, + * "+[new_jersey.geojson]": 22390.77, + * … + * } + * + * @param `loc` `[lon,lat]` location to query, e.g. `[-74.4813, 40.7967]` + * @return Object of locationSetIDs valid at given location + */ + locationSetsAt(loc) { + let result = {}; + const hits = this._wp(loc, true) || []; + const thiz = this; + hits.forEach((prop) => { + if (prop.id[0] !== "+") + return; + const locationSetID = prop.id; + const area = thiz._knownLocationSets.get(locationSetID); + if (area) { + result[locationSetID] = area; + } + }); + hits.forEach((prop) => { + if (prop.id[0] === "+") + return; + const locationID = prop.id; + const included = thiz._locationIncludedIn.get(locationID); + (included || []).forEach((locationSetID) => { + const area = thiz._knownLocationSets.get(locationSetID); + if (area) { + result[locationSetID] = area; + } + }); + }); + hits.forEach((prop) => { + if (prop.id[0] === "+") + return; + const locationID = prop.id; + const excluded = thiz._locationExcludedIn.get(locationID); + (excluded || []).forEach((locationSetID) => { + delete result[locationSetID]; + }); + }); + return result; + } + // Direct access to the location-conflation resolver + loco() { + return _loco; + } + }; + var _sharedLocationManager = new LocationManager(); - // modules/util/aes.js - var import_aes_js = __toESM(require_aes_js()); - var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208]; - function utilAesEncrypt(text2, key) { - key = key || DEFAULT_128; - const textBytes = import_aes_js.default.utils.utf8.toBytes(text2); - const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key); - const encryptedBytes = aesCtr.encrypt(textBytes); - const encryptedHex = import_aes_js.default.utils.hex.fromBytes(encryptedBytes); - return encryptedHex; + // node_modules/lodash-es/_freeGlobal.js + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeGlobal_default = freeGlobal; + + // node_modules/lodash-es/_root.js + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root2 = freeGlobal_default || freeSelf || Function("return this")(); + var root_default = root2; + + // node_modules/lodash-es/_Symbol.js + var Symbol2 = root_default.Symbol; + var Symbol_default = Symbol2; + + // node_modules/lodash-es/_getRawTag.js + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + var nativeObjectToString = objectProto.toString; + var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0; + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; + try { + value[symToStringTag] = void 0; + var unmasked = true; + } catch (e3) { + } + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; } - function utilAesDecrypt(encryptedHex, key) { - key = key || DEFAULT_128; - const encryptedBytes = import_aes_js.default.utils.hex.toBytes(encryptedHex); - const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key); - const decryptedBytes = aesCtr.decrypt(encryptedBytes); - const text2 = import_aes_js.default.utils.utf8.fromBytes(decryptedBytes); - return text2; + var getRawTag_default = getRawTag; + + // node_modules/lodash-es/_objectToString.js + var objectProto2 = Object.prototype; + var nativeObjectToString2 = objectProto2.toString; + function objectToString(value) { + return nativeObjectToString2.call(value); } + var objectToString_default = objectToString; - // modules/util/clean_tags.js - function utilCleanTags(tags) { - var out = {}; - for (var k in tags) { - if (!k) - continue; - var v = tags[k]; - if (v !== void 0) { - out[k] = cleanValue(k, v); - } + // node_modules/lodash-es/_baseGetTag.js + var nullTag = "[object Null]"; + var undefinedTag = "[object Undefined]"; + var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0; + function baseGetTag(value) { + if (value == null) { + return value === void 0 ? undefinedTag : nullTag; } - return out; - function cleanValue(k2, v2) { - function keepSpaces(k3) { - return /_hours|_times|:conditional$/.test(k3); - } - function skip(k3) { - return /^(description|note|fixme)$/.test(k3); - } - if (skip(k2)) - return v2; - var cleaned = v2.split(";").map(function(s) { - return s.trim(); - }).join(keepSpaces(k2) ? "; " : ";"); - if (k2.indexOf("website") !== -1 || k2.indexOf("email") !== -1 || cleaned.indexOf("http") === 0) { - cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ""); - } - return cleaned; + return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value); + } + var baseGetTag_default = baseGetTag; + + // node_modules/lodash-es/isObjectLike.js + function isObjectLike(value) { + return value != null && typeof value == "object"; + } + var isObjectLike_default = isObjectLike; + + // node_modules/lodash-es/isSymbol.js + var symbolTag = "[object Symbol]"; + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike_default(value) && baseGetTag_default(value) == symbolTag; + } + var isSymbol_default = isSymbol; + + // node_modules/lodash-es/_arrayMap.js + function arrayMap(array2, iteratee) { + var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length); + while (++index < length) { + result[index] = iteratee(array2[index], index, array2); } + return result; } + var arrayMap_default = arrayMap; - // modules/util/detect.js - var _detected; - function utilDetect(refresh2) { - if (_detected && !refresh2) - return _detected; - _detected = {}; - const ua = navigator.userAgent; - let m = null; - m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); - if (m !== null) { - _detected.browser = m[1]; - _detected.version = m[2]; + // node_modules/lodash-es/isArray.js + var isArray = Array.isArray; + var isArray_default = isArray; + + // node_modules/lodash-es/_baseToString.js + var INFINITY = 1 / 0; + var symbolProto = Symbol_default ? Symbol_default.prototype : void 0; + var symbolToString = symbolProto ? symbolProto.toString : void 0; + function baseToString(value) { + if (typeof value == "string") { + return value; } - if (!_detected.browser) { - m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); - if (m !== null) { - _detected.browser = "msie"; - _detected.version = m[1]; - } + if (isArray_default(value)) { + return arrayMap_default(value, baseToString) + ""; } - if (!_detected.browser) { - m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); - if (m !== null) { - _detected.browser = "Opera"; - _detected.version = m[2]; - } + if (isSymbol_default(value)) { + return symbolToString ? symbolToString.call(value) : ""; } - if (!_detected.browser) { - m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i); - if (m !== null) { - _detected.browser = m[1]; - _detected.version = m[2]; - m = ua.match(/version\/([\.\d]+)/i); - if (m !== null) - _detected.version = m[1]; - } + var result = value + ""; + return result == "0" && 1 / value == -INFINITY ? "-0" : result; + } + var baseToString_default = baseToString; + + // node_modules/lodash-es/_trimmedEndIndex.js + var reWhitespace = /\s/; + function trimmedEndIndex(string) { + var index = string.length; + while (index-- && reWhitespace.test(string.charAt(index))) { } - if (!_detected.browser) { - _detected.browser = navigator.appName; - _detected.version = navigator.appVersion; + return index; + } + var trimmedEndIndex_default = trimmedEndIndex; + + // node_modules/lodash-es/_baseTrim.js + var reTrimStart = /^\s+/; + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex_default(string) + 1).replace(reTrimStart, "") : string; + } + var baseTrim_default = baseTrim; + + // node_modules/lodash-es/isObject.js + function isObject(value) { + var type2 = typeof value; + return value != null && (type2 == "object" || type2 == "function"); + } + var isObject_default = isObject; + + // node_modules/lodash-es/toNumber.js + var NAN = 0 / 0; + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + var reIsBinary = /^0b[01]+$/i; + var reIsOctal = /^0o[0-7]+$/i; + var freeParseInt = parseInt; + function toNumber(value) { + if (typeof value == "number") { + return value; } - _detected.version = _detected.version.split(/\W/).slice(0, 2).join("."); - _detected.opera = _detected.browser.toLowerCase() === "opera" && parseFloat(_detected.version) < 15; - if (_detected.browser.toLowerCase() === "msie") { - _detected.ie = true; - _detected.browser = "Internet Explorer"; - _detected.support = false; - } else { - _detected.ie = false; - _detected.support = true; + if (isSymbol_default(value)) { + return NAN; } - _detected.filedrop = window.FileReader && "ondrop" in window; - if (/Win/.test(ua)) { - _detected.os = "win"; - _detected.platform = "Windows"; - } else if (/Mac/.test(ua)) { - _detected.os = "mac"; - _detected.platform = "Macintosh"; - } else if (/X11/.test(ua) || /Linux/.test(ua)) { - _detected.os = "linux"; - _detected.platform = "Linux"; - } else { - _detected.os = "win"; - _detected.platform = "Unknown"; + if (isObject_default(value)) { + var other = typeof value.valueOf == "function" ? value.valueOf() : value; + value = isObject_default(other) ? other + "" : other; } - _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || navigator.platform === "MacIntel" && "maxTouchPoints" in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream; - _detected.browserLocales = Array.from(new Set( - [navigator.language].concat(navigator.languages || []).concat([ - navigator.userLanguage - ]).filter(Boolean) - )); - const loc = window.top.location; - let origin = loc.origin; - if (!origin) { - origin = loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port : ""); + if (typeof value != "string") { + return value === 0 ? value : +value; } - _detected.host = origin + loc.pathname; - return _detected; + value = baseTrim_default(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } + var toNumber_default = toNumber; - // modules/util/get_set_value.js - function utilGetSetValue(selection2, value) { - function d3_selection_value(value2) { - function valueNull() { - delete this.value; - } - function valueConstant() { - if (this.value !== value2) { - this.value = value2; - } + // node_modules/lodash-es/isFunction.js + var asyncTag = "[object AsyncFunction]"; + var funcTag = "[object Function]"; + var genTag = "[object GeneratorFunction]"; + var proxyTag = "[object Proxy]"; + function isFunction(value) { + if (!isObject_default(value)) { + return false; + } + var tag = baseGetTag_default(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + var isFunction_default = isFunction; + + // node_modules/lodash-es/_coreJsData.js + var coreJsData = root_default["__core-js_shared__"]; + var coreJsData_default = coreJsData; + + // node_modules/lodash-es/_isMasked.js + var maskSrcKey = function() { + var uid = /[^.]+$/.exec(coreJsData_default && coreJsData_default.keys && coreJsData_default.keys.IE_PROTO || ""); + return uid ? "Symbol(src)_1." + uid : ""; + }(); + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + var isMasked_default = isMasked; + + // node_modules/lodash-es/_toSource.js + var funcProto = Function.prototype; + var funcToString = funcProto.toString; + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e3) { } - function valueFunction() { - var x = value2.apply(this, arguments); - if (x === null || x === void 0) { - delete this.value; - } else if (this.value !== x) { - this.value = x; - } + try { + return func + ""; + } catch (e3) { } - return value2 === null || value2 === void 0 ? valueNull : typeof value2 === "function" ? valueFunction : valueConstant; } - if (arguments.length === 1) { - return selection2.property("value"); + return ""; + } + var toSource_default = toSource; + + // node_modules/lodash-es/_baseIsNative.js + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + var funcProto2 = Function.prototype; + var objectProto3 = Object.prototype; + var funcToString2 = funcProto2.toString; + var hasOwnProperty2 = objectProto3.hasOwnProperty; + var reIsNative = RegExp( + "^" + funcToString2.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" + ); + function baseIsNative(value) { + if (!isObject_default(value) || isMasked_default(value)) { + return false; } - return selection2.each(d3_selection_value(value)); + var pattern = isFunction_default(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource_default(value)); } + var baseIsNative_default = baseIsNative; - // modules/util/keybinding.js - function utilKeybinding(namespace) { - var _keybindings = {}; - function testBindings(d3_event, isCapturing) { - var didMatch = false; - var bindings = Object.keys(_keybindings).map(function(id2) { - return _keybindings[id2]; - }); - var i2, binding; - for (i2 = 0; i2 < bindings.length; i2++) { - binding = bindings[i2]; - if (!binding.event.modifiers.shiftKey) - continue; - if (!!binding.capture !== isCapturing) - continue; - if (matches(d3_event, binding, true)) { - binding.callback(d3_event); - didMatch = true; - break; - } - } - if (didMatch) - return; - for (i2 = 0; i2 < bindings.length; i2++) { - binding = bindings[i2]; - if (binding.event.modifiers.shiftKey) - continue; - if (!!binding.capture !== isCapturing) - continue; - if (matches(d3_event, binding, false)) { - binding.callback(d3_event); - break; - } + // node_modules/lodash-es/_getValue.js + function getValue(object, key) { + return object == null ? void 0 : object[key]; + } + var getValue_default = getValue; + + // node_modules/lodash-es/_getNative.js + function getNative(object, key) { + var value = getValue_default(object, key); + return baseIsNative_default(value) ? value : void 0; + } + var getNative_default = getNative; + + // node_modules/lodash-es/_WeakMap.js + var WeakMap = getNative_default(root_default, "WeakMap"); + var WeakMap_default = WeakMap; + + // node_modules/lodash-es/_isIndex.js + var MAX_SAFE_INTEGER = 9007199254740991; + var reIsUint = /^(?:0|[1-9]\d*)$/; + function isIndex(value, length) { + var type2 = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + } + var isIndex_default = isIndex; + + // node_modules/lodash-es/eq.js + function eq(value, other) { + return value === other || value !== value && other !== other; + } + var eq_default = eq; + + // node_modules/lodash-es/isLength.js + var MAX_SAFE_INTEGER2 = 9007199254740991; + function isLength(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER2; + } + var isLength_default = isLength; + + // node_modules/lodash-es/isArrayLike.js + function isArrayLike(value) { + return value != null && isLength_default(value.length) && !isFunction_default(value); + } + var isArrayLike_default = isArrayLike; + + // node_modules/lodash-es/_isPrototype.js + var objectProto4 = Object.prototype; + function isPrototype(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto4; + return value === proto; + } + var isPrototype_default = isPrototype; + + // node_modules/lodash-es/_baseTimes.js + function baseTimes(n3, iteratee) { + var index = -1, result = Array(n3); + while (++index < n3) { + result[index] = iteratee(index); + } + return result; + } + var baseTimes_default = baseTimes; + + // node_modules/lodash-es/_baseIsArguments.js + var argsTag = "[object Arguments]"; + function baseIsArguments(value) { + return isObjectLike_default(value) && baseGetTag_default(value) == argsTag; + } + var baseIsArguments_default = baseIsArguments; + + // node_modules/lodash-es/isArguments.js + var objectProto5 = Object.prototype; + var hasOwnProperty3 = objectProto5.hasOwnProperty; + var propertyIsEnumerable = objectProto5.propertyIsEnumerable; + var isArguments = baseIsArguments_default(function() { + return arguments; + }()) ? baseIsArguments_default : function(value) { + return isObjectLike_default(value) && hasOwnProperty3.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }; + var isArguments_default = isArguments; + + // node_modules/lodash-es/stubFalse.js + function stubFalse() { + return false; + } + var stubFalse_default = stubFalse; + + // node_modules/lodash-es/isBuffer.js + var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module; + var moduleExports = freeModule && freeModule.exports === freeExports; + var Buffer2 = moduleExports ? root_default.Buffer : void 0; + var nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : void 0; + var isBuffer = nativeIsBuffer || stubFalse_default; + var isBuffer_default = isBuffer; + + // node_modules/lodash-es/_baseIsTypedArray.js + var argsTag2 = "[object Arguments]"; + var arrayTag = "[object Array]"; + var boolTag = "[object Boolean]"; + var dateTag = "[object Date]"; + var errorTag = "[object Error]"; + var funcTag2 = "[object Function]"; + var mapTag = "[object Map]"; + var numberTag = "[object Number]"; + var objectTag = "[object Object]"; + var regexpTag = "[object RegExp]"; + var setTag = "[object Set]"; + var stringTag = "[object String]"; + var weakMapTag = "[object WeakMap]"; + var arrayBufferTag = "[object ArrayBuffer]"; + var dataViewTag = "[object DataView]"; + var float32Tag = "[object Float32Array]"; + var float64Tag = "[object Float64Array]"; + var int8Tag = "[object Int8Array]"; + var int16Tag = "[object Int16Array]"; + var int32Tag = "[object Int32Array]"; + var uint8Tag = "[object Uint8Array]"; + var uint8ClampedTag = "[object Uint8ClampedArray]"; + var uint16Tag = "[object Uint16Array]"; + var uint32Tag = "[object Uint32Array]"; + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag2] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag2] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + function baseIsTypedArray(value) { + return isObjectLike_default(value) && isLength_default(value.length) && !!typedArrayTags[baseGetTag_default(value)]; + } + var baseIsTypedArray_default = baseIsTypedArray; + + // node_modules/lodash-es/_baseUnary.js + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + var baseUnary_default = baseUnary; + + // node_modules/lodash-es/_nodeUtil.js + var freeExports2 = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule2 = freeExports2 && typeof module == "object" && module && !module.nodeType && module; + var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2; + var freeProcess = moduleExports2 && freeGlobal_default.process; + var nodeUtil = function() { + try { + var types = freeModule2 && freeModule2.require && freeModule2.require("util").types; + if (types) { + return types; } - function matches(d3_event2, binding2, testShift) { - var event = d3_event2; - var isMatch = false; - var tryKeyCode = true; - if (event.key !== void 0) { - tryKeyCode = event.key.charCodeAt(0) > 127; - isMatch = true; - if (binding2.event.key === void 0) { - isMatch = false; - } else if (Array.isArray(binding2.event.key)) { - if (binding2.event.key.map(function(s) { - return s.toLowerCase(); - }).indexOf(event.key.toLowerCase()) === -1) { - isMatch = false; - } - } else { - if (event.key.toLowerCase() !== binding2.event.key.toLowerCase()) { - isMatch = false; - } - } - } - if (!isMatch && (tryKeyCode || binding2.event.modifiers.altKey)) { - isMatch = event.keyCode === binding2.event.keyCode; - } - if (!isMatch) - return false; - if (!(event.ctrlKey && event.altKey)) { - if (event.ctrlKey !== binding2.event.modifiers.ctrlKey) - return false; - if (event.altKey !== binding2.event.modifiers.altKey) - return false; - } - if (event.metaKey !== binding2.event.modifiers.metaKey) - return false; - if (testShift && event.shiftKey !== binding2.event.modifiers.shiftKey) - return false; - return true; + return freeProcess && freeProcess.binding && freeProcess.binding("util"); + } catch (e3) { + } + }(); + var nodeUtil_default = nodeUtil; + + // node_modules/lodash-es/isTypedArray.js + var nodeIsTypedArray = nodeUtil_default && nodeUtil_default.isTypedArray; + var isTypedArray = nodeIsTypedArray ? baseUnary_default(nodeIsTypedArray) : baseIsTypedArray_default; + var isTypedArray_default = isTypedArray; + + // node_modules/lodash-es/_arrayLikeKeys.js + var objectProto6 = Object.prototype; + var hasOwnProperty4 = objectProto6.hasOwnProperty; + function arrayLikeKeys(value, inherited) { + var isArr = isArray_default(value), isArg = !isArr && isArguments_default(value), isBuff = !isArr && !isArg && isBuffer_default(value), isType = !isArr && !isArg && !isBuff && isTypedArray_default(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes_default(value.length, String) : [], length = result.length; + for (var key in value) { + if ((inherited || hasOwnProperty4.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. + (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. + isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. + isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties. + isIndex_default(key, length)))) { + result.push(key); } } - function capture(d3_event) { - testBindings(d3_event, true); + return result; + } + var arrayLikeKeys_default = arrayLikeKeys; + + // node_modules/lodash-es/_overArg.js + function overArg(func, transform2) { + return function(arg) { + return func(transform2(arg)); + }; + } + var overArg_default = overArg; + + // node_modules/lodash-es/_nativeKeys.js + var nativeKeys = overArg_default(Object.keys, Object); + var nativeKeys_default = nativeKeys; + + // node_modules/lodash-es/_baseKeys.js + var objectProto7 = Object.prototype; + var hasOwnProperty5 = objectProto7.hasOwnProperty; + function baseKeys(object) { + if (!isPrototype_default(object)) { + return nativeKeys_default(object); } - function bubble(d3_event) { - var tagName = select_default2(d3_event.target).node().tagName; - if (tagName === "INPUT" || tagName === "SELECT" || tagName === "TEXTAREA") { - return; + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty5.call(object, key) && key != "constructor") { + result.push(key); } - testBindings(d3_event, false); } - function keybinding(selection2) { - selection2 = selection2 || select_default2(document); - selection2.on("keydown.capture." + namespace, capture, true); - selection2.on("keydown.bubble." + namespace, bubble, false); - return keybinding; + return result; + } + var baseKeys_default = baseKeys; + + // node_modules/lodash-es/keys.js + function keys(object) { + return isArrayLike_default(object) ? arrayLikeKeys_default(object) : baseKeys_default(object); + } + var keys_default = keys; + + // node_modules/lodash-es/_nativeCreate.js + var nativeCreate = getNative_default(Object, "create"); + var nativeCreate_default = nativeCreate; + + // node_modules/lodash-es/_hashClear.js + function hashClear() { + this.__data__ = nativeCreate_default ? nativeCreate_default(null) : {}; + this.size = 0; + } + var hashClear_default = hashClear; + + // node_modules/lodash-es/_hashDelete.js + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + var hashDelete_default = hashDelete; + + // node_modules/lodash-es/_hashGet.js + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var objectProto8 = Object.prototype; + var hasOwnProperty6 = objectProto8.hasOwnProperty; + function hashGet(key) { + var data = this.__data__; + if (nativeCreate_default) { + var result = data[key]; + return result === HASH_UNDEFINED ? void 0 : result; + } + return hasOwnProperty6.call(data, key) ? data[key] : void 0; + } + var hashGet_default = hashGet; + + // node_modules/lodash-es/_hashHas.js + var objectProto9 = Object.prototype; + var hasOwnProperty7 = objectProto9.hasOwnProperty; + function hashHas(key) { + var data = this.__data__; + return nativeCreate_default ? data[key] !== void 0 : hasOwnProperty7.call(data, key); + } + var hashHas_default = hashHas; + + // node_modules/lodash-es/_hashSet.js + var HASH_UNDEFINED2 = "__lodash_hash_undefined__"; + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate_default && value === void 0 ? HASH_UNDEFINED2 : value; + return this; + } + var hashSet_default = hashSet; + + // node_modules/lodash-es/_Hash.js + function Hash(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); } - keybinding.unbind = function(selection2) { - _keybindings = []; - selection2 = selection2 || select_default2(document); - selection2.on("keydown.capture." + namespace, null); - selection2.on("keydown.bubble." + namespace, null); - return keybinding; - }; - keybinding.clear = function() { - _keybindings = {}; - return keybinding; - }; - keybinding.off = function(codes, capture2) { - var arr = utilArrayUniq([].concat(codes)); - for (var i2 = 0; i2 < arr.length; i2++) { - var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble"); - delete _keybindings[id2]; + } + Hash.prototype.clear = hashClear_default; + Hash.prototype["delete"] = hashDelete_default; + Hash.prototype.get = hashGet_default; + Hash.prototype.has = hashHas_default; + Hash.prototype.set = hashSet_default; + var Hash_default = Hash; + + // node_modules/lodash-es/_listCacheClear.js + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + var listCacheClear_default = listCacheClear; + + // node_modules/lodash-es/_assocIndexOf.js + function assocIndexOf(array2, key) { + var length = array2.length; + while (length--) { + if (eq_default(array2[length][0], key)) { + return length; } - return keybinding; + } + return -1; + } + var assocIndexOf_default = assocIndexOf; + + // node_modules/lodash-es/_listCacheDelete.js + var arrayProto = Array.prototype; + var splice = arrayProto.splice; + function listCacheDelete(key) { + var data = this.__data__, index = assocIndexOf_default(data, key); + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + var listCacheDelete_default = listCacheDelete; + + // node_modules/lodash-es/_listCacheGet.js + function listCacheGet(key) { + var data = this.__data__, index = assocIndexOf_default(data, key); + return index < 0 ? void 0 : data[index][1]; + } + var listCacheGet_default = listCacheGet; + + // node_modules/lodash-es/_listCacheHas.js + function listCacheHas(key) { + return assocIndexOf_default(this.__data__, key) > -1; + } + var listCacheHas_default = listCacheHas; + + // node_modules/lodash-es/_listCacheSet.js + function listCacheSet(key, value) { + var data = this.__data__, index = assocIndexOf_default(data, key); + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + var listCacheSet_default = listCacheSet; + + // node_modules/lodash-es/_ListCache.js + function ListCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + ListCache.prototype.clear = listCacheClear_default; + ListCache.prototype["delete"] = listCacheDelete_default; + ListCache.prototype.get = listCacheGet_default; + ListCache.prototype.has = listCacheHas_default; + ListCache.prototype.set = listCacheSet_default; + var ListCache_default = ListCache; + + // node_modules/lodash-es/_Map.js + var Map2 = getNative_default(root_default, "Map"); + var Map_default = Map2; + + // node_modules/lodash-es/_mapCacheClear.js + function mapCacheClear() { + this.size = 0; + this.__data__ = { + "hash": new Hash_default(), + "map": new (Map_default || ListCache_default)(), + "string": new Hash_default() }; - keybinding.on = function(codes, callback, capture2) { - if (typeof callback !== "function") { - return keybinding.off(codes, capture2); - } - var arr = utilArrayUniq([].concat(codes)); - for (var i2 = 0; i2 < arr.length; i2++) { - var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble"); - var binding = { - id: id2, - capture: capture2, - callback, - event: { - key: void 0, - keyCode: 0, - modifiers: { - shiftKey: false, - ctrlKey: false, - altKey: false, - metaKey: false - } - } - }; - if (_keybindings[id2]) { - console.warn('warning: duplicate keybinding for "' + id2 + '"'); - } - _keybindings[id2] = binding; - var matches = arr[i2].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); - for (var j2 = 0; j2 < matches.length; j2++) { - if (matches[j2] === "++") - matches[j2] = "+"; - if (matches[j2] in utilKeybinding.modifierCodes) { - var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j2]]]; - binding.event.modifiers[prop] = true; - } else { - binding.event.key = utilKeybinding.keys[matches[j2]] || matches[j2]; - if (matches[j2] in utilKeybinding.keyCodes) { - binding.event.keyCode = utilKeybinding.keyCodes[matches[j2]]; - } - } - } - } - return keybinding; + } + var mapCacheClear_default = mapCacheClear; + + // node_modules/lodash-es/_isKeyable.js + function isKeyable(value) { + var type2 = typeof value; + return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null; + } + var isKeyable_default = isKeyable; + + // node_modules/lodash-es/_getMapData.js + function getMapData(map2, key) { + var data = map2.__data__; + return isKeyable_default(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + } + var getMapData_default = getMapData; + + // node_modules/lodash-es/_mapCacheDelete.js + function mapCacheDelete(key) { + var result = getMapData_default(this, key)["delete"](key); + this.size -= result ? 1 : 0; + return result; + } + var mapCacheDelete_default = mapCacheDelete; + + // node_modules/lodash-es/_mapCacheGet.js + function mapCacheGet(key) { + return getMapData_default(this, key).get(key); + } + var mapCacheGet_default = mapCacheGet; + + // node_modules/lodash-es/_mapCacheHas.js + function mapCacheHas(key) { + return getMapData_default(this, key).has(key); + } + var mapCacheHas_default = mapCacheHas; + + // node_modules/lodash-es/_mapCacheSet.js + function mapCacheSet(key, value) { + var data = getMapData_default(this, key), size = data.size; + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + var mapCacheSet_default = mapCacheSet; + + // node_modules/lodash-es/_MapCache.js + function MapCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + MapCache.prototype.clear = mapCacheClear_default; + MapCache.prototype["delete"] = mapCacheDelete_default; + MapCache.prototype.get = mapCacheGet_default; + MapCache.prototype.has = mapCacheHas_default; + MapCache.prototype.set = mapCacheSet_default; + var MapCache_default = MapCache; + + // node_modules/lodash-es/toString.js + function toString(value) { + return value == null ? "" : baseToString_default(value); + } + var toString_default = toString; + + // node_modules/lodash-es/_arrayPush.js + function arrayPush(array2, values) { + var index = -1, length = values.length, offset = array2.length; + while (++index < length) { + array2[offset + index] = values[index]; + } + return array2; + } + var arrayPush_default = arrayPush; + + // node_modules/lodash-es/_basePropertyOf.js + function basePropertyOf(object) { + return function(key) { + return object == null ? void 0 : object[key]; }; - return keybinding; } - utilKeybinding.modifierCodes = { - "\u21E7": 16, - shift: 16, - "\u2303": 17, - ctrl: 17, - "\u2325": 18, - alt: 18, - option: 18, - "\u2318": 91, - meta: 91, - cmd: 91, - "super": 91, - win: 91 - }; - utilKeybinding.modifierProperties = { - 16: "shiftKey", - 17: "ctrlKey", - 18: "altKey", - 91: "metaKey" - }; - utilKeybinding.plusKeys = ["plus", "ffplus", "=", "ffequals", "\u2260", "\xB1"]; - utilKeybinding.minusKeys = ["_", "-", "ffminus", "dash", "\u2013", "\u2014"]; - utilKeybinding.keys = { - "\u232B": "Backspace", - backspace: "Backspace", - "\u21E5": "Tab", - "\u21C6": "Tab", - tab: "Tab", - "\u21A9": "Enter", - "\u21B5": "Enter", - "\u23CE": "Enter", - "return": "Enter", - enter: "Enter", - "\u2305": "Enter", - "pause": "Pause", - "pause-break": "Pause", - "\u21EA": "CapsLock", - caps: "CapsLock", - "caps-lock": "CapsLock", - "\u238B": ["Escape", "Esc"], - escape: ["Escape", "Esc"], - esc: ["Escape", "Esc"], - space: [" ", "Spacebar"], - "\u2196": "PageUp", - pgup: "PageUp", - "page-up": "PageUp", - "\u2198": "PageDown", - pgdown: "PageDown", - "page-down": "PageDown", - "\u21DF": "End", - end: "End", - "\u21DE": "Home", - home: "Home", - ins: "Insert", - insert: "Insert", - "\u2326": ["Delete", "Del"], - del: ["Delete", "Del"], - "delete": ["Delete", "Del"], - "\u2190": ["ArrowLeft", "Left"], - left: ["ArrowLeft", "Left"], - "arrow-left": ["ArrowLeft", "Left"], - "\u2191": ["ArrowUp", "Up"], - up: ["ArrowUp", "Up"], - "arrow-up": ["ArrowUp", "Up"], - "\u2192": ["ArrowRight", "Right"], - right: ["ArrowRight", "Right"], - "arrow-right": ["ArrowRight", "Right"], - "\u2193": ["ArrowDown", "Down"], - down: ["ArrowDown", "Down"], - "arrow-down": ["ArrowDown", "Down"], - "*": ["*", "Multiply"], - star: ["*", "Multiply"], - asterisk: ["*", "Multiply"], - multiply: ["*", "Multiply"], - "+": ["+", "Add"], - "plus": ["+", "Add"], - "-": ["-", "Subtract"], - subtract: ["-", "Subtract"], - "dash": ["-", "Subtract"], - semicolon: ";", - equals: "=", - comma: ",", - period: ".", - "full-stop": ".", - slash: "/", - "forward-slash": "/", - tick: "`", - "back-quote": "`", - "open-bracket": "[", - "back-slash": "\\", - "close-bracket": "]", - quote: "'", - apostrophe: "'", - "num-0": "0", - "num-1": "1", - "num-2": "2", - "num-3": "3", - "num-4": "4", - "num-5": "5", - "num-6": "6", - "num-7": "7", - "num-8": "8", - "num-9": "9", - f1: "F1", - f2: "F2", - f3: "F3", - f4: "F4", - f5: "F5", - f6: "F6", - f7: "F7", - f8: "F8", - f9: "F9", - f10: "F10", - f11: "F11", - f12: "F12", - f13: "F13", - f14: "F14", - f15: "F15", - f16: "F16", - f17: "F17", - f18: "F18", - f19: "F19", - f20: "F20", - f21: "F21", - f22: "F22", - f23: "F23", - f24: "F24", - f25: "F25" - }; - utilKeybinding.keyCodes = { - "\u232B": 8, - backspace: 8, - "\u21E5": 9, - "\u21C6": 9, - tab: 9, - "\u21A9": 13, - "\u21B5": 13, - "\u23CE": 13, - "return": 13, - enter: 13, - "\u2305": 13, - "pause": 19, - "pause-break": 19, - "\u21EA": 20, - caps: 20, - "caps-lock": 20, - "\u238B": 27, - escape: 27, - esc: 27, - space: 32, - "\u2196": 33, - pgup: 33, - "page-up": 33, - "\u2198": 34, - pgdown: 34, - "page-down": 34, - "\u21DF": 35, - end: 35, - "\u21DE": 36, - home: 36, - ins: 45, - insert: 45, - "\u2326": 46, - del: 46, - "delete": 46, - "\u2190": 37, - left: 37, - "arrow-left": 37, - "\u2191": 38, - up: 38, - "arrow-up": 38, - "\u2192": 39, - right: 39, - "arrow-right": 39, - "\u2193": 40, - down: 40, - "arrow-down": 40, - "ffequals": 61, - "*": 106, - star: 106, - asterisk: 106, - multiply: 106, - "+": 107, - "plus": 107, - "-": 109, - subtract: 109, - "|": 124, - "ffplus": 171, - "ffminus": 173, - ";": 186, - semicolon: 186, - "=": 187, - "equals": 187, - ",": 188, - comma: 188, - "dash": 189, - ".": 190, - period: 190, - "full-stop": 190, - "/": 191, - slash: 191, - "forward-slash": 191, - "`": 192, - tick: 192, - "back-quote": 192, - "[": 219, - "open-bracket": 219, - "\\": 220, - "back-slash": 220, - "]": 221, - "close-bracket": 221, - "'": 222, - quote: 222, - apostrophe: 222 - }; - var i = 95; - var n = 0; - while (++i < 106) { - utilKeybinding.keyCodes["num-" + n] = i; - ++n; + var basePropertyOf_default = basePropertyOf; + + // node_modules/lodash-es/_stackClear.js + function stackClear() { + this.__data__ = new ListCache_default(); + this.size = 0; } - i = 47; - n = 0; - while (++i < 58) { - utilKeybinding.keyCodes[n] = i; - ++n; + var stackClear_default = stackClear; + + // node_modules/lodash-es/_stackDelete.js + function stackDelete(key) { + var data = this.__data__, result = data["delete"](key); + this.size = data.size; + return result; } - i = 111; - n = 1; - while (++i < 136) { - utilKeybinding.keyCodes["f" + n] = i; - ++n; + var stackDelete_default = stackDelete; + + // node_modules/lodash-es/_stackGet.js + function stackGet(key) { + return this.__data__.get(key); } - i = 64; - while (++i < 91) { - utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i; + var stackGet_default = stackGet; + + // node_modules/lodash-es/_stackHas.js + function stackHas(key) { + return this.__data__.has(key); } + var stackHas_default = stackHas; - // modules/util/object.js - function utilObjectOmit(obj, omitKeys) { - return Object.keys(obj).reduce(function(result, key) { - if (omitKeys.indexOf(key) === -1) { - result[key] = obj[key]; + // node_modules/lodash-es/_stackSet.js + var LARGE_ARRAY_SIZE = 200; + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache_default) { + var pairs2 = data.__data__; + if (!Map_default || pairs2.length < LARGE_ARRAY_SIZE - 1) { + pairs2.push([key, value]); + this.size = ++data.size; + return this; } - return result; - }, {}); + data = this.__data__ = new MapCache_default(pairs2); + } + data.set(key, value); + this.size = data.size; + return this; } + var stackSet_default = stackSet; - // modules/util/rebind.js - function utilRebind(target, source) { - var i2 = 1, n2 = arguments.length, method; - while (++i2 < n2) { - target[method = arguments[i2]] = d3_rebind(target, source, source[method]); + // node_modules/lodash-es/_Stack.js + function Stack(entries) { + var data = this.__data__ = new ListCache_default(entries); + this.size = data.size; + } + Stack.prototype.clear = stackClear_default; + Stack.prototype["delete"] = stackDelete_default; + Stack.prototype.get = stackGet_default; + Stack.prototype.has = stackHas_default; + Stack.prototype.set = stackSet_default; + var Stack_default = Stack; + + // node_modules/lodash-es/_arrayFilter.js + function arrayFilter(array2, predicate) { + var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = []; + while (++index < length) { + var value = array2[index]; + if (predicate(value, index, array2)) { + result[resIndex++] = value; + } } - return target; + return result; } - function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return value === source ? target : value; - }; + var arrayFilter_default = arrayFilter; + + // node_modules/lodash-es/stubArray.js + function stubArray() { + return []; } + var stubArray_default = stubArray; - // modules/util/session_mutex.js - function utilSessionMutex(name) { - var mutex = {}; - var intervalID; - function renew() { - var expires = new Date(); - expires.setSeconds(expires.getSeconds() + 5); - document.cookie = name + "=1; expires=" + expires.toUTCString() + "; sameSite=strict"; + // node_modules/lodash-es/_getSymbols.js + var objectProto10 = Object.prototype; + var propertyIsEnumerable2 = objectProto10.propertyIsEnumerable; + var nativeGetSymbols = Object.getOwnPropertySymbols; + var getSymbols = !nativeGetSymbols ? stubArray_default : function(object) { + if (object == null) { + return []; } - mutex.lock = function() { - if (intervalID) - return true; - var cookie = document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1"); - if (cookie) - return false; - renew(); - intervalID = window.setInterval(renew, 4e3); - return true; - }; - mutex.unlock = function() { - if (!intervalID) - return; - document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict"; - clearInterval(intervalID); - intervalID = null; - }; - mutex.locked = function() { - return !!intervalID; + object = Object(object); + return arrayFilter_default(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable2.call(object, symbol); + }); + }; + var getSymbols_default = getSymbols; + + // node_modules/lodash-es/_baseGetAllKeys.js + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray_default(object) ? result : arrayPush_default(result, symbolsFunc(object)); + } + var baseGetAllKeys_default = baseGetAllKeys; + + // node_modules/lodash-es/_getAllKeys.js + function getAllKeys(object) { + return baseGetAllKeys_default(object, keys_default, getSymbols_default); + } + var getAllKeys_default = getAllKeys; + + // node_modules/lodash-es/_DataView.js + var DataView2 = getNative_default(root_default, "DataView"); + var DataView_default = DataView2; + + // node_modules/lodash-es/_Promise.js + var Promise2 = getNative_default(root_default, "Promise"); + var Promise_default = Promise2; + + // node_modules/lodash-es/_Set.js + var Set2 = getNative_default(root_default, "Set"); + var Set_default = Set2; + + // node_modules/lodash-es/_getTag.js + var mapTag2 = "[object Map]"; + var objectTag2 = "[object Object]"; + var promiseTag = "[object Promise]"; + var setTag2 = "[object Set]"; + var weakMapTag2 = "[object WeakMap]"; + var dataViewTag2 = "[object DataView]"; + var dataViewCtorString = toSource_default(DataView_default); + var mapCtorString = toSource_default(Map_default); + var promiseCtorString = toSource_default(Promise_default); + var setCtorString = toSource_default(Set_default); + var weakMapCtorString = toSource_default(WeakMap_default); + var getTag = baseGetTag_default; + if (DataView_default && getTag(new DataView_default(new ArrayBuffer(1))) != dataViewTag2 || Map_default && getTag(new Map_default()) != mapTag2 || Promise_default && getTag(Promise_default.resolve()) != promiseTag || Set_default && getTag(new Set_default()) != setTag2 || WeakMap_default && getTag(new WeakMap_default()) != weakMapTag2) { + getTag = function(value) { + var result = baseGetTag_default(value), Ctor = result == objectTag2 ? value.constructor : void 0, ctorString = Ctor ? toSource_default(Ctor) : ""; + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag2; + case mapCtorString: + return mapTag2; + case promiseCtorString: + return promiseTag; + case setCtorString: + return setTag2; + case weakMapCtorString: + return weakMapTag2; + } + } + return result; }; - return mutex; } + var getTag_default = getTag; - // modules/util/tiler.js - function utilTiler() { - var _size = [256, 256]; - var _scale = 256; - var _tileSize = 256; - var _zoomExtent = [0, 20]; - var _translate = [_size[0] / 2, _size[1] / 2]; - var _margin = 0; - var _skipNullIsland = false; - function clamp3(num, min3, max3) { - return Math.max(min3, Math.min(num, max3)); + // node_modules/lodash-es/_Uint8Array.js + var Uint8Array2 = root_default.Uint8Array; + var Uint8Array_default = Uint8Array2; + + // node_modules/lodash-es/_setCacheAdd.js + var HASH_UNDEFINED3 = "__lodash_hash_undefined__"; + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED3); + return this; + } + var setCacheAdd_default = setCacheAdd; + + // node_modules/lodash-es/_setCacheHas.js + function setCacheHas(value) { + return this.__data__.has(value); + } + var setCacheHas_default = setCacheHas; + + // node_modules/lodash-es/_SetCache.js + function SetCache(values) { + var index = -1, length = values == null ? 0 : values.length; + this.__data__ = new MapCache_default(); + while (++index < length) { + this.add(values[index]); } - function nearNullIsland(tile) { - var x = tile[0]; - var y = tile[1]; - var z = tile[2]; - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min3 = center - width / 2; - var max3 = center + width / 2 - 1; - return x >= min3 && x <= max3 && y >= min3 && y <= max3; + } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd_default; + SetCache.prototype.has = setCacheHas_default; + var SetCache_default = SetCache; + + // node_modules/lodash-es/_arraySome.js + function arraySome(array2, predicate) { + var index = -1, length = array2 == null ? 0 : array2.length; + while (++index < length) { + if (predicate(array2[index], index, array2)) { + return true; } + } + return false; + } + var arraySome_default = arraySome; + + // node_modules/lodash-es/_cacheHas.js + function cacheHas(cache, key) { + return cache.has(key); + } + var cacheHas_default = cacheHas; + + // node_modules/lodash-es/_equalArrays.js + var COMPARE_PARTIAL_FLAG = 1; + var COMPARE_UNORDERED_FLAG = 2; + function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array2.length, othLength = other.length; + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } - function tiler8() { - var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); - var z0 = clamp3(Math.round(z), _zoomExtent[0], _zoomExtent[1]); - var tileMin = 0; - var tileMax = Math.pow(2, z0) - 1; - var log2ts = Math.log(_tileSize) * Math.LOG2E; - var k = Math.pow(2, z - z0 + log2ts); - var origin = [ - (_translate[0] - _scale / 2) / k, - (_translate[1] - _scale / 2) / k - ]; - var cols = range( - clamp3(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), - clamp3(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1) - ); - var rows = range( - clamp3(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), - clamp3(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1) - ); - var tiles = []; - for (var i2 = 0; i2 < rows.length; i2++) { - var y = rows[i2]; - for (var j2 = 0; j2 < cols.length; j2++) { - var x = cols[j2]; - if (i2 >= _margin && i2 <= rows.length - _margin && j2 >= _margin && j2 <= cols.length - _margin) { - tiles.unshift([x, y, z0]); - } else { - tiles.push([x, y, z0]); + var arrStacked = stack.get(array2); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array2; + } + var index = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache_default() : void 0; + stack.set(array2, other); + stack.set(other, array2); + while (++index < arrLength) { + var arrValue = array2[index], othValue = other[index]; + if (customizer) { + var compared = isPartial ? customizer(othValue, arrValue, index, other, array2, stack) : customizer(arrValue, othValue, index, array2, other, stack); + } + if (compared !== void 0) { + if (compared) { + continue; + } + result = false; + break; + } + if (seen) { + if (!arraySome_default(other, function(othValue2, othIndex) { + if (!cacheHas_default(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { + return seen.push(othIndex); } + })) { + result = false; + break; } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + result = false; + break; } - tiles.translate = origin; - tiles.scale = k; - return tiles; } - tiler8.getTiles = function(projection2) { - var origin = [ - projection2.scale() * Math.PI - projection2.translate()[0], - projection2.scale() * Math.PI - projection2.translate()[1] - ]; - this.size(projection2.clipExtent()[1]).scale(projection2.scale() * 2 * Math.PI).translate(projection2.translate()); - var tiles = tiler8(); - var ts = tiles.scale; - return tiles.map(function(tile) { - if (_skipNullIsland && nearNullIsland(tile)) { + stack["delete"](array2); + stack["delete"](other); + return result; + } + var equalArrays_default = equalArrays; + + // node_modules/lodash-es/_mapToArray.js + function mapToArray(map2) { + var index = -1, result = Array(map2.size); + map2.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + var mapToArray_default = mapToArray; + + // node_modules/lodash-es/_setToArray.js + function setToArray(set3) { + var index = -1, result = Array(set3.size); + set3.forEach(function(value) { + result[++index] = value; + }); + return result; + } + var setToArray_default = setToArray; + + // node_modules/lodash-es/_equalByTag.js + var COMPARE_PARTIAL_FLAG2 = 1; + var COMPARE_UNORDERED_FLAG2 = 2; + var boolTag2 = "[object Boolean]"; + var dateTag2 = "[object Date]"; + var errorTag2 = "[object Error]"; + var mapTag3 = "[object Map]"; + var numberTag2 = "[object Number]"; + var regexpTag2 = "[object RegExp]"; + var setTag3 = "[object Set]"; + var stringTag2 = "[object String]"; + var symbolTag2 = "[object Symbol]"; + var arrayBufferTag2 = "[object ArrayBuffer]"; + var dataViewTag3 = "[object DataView]"; + var symbolProto2 = Symbol_default ? Symbol_default.prototype : void 0; + var symbolValueOf = symbolProto2 ? symbolProto2.valueOf : void 0; + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag3: + if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { return false; } - var x = tile[0] * ts - origin[0]; - var y = tile[1] * ts - origin[1]; - return { - id: tile.toString(), - xyz: tile, - extent: geoExtent( - projection2.invert([x, y + ts]), - projection2.invert([x + ts, y]) - ) - }; - }).filter(Boolean); - }; - tiler8.getGeoJSON = function(projection2) { - var features2 = tiler8.getTiles(projection2).map(function(tile) { - return { - type: "Feature", - properties: { - id: tile.id, - name: tile.id - }, - geometry: { - type: "Polygon", - coordinates: [tile.extent.polygon()] - } - }; - }); - return { - type: "FeatureCollection", - features: features2 - }; - }; - tiler8.tileSize = function(val) { - if (!arguments.length) - return _tileSize; - _tileSize = val; - return tiler8; - }; - tiler8.zoomExtent = function(val) { - if (!arguments.length) - return _zoomExtent; - _zoomExtent = val; - return tiler8; - }; - tiler8.size = function(val) { - if (!arguments.length) - return _size; - _size = val; - return tiler8; - }; - tiler8.scale = function(val) { - if (!arguments.length) - return _scale; - _scale = val; - return tiler8; - }; - tiler8.translate = function(val) { - if (!arguments.length) - return _translate; - _translate = val; - return tiler8; - }; - tiler8.margin = function(val) { - if (!arguments.length) - return _margin; - _margin = +val; - return tiler8; - }; - tiler8.skipNullIsland = function(val) { - if (!arguments.length) - return _skipNullIsland; - _skipNullIsland = val; - return tiler8; - }; - return tiler8; - } - - // modules/util/trigger_event.js - function utilTriggerEvent(target, type3) { - target.each(function() { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent(type3, true, true); - this.dispatchEvent(evt); - }); - } - - // modules/core/locations.js - var _mainLocations = coreLocations(); - function coreLocations() { - let _this = {}; - let _resolvedFeatures = {}; - let _loco = new location_conflation_default(); - let _wp; - const world = { locationSet: { include: ["Q2"] } }; - resolveLocationSet(world); - rebuildIndex(); - let _queue = []; - let _deferred2 = /* @__PURE__ */ new Set(); - let _inProcess; - function processQueue() { - if (!_queue.length) - return Promise.resolve(); - const chunk = _queue.pop(); - return new Promise((resolvePromise) => { - const handle = window.requestIdleCallback(() => { - _deferred2.delete(handle); - chunk.forEach(resolveLocationSet); - resolvePromise(); - }); - _deferred2.add(handle); - }).then(() => processQueue()); - } - function resolveLocationSet(obj) { - if (obj.locationSetID) - return; - try { - let locationSet = obj.locationSet; - if (!locationSet) { - throw new Error("object missing locationSet property"); + object = object.buffer; + other = other.buffer; + case arrayBufferTag2: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array_default(object), new Uint8Array_default(other))) { + return false; } - if (!locationSet.include) { - locationSet.include = ["Q2"]; + return true; + case boolTag2: + case dateTag2: + case numberTag2: + return eq_default(+object, +other); + case errorTag2: + return object.name == other.name && object.message == other.message; + case regexpTag2: + case stringTag2: + return object == other + ""; + case mapTag3: + var convert = mapToArray_default; + case setTag3: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG2; + convert || (convert = setToArray_default); + if (object.size != other.size && !isPartial) { + return false; } - const resolved = _loco.resolveLocationSet(locationSet); - const locationSetID = resolved.id; - obj.locationSetID = locationSetID; - if (!resolved.feature.geometry.coordinates.length || !resolved.feature.properties.area) { - throw new Error(`locationSet ${locationSetID} resolves to an empty feature.`); + var stacked = stack.get(object); + if (stacked) { + return stacked == other; } - if (!_resolvedFeatures[locationSetID]) { - let feature3 = JSON.parse(JSON.stringify(resolved.feature)); - feature3.id = locationSetID; - feature3.properties.id = locationSetID; - _resolvedFeatures[locationSetID] = feature3; + bitmask |= COMPARE_UNORDERED_FLAG2; + stack.set(object, other); + var result = equalArrays_default(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack["delete"](object); + return result; + case symbolTag2: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); } - } catch (err) { - obj.locationSet = { include: ["Q2"] }; - obj.locationSetID = "+[Q2]"; - } } - function rebuildIndex() { - _wp = (0, import_which_polygon2.default)({ features: Object.values(_resolvedFeatures) }); - } - _this.mergeCustomGeoJSON = (fc) => { - if (fc && fc.type === "FeatureCollection" && Array.isArray(fc.features)) { - fc.features.forEach((feature3) => { - feature3.properties = feature3.properties || {}; - let props = feature3.properties; - let id2 = feature3.id || props.id; - if (!id2 || !/^\S+\.geojson$/i.test(id2)) - return; - id2 = id2.toLowerCase(); - feature3.id = id2; - props.id = id2; - if (!props.area) { - const area = import_geojson_area2.default.geometry(feature3.geometry) / 1e6; - props.area = Number(area.toFixed(2)); - } - _loco._cache[id2] = feature3; - }); - } - }; - _this.mergeLocationSets = (objects) => { - if (!Array.isArray(objects)) - return Promise.reject("nothing to do"); - _queue = _queue.concat(utilArrayChunk(objects, 200)); - if (!_inProcess) { - _inProcess = processQueue().then(() => { - rebuildIndex(); - _inProcess = null; - return objects; - }); - } - return _inProcess; - }; - _this.locationSetID = (locationSet) => { - let locationSetID; - try { - locationSetID = _loco.validateLocationSet(locationSet).id; - } catch (err) { - locationSetID = "+[Q2]"; - } - return locationSetID; - }; - _this.feature = (locationSetID) => _resolvedFeatures[locationSetID] || _resolvedFeatures["+[Q2]"]; - _this.locationsAt = (loc) => { - let result = {}; - (_wp(loc, true) || []).forEach((prop) => result[prop.id] = prop.area); - return result; - }; - _this.query = (loc, multi) => _wp(loc, multi); - _this.loco = () => _loco; - _this.wp = () => _wp; - return _this; + return false; } + var equalByTag_default = equalByTag; - // node_modules/lodash-es/_freeGlobal.js - var freeGlobal = typeof global == "object" && global && global.Object === Object && global; - var freeGlobal_default = freeGlobal; - - // node_modules/lodash-es/_root.js - var freeSelf = typeof self == "object" && self && self.Object === Object && self; - var root2 = freeGlobal_default || freeSelf || Function("return this")(); - var root_default = root2; - - // node_modules/lodash-es/_Symbol.js - var Symbol2 = root_default.Symbol; - var Symbol_default = Symbol2; - - // node_modules/lodash-es/_getRawTag.js - var objectProto = Object.prototype; - var hasOwnProperty = objectProto.hasOwnProperty; - var nativeObjectToString = objectProto.toString; - var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0; - function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; - try { - value[symToStringTag] = void 0; - var unmasked = true; - } catch (e) { + // node_modules/lodash-es/_equalObjects.js + var COMPARE_PARTIAL_FLAG3 = 1; + var objectProto11 = Object.prototype; + var hasOwnProperty8 = objectProto11.hasOwnProperty; + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG3, objProps = getAllKeys_default(object), objLength = objProps.length, othProps = getAllKeys_default(other), othLength = othProps.length; + if (objLength != othLength && !isPartial) { + return false; } - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty8.call(other, key))) { + return false; } } - return result; - } - var getRawTag_default = getRawTag; - - // node_modules/lodash-es/_objectToString.js - var objectProto2 = Object.prototype; - var nativeObjectToString2 = objectProto2.toString; - function objectToString(value) { - return nativeObjectToString2.call(value); - } - var objectToString_default = objectToString; - - // node_modules/lodash-es/_baseGetTag.js - var nullTag = "[object Null]"; - var undefinedTag = "[object Undefined]"; - var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0; - function baseGetTag(value) { - if (value == null) { - return value === void 0 ? undefinedTag : nullTag; + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; } - return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value); - } - var baseGetTag_default = baseGetTag; - - // node_modules/lodash-es/isObjectLike.js - function isObjectLike(value) { - return value != null && typeof value == "object"; - } - var isObjectLike_default = isObjectLike; - - // node_modules/lodash-es/isSymbol.js - var symbolTag = "[object Symbol]"; - function isSymbol(value) { - return typeof value == "symbol" || isObjectLike_default(value) && baseGetTag_default(value) == symbolTag; - } - var isSymbol_default = isSymbol; - - // node_modules/lodash-es/_arrayMap.js - function arrayMap(array2, iteratee) { - var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length); - while (++index < length) { - result[index] = iteratee(array2[index], index, array2); + var result = true; + stack.set(object, other); + stack.set(other, object); + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], othValue = other[key]; + if (customizer) { + var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); + } + if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { + result = false; + break; + } + skipCtor || (skipCtor = key == "constructor"); } + if (result && !skipCtor) { + var objCtor = object.constructor, othCtor = other.constructor; + if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) { + result = false; + } + } + stack["delete"](object); + stack["delete"](other); return result; } - var arrayMap_default = arrayMap; - - // node_modules/lodash-es/isArray.js - var isArray = Array.isArray; - var isArray_default = isArray; - - // node_modules/lodash-es/_baseToString.js - var INFINITY = 1 / 0; - var symbolProto = Symbol_default ? Symbol_default.prototype : void 0; - var symbolToString = symbolProto ? symbolProto.toString : void 0; - function baseToString(value) { - if (typeof value == "string") { - return value; + var equalObjects_default = equalObjects; + + // node_modules/lodash-es/_baseIsEqualDeep.js + var COMPARE_PARTIAL_FLAG4 = 1; + var argsTag3 = "[object Arguments]"; + var arrayTag2 = "[object Array]"; + var objectTag3 = "[object Object]"; + var objectProto12 = Object.prototype; + var hasOwnProperty9 = objectProto12.hasOwnProperty; + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray_default(object), othIsArr = isArray_default(other), objTag = objIsArr ? arrayTag2 : getTag_default(object), othTag = othIsArr ? arrayTag2 : getTag_default(other); + objTag = objTag == argsTag3 ? objectTag3 : objTag; + othTag = othTag == argsTag3 ? objectTag3 : othTag; + var objIsObj = objTag == objectTag3, othIsObj = othTag == objectTag3, isSameTag = objTag == othTag; + if (isSameTag && isBuffer_default(object)) { + if (!isBuffer_default(other)) { + return false; + } + objIsArr = true; + objIsObj = false; } - if (isArray_default(value)) { - return arrayMap_default(value, baseToString) + ""; + if (isSameTag && !objIsObj) { + stack || (stack = new Stack_default()); + return objIsArr || isTypedArray_default(object) ? equalArrays_default(object, other, bitmask, customizer, equalFunc, stack) : equalByTag_default(object, other, objTag, bitmask, customizer, equalFunc, stack); } - if (isSymbol_default(value)) { - return symbolToString ? symbolToString.call(value) : ""; + if (!(bitmask & COMPARE_PARTIAL_FLAG4)) { + var objIsWrapped = objIsObj && hasOwnProperty9.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty9.call(other, "__wrapped__"); + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; + stack || (stack = new Stack_default()); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } } - var result = value + ""; - return result == "0" && 1 / value == -INFINITY ? "-0" : result; - } - var baseToString_default = baseToString; - - // node_modules/lodash-es/_trimmedEndIndex.js - var reWhitespace = /\s/; - function trimmedEndIndex(string) { - var index = string.length; - while (index-- && reWhitespace.test(string.charAt(index))) { + if (!isSameTag) { + return false; } - return index; - } - var trimmedEndIndex_default = trimmedEndIndex; - - // node_modules/lodash-es/_baseTrim.js - var reTrimStart = /^\s+/; - function baseTrim(string) { - return string ? string.slice(0, trimmedEndIndex_default(string) + 1).replace(reTrimStart, "") : string; - } - var baseTrim_default = baseTrim; - - // node_modules/lodash-es/isObject.js - function isObject(value) { - var type3 = typeof value; - return value != null && (type3 == "object" || type3 == "function"); + stack || (stack = new Stack_default()); + return equalObjects_default(object, other, bitmask, customizer, equalFunc, stack); } - var isObject_default = isObject; + var baseIsEqualDeep_default = baseIsEqualDeep; - // node_modules/lodash-es/toNumber.js - var NAN = 0 / 0; - var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - var reIsBinary = /^0b[01]+$/i; - var reIsOctal = /^0o[0-7]+$/i; - var freeParseInt = parseInt; - function toNumber(value) { - if (typeof value == "number") { - return value; - } - if (isSymbol_default(value)) { - return NAN; - } - if (isObject_default(value)) { - var other = typeof value.valueOf == "function" ? value.valueOf() : value; - value = isObject_default(other) ? other + "" : other; + // node_modules/lodash-es/_baseIsEqual.js + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; } - if (typeof value != "string") { - return value === 0 ? value : +value; + if (value == null || other == null || !isObjectLike_default(value) && !isObjectLike_default(other)) { + return value !== value && other !== other; } - value = baseTrim_default(value); - var isBinary = reIsBinary.test(value); - return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; - } - var toNumber_default = toNumber; - - // node_modules/lodash-es/toString.js - function toString(value) { - return value == null ? "" : baseToString_default(value); - } - var toString_default = toString; - - // node_modules/lodash-es/_basePropertyOf.js - function basePropertyOf(object) { - return function(key) { - return object == null ? void 0 : object[key]; - }; + return baseIsEqualDeep_default(value, other, bitmask, customizer, baseIsEqual, stack); } - var basePropertyOf_default = basePropertyOf; + var baseIsEqual_default = baseIsEqual; // node_modules/lodash-es/now.js var now2 = function() { @@ -24738,6 +25661,19 @@ } var escape_default = escape2; + // node_modules/lodash-es/isEqual.js + function isEqual(value, other) { + return baseIsEqual_default(value, other); + } + var isEqual_default = isEqual; + + // node_modules/lodash-es/isNumber.js + var numberTag3 = "[object Number]"; + function isNumber(value) { + return typeof value == "number" || isObjectLike_default(value) && baseGetTag_default(value) == numberTag3; + } + var isNumber_default = isNumber; + // node_modules/lodash-es/throttle.js var FUNC_ERROR_TEXT2 = "Expected a function"; function throttle(func, wait, options2) { @@ -24777,13873 +25713,14484 @@ } var unescape_default = unescape2; - // modules/core/localizer.js - var _mainLocalizer = coreLocalizer(); - var _t = _mainLocalizer.t; - function coreLocalizer() { - let localizer = {}; - let _dataLanguages = {}; - let _dataLocales = {}; - let _localeStrings = {}; - let _localeCode = "en-US"; - let _localeCodes = ["en-US", "en"]; - let _languageCode = "en"; - let _textDirection = "ltr"; - let _usesMetric = false; - let _languageNames = {}; - let _scriptNames = {}; - localizer.localeCode = () => _localeCode; - localizer.localeCodes = () => _localeCodes; - localizer.languageCode = () => _languageCode; - localizer.textDirection = () => _textDirection; - localizer.usesMetric = () => _usesMetric; - localizer.languageNames = () => _languageNames; - localizer.scriptNames = () => _scriptNames; - let _preferredLocaleCodes = []; - localizer.preferredLocaleCodes = function(codes) { - if (!arguments.length) - return _preferredLocaleCodes; - if (typeof codes === "string") { - _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean); - } else { - _preferredLocaleCodes = codes; + // modules/util/detect.js + var _detected; + function utilDetect(refresh2) { + if (_detected && !refresh2) + return _detected; + _detected = {}; + const ua = navigator.userAgent; + let m2 = null; + m2 = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); + if (m2 !== null) { + _detected.browser = m2[1]; + _detected.version = m2[2]; + } + if (!_detected.browser) { + m2 = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); + if (m2 !== null) { + _detected.browser = "msie"; + _detected.version = m2[1]; } - return localizer; - }; - var _loadPromise; - localizer.ensureLoaded = () => { - if (_loadPromise) - return _loadPromise; - let filesToFetch = [ - "languages", - "locales" - ]; - const localeDirs = { - general: "locales", - tagging: "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/translations" - }; - let fileMap = _mainFileFetcher.fileMap(); - for (let scopeId in localeDirs) { - const key = `locales_index_${scopeId}`; - if (!fileMap[key]) { - fileMap[key] = localeDirs[scopeId] + "/index.min.json"; - } - filesToFetch.push(key); + } + if (!_detected.browser) { + m2 = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); + if (m2 !== null) { + _detected.browser = "Opera"; + _detected.version = m2[2]; } - return _loadPromise = Promise.all(filesToFetch.map((key) => _mainFileFetcher.get(key))).then((results) => { - _dataLanguages = results[0]; - _dataLocales = results[1]; - let indexes = results.slice(2); - let requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales).concat(["en"]); - _localeCodes = localesToUseFrom(requestedLocales); - _localeCode = _localeCodes[0]; - let loadStringsPromises = []; - indexes.forEach((index, i2) => { - const fullCoverageIndex = _localeCodes.findIndex(function(locale2) { - return index[locale2] && index[locale2].pct === 1; - }); - _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function(code) { - let scopeId = Object.keys(localeDirs)[i2]; - let directory = Object.values(localeDirs)[i2]; - if (index[code]) - loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory)); - }); - }); - return Promise.all(loadStringsPromises); - }).then(() => { - updateForCurrentLocale(); - }).catch((err) => console.error(err)); - }; - function localesToUseFrom(requestedLocales) { - let supportedLocales = _dataLocales; - let toUse = []; - for (let i2 in requestedLocales) { - let locale2 = requestedLocales[i2]; - if (supportedLocales[locale2]) - toUse.push(locale2); - if (locale2.includes("-")) { - let langPart = locale2.split("-")[0]; - if (supportedLocales[langPart]) - toUse.push(langPart); - } + } + if (!_detected.browser) { + m2 = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i); + if (m2 !== null) { + _detected.browser = m2[1]; + _detected.version = m2[2]; + m2 = ua.match(/version\/([\.\d]+)/i); + if (m2 !== null) + _detected.version = m2[1]; } - return utilArrayUniq(toUse); } - function updateForCurrentLocale() { - if (!_localeCode) - return; - _languageCode = _localeCode.split("-")[0]; - const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode]; - const hash = utilStringQs(window.location.hash); - if (hash.rtl === "true") { - _textDirection = "rtl"; - } else if (hash.rtl === "false") { - _textDirection = "ltr"; - } else { - _textDirection = currentData && currentData.rtl ? "rtl" : "ltr"; + if (!_detected.browser) { + _detected.browser = navigator.appName; + _detected.version = navigator.appVersion; + } + _detected.version = _detected.version.split(/\W/).slice(0, 2).join("."); + _detected.opera = _detected.browser.toLowerCase() === "opera" && Number(_detected.version) < 15; + if (_detected.browser.toLowerCase() === "msie") { + _detected.ie = true; + _detected.browser = "Internet Explorer"; + _detected.support = false; + } else { + _detected.ie = false; + _detected.support = true; + } + _detected.filedrop = window.FileReader && "ondrop" in window; + if (/Win/.test(ua)) { + _detected.os = "win"; + _detected.platform = "Windows"; + } else if (/Mac/.test(ua)) { + _detected.os = "mac"; + _detected.platform = "Macintosh"; + } else if (/X11/.test(ua) || /Linux/.test(ua)) { + _detected.os = "linux"; + _detected.platform = "Linux"; + } else { + _detected.os = "win"; + _detected.platform = "Unknown"; + } + _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent, + // so assume any "mac" with multitouch is actually iOS + navigator.platform === "MacIntel" && "maxTouchPoints" in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream; + _detected.browserLocales = Array.from(new Set( + // remove duplicates + [navigator.language].concat(navigator.languages || []).concat([ + // old property for backwards compatibility + navigator.userLanguage + ]).filter(Boolean) + )); + const loc = window.top.location; + let origin = loc.origin; + if (!origin) { + origin = loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port : ""); + } + _detected.host = origin + loc.pathname; + return _detected; + } + + // modules/util/aes.js + var import_aes_js = __toESM(require_aes_js()); + var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208]; + function utilAesEncrypt(text2, key) { + key = key || DEFAULT_128; + const textBytes = import_aes_js.default.utils.utf8.toBytes(text2); + const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key); + const encryptedBytes = aesCtr.encrypt(textBytes); + const encryptedHex = import_aes_js.default.utils.hex.fromBytes(encryptedBytes); + return encryptedHex; + } + function utilAesDecrypt(encryptedHex, key) { + key = key || DEFAULT_128; + const encryptedBytes = import_aes_js.default.utils.hex.toBytes(encryptedHex); + const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key); + const decryptedBytes = aesCtr.decrypt(encryptedBytes); + const text2 = import_aes_js.default.utils.utf8.fromBytes(decryptedBytes); + return text2; + } + + // modules/util/clean_tags.js + function utilCleanTags(tags) { + var out = {}; + for (var k2 in tags) { + if (!k2) + continue; + var v2 = tags[k2]; + if (v2 !== void 0) { + out[k2] = cleanValue(k2, v2); } - let locale2 = _localeCode; - if (locale2.toLowerCase() === "en-us") - locale2 = "en"; - _languageNames = _localeStrings.general[locale2].languageNames; - _scriptNames = _localeStrings.general[locale2].scriptNames; - _usesMetric = _localeCode.slice(-3).toLowerCase() !== "-us"; } - localizer.loadLocale = (locale2, scopeId, directory) => { - if (locale2.toLowerCase() === "en-us") - locale2 = "en"; - if (_localeStrings[scopeId] && _localeStrings[scopeId][locale2]) { - return Promise.resolve(locale2); + return out; + function cleanValue(k3, v3) { + function keepSpaces(k4) { + return /_hours|_times|:conditional$/.test(k4); } - let fileMap = _mainFileFetcher.fileMap(); - const key = `locale_${scopeId}_${locale2}`; - if (!fileMap[key]) { - fileMap[key] = `${directory}/${locale2}.min.json`; + function skip(k4) { + return /^(description|note|fixme)$/.test(k4); } - return _mainFileFetcher.get(key).then((d) => { - if (!_localeStrings[scopeId]) - _localeStrings[scopeId] = {}; - _localeStrings[scopeId][locale2] = d[locale2]; - return locale2; - }); - }; - localizer.pluralRule = function(number3) { - return pluralRule(number3, _localeCode); - }; - function pluralRule(number3, localeCode) { - const rules = "Intl" in window && Intl.PluralRules && new Intl.PluralRules(localeCode); - if (rules) { - return rules.select(number3); + if (skip(k3)) + return v3; + var cleaned = v3.split(";").map(function(s2) { + return s2.trim(); + }).join(keepSpaces(k3) ? "; " : ";"); + if (k3.indexOf("website") !== -1 || k3.indexOf("email") !== -1 || cleaned.indexOf("http") === 0) { + cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ""); } - if (number3 === 1) - return "one"; - return "other"; + return cleaned; } - localizer.tInfo = function(origStringId, replacements, locale2) { - let stringId = origStringId.trim(); - let scopeId = "general"; - if (stringId[0] === "_") { - let split = stringId.split("."); - scopeId = split[0].slice(1); - stringId = split.slice(1).join("."); + } + + // modules/util/get_set_value.js + function utilGetSetValue(selection2, value, shouldUpdate) { + function setValue(value2, shouldUpdate2) { + function valueNull() { + delete this.value; } - locale2 = locale2 || _localeCode; - let path = stringId.split(".").map((s) => s.replace(//g, ".")).reverse(); - let stringsKey = locale2; - if (stringsKey.toLowerCase() === "en-us") - stringsKey = "en"; - let result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey]; - while (result !== void 0 && path.length) { - result = result[path.pop()]; + function valueConstant() { + if (shouldUpdate2(this.value, value2)) { + this.value = value2; + } } - if (result !== void 0) { - if (replacements) { - if (typeof result === "object" && Object.keys(result).length) { - const number3 = Object.values(replacements).find(function(value) { - return typeof value === "number"; - }); - if (number3 !== void 0) { - const rule = pluralRule(number3, locale2); - if (result[rule]) { - result = result[rule]; - } else { - result = Object.values(result)[0]; - } - } - } - if (typeof result === "string") { - for (let key in replacements) { - let value = replacements[key]; - if (typeof value === "number") { - if (value.toLocaleString) { - value = value.toLocaleString(locale2, { - style: "decimal", - useGrouping: true, - minimumFractionDigits: 0 - }); - } else { - value = value.toString(); - } - } - const token = `{${key}}`; - const regex = new RegExp(token, "g"); - result = result.replace(regex, value); - } - } - } - if (typeof result === "string") { - return { - text: result, - locale: locale2 - }; - } - } - let index = _localeCodes.indexOf(locale2); - if (index >= 0 && index < _localeCodes.length - 1) { - let fallback = _localeCodes[index + 1]; - return localizer.tInfo(origStringId, replacements, fallback); - } - if (replacements && "default" in replacements) { - return { - text: replacements.default, - locale: null - }; - } - const missing = `Missing ${locale2} translation: ${origStringId}`; - if (typeof console !== "undefined") - console.error(missing); - return { - text: missing, - locale: "en" - }; - }; - localizer.hasTextForStringId = function(stringId) { - return !!localizer.tInfo(stringId, { default: "nothing found" }).locale; - }; - localizer.t = function(stringId, replacements, locale2) { - return localizer.tInfo(stringId, replacements, locale2).text; - }; - localizer.t.html = function(stringId, replacements, locale2) { - replacements = Object.assign({}, replacements); - for (var k in replacements) { - if (typeof replacements[k] === "string") { - replacements[k] = escape_default(replacements[k]); - } - if (typeof replacements[k] === "object" && typeof replacements[k].html === "string") { - replacements[k] = replacements[k].html; + function valueFunction() { + var x2 = value2.apply(this, arguments); + if (x2 === null || x2 === void 0) { + delete this.value; + } else if (shouldUpdate2(this.value, x2)) { + this.value = x2; } } - const info = localizer.tInfo(stringId, replacements, locale2); - if (info.text) { - return `${info.text}`; - } else { - return ""; + return value2 === null || value2 === void 0 ? valueNull : typeof value2 === "function" ? valueFunction : valueConstant; + } + function stickyCursor(func) { + const supportedTypes = ["text", "search", "url", "tel", "password"]; + if (!supportedTypes.includes(selection2.node()?.type)) { + return func; } - }; - localizer.t.append = function(stringId, replacements, locale2) { - const ret = function(selection2) { - const info = localizer.tInfo(stringId, replacements, locale2); - return selection2.append("span").attr("class", "localized-text").attr("lang", info.locale || "und").text((replacements && replacements.prefix || "") + info.text + (replacements && replacements.suffix || "")); + return function() { + const cursor = { start: this.selectionStart, end: this.selectionEnd }; + func.apply(this, arguments); + this.setSelectionRange(cursor.start, cursor.end); }; - ret.stringId = stringId; - return ret; - }; - localizer.languageName = (code, options2) => { - if (_languageNames[code]) { - return _languageNames[code]; - } - if (options2 && options2.localOnly) - return null; - const langInfo = _dataLanguages[code]; - if (langInfo) { - if (langInfo.nativeName) { - return localizer.t("translate.language_and_code", { language: langInfo.nativeName, code }); - } else if (langInfo.base && langInfo.script) { - const base = langInfo.base; - if (_languageNames[base]) { - const scriptCode = langInfo.script; - const script = _scriptNames[scriptCode] || scriptCode; - return localizer.t("translate.language_and_code", { language: _languageNames[base], code: script }); - } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) { - return localizer.t("translate.language_and_code", { language: _dataLanguages[base].nativeName, code }); - } - } - } - return code; - }; - return localizer; + } + if (arguments.length === 1) { + return selection2.property("value"); + } + if (shouldUpdate === void 0) { + shouldUpdate = (a2, b2) => a2 !== b2; + } + return selection2.each(stickyCursor(setValue(value, shouldUpdate))); } - // modules/presets/collection.js - function presetCollection(collection) { - const MAXRESULTS = 50; - let _this = {}; - let _memo = {}; - _this.collection = collection; - _this.item = (id2) => { - if (_memo[id2]) - return _memo[id2]; - const found = _this.collection.find((d) => d.id === id2); - if (found) - _memo[id2] = found; - return found; - }; - _this.index = (id2) => _this.collection.findIndex((d) => d.id === id2); - _this.matchGeometry = (geometry) => { - return presetCollection( - _this.collection.filter((d) => d.matchGeometry(geometry)) - ); - }; - _this.matchAllGeometry = (geometries) => { - return presetCollection( - _this.collection.filter((d) => d && d.matchAllGeometry(geometries)) - ); - }; - _this.matchAnyGeometry = (geometries) => { - return presetCollection( - _this.collection.filter((d) => geometries.some((geom) => d.matchGeometry(geom))) - ); - }; - _this.fallback = (geometry) => { - let id2 = geometry; - if (id2 === "vertex") - id2 = "point"; - return _this.item(id2); - }; - _this.search = (value, geometry, loc) => { - if (!value) - return _this; - value = value.toLowerCase().trim(); - function leading(a) { - const index = a.indexOf(value); - return index === 0 || a[index - 1] === " "; - } - function leadingStrict(a) { - const index = a.indexOf(value); - return index === 0; - } - function sortPresets(nameProp, aliasesProp) { - return function sortNames(a, b) { - let aCompare = a[nameProp](); - let bCompare = b[nameProp](); - if (aliasesProp) { - const findMatchingAlias = (strings) => { - if (strings.some((s) => s === value)) { - return strings.find((s) => s === value); - } else { - return strings.find((s) => s.includes(value)); - } - }; - aCompare = findMatchingAlias([aCompare].concat(a[aliasesProp]())); - bCompare = findMatchingAlias([bCompare].concat(b[aliasesProp]())); - } - if (value === aCompare) - return -1; - if (value === bCompare) - return 1; - let i2 = b.originalScore - a.originalScore; - if (i2 !== 0) - return i2; - i2 = aCompare.indexOf(value) - bCompare.indexOf(value); - if (i2 !== 0) - return i2; - return aCompare.length - bCompare.length; - }; - } - let pool = _this.collection; - if (Array.isArray(loc)) { - const validLocations = _mainLocations.locationsAt(loc); - pool = pool.filter((a) => !a.locationSetID || validLocations[a.locationSetID]); - } - const searchable = pool.filter((a) => a.searchable !== false && a.suggestion !== true); - const suggestions = pool.filter((a) => a.suggestion === true); - const leadingNames = searchable.filter((a) => leading(a.searchName()) || a.searchAliases().some(leading)).sort(sortPresets("searchName", "searchAliases")); - const leadingSuggestions = suggestions.filter((a) => leadingStrict(a.searchName())).sort(sortPresets("searchName")); - const leadingNamesStripped = searchable.filter((a) => leading(a.searchNameStripped()) || a.searchAliasesStripped().some(leading)).sort(sortPresets("searchNameStripped", "searchAliasesStripped")); - const leadingSuggestionsStripped = suggestions.filter((a) => leadingStrict(a.searchNameStripped())).sort(sortPresets("searchNameStripped")); - const leadingTerms = searchable.filter((a) => (a.terms() || []).some(leading)); - const leadingSuggestionTerms = suggestions.filter((a) => (a.terms() || []).some(leading)); - const leadingTagValues = searchable.filter((a) => Object.values(a.tags || {}).filter((val) => val !== "*").some(leading)); - const similarName = searchable.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3).sort((a, b) => a.dist - b.dist).map((a) => a.preset); - const similarSuggestions = suggestions.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1).sort((a, b) => a.dist - b.dist).map((a) => a.preset); - const similarTerms = searchable.filter((a) => { - return (a.terms() || []).some((b) => { - return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3; - }); + // modules/util/keybinding.js + function utilKeybinding(namespace) { + var _keybindings = {}; + function testBindings(d3_event, isCapturing) { + var didMatch = false; + var bindings = Object.keys(_keybindings).map(function(id2) { + return _keybindings[id2]; }); - let leadingTagKeyValues = []; - if (value.includes("=")) { - leadingTagKeyValues = searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => key + "=" + a.tags[key] === value)).concat(searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => leading(key + "=" + a.tags[key])))); - } - let results = leadingNames.concat( - leadingSuggestions, - leadingNamesStripped, - leadingSuggestionsStripped, - leadingTerms, - leadingSuggestionTerms, - leadingTagValues, - similarName, - similarSuggestions, - similarTerms, - leadingTagKeyValues - ).slice(0, MAXRESULTS - 1); - if (geometry) { - if (typeof geometry === "string") { - results.push(_this.fallback(geometry)); - } else { - geometry.forEach((geom) => results.push(_this.fallback(geom))); + var i3, binding; + for (i3 = 0; i3 < bindings.length; i3++) { + binding = bindings[i3]; + if (!binding.event.modifiers.shiftKey) + continue; + if (!!binding.capture !== isCapturing) + continue; + if (matches(d3_event, binding, true)) { + binding.callback(d3_event); + didMatch = true; + break; } } - return presetCollection(utilArrayUniq(results)); - }; - return _this; - } - - // modules/presets/category.js - function presetCategory(categoryID, category, allPresets) { - let _this = Object.assign({}, category); - let _searchName; - let _searchNameStripped; - _this.id = categoryID; - _this.members = presetCollection( - (category.members || []).map((presetID) => allPresets[presetID]).filter(Boolean) - ); - _this.geometry = _this.members.collection.reduce((acc, preset) => { - for (let i2 in preset.geometry) { - const geometry = preset.geometry[i2]; - if (acc.indexOf(geometry) === -1) { - acc.push(geometry); + if (didMatch) + return; + for (i3 = 0; i3 < bindings.length; i3++) { + binding = bindings[i3]; + if (binding.event.modifiers.shiftKey) + continue; + if (!!binding.capture !== isCapturing) + continue; + if (matches(d3_event, binding, false)) { + binding.callback(d3_event); + break; } } - return acc; - }, []); - _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0; - _this.matchAllGeometry = (geometries) => _this.members.collection.some((preset) => preset.matchAllGeometry(geometries)); - _this.matchScore = () => -1; - _this.name = () => _t(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID }); - _this.nameLabel = () => _t.append(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID }); - _this.terms = () => []; - _this.searchName = () => { - if (!_searchName) { - _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); - } - return _searchName; - }; - _this.searchNameStripped = () => { - if (!_searchNameStripped) { - _searchNameStripped = _this.searchName(); - if (_searchNameStripped.normalize) - _searchNameStripped = _searchNameStripped.normalize("NFD"); - _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, ""); - } - return _searchNameStripped; - }; - _this.searchAliases = () => []; - _this.searchAliasesStripped = () => []; - return _this; - } - - // modules/presets/field.js - function presetField(fieldID, field) { - let _this = Object.assign({}, field); - _this.id = fieldID; - _this.safeid = utilSafeClassName(fieldID); - _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1; - _this.matchAllGeometry = (geometries) => { - return !_this.geometry || geometries.every((geom) => _this.geometry.indexOf(geom) !== -1); - }; - _this.t = (scope, options2) => _t(`_tagging.presets.fields.${fieldID}.${scope}`, options2); - _this.t.html = (scope, options2) => _t.html(`_tagging.presets.fields.${fieldID}.${scope}`, options2); - _this.t.append = (scope, options2) => _t.append(`_tagging.presets.fields.${fieldID}.${scope}`, options2); - _this.hasTextForStringId = (scope) => _mainLocalizer.hasTextForStringId(`_tagging.presets.fields.${fieldID}.${scope}`); - _this.title = () => _this.overrideLabel || _this.t("label", { "default": fieldID }); - _this.label = () => _this.overrideLabel ? (selection2) => selection2.text(_this.overrideLabel) : _this.t.append("label", { "default": fieldID }); - const _placeholder = _this.placeholder; - _this.placeholder = () => _this.t("placeholder", { "default": _placeholder }); - _this.originalTerms = (_this.terms || []).join(); - _this.terms = () => _this.t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/); - _this.increment = _this.type === "number" ? _this.increment || 1 : void 0; - return _this; - } - - // modules/presets/preset.js - function presetPreset(presetID, preset, addable, allFields, allPresets) { - allFields = allFields || {}; - allPresets = allPresets || {}; - let _this = Object.assign({}, preset); - let _addable = addable || false; - let _resolvedFields; - let _resolvedMoreFields; - let _searchName; - let _searchNameStripped; - let _searchAliases; - let _searchAliasesStripped; - _this.id = presetID; - _this.safeid = utilSafeClassName(presetID); - _this.originalTerms = (_this.terms || []).join(); - _this.originalName = _this.name || ""; - _this.originalAliases = (_this.aliases || []).join("\n"); - _this.originalScore = _this.matchScore || 1; - _this.originalReference = _this.reference || {}; - _this.originalFields = _this.fields || []; - _this.originalMoreFields = _this.moreFields || []; - _this.fields = () => _resolvedFields || (_resolvedFields = resolve("fields")); - _this.moreFields = () => _resolvedMoreFields || (_resolvedMoreFields = resolve("moreFields")); - _this.resetFields = () => _resolvedFields = _resolvedMoreFields = null; - _this.tags = _this.tags || {}; - _this.addTags = _this.addTags || _this.tags; - _this.removeTags = _this.removeTags || _this.addTags; - _this.geometry = _this.geometry || []; - _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0; - _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry); - _this.matchScore = (entityTags) => { - const tags = _this.tags; - let seen = {}; - let score = 0; - for (let k in tags) { - seen[k] = true; - if (entityTags[k] === tags[k]) { - score += _this.originalScore; - } else if (tags[k] === "*" && k in entityTags) { - score += _this.originalScore / 2; - } else { - return -1; + function matches(d3_event2, binding2, testShift) { + var event = d3_event2; + var isMatch = false; + var tryKeyCode = true; + if (event.key !== void 0) { + tryKeyCode = event.key.charCodeAt(0) > 127; + isMatch = true; + if (binding2.event.key === void 0) { + isMatch = false; + } else if (Array.isArray(binding2.event.key)) { + if (binding2.event.key.map(function(s2) { + return s2.toLowerCase(); + }).indexOf(event.key.toLowerCase()) === -1) { + isMatch = false; + } + } else { + if (event.key.toLowerCase() !== binding2.event.key.toLowerCase()) { + isMatch = false; + } + } } - } - const addTags = _this.addTags; - for (let k in addTags) { - if (!seen[k] && entityTags[k] === addTags[k]) { - score += _this.originalScore; + if (!isMatch && (tryKeyCode || binding2.event.modifiers.altKey)) { + isMatch = event.keyCode === binding2.event.keyCode; } + if (!isMatch) + return false; + if (!(event.ctrlKey && event.altKey)) { + if (event.ctrlKey !== binding2.event.modifiers.ctrlKey) + return false; + if (event.altKey !== binding2.event.modifiers.altKey) + return false; + } + if (event.metaKey !== binding2.event.modifiers.metaKey) + return false; + if (testShift && event.shiftKey !== binding2.event.modifiers.shiftKey) + return false; + return true; } - if (_this.searchable === false) { - score *= 0.999; - } - return score; - }; - _this.t = (scope, options2) => { - const textID = `_tagging.presets.presets.${presetID}.${scope}`; - return _t(textID, options2); - }; - _this.t.append = (scope, options2) => { - const textID = `_tagging.presets.presets.${presetID}.${scope}`; - return _t.append(textID, options2); - }; - _this.name = () => { - return _this.t("name", { "default": _this.originalName }); - }; - _this.nameLabel = () => _this.t.append("name", { "default": _this.originalName }); - _this.subtitle = () => { - if (_this.suggestion) { - let path = presetID.split("/"); - path.pop(); - return _t("_tagging.presets.presets." + path.join("/") + ".name"); - } - return null; - }; - _this.subtitleLabel = () => { - if (_this.suggestion) { - let path = presetID.split("/"); - path.pop(); - return _t.append("_tagging.presets.presets." + path.join("/") + ".name"); - } - return null; - }; - _this.aliases = () => { - return _this.t("aliases", { "default": _this.originalAliases }).trim().split(/\s*[\r\n]+\s*/); - }; - _this.terms = () => _this.t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/); - _this.searchName = () => { - if (!_searchName) { - _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); - } - return _searchName; - }; - _this.searchNameStripped = () => { - if (!_searchNameStripped) { - _searchNameStripped = stripDiacritics(_this.searchName()); - } - return _searchNameStripped; - }; - _this.searchAliases = () => { - if (!_searchAliases) { - _searchAliases = _this.aliases().map((alias) => alias.toLowerCase()); - } - return _searchAliases; - }; - _this.searchAliasesStripped = () => { - if (!_searchAliasesStripped) { - _searchAliasesStripped = _this.searchAliases(); - _searchAliasesStripped = _searchAliasesStripped.map(stripDiacritics); + } + function capture(d3_event) { + testBindings(d3_event, true); + } + function bubble(d3_event) { + var tagName = select_default2(d3_event.target).node().tagName; + if (tagName === "INPUT" || tagName === "SELECT" || tagName === "TEXTAREA") { + return; } - return _searchAliasesStripped; - }; - _this.isFallback = () => { - const tagCount = Object.keys(_this.tags).length; - return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty("area"); + testBindings(d3_event, false); + } + function keybinding(selection2) { + selection2 = selection2 || select_default2(document); + selection2.on("keydown.capture." + namespace, capture, true); + selection2.on("keydown.bubble." + namespace, bubble, false); + return keybinding; + } + keybinding.unbind = function(selection2) { + _keybindings = []; + selection2 = selection2 || select_default2(document); + selection2.on("keydown.capture." + namespace, null); + selection2.on("keydown.bubble." + namespace, null); + return keybinding; }; - _this.addable = function(val) { - if (!arguments.length) - return _addable; - _addable = val; - return _this; + keybinding.clear = function() { + _keybindings = {}; + return keybinding; }; - _this.reference = () => { - const qid = _this.tags.wikidata || _this.tags["flag:wikidata"] || _this.tags["brand:wikidata"] || _this.tags["network:wikidata"] || _this.tags["operator:wikidata"]; - if (qid) { - return { qid }; - } - let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, "name"))[0]; - let value = _this.originalReference.value || _this.tags[key]; - if (value === "*") { - return { key }; - } else { - return { key, value }; + keybinding.off = function(codes, capture2) { + var arr = utilArrayUniq([].concat(codes)); + for (var i3 = 0; i3 < arr.length; i3++) { + var id2 = arr[i3] + (capture2 ? "-capture" : "-bubble"); + delete _keybindings[id2]; } + return keybinding; }; - _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults) => { - let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags; - tags = utilObjectOmit(tags, Object.keys(removeTags)); - if (geometry && !skipFieldDefaults) { - _this.fields().forEach((field) => { - if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key]) { - delete tags[field.key]; - } - }); + keybinding.on = function(codes, callback, capture2) { + if (typeof callback !== "function") { + return keybinding.off(codes, capture2); } - delete tags.area; - return tags; - }; - _this.setTags = (tags, geometry, skipFieldDefaults) => { - const addTags = _this.addTags; - tags = Object.assign({}, tags); - for (let k in addTags) { - if (addTags[k] === "*") { - if (_this.tags[k] || !tags[k]) { - tags[k] = "yes"; + var arr = utilArrayUniq([].concat(codes)); + for (var i3 = 0; i3 < arr.length; i3++) { + var id2 = arr[i3] + (capture2 ? "-capture" : "-bubble"); + var binding = { + id: id2, + capture: capture2, + callback, + event: { + key: void 0, + // preferred + keyCode: 0, + // fallback + modifiers: { + shiftKey: false, + ctrlKey: false, + altKey: false, + metaKey: false + } } - } else { - tags[k] = addTags[k]; + }; + if (_keybindings[id2]) { + console.warn('warning: duplicate keybinding for "' + id2 + '"'); } - } - if (!addTags.hasOwnProperty("area")) { - delete tags.area; - if (geometry === "area") { - let needsAreaTag = true; - for (let k in addTags) { - if (_this.geometry.indexOf("line") === -1 && k in osmAreaKeys || k in osmAreaKeysExceptions && addTags[k] in osmAreaKeysExceptions[k]) { - needsAreaTag = false; - break; + _keybindings[id2] = binding; + var matches = arr[i3].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); + for (var j3 = 0; j3 < matches.length; j3++) { + if (matches[j3] === "++") + matches[j3] = "+"; + if (matches[j3] in utilKeybinding.modifierCodes) { + var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j3]]]; + binding.event.modifiers[prop] = true; + } else { + binding.event.key = utilKeybinding.keys[matches[j3]] || matches[j3]; + if (matches[j3] in utilKeybinding.keyCodes) { + binding.event.keyCode = utilKeybinding.keyCodes[matches[j3]]; } } - if (needsAreaTag) { - tags.area = "yes"; - } } } - if (geometry && !skipFieldDefaults) { - _this.fields().forEach((field) => { - if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) { - tags[field.key] = field.default; - } - }); - } - return tags; + return keybinding; }; - function resolve(which) { - const fieldIDs = which === "fields" ? _this.originalFields : _this.originalMoreFields; - let resolved = []; - fieldIDs.forEach((fieldID) => { - const match = fieldID.match(/\{(.*)\}/); - if (match !== null) { - resolved = resolved.concat(inheritFields(match[1], which)); - } else if (allFields[fieldID]) { - resolved.push(allFields[fieldID]); - } else { - console.log(`Cannot resolve "${fieldID}" found in ${_this.id}.${which}`); - } - }); - if (!resolved.length) { - const endIndex = _this.id.lastIndexOf("/"); - const parentID = endIndex && _this.id.substring(0, endIndex); - if (parentID) { - resolved = inheritFields(parentID, which); - } - } - return utilArrayUniq(resolved); - function inheritFields(presetID2, which2) { - const parent = allPresets[presetID2]; - if (!parent) - return []; - if (which2 === "fields") { - return parent.fields().filter(shouldInherit); - } else if (which2 === "moreFields") { - return parent.moreFields(); - } else { - return []; - } - } - function shouldInherit(f2) { - if (f2.key && _this.tags[f2.key] !== void 0 && f2.type !== "multiCombo" && f2.type !== "semiCombo" && f2.type !== "manyCombo" && f2.type !== "check") - return false; - return true; + return keybinding; + } + utilKeybinding.modifierCodes = { + // Shift key, ⇧ + "\u21E7": 16, + shift: 16, + // CTRL key, on Mac: ⌃ + "\u2303": 17, + ctrl: 17, + // ALT key, on Mac: ⌥ (Alt) + "\u2325": 18, + alt: 18, + option: 18, + // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super) + "\u2318": 91, + meta: 91, + cmd: 91, + "super": 91, + win: 91 + }; + utilKeybinding.modifierProperties = { + 16: "shiftKey", + 17: "ctrlKey", + 18: "altKey", + 91: "metaKey" + }; + utilKeybinding.plusKeys = ["plus", "ffplus", "=", "ffequals", "\u2260", "\xB1"]; + utilKeybinding.minusKeys = ["_", "-", "ffminus", "dash", "\u2013", "\u2014"]; + utilKeybinding.keys = { + // Backspace key, on Mac: ⌫ (Backspace) + "\u232B": "Backspace", + backspace: "Backspace", + // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ + "\u21E5": "Tab", + "\u21C6": "Tab", + tab: "Tab", + // Return key, ↩ + "\u21A9": "Enter", + "\u21B5": "Enter", + "\u23CE": "Enter", + "return": "Enter", + enter: "Enter", + "\u2305": "Enter", + // Pause/Break key + "pause": "Pause", + "pause-break": "Pause", + // Caps Lock key, ⇪ + "\u21EA": "CapsLock", + caps: "CapsLock", + "caps-lock": "CapsLock", + // Escape key, on Mac: ⎋, on Windows: Esc + "\u238B": ["Escape", "Esc"], + escape: ["Escape", "Esc"], + esc: ["Escape", "Esc"], + // Space key + space: [" ", "Spacebar"], + // Page-Up key, or pgup, on Mac: ↖ + "\u2196": "PageUp", + pgup: "PageUp", + "page-up": "PageUp", + // Page-Down key, or pgdown, on Mac: ↘ + "\u2198": "PageDown", + pgdown: "PageDown", + "page-down": "PageDown", + // END key, on Mac: ⇟ + "\u21DF": "End", + end: "End", + // HOME key, on Mac: ⇞ + "\u21DE": "Home", + home: "Home", + // Insert key, or ins + ins: "Insert", + insert: "Insert", + // Delete key, on Mac: ⌦ (Delete) + "\u2326": ["Delete", "Del"], + del: ["Delete", "Del"], + "delete": ["Delete", "Del"], + // Left Arrow Key, or ← + "\u2190": ["ArrowLeft", "Left"], + left: ["ArrowLeft", "Left"], + "arrow-left": ["ArrowLeft", "Left"], + // Up Arrow Key, or ↑ + "\u2191": ["ArrowUp", "Up"], + up: ["ArrowUp", "Up"], + "arrow-up": ["ArrowUp", "Up"], + // Right Arrow Key, or → + "\u2192": ["ArrowRight", "Right"], + right: ["ArrowRight", "Right"], + "arrow-right": ["ArrowRight", "Right"], + // Up Arrow Key, or ↓ + "\u2193": ["ArrowDown", "Down"], + down: ["ArrowDown", "Down"], + "arrow-down": ["ArrowDown", "Down"], + // odities, stuff for backward compatibility (browsers and code): + // Num-Multiply, or * + "*": ["*", "Multiply"], + star: ["*", "Multiply"], + asterisk: ["*", "Multiply"], + multiply: ["*", "Multiply"], + // Num-Plus or + + "+": ["+", "Add"], + "plus": ["+", "Add"], + // Num-Subtract, or - + "-": ["-", "Subtract"], + subtract: ["-", "Subtract"], + "dash": ["-", "Subtract"], + // Semicolon + semicolon: ";", + // = or equals + equals: "=", + // Comma, or , + comma: ",", + // Period, or ., or full-stop + period: ".", + "full-stop": ".", + // Slash, or /, or forward-slash + slash: "/", + "forward-slash": "/", + // Tick, or `, or back-quote + tick: "`", + "back-quote": "`", + // Open bracket, or [ + "open-bracket": "[", + // Back slash, or \ + "back-slash": "\\", + // Close backet, or ] + "close-bracket": "]", + // Apostrophe, or Quote, or ' + quote: "'", + apostrophe: "'", + // NUMPAD 0-9 + "num-0": "0", + "num-1": "1", + "num-2": "2", + "num-3": "3", + "num-4": "4", + "num-5": "5", + "num-6": "6", + "num-7": "7", + "num-8": "8", + "num-9": "9", + // F1-F25 + f1: "F1", + f2: "F2", + f3: "F3", + f4: "F4", + f5: "F5", + f6: "F6", + f7: "F7", + f8: "F8", + f9: "F9", + f10: "F10", + f11: "F11", + f12: "F12", + f13: "F13", + f14: "F14", + f15: "F15", + f16: "F16", + f17: "F17", + f18: "F18", + f19: "F19", + f20: "F20", + f21: "F21", + f22: "F22", + f23: "F23", + f24: "F24", + f25: "F25" + }; + utilKeybinding.keyCodes = { + // Backspace key, on Mac: ⌫ (Backspace) + "\u232B": 8, + backspace: 8, + // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ + "\u21E5": 9, + "\u21C6": 9, + tab: 9, + // Return key, ↩ + "\u21A9": 13, + "\u21B5": 13, + "\u23CE": 13, + "return": 13, + enter: 13, + "\u2305": 13, + // Pause/Break key + "pause": 19, + "pause-break": 19, + // Caps Lock key, ⇪ + "\u21EA": 20, + caps: 20, + "caps-lock": 20, + // Escape key, on Mac: ⎋, on Windows: Esc + "\u238B": 27, + escape: 27, + esc: 27, + // Space key + space: 32, + // Page-Up key, or pgup, on Mac: ↖ + "\u2196": 33, + pgup: 33, + "page-up": 33, + // Page-Down key, or pgdown, on Mac: ↘ + "\u2198": 34, + pgdown: 34, + "page-down": 34, + // END key, on Mac: ⇟ + "\u21DF": 35, + end: 35, + // HOME key, on Mac: ⇞ + "\u21DE": 36, + home: 36, + // Insert key, or ins + ins: 45, + insert: 45, + // Delete key, on Mac: ⌦ (Delete) + "\u2326": 46, + del: 46, + "delete": 46, + // Left Arrow Key, or ← + "\u2190": 37, + left: 37, + "arrow-left": 37, + // Up Arrow Key, or ↑ + "\u2191": 38, + up: 38, + "arrow-up": 38, + // Right Arrow Key, or → + "\u2192": 39, + right: 39, + "arrow-right": 39, + // Up Arrow Key, or ↓ + "\u2193": 40, + down: 40, + "arrow-down": 40, + // odities, printing characters that come out wrong: + // Firefox Equals + "ffequals": 61, + // Num-Multiply, or * + "*": 106, + star: 106, + asterisk: 106, + multiply: 106, + // Num-Plus or + + "+": 107, + "plus": 107, + // Num-Subtract, or - + "-": 109, + subtract: 109, + // Vertical Bar / Pipe + "|": 124, + // Firefox Plus + "ffplus": 171, + // Firefox Minus + "ffminus": 173, + // Semicolon + ";": 186, + semicolon: 186, + // = or equals + "=": 187, + "equals": 187, + // Comma, or , + ",": 188, + comma: 188, + // Dash / Underscore key + "dash": 189, + // Period, or ., or full-stop + ".": 190, + period: 190, + "full-stop": 190, + // Slash, or /, or forward-slash + "/": 191, + slash: 191, + "forward-slash": 191, + // Tick, or `, or back-quote + "`": 192, + tick: 192, + "back-quote": 192, + // Open bracket, or [ + "[": 219, + "open-bracket": 219, + // Back slash, or \ + "\\": 220, + "back-slash": 220, + // Close backet, or ] + "]": 221, + "close-bracket": 221, + // Apostrophe, or Quote, or ' + "'": 222, + quote: 222, + apostrophe: 222 + }; + var i = 95; + var n = 0; + while (++i < 106) { + utilKeybinding.keyCodes["num-" + n] = i; + ++n; + } + i = 47; + n = 0; + while (++i < 58) { + utilKeybinding.keyCodes[n] = i; + ++n; + } + i = 111; + n = 1; + while (++i < 136) { + utilKeybinding.keyCodes["f" + n] = i; + ++n; + } + i = 64; + while (++i < 91) { + utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i; + } + + // modules/util/object.js + function utilObjectOmit(obj, omitKeys) { + return Object.keys(obj).reduce(function(result, key) { + if (omitKeys.indexOf(key) === -1) { + result[key] = obj[key]; } + return result; + }, {}); + } + + // modules/util/rebind.js + function utilRebind(target, source) { + var i3 = 1, n3 = arguments.length, method; + while (++i3 < n3) { + target[method = arguments[i3]] = d3_rebind(target, source, source[method]); } - function stripDiacritics(s) { - if (s.normalize) - s = s.normalize("NFD"); - s = s.replace(/[\u0300-\u036f]/g, ""); - return s; - } - return _this; + return target; + } + function d3_rebind(target, source, method) { + return function() { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; } - // modules/presets/index.js - var _mainPresetIndex = presetIndex(); - function presetIndex() { - const dispatch10 = dispatch_default("favoritePreset", "recentsChange"); - const MAXRECENTS = 30; - const POINT = presetPreset("point", { name: "Point", tags: {}, geometry: ["point", "vertex"], matchScore: 0.1 }); - const LINE = presetPreset("line", { name: "Line", tags: {}, geometry: ["line"], matchScore: 0.1 }); - const AREA = presetPreset("area", { name: "Area", tags: { area: "yes" }, geometry: ["area"], matchScore: 0.1 }); - const RELATION = presetPreset("relation", { name: "Relation", tags: {}, geometry: ["relation"], matchScore: 0.1 }); - let _this = presetCollection([POINT, LINE, AREA, RELATION]); - let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION }; - let _defaults = { - point: presetCollection([POINT]), - vertex: presetCollection([POINT]), - line: presetCollection([LINE]), - area: presetCollection([AREA]), - relation: presetCollection([RELATION]) + // modules/util/session_mutex.js + function utilSessionMutex(name) { + var mutex = {}; + var intervalID; + function renew() { + var expires = /* @__PURE__ */ new Date(); + expires.setSeconds(expires.getSeconds() + 5); + document.cookie = name + "=1; expires=" + expires.toUTCString() + "; sameSite=strict"; + } + mutex.lock = function() { + if (intervalID) + return true; + var cookie = document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1"); + if (cookie) + return false; + renew(); + intervalID = window.setInterval(renew, 4e3); + return true; }; - let _fields = {}; - let _categories = {}; - let _universal = []; - let _addablePresetIDs = null; - let _recents; - let _favorites; - let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; - let _loadPromise; - _this.ensureLoaded = () => { - if (_loadPromise) - return _loadPromise; - return _loadPromise = Promise.all([ - _mainFileFetcher.get("preset_categories"), - _mainFileFetcher.get("preset_defaults"), - _mainFileFetcher.get("preset_presets"), - _mainFileFetcher.get("preset_fields") - ]).then((vals) => { - _this.merge({ - categories: vals[0], - defaults: vals[1], - presets: vals[2], - fields: vals[3] - }); - osmSetAreaKeys(_this.areaKeys()); - osmSetPointTags(_this.pointTags()); - osmSetVertexTags(_this.vertexTags()); - }); + mutex.unlock = function() { + if (!intervalID) + return; + document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict"; + clearInterval(intervalID); + intervalID = null; }; - _this.merge = (d) => { - let newLocationSets = []; - if (d.fields) { - Object.keys(d.fields).forEach((fieldID) => { - let f2 = d.fields[fieldID]; - if (f2) { - f2 = presetField(fieldID, f2); - if (f2.locationSet) - newLocationSets.push(f2); - _fields[fieldID] = f2; - } else { - delete _fields[fieldID]; - } - }); - } - if (d.presets) { - Object.keys(d.presets).forEach((presetID) => { - let p = d.presets[presetID]; - if (p) { - const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID); - p = presetPreset(presetID, p, isAddable, _fields, _presets); - if (p.locationSet) - newLocationSets.push(p); - _presets[presetID] = p; - } else { - const existing = _presets[presetID]; - if (existing && !existing.isFallback()) { - delete _presets[presetID]; - } - } - }); - } - if (d.categories) { - Object.keys(d.categories).forEach((categoryID) => { - let c = d.categories[categoryID]; - if (c) { - c = presetCategory(categoryID, c, _presets); - if (c.locationSet) - newLocationSets.push(c); - _categories[categoryID] = c; - } else { - delete _categories[categoryID]; - } - }); + mutex.locked = function() { + return !!intervalID; + }; + return mutex; + } + + // modules/util/tiler.js + function utilTiler() { + var _size = [256, 256]; + var _scale = 256; + var _tileSize = 256; + var _zoomExtent = [0, 20]; + var _translate = [_size[0] / 2, _size[1] / 2]; + var _margin = 0; + var _skipNullIsland = false; + function clamp3(num, min3, max3) { + return Math.max(min3, Math.min(num, max3)); + } + function nearNullIsland(tile) { + var x2 = tile[0]; + var y2 = tile[1]; + var z2 = tile[2]; + if (z2 >= 7) { + var center = Math.pow(2, z2 - 1); + var width = Math.pow(2, z2 - 6); + var min3 = center - width / 2; + var max3 = center + width / 2 - 1; + return x2 >= min3 && x2 <= max3 && y2 >= min3 && y2 <= max3; } - _this.collection = Object.values(_presets).concat(Object.values(_categories)); - if (d.defaults) { - Object.keys(d.defaults).forEach((geometry) => { - const def = d.defaults[geometry]; - if (Array.isArray(def)) { - _defaults[geometry] = presetCollection( - def.map((id2) => _presets[id2] || _categories[id2]).filter(Boolean) - ); + return false; + } + function tiler9() { + var z2 = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); + var z0 = clamp3(Math.round(z2), _zoomExtent[0], _zoomExtent[1]); + var tileMin = 0; + var tileMax = Math.pow(2, z0) - 1; + var log2ts = Math.log(_tileSize) * Math.LOG2E; + var k2 = Math.pow(2, z2 - z0 + log2ts); + var origin = [ + (_translate[0] - _scale / 2) / k2, + (_translate[1] - _scale / 2) / k2 + ]; + var cols = range( + clamp3(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), + clamp3(Math.ceil(_size[0] / k2 - origin[0]) + _margin, tileMin, tileMax + 1) + ); + var rows = range( + clamp3(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), + clamp3(Math.ceil(_size[1] / k2 - origin[1]) + _margin, tileMin, tileMax + 1) + ); + var tiles = []; + for (var i3 = 0; i3 < rows.length; i3++) { + var y2 = rows[i3]; + for (var j3 = 0; j3 < cols.length; j3++) { + var x2 = cols[j3]; + if (i3 >= _margin && i3 <= rows.length - _margin && j3 >= _margin && j3 <= cols.length - _margin) { + tiles.unshift([x2, y2, z0]); } else { - delete _defaults[geometry]; + tiles.push([x2, y2, z0]); } - }); + } } - _universal = Object.values(_fields).filter((field) => field.universal); - Object.values(_presets).forEach((preset) => preset.resetFields()); - _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; - _this.collection.forEach((preset) => { - (preset.geometry || []).forEach((geometry) => { - let g = _geometryIndex[geometry]; - for (let key in preset.tags) { - g[key] = g[key] || {}; - let value = preset.tags[key]; - (g[key][value] = g[key][value] || []).push(preset); + tiles.translate = origin; + tiles.scale = k2; + return tiles; + } + tiler9.getTiles = function(projection2) { + var origin = [ + projection2.scale() * Math.PI - projection2.translate()[0], + projection2.scale() * Math.PI - projection2.translate()[1] + ]; + this.size(projection2.clipExtent()[1]).scale(projection2.scale() * 2 * Math.PI).translate(projection2.translate()); + var tiles = tiler9(); + var ts = tiles.scale; + return tiles.map(function(tile) { + if (_skipNullIsland && nearNullIsland(tile)) { + return false; + } + var x2 = tile[0] * ts - origin[0]; + var y2 = tile[1] * ts - origin[1]; + return { + id: tile.toString(), + xyz: tile, + extent: geoExtent( + projection2.invert([x2, y2 + ts]), + projection2.invert([x2 + ts, y2]) + ) + }; + }).filter(Boolean); + }; + tiler9.getGeoJSON = function(projection2) { + var features = tiler9.getTiles(projection2).map(function(tile) { + return { + type: "Feature", + properties: { + id: tile.id, + name: tile.id + }, + geometry: { + type: "Polygon", + coordinates: [tile.extent.polygon()] } - }); + }; }); - if (d.featureCollection && Array.isArray(d.featureCollection.features)) { - _mainLocations.mergeCustomGeoJSON(d.featureCollection); - } - if (newLocationSets.length) { - _mainLocations.mergeLocationSets(newLocationSets); - } - return _this; + return { + type: "FeatureCollection", + features + }; }; - _this.match = (entity, resolver) => { - return resolver.transient(entity, "presetMatch", () => { - let geometry = entity.geometry(resolver); - if (geometry === "vertex" && entity.isOnAddressLine(resolver)) { - geometry = "point"; - } - const entityExtent = entity.extent(resolver); - return _this.matchTags(entity.tags, geometry, entityExtent.center()); - }); + tiler9.tileSize = function(val) { + if (!arguments.length) + return _tileSize; + _tileSize = val; + return tiler9; }; - _this.matchTags = (tags, geometry, loc) => { - const keyIndex = _geometryIndex[geometry]; - let bestScore = -1; - let bestMatch; - let matchCandidates = []; - for (let k in tags) { - let indexMatches = []; - let valueIndex = keyIndex[k]; - if (!valueIndex) - continue; - let keyValueMatches = valueIndex[tags[k]]; - if (keyValueMatches) - indexMatches.push(...keyValueMatches); - let keyStarMatches = valueIndex["*"]; - if (keyStarMatches) - indexMatches.push(...keyStarMatches); - if (indexMatches.length === 0) - continue; - for (let i2 = 0; i2 < indexMatches.length; i2++) { - const candidate = indexMatches[i2]; - const score = candidate.matchScore(tags); - if (score === -1) { - continue; - } - matchCandidates.push({ score, candidate }); - if (score > bestScore) { - bestScore = score; - bestMatch = candidate; - } - } - } - if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== "+[Q2]" && Array.isArray(loc)) { - let validLocations = _mainLocations.locationsAt(loc); - if (!validLocations[bestMatch.locationSetID]) { - matchCandidates.sort((a, b) => a.score < b.score ? 1 : -1); - for (let i2 = 0; i2 < matchCandidates.length; i2++) { - const candidateScore = matchCandidates[i2]; - if (!candidateScore.candidate.locationSetID || validLocations[candidateScore.candidate.locationSetID]) { - bestMatch = candidateScore.candidate; - bestScore = candidateScore.score; - break; - } - } - } - } - if (!bestMatch || bestMatch.isFallback()) { - for (let k in tags) { - if (/^addr:/.test(k) && keyIndex["addr:*"] && keyIndex["addr:*"]["*"]) { - bestMatch = keyIndex["addr:*"]["*"][0]; - break; - } - } - } - return bestMatch || _this.fallback(geometry); + tiler9.zoomExtent = function(val) { + if (!arguments.length) + return _zoomExtent; + _zoomExtent = val; + return tiler9; }; - _this.allowsVertex = (entity, resolver) => { - if (entity.type !== "node") - return false; - if (Object.keys(entity.tags).length === 0) - return true; - return resolver.transient(entity, "vertexMatch", () => { - if (entity.isOnAddressLine(resolver)) - return true; - const geometries = osmNodeGeometriesForTags(entity.tags); - if (geometries.vertex) - return true; - if (geometries.point) - return false; - return true; - }); + tiler9.size = function(val) { + if (!arguments.length) + return _size; + _size = val; + return tiler9; }; - _this.areaKeys = () => { - const ignore = { - barrier: true, - highway: true, - footway: true, - railway: true, - junction: true, - type: true - }; - let areaKeys = {}; - const presets = _this.collection.filter((p) => !p.suggestion && !p.replacement); - presets.forEach((p) => { - const keys = p.tags && Object.keys(p.tags); - const key = keys && keys.length && keys[0]; - if (!key) - return; - if (ignore[key]) - return; - if (p.geometry.indexOf("area") !== -1) { - areaKeys[key] = areaKeys[key] || {}; - } - }); - presets.forEach((p) => { - let key; - for (key in p.addTags) { - const value = p.addTags[key]; - if (key in areaKeys && p.geometry.indexOf("line") !== -1 && value !== "*") { - areaKeys[key][value] = true; - } - } - }); - return areaKeys; + tiler9.scale = function(val) { + if (!arguments.length) + return _scale; + _scale = val; + return tiler9; }; - _this.pointTags = () => { - return _this.collection.reduce((pointTags, d) => { - if (d.suggestion || d.replacement || d.searchable === false) - return pointTags; - const keys = d.tags && Object.keys(d.tags); - const key = keys && keys.length && keys[0]; - if (!key) - return pointTags; - if (d.geometry.indexOf("point") !== -1) { - pointTags[key] = pointTags[key] || {}; - pointTags[key][d.tags[key]] = true; - } - return pointTags; - }, {}); + tiler9.translate = function(val) { + if (!arguments.length) + return _translate; + _translate = val; + return tiler9; }; - _this.vertexTags = () => { - return _this.collection.reduce((vertexTags, d) => { - if (d.suggestion || d.replacement || d.searchable === false) - return vertexTags; - const keys = d.tags && Object.keys(d.tags); - const key = keys && keys.length && keys[0]; - if (!key) - return vertexTags; - if (d.geometry.indexOf("vertex") !== -1) { - vertexTags[key] = vertexTags[key] || {}; - vertexTags[key][d.tags[key]] = true; - } - return vertexTags; - }, {}); + tiler9.margin = function(val) { + if (!arguments.length) + return _margin; + _margin = +val; + return tiler9; }; - _this.field = (id2) => _fields[id2]; - _this.universal = () => _universal; - _this.defaults = (geometry, n2, startWithRecents, loc, extraPresets) => { - let recents = []; - if (startWithRecents) { - recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4); - } - let defaults2; - if (_addablePresetIDs) { - defaults2 = Array.from(_addablePresetIDs).map(function(id2) { - var preset = _this.item(id2); - if (preset && preset.matchGeometry(geometry)) - return preset; - return null; - }).filter(Boolean); - } else { - defaults2 = _defaults[geometry].collection.concat(_this.fallback(geometry)); - } - let result = presetCollection( - utilArrayUniq(recents.concat(defaults2).concat(extraPresets || [])).slice(0, n2 - 1) - ); - if (Array.isArray(loc)) { - const validLocations = _mainLocations.locationsAt(loc); - result.collection = result.collection.filter((a) => !a.locationSetID || validLocations[a.locationSetID]); - } - return result; + tiler9.skipNullIsland = function(val) { + if (!arguments.length) + return _skipNullIsland; + _skipNullIsland = val; + return tiler9; }; - _this.addablePresetIDs = function(val) { + return tiler9; + } + + // modules/util/trigger_event.js + function utilTriggerEvent(target, type2, eventProperties) { + target.each(function() { + var evt = document.createEvent("HTMLEvents"); + evt.initEvent(type2, true, true); + for (var prop in eventProperties) { + evt[prop] = eventProperties[prop]; + } + this.dispatchEvent(evt); + }); + } + + // modules/core/localizer.js + var _mainLocalizer = coreLocalizer(); + var _t = _mainLocalizer.t; + function coreLocalizer() { + let localizer = {}; + let _dataLanguages = {}; + let _dataLocales = {}; + let _localeStrings = {}; + let _localeCode = "en-US"; + let _localeCodes = ["en-US", "en"]; + let _languageCode = "en"; + let _textDirection = "ltr"; + let _usesMetric = false; + let _languageNames = {}; + let _scriptNames = {}; + localizer.localeCode = () => _localeCode; + localizer.localeCodes = () => _localeCodes; + localizer.languageCode = () => _languageCode; + localizer.textDirection = () => _textDirection; + localizer.usesMetric = () => _usesMetric; + localizer.languageNames = () => _languageNames; + localizer.scriptNames = () => _scriptNames; + let _preferredLocaleCodes = []; + localizer.preferredLocaleCodes = function(codes) { if (!arguments.length) - return _addablePresetIDs; - if (Array.isArray(val)) - val = new Set(val); - _addablePresetIDs = val; - if (_addablePresetIDs) { - _this.collection.forEach((p) => { - if (p.addable) - p.addable(_addablePresetIDs.has(p.id)); - }); + return _preferredLocaleCodes; + if (typeof codes === "string") { + _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean); } else { - _this.collection.forEach((p) => { - if (p.addable) - p.addable(true); - }); + _preferredLocaleCodes = codes; } - return _this; + return localizer; }; - _this.recent = () => { - return presetCollection( - utilArrayUniq(_this.getRecents().map((d) => d.preset).filter((d) => d.searchable !== false)) - ); + var _loadPromise; + localizer.ensureLoaded = () => { + if (_loadPromise) + return _loadPromise; + let filesToFetch = [ + "languages", + // load the list of languages + "locales" + // load the list of supported locales + ]; + const localeDirs = { + general: "locales", + tagging: presetsCdnUrl + "dist/translations" + }; + let fileMap = _mainFileFetcher.fileMap(); + for (let scopeId in localeDirs) { + const key = `locales_index_${scopeId}`; + if (!fileMap[key]) { + fileMap[key] = localeDirs[scopeId] + "/index.min.json"; + } + filesToFetch.push(key); + } + return _loadPromise = Promise.all(filesToFetch.map((key) => _mainFileFetcher.get(key))).then((results) => { + _dataLanguages = results[0]; + _dataLocales = results[1]; + let indexes = results.slice(2); + let requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales).concat(["en"]); + _localeCodes = localesToUseFrom(requestedLocales); + _localeCode = _localeCodes[0]; + let loadStringsPromises = []; + indexes.forEach((index, i3) => { + const fullCoverageIndex = _localeCodes.findIndex(function(locale2) { + return index[locale2] && index[locale2].pct === 1; + }); + _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function(code) { + let scopeId = Object.keys(localeDirs)[i3]; + let directory = Object.values(localeDirs)[i3]; + if (index[code]) + loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory)); + }); + }); + return Promise.all(loadStringsPromises); + }).then(() => { + updateForCurrentLocale(); + }).catch((err) => console.error(err)); }; - function RibbonItem(preset, source) { - let item = {}; - item.preset = preset; - item.source = source; - item.isFavorite = () => item.source === "favorite"; - item.isRecent = () => item.source === "recent"; - item.matches = (preset2) => item.preset.id === preset2.id; - item.minified = () => ({ pID: item.preset.id }); - return item; + function localesToUseFrom(requestedLocales) { + let supportedLocales = _dataLocales; + let toUse = []; + for (let i3 in requestedLocales) { + let locale2 = requestedLocales[i3]; + if (supportedLocales[locale2]) + toUse.push(locale2); + if (locale2.includes("-")) { + let langPart = locale2.split("-")[0]; + if (supportedLocales[langPart]) + toUse.push(langPart); + } + } + return utilArrayUniq(toUse); } - function ribbonItemForMinified(d, source) { - if (d && d.pID) { - const preset = _this.item(d.pID); - if (!preset) - return null; - return RibbonItem(preset, source); + function updateForCurrentLocale() { + if (!_localeCode) + return; + _languageCode = _localeCode.split("-")[0]; + const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode]; + const hash = utilStringQs(window.location.hash); + if (hash.rtl === "true") { + _textDirection = "rtl"; + } else if (hash.rtl === "false") { + _textDirection = "ltr"; + } else { + _textDirection = currentData && currentData.rtl ? "rtl" : "ltr"; } - return null; + let locale2 = _localeCode; + if (locale2.toLowerCase() === "en-us") + locale2 = "en"; + _languageNames = _localeStrings.general[locale2].languageNames || _localeStrings.general[_languageCode].languageNames; + _scriptNames = _localeStrings.general[locale2].scriptNames || _localeStrings.general[_languageCode].scriptNames; + _usesMetric = _localeCode.slice(-3).toLowerCase() !== "-us"; } - _this.getGenericRibbonItems = () => { - return ["point", "line", "area"].map((id2) => RibbonItem(_this.item(id2), "generic")); + localizer.loadLocale = (locale2, scopeId, directory) => { + if (locale2.toLowerCase() === "en-us") + locale2 = "en"; + if (_localeStrings[scopeId] && _localeStrings[scopeId][locale2]) { + return Promise.resolve(locale2); + } + let fileMap = _mainFileFetcher.fileMap(); + const key = `locale_${scopeId}_${locale2}`; + if (!fileMap[key]) { + fileMap[key] = `${directory}/${locale2}.min.json`; + } + return _mainFileFetcher.get(key).then((d2) => { + if (!_localeStrings[scopeId]) + _localeStrings[scopeId] = {}; + _localeStrings[scopeId][locale2] = d2[locale2]; + return locale2; + }); }; - _this.getAddable = () => { - if (!_addablePresetIDs) - return []; - return _addablePresetIDs.map((id2) => { - const preset = _this.item(id2); - if (preset) - return RibbonItem(preset, "addable"); - return null; - }).filter(Boolean); + localizer.pluralRule = function(number3) { + return pluralRule(number3, _localeCode); }; - function setRecents(items) { - _recents = items; - const minifiedItems = items.map((d) => d.minified()); - corePreferences("preset_recents", JSON.stringify(minifiedItems)); - dispatch10.call("recentsChange"); + function pluralRule(number3, localeCode) { + const rules = "Intl" in window && Intl.PluralRules && new Intl.PluralRules(localeCode); + if (rules) { + return rules.select(number3); + } + if (number3 === 1) + return "one"; + return "other"; } - _this.getRecents = () => { - if (!_recents) { - _recents = (JSON.parse(corePreferences("preset_recents")) || []).reduce((acc, d) => { - let item = ribbonItemForMinified(d, "recent"); - if (item && item.preset.addable()) - acc.push(item); - return acc; - }, []); + localizer.tInfo = function(origStringId, replacements, locale2) { + let stringId = origStringId.trim(); + let scopeId = "general"; + if (stringId[0] === "_") { + let split = stringId.split("."); + scopeId = split[0].slice(1); + stringId = split.slice(1).join("."); } - return _recents; - }; - _this.addRecent = (preset, besidePreset, after) => { - const recents = _this.getRecents(); - const beforeItem = _this.recentMatching(besidePreset); - let toIndex = recents.indexOf(beforeItem); - if (after) - toIndex += 1; - const newItem = RibbonItem(preset, "recent"); - recents.splice(toIndex, 0, newItem); - setRecents(recents); - }; - _this.removeRecent = (preset) => { - const item = _this.recentMatching(preset); - if (item) { - let items = _this.getRecents(); - items.splice(items.indexOf(item), 1); - setRecents(items); + locale2 = locale2 || _localeCode; + let path = stringId.split(".").map((s2) => s2.replace(//g, ".")).reverse(); + let stringsKey = locale2; + if (stringsKey.toLowerCase() === "en-us") + stringsKey = "en"; + let result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey]; + while (result !== void 0 && path.length) { + result = result[path.pop()]; } - }; - _this.recentMatching = (preset) => { - const items = _this.getRecents(); - for (let i2 in items) { - if (items[i2].matches(preset)) { - return items[i2]; + if (result !== void 0) { + if (replacements) { + if (typeof result === "object" && Object.keys(result).length) { + const number3 = Object.values(replacements).find(function(value) { + return typeof value === "number"; + }); + if (number3 !== void 0) { + const rule = pluralRule(number3, locale2); + if (result[rule]) { + result = result[rule]; + } else { + result = Object.values(result)[0]; + } + } + } + if (typeof result === "string") { + for (let key in replacements) { + let value = replacements[key]; + if (typeof value === "number") { + if (value.toLocaleString) { + value = value.toLocaleString(locale2, { + style: "decimal", + useGrouping: true, + minimumFractionDigits: 0 + }); + } else { + value = value.toString(); + } + } + const token = `{${key}}`; + const regex = new RegExp(token, "g"); + result = result.replace(regex, value); + } + } + } + if (typeof result === "string") { + return { + text: result, + locale: locale2 + }; } } - return null; + let index = _localeCodes.indexOf(locale2); + if (index >= 0 && index < _localeCodes.length - 1) { + let fallback = _localeCodes[index + 1]; + return localizer.tInfo(origStringId, replacements, fallback); + } + if (replacements && "default" in replacements) { + return { + text: replacements.default, + locale: null + }; + } + const missing = `Missing ${locale2} translation: ${origStringId}`; + if (typeof console !== "undefined") + console.error(missing); + return { + text: missing, + locale: "en" + }; }; - _this.moveItem = (items, fromIndex, toIndex) => { - if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) - return null; - items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]); - return items; + localizer.hasTextForStringId = function(stringId) { + return !!localizer.tInfo(stringId, { default: "nothing found" }).locale; }; - _this.moveRecent = (item, beforeItem) => { - const recents = _this.getRecents(); - const fromIndex = recents.indexOf(item); - const toIndex = recents.indexOf(beforeItem); - const items = _this.moveItem(recents, fromIndex, toIndex); - if (items) - setRecents(items); + localizer.t = function(stringId, replacements, locale2) { + return localizer.tInfo(stringId, replacements, locale2).text; }; - _this.setMostRecent = (preset) => { - if (preset.searchable === false) - return; - let items = _this.getRecents(); - let item = _this.recentMatching(preset); - if (item) { - items.splice(items.indexOf(item), 1); - } else { - item = RibbonItem(preset, "recent"); + localizer.t.html = function(stringId, replacements, locale2) { + replacements = Object.assign({}, replacements); + for (var k2 in replacements) { + if (typeof replacements[k2] === "string") { + replacements[k2] = escape_default(replacements[k2]); + } + if (typeof replacements[k2] === "object" && typeof replacements[k2].html === "string") { + replacements[k2] = replacements[k2].html; + } } - while (items.length >= MAXRECENTS) { - items.pop(); + const info = localizer.tInfo(stringId, replacements, locale2); + if (info.text) { + return `${info.text}`; + } else { + return ""; } - items.unshift(item); - setRecents(items); }; - function setFavorites(items) { - _favorites = items; - const minifiedItems = items.map((d) => d.minified()); - corePreferences("preset_favorites", JSON.stringify(minifiedItems)); - dispatch10.call("favoritePreset"); - } - _this.addFavorite = (preset, besidePreset, after) => { - const favorites = _this.getFavorites(); - const beforeItem = _this.favoriteMatching(besidePreset); - let toIndex = favorites.indexOf(beforeItem); - if (after) - toIndex += 1; - const newItem = RibbonItem(preset, "favorite"); - favorites.splice(toIndex, 0, newItem); - setFavorites(favorites); + localizer.t.append = function(stringId, replacements, locale2) { + const ret = function(selection2) { + const info = localizer.tInfo(stringId, replacements, locale2); + return selection2.append("span").attr("class", "localized-text").attr("lang", info.locale || "und").text((replacements && replacements.prefix || "") + info.text + (replacements && replacements.suffix || "")); + }; + ret.stringId = stringId; + return ret; }; - _this.toggleFavorite = (preset) => { - const favs = _this.getFavorites(); - const favorite = _this.favoriteMatching(preset); - if (favorite) { - favs.splice(favs.indexOf(favorite), 1); - } else { - if (favs.length === 10) { - favs.pop(); + localizer.languageName = (code, options2) => { + if (_languageNames && _languageNames[code]) { + return _languageNames[code]; + } + if (options2 && options2.localOnly) + return null; + const langInfo = _dataLanguages[code]; + if (langInfo) { + if (langInfo.nativeName) { + return localizer.t("translate.language_and_code", { language: langInfo.nativeName, code }); + } else if (langInfo.base && langInfo.script) { + const base = langInfo.base; + if (_languageNames && _languageNames[base]) { + const scriptCode = langInfo.script; + const script = _scriptNames && _scriptNames[scriptCode] || scriptCode; + return localizer.t("translate.language_and_code", { language: _languageNames[base], code: script }); + } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) { + return localizer.t("translate.language_and_code", { language: _dataLanguages[base].nativeName, code }); + } } - favs.push(RibbonItem(preset, "favorite")); } - setFavorites(favs); + return code; }; - _this.removeFavorite = (preset) => { - const item = _this.favoriteMatching(preset); - if (item) { - const items = _this.getFavorites(); - items.splice(items.indexOf(item), 1); - setFavorites(items); + localizer.floatFormatter = (locale2) => { + if (!("Intl" in window && "NumberFormat" in Intl && "formatToParts" in Intl.NumberFormat.prototype)) { + return (number3, fractionDigits) => { + return fractionDigits === void 0 ? number3.toString() : number3.toFixed(fractionDigits); + }; + } else { + return (number3, fractionDigits) => number3.toLocaleString(locale2, { + minimumFractionDigits: fractionDigits, + maximumFractionDigits: fractionDigits === void 0 ? 20 : fractionDigits + }); } }; - _this.getFavorites = () => { - if (!_favorites) { - let rawFavorites = JSON.parse(corePreferences("preset_favorites")); - if (!rawFavorites) { - rawFavorites = []; - corePreferences("preset_favorites", JSON.stringify(rawFavorites)); - } - _favorites = rawFavorites.reduce((output, d) => { - const item = ribbonItemForMinified(d, "favorite"); - if (item && item.preset.addable()) - output.push(item); - return output; - }, []); - } - return _favorites; + localizer.floatParser = (locale2) => { + const polyfill = (string) => +string.trim(); + if (!("Intl" in window && "NumberFormat" in Intl)) + return polyfill; + const format2 = new Intl.NumberFormat(locale2, { maximumFractionDigits: 20 }); + if (!("formatToParts" in format2)) + return polyfill; + const parts = format2.formatToParts(-12345.6); + const numerals = Array.from({ length: 10 }).map((_2, i3) => format2.format(i3)); + const index = new Map(numerals.map((d2, i3) => [d2, i3])); + const literalPart = parts.find((d2) => d2.type === "literal"); + const literal = literalPart && new RegExp(`[${literalPart.value}]`, "g"); + const groupPart = parts.find((d2) => d2.type === "group"); + const group = groupPart && new RegExp(`[${groupPart.value}]`, "g"); + const decimalPart = parts.find((d2) => d2.type === "decimal"); + const decimal = decimalPart && new RegExp(`[${decimalPart.value}]`); + const numeral = new RegExp(`[${numerals.join("")}]`, "g"); + const getIndex = (d2) => index.get(d2); + return (string) => { + string = string.trim(); + if (literal) + string = string.replace(literal, ""); + if (group) + string = string.replace(group, ""); + if (decimal) + string = string.replace(decimal, "."); + string = string.replace(numeral, getIndex); + return string ? +string : NaN; + }; }; - _this.favoriteMatching = (preset) => { - const favs = _this.getFavorites(); - for (let index in favs) { - if (favs[index].matches(preset)) { - return favs[index]; - } - } - return null; + localizer.decimalPlaceCounter = (locale2) => { + var literal, group, decimal; + if ("Intl" in window && "NumberFormat" in Intl) { + const format2 = new Intl.NumberFormat(locale2, { maximumFractionDigits: 20 }); + if ("formatToParts" in format2) { + const parts = format2.formatToParts(-12345.6); + const literalPart = parts.find((d2) => d2.type === "literal"); + literal = literalPart && new RegExp(`[${literalPart.value}]`, "g"); + const groupPart = parts.find((d2) => d2.type === "group"); + group = groupPart && new RegExp(`[${groupPart.value}]`, "g"); + const decimalPart = parts.find((d2) => d2.type === "decimal"); + decimal = decimalPart && new RegExp(`[${decimalPart.value}]`); + } + } + return (string) => { + string = string.trim(); + if (literal) + string = string.replace(literal, ""); + if (group) + string = string.replace(group, ""); + const parts = string.split(decimal || "."); + return parts && parts[1] && parts[1].length || 0; + }; }; - return utilRebind(_this, dispatch10, "on"); + return localizer; } - // modules/util/util.js - function utilTagText(entity) { - var obj = entity && entity.tags || {}; - return Object.keys(obj).map(function(k) { - return k + "=" + obj[k]; - }).join(", "); - } - function utilTotalExtent(array2, graph) { - var extent = geoExtent(); - var val, entity; - for (var i2 = 0; i2 < array2.length; i2++) { - val = array2[i2]; - entity = typeof val === "string" ? graph.hasEntity(val) : val; - if (entity) { - extent._extend(entity.extent(graph)); + // modules/presets/collection.js + function presetCollection(collection) { + const MAXRESULTS = 50; + let _this = {}; + let _memo = {}; + _this.collection = collection; + _this.item = (id2) => { + if (_memo[id2]) + return _memo[id2]; + const found = _this.collection.find((d2) => d2.id === id2); + if (found) + _memo[id2] = found; + return found; + }; + _this.index = (id2) => _this.collection.findIndex((d2) => d2.id === id2); + _this.matchGeometry = (geometry) => { + return presetCollection( + _this.collection.filter((d2) => d2.matchGeometry(geometry)) + ); + }; + _this.matchAllGeometry = (geometries) => { + return presetCollection( + _this.collection.filter((d2) => d2 && d2.matchAllGeometry(geometries)) + ); + }; + _this.matchAnyGeometry = (geometries) => { + return presetCollection( + _this.collection.filter((d2) => geometries.some((geom) => d2.matchGeometry(geom))) + ); + }; + _this.fallback = (geometry) => { + let id2 = geometry; + if (id2 === "vertex") + id2 = "point"; + return _this.item(id2); + }; + _this.search = (value, geometry, loc) => { + if (!value) + return _this; + value = value.toLowerCase().trim(); + function leading(a2) { + const index = a2.indexOf(value); + return index === 0 || a2[index - 1] === " "; } - } - return extent; - } - function utilTagDiff(oldTags, newTags) { - var tagDiff = []; - var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); - keys.forEach(function(k) { - var oldVal = oldTags[k]; - var newVal = newTags[k]; - if ((oldVal || oldVal === "") && (newVal === void 0 || newVal !== oldVal)) { - tagDiff.push({ - type: "-", - key: k, - oldVal, - newVal, - display: "- " + k + "=" + oldVal - }); + function leadingStrict(a2) { + const index = a2.indexOf(value); + return index === 0; } - if ((newVal || newVal === "") && (oldVal === void 0 || newVal !== oldVal)) { - tagDiff.push({ - type: "+", - key: k, - oldVal, - newVal, - display: "+ " + k + "=" + newVal - }); + function sortPresets(nameProp, aliasesProp) { + return function sortNames(a2, b2) { + let aCompare = a2[nameProp](); + let bCompare = b2[nameProp](); + if (aliasesProp) { + const findMatchingAlias = (strings) => { + if (strings.some((s2) => s2 === value)) { + return strings.find((s2) => s2 === value); + } else { + return strings.filter((s2) => s2.includes(value)).sort((a3, b3) => a3.length - b3.length)[0]; + } + }; + aCompare = findMatchingAlias([aCompare].concat(a2[aliasesProp]())); + bCompare = findMatchingAlias([bCompare].concat(b2[aliasesProp]())); + } + if (value === aCompare) + return -1; + if (value === bCompare) + return 1; + let i3 = b2.originalScore - a2.originalScore; + if (i3 !== 0) + return i3; + i3 = aCompare.indexOf(value) - bCompare.indexOf(value); + if (i3 !== 0) + return i3; + return aCompare.length - bCompare.length; + }; } - }); - return tagDiff; - } - function utilEntitySelector(ids) { - return ids.length ? "." + ids.join(",.") : "nothing"; - } - function utilEntityOrMemberSelector(ids, graph) { - var seen = new Set(ids); - ids.forEach(collectShallowDescendants); - return utilEntitySelector(Array.from(seen)); - function collectShallowDescendants(id2) { - var entity = graph.hasEntity(id2); - if (!entity || entity.type !== "relation") - return; - entity.members.map(function(member) { - return member.id; - }).forEach(function(id3) { - seen.add(id3); + let pool = _this.collection; + if (Array.isArray(loc)) { + const validHere = _sharedLocationManager.locationSetsAt(loc); + pool = pool.filter((a2) => !a2.locationSetID || validHere[a2.locationSetID]); + } + const searchable = pool.filter((a2) => a2.searchable !== false && a2.suggestion !== true); + const suggestions = pool.filter((a2) => a2.suggestion === true); + const leadingNames = searchable.filter((a2) => leading(a2.searchName()) || a2.searchAliases().some(leading)).sort(sortPresets("searchName", "searchAliases")); + const leadingSuggestions = suggestions.filter((a2) => leadingStrict(a2.searchName())).sort(sortPresets("searchName")); + const leadingNamesStripped = searchable.filter((a2) => leading(a2.searchNameStripped()) || a2.searchAliasesStripped().some(leading)).sort(sortPresets("searchNameStripped", "searchAliasesStripped")); + const leadingSuggestionsStripped = suggestions.filter((a2) => leadingStrict(a2.searchNameStripped())).sort(sortPresets("searchNameStripped")); + const leadingTerms = searchable.filter((a2) => (a2.terms() || []).some(leading)); + const leadingSuggestionTerms = suggestions.filter((a2) => (a2.terms() || []).some(leading)); + const leadingTagValues = searchable.filter((a2) => Object.values(a2.tags || {}).filter((val) => val !== "*").some(leading)); + const similarName = searchable.map((a2) => ({ preset: a2, dist: utilEditDistance(value, a2.searchName()) })).filter((a2) => a2.dist + Math.min(value.length - a2.preset.searchName().length, 0) < 3).sort((a2, b2) => a2.dist - b2.dist).map((a2) => a2.preset); + const similarSuggestions = suggestions.map((a2) => ({ preset: a2, dist: utilEditDistance(value, a2.searchName()) })).filter((a2) => a2.dist + Math.min(value.length - a2.preset.searchName().length, 0) < 1).sort((a2, b2) => a2.dist - b2.dist).map((a2) => a2.preset); + const similarTerms = searchable.filter((a2) => { + return (a2.terms() || []).some((b2) => { + return utilEditDistance(value, b2) + Math.min(value.length - b2.length, 0) < 3; + }); }); - } - } - function utilEntityOrDeepMemberSelector(ids, graph) { - return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph)); - } - function utilEntityAndDeepMemberIDs(ids, graph) { - var seen = /* @__PURE__ */ new Set(); - ids.forEach(collectDeepDescendants); - return Array.from(seen); - function collectDeepDescendants(id2) { - if (seen.has(id2)) - return; - seen.add(id2); - var entity = graph.hasEntity(id2); - if (!entity || entity.type !== "relation") - return; - entity.members.map(function(member) { - return member.id; - }).forEach(collectDeepDescendants); - } - } - function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) { - var idsSet = new Set(ids); - var seen = /* @__PURE__ */ new Set(); - var returners = /* @__PURE__ */ new Set(); - ids.forEach(collectDeepDescendants); - return utilEntitySelector(Array.from(returners)); - function collectDeepDescendants(id2) { - if (seen.has(id2)) - return; - seen.add(id2); - if (!idsSet.has(id2)) { - returners.add(id2); + let leadingTagKeyValues = []; + if (value.includes("=")) { + leadingTagKeyValues = searchable.filter((a2) => a2.tags && Object.keys(a2.tags).some((key) => key + "=" + a2.tags[key] === value)).concat(searchable.filter((a2) => a2.tags && Object.keys(a2.tags).some((key) => leading(key + "=" + a2.tags[key])))); } - var entity = graph.hasEntity(id2); - if (!entity || entity.type !== "relation") - return; - if (skipMultipolgonMembers && entity.isMultipolygon()) - return; - entity.members.map(function(member) { - return member.id; - }).forEach(collectDeepDescendants); - } - } - function utilHighlightEntities(ids, highlighted, context) { - context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed("highlighted", highlighted); + let results = leadingNames.concat( + leadingSuggestions, + leadingNamesStripped, + leadingSuggestionsStripped, + leadingTerms, + leadingSuggestionTerms, + leadingTagValues, + similarName, + similarSuggestions, + similarTerms, + leadingTagKeyValues + ).slice(0, MAXRESULTS - 1); + if (geometry) { + if (typeof geometry === "string") { + results.push(_this.fallback(geometry)); + } else { + geometry.forEach((geom) => results.push(_this.fallback(geom))); + } + } + return presetCollection(utilArrayUniq(results)); + }; + return _this; } - function utilGetAllNodes(ids, graph) { - var seen = /* @__PURE__ */ new Set(); - var nodes = /* @__PURE__ */ new Set(); - ids.forEach(collectNodes); - return Array.from(nodes); - function collectNodes(id2) { - if (seen.has(id2)) - return; - seen.add(id2); - var entity = graph.hasEntity(id2); - if (!entity) - return; - if (entity.type === "node") { - nodes.add(entity); - } else if (entity.type === "way") { - entity.nodes.forEach(collectNodes); - } else { - entity.members.map(function(member) { - return member.id; - }).forEach(collectNodes); + + // modules/presets/category.js + function presetCategory(categoryID, category, allPresets) { + let _this = Object.assign({}, category); + let _searchName; + let _searchNameStripped; + _this.id = categoryID; + _this.members = presetCollection( + (category.members || []).map((presetID) => allPresets[presetID]).filter(Boolean) + ); + _this.geometry = _this.members.collection.reduce((acc, preset) => { + for (let i3 in preset.geometry) { + const geometry = preset.geometry[i3]; + if (acc.indexOf(geometry) === -1) { + acc.push(geometry); + } } - } + return acc; + }, []); + _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0; + _this.matchAllGeometry = (geometries) => _this.members.collection.some((preset) => preset.matchAllGeometry(geometries)); + _this.matchScore = () => -1; + _this.name = () => _t(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID }); + _this.nameLabel = () => _t.append(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID }); + _this.terms = () => []; + _this.searchName = () => { + if (!_searchName) { + _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); + } + return _searchName; + }; + _this.searchNameStripped = () => { + if (!_searchNameStripped) { + _searchNameStripped = _this.searchName(); + if (_searchNameStripped.normalize) + _searchNameStripped = _searchNameStripped.normalize("NFD"); + _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, ""); + } + return _searchNameStripped; + }; + _this.searchAliases = () => []; + _this.searchAliasesStripped = () => []; + return _this; } - function utilDisplayName(entity) { - var localizedNameKey = "name:" + _mainLocalizer.languageCode().toLowerCase(); - var name = entity.tags[localizedNameKey] || entity.tags.name || ""; - if (name) - return name; - var tags = { - direction: entity.tags.direction, - from: entity.tags.from, - network: entity.tags.cycle_network || entity.tags.network, - ref: entity.tags.ref, - to: entity.tags.to, - via: entity.tags.via + + // modules/presets/field.js + function presetField(fieldID, field, allFields) { + allFields = allFields || {}; + let _this = Object.assign({}, field); + _this.id = fieldID; + _this.safeid = utilSafeClassName(fieldID); + _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1; + _this.matchAllGeometry = (geometries) => { + return !_this.geometry || geometries.every((geom) => _this.geometry.indexOf(geom) !== -1); }; - var keyComponents = []; - if (tags.network) { - keyComponents.push("network"); - } - if (tags.ref) { - keyComponents.push("ref"); - } - if (entity.tags.route) { - if (tags.direction) { - keyComponents.push("direction"); - } else if (tags.from && tags.to) { - keyComponents.push("from"); - keyComponents.push("to"); - if (tags.via) { - keyComponents.push("via"); + _this.t = (scope, options2) => _t(`_tagging.presets.fields.${fieldID}.${scope}`, options2); + _this.t.html = (scope, options2) => _t.html(`_tagging.presets.fields.${fieldID}.${scope}`, options2); + _this.t.append = (scope, options2) => _t.append(`_tagging.presets.fields.${fieldID}.${scope}`, options2); + _this.hasTextForStringId = (scope) => _mainLocalizer.hasTextForStringId(`_tagging.presets.fields.${fieldID}.${scope}`); + _this.resolveReference = (which) => { + const referenceRegex = /^\{(.*)\}$/; + const match = (field[which] || "").match(referenceRegex); + if (match) { + const field2 = allFields[match[1]]; + if (field2) { + return field2; } + console.error(`Unable to resolve referenced field: ${match[1]}`); } - } - if (keyComponents.length) { - name = _t("inspector.display_name." + keyComponents.join("_"), tags); - } - return name; - } - function utilDisplayNameForPath(entity) { - var name = utilDisplayName(entity); - var isFirefox = utilDetect().browser.toLowerCase().indexOf("firefox") > -1; - var isNewChromium = Number(utilDetect().version.split(".")[0]) >= 96; - if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) { - name = fixRTLTextForSvg(name); - } - return name; - } - function utilDisplayType(id2) { - return { - n: _t("inspector.node"), - w: _t("inspector.way"), - r: _t("inspector.relation") - }[id2.charAt(0)]; - } - function utilDisplayLabel(entity, graphOrGeometry, verbose) { - var result; - var displayName = utilDisplayName(entity); - var preset = typeof graphOrGeometry === "string" ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry); - var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name()); - if (verbose) { - result = [presetName, displayName].filter(Boolean).join(" "); - } else { - result = displayName || presetName; - } - return result || utilDisplayType(entity.id); - } - function utilEntityRoot(entityType) { - return { - node: "n", - way: "w", - relation: "r" - }[entityType]; + return _this; + }; + _this.title = () => _this.overrideLabel || _this.resolveReference("label").t("label", { "default": fieldID }); + _this.label = () => _this.overrideLabel ? (selection2) => selection2.text(_this.overrideLabel) : _this.resolveReference("label").t.append("label", { "default": fieldID }); + _this.placeholder = () => _this.resolveReference("placeholder").t("placeholder", { "default": "" }); + _this.originalTerms = (_this.terms || []).join(); + _this.terms = () => _this.resolveReference("label").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/); + _this.increment = _this.type === "number" ? _this.increment || 1 : void 0; + return _this; } - function utilCombinedTags(entityIDs, graph) { - var tags = {}; - var tagCounts = {}; - var allKeys = /* @__PURE__ */ new Set(); - var entities = entityIDs.map(function(entityID) { - return graph.hasEntity(entityID); - }).filter(Boolean); - entities.forEach(function(entity) { - var keys = Object.keys(entity.tags).filter(Boolean); - keys.forEach(function(key2) { - allKeys.add(key2); - }); - }); - entities.forEach(function(entity) { - allKeys.forEach(function(key2) { - var value = entity.tags[key2]; - if (!tags.hasOwnProperty(key2)) { - tags[key2] = value; + + // modules/presets/preset.js + var import_lodash = __toESM(require_lodash()); + function presetPreset(presetID, preset, addable, allFields, allPresets) { + allFields = allFields || {}; + allPresets = allPresets || {}; + let _this = Object.assign({}, preset); + let _addable = addable || false; + let _searchName; + let _searchNameStripped; + let _searchAliases; + let _searchAliasesStripped; + const referenceRegex = /^\{(.*)\}$/; + _this.id = presetID; + _this.safeid = utilSafeClassName(presetID); + _this.originalTerms = (_this.terms || []).join(); + _this.originalName = _this.name || ""; + _this.originalAliases = (_this.aliases || []).join("\n"); + _this.originalScore = _this.matchScore || 1; + _this.originalReference = _this.reference || {}; + _this.originalFields = _this.fields || []; + _this.originalMoreFields = _this.moreFields || []; + _this.fields = (loc) => resolveFields("fields", loc); + _this.moreFields = (loc) => resolveFields("moreFields", loc); + _this.tags = _this.tags || {}; + _this.addTags = _this.addTags || _this.tags; + _this.removeTags = _this.removeTags || _this.addTags; + _this.geometry = _this.geometry || []; + _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0; + _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry); + _this.matchScore = (entityTags) => { + const tags = _this.tags; + let seen = {}; + let score = 0; + for (let k2 in tags) { + seen[k2] = true; + if (entityTags[k2] === tags[k2]) { + score += _this.originalScore; + } else if (tags[k2] === "*" && k2 in entityTags) { + score += _this.originalScore / 2; } else { - if (!Array.isArray(tags[key2])) { - if (tags[key2] !== value) { - tags[key2] = [tags[key2], value]; - } - } else { - if (tags[key2].indexOf(value) === -1) { - tags[key2].push(value); - } - } + return -1; } - var tagHash = key2 + "=" + value; - if (!tagCounts[tagHash]) - tagCounts[tagHash] = 0; - tagCounts[tagHash] += 1; - }); - }); - for (var key in tags) { - if (!Array.isArray(tags[key])) - continue; - tags[key] = tags[key].sort(function(val12, val2) { - var key2 = key2; - var count2 = tagCounts[key2 + "=" + val2]; - var count1 = tagCounts[key2 + "=" + val12]; - if (count2 !== count1) { - return count2 - count1; + } + const addTags = _this.addTags; + for (let k2 in addTags) { + if (!seen[k2] && entityTags[k2] === addTags[k2]) { + score += _this.originalScore; } - if (val2 && val12) { - return val12.localeCompare(val2); + } + if (_this.searchable === false) { + score *= 0.999; + } + return score; + }; + _this.t = (scope, options2) => { + const textID = `_tagging.presets.presets.${presetID}.${scope}`; + return _t(textID, options2); + }; + _this.t.append = (scope, options2) => { + const textID = `_tagging.presets.presets.${presetID}.${scope}`; + return _t.append(textID, options2); + }; + function resolveReference(which) { + const match = (_this[which] || "").match(referenceRegex); + if (match) { + const preset2 = allPresets[match[1]]; + if (preset2) { + return preset2; } - return val12 ? 1 : -1; - }); - } - return tags; - } - function utilStringQs(str2) { - var i2 = 0; - while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#")) - i2++; - str2 = str2.slice(i2); - return str2.split("&").reduce(function(obj, pair2) { - var parts = pair2.split("="); - if (parts.length === 2) { - obj[parts[0]] = null === parts[1] ? "" : decodeURIComponent(parts[1]); + console.error(`Unable to resolve referenced preset: ${match[1]}`); } - return obj; - }, {}); - } - function utilQsString(obj, noencode) { - function softEncode(s) { - return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent); + return _this; } - return Object.keys(obj).sort().map(function(key) { - return encodeURIComponent(key) + "=" + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key])); - }).join("&"); - } - function utilPrefixDOMProperty(property) { - var prefixes2 = ["webkit", "ms", "moz", "o"]; - var i2 = -1; - var n2 = prefixes2.length; - var s = document.body; - if (property in s) - return property; - property = property.slice(0, 1).toUpperCase() + property.slice(1); - while (++i2 < n2) { - if (prefixes2[i2] + property in s) { - return prefixes2[i2] + property; + _this.name = () => { + return resolveReference("originalName").t("name", { "default": _this.originalName || presetID }); + }; + _this.nameLabel = () => { + return resolveReference("originalName").t.append("name", { "default": _this.originalName || presetID }); + }; + _this.subtitle = () => { + if (_this.suggestion) { + let path = presetID.split("/"); + path.pop(); + return _t("_tagging.presets.presets." + path.join("/") + ".name"); } - } - return false; - } - function utilPrefixCSSProperty(property) { - var prefixes2 = ["webkit", "ms", "Moz", "O"]; - var i2 = -1; - var n2 = prefixes2.length; - var s = document.body.style; - if (property.toLowerCase() in s) { - return property.toLowerCase(); - } - while (++i2 < n2) { - if (prefixes2[i2] + property in s) { - return "-" + prefixes2[i2].toLowerCase() + property.replace(/([A-Z])/g, "-$1").toLowerCase(); + return null; + }; + _this.subtitleLabel = () => { + if (_this.suggestion) { + let path = presetID.split("/"); + path.pop(); + return _t.append("_tagging.presets.presets." + path.join("/") + ".name"); } - } - return false; - } - var transformProperty; - function utilSetTransform(el, x, y, scale) { - var prop = transformProperty = transformProperty || utilPrefixCSSProperty("Transform"); - var translate = utilDetect().opera ? "translate(" + x + "px," + y + "px)" : "translate3d(" + x + "px," + y + "px,0)"; - return el.style(prop, translate + (scale ? " scale(" + scale + ")" : "")); - } - function utilEditDistance(a, b) { - a = (0, import_diacritics.remove)(a.toLowerCase()); - b = (0, import_diacritics.remove)(b.toLowerCase()); - if (a.length === 0) - return b.length; - if (b.length === 0) - return a.length; - var matrix = []; - var i2, j2; - for (i2 = 0; i2 <= b.length; i2++) { - matrix[i2] = [i2]; - } - for (j2 = 0; j2 <= a.length; j2++) { - matrix[0][j2] = j2; - } - for (i2 = 1; i2 <= b.length; i2++) { - for (j2 = 1; j2 <= a.length; j2++) { - if (b.charAt(i2 - 1) === a.charAt(j2 - 1)) { - matrix[i2][j2] = matrix[i2 - 1][j2 - 1]; + return null; + }; + _this.aliases = () => { + return resolveReference("originalName").t("aliases", { "default": _this.originalAliases }).trim().split(/\s*[\r\n]+\s*/); + }; + _this.terms = () => { + return resolveReference("originalName").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/); + }; + _this.searchName = () => { + if (!_searchName) { + _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); + } + return _searchName; + }; + _this.searchNameStripped = () => { + if (!_searchNameStripped) { + _searchNameStripped = stripDiacritics(_this.searchName()); + } + return _searchNameStripped; + }; + _this.searchAliases = () => { + if (!_searchAliases) { + _searchAliases = _this.aliases().map((alias) => alias.toLowerCase()); + } + return _searchAliases; + }; + _this.searchAliasesStripped = () => { + if (!_searchAliasesStripped) { + _searchAliasesStripped = _this.searchAliases(); + _searchAliasesStripped = _searchAliasesStripped.map(stripDiacritics); + } + return _searchAliasesStripped; + }; + _this.isFallback = () => { + const tagCount = Object.keys(_this.tags).length; + return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty("area"); + }; + _this.addable = function(val) { + if (!arguments.length) + return _addable; + _addable = val; + return _this; + }; + _this.reference = () => { + const qid = _this.tags.wikidata || _this.tags["flag:wikidata"] || _this.tags["brand:wikidata"] || _this.tags["network:wikidata"] || _this.tags["operator:wikidata"]; + if (qid) { + return { qid }; + } + let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, "name"))[0]; + let value = _this.originalReference.value || _this.tags[key]; + if (value === "*") { + return { key }; + } else { + return { key, value }; + } + }; + _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults, loc) => { + let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags; + tags = utilObjectOmit(tags, Object.keys(removeTags)); + if (geometry && !skipFieldDefaults) { + _this.fields(loc).forEach((field) => { + if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key] && (!ignoringKeys || ignoringKeys.indexOf(field.key) === -1)) { + delete tags[field.key]; + } + }); + } + delete tags.area; + return tags; + }; + _this.setTags = (tags, geometry, skipFieldDefaults, loc) => { + const addTags = _this.addTags; + tags = Object.assign({}, tags); + for (let k2 in addTags) { + if (addTags[k2] === "*") { + if (_this.tags[k2] || !tags[k2]) { + tags[k2] = "yes"; + } } else { - matrix[i2][j2] = Math.min( - matrix[i2 - 1][j2 - 1] + 1, - Math.min( - matrix[i2][j2 - 1] + 1, - matrix[i2 - 1][j2] + 1 - ) - ); + tags[k2] = addTags[k2]; } } - } - return matrix[b.length][a.length]; - } - function utilFastMouse(container) { - var rect = container.getBoundingClientRect(); - var rectLeft = rect.left; - var rectTop = rect.top; - var clientLeft = +container.clientLeft; - var clientTop = +container.clientTop; - return function(e) { - return [ - e.clientX - rectLeft - clientLeft, - e.clientY - rectTop - clientTop - ]; + if (!addTags.hasOwnProperty("area")) { + delete tags.area; + if (geometry === "area") { + let needsAreaTag = true; + for (let k2 in addTags) { + if (_this.geometry.indexOf("line") === -1 && k2 in osmAreaKeys || k2 in osmAreaKeysExceptions && addTags[k2] in osmAreaKeysExceptions[k2]) { + needsAreaTag = false; + break; + } + } + if (needsAreaTag) { + tags.area = "yes"; + } + } + } + if (geometry && !skipFieldDefaults) { + _this.fields(loc).forEach((field) => { + if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) { + tags[field.key] = field.default; + } + }); + } + return tags; }; - } - function utilAsyncMap(inputs, func, callback) { - var remaining = inputs.length; - var results = []; - var errors = []; - inputs.forEach(function(d, i2) { - func(d, function done(err, data) { - errors[i2] = err; - results[i2] = data; - remaining--; - if (!remaining) - callback(errors, results); - }); - }); - } - function utilWrap(index, length) { - if (index < 0) { - index += Math.ceil(-index / length) * length; - } - return index % length; - } - function utilFunctor(value) { - if (typeof value === "function") - return value; - return function() { - return value; - }; - } - function utilNoAuto(selection2) { - var isText = selection2.size() && selection2.node().tagName.toLowerCase() === "textarea"; - return selection2.attr("autocomplete", "new-password").attr("autocorrect", "off").attr("autocapitalize", "off").attr("spellcheck", isText ? "true" : "false"); - } - function utilHashcode(str2) { - var hash = 0; - if (str2.length === 0) { - return hash; - } - for (var i2 = 0; i2 < str2.length; i2++) { - var char = str2.charCodeAt(i2); - hash = (hash << 5) - hash + char; - hash = hash & hash; - } - return hash; - } - function utilSafeClassName(str2) { - return str2.toLowerCase().replace(/[^a-z0-9]+/g, "_"); - } - function utilUniqueDomId(val) { - return "ideditor-" + utilSafeClassName(val.toString()) + "-" + new Date().getTime().toString(); - } - function utilUnicodeCharsCount(str2) { - return Array.from(str2).length; - } - function utilUnicodeCharsTruncated(str2, limit) { - return Array.from(str2).slice(0, limit).join(""); - } - function toNumericID(id2) { - var match = id2.match(/^[cnwr](-?\d+)$/); - if (match) { - return parseInt(match[1], 10); - } - return NaN; - } - function compareNumericIDs(left, right) { - if (isNaN(left) && isNaN(right)) - return -1; - if (isNaN(left)) - return 1; - if (isNaN(right)) - return -1; - if (Math.sign(left) !== Math.sign(right)) - return -Math.sign(left); - if (Math.sign(left) < 0) - return Math.sign(right - left); - return Math.sign(left - right); - } - function utilCompareIDs(left, right) { - return compareNumericIDs(toNumericID(left), toNumericID(right)); - } - function utilOldestID(ids) { - if (ids.length === 0) { - return void 0; - } - var oldestIDIndex = 0; - var oldestID = toNumericID(ids[0]); - for (var i2 = 1; i2 < ids.length; i2++) { - var num = toNumericID(ids[i2]); - if (compareNumericIDs(oldestID, num) === 1) { - oldestIDIndex = i2; - oldestID = num; + function resolveFields(which, loc) { + const fieldIDs = which === "fields" ? _this.originalFields : _this.originalMoreFields; + let resolved = []; + fieldIDs.forEach((fieldID) => { + const match = fieldID.match(referenceRegex); + if (match !== null) { + resolved = resolved.concat(inheritFields(allPresets[match[1]], which)); + } else if (allFields[fieldID]) { + resolved.push(allFields[fieldID]); + } else { + console.log(`Cannot resolve "${fieldID}" found in ${_this.id}.${which}`); + } + }); + if (!resolved.length) { + const endIndex = _this.id.lastIndexOf("/"); + const parentID = endIndex && _this.id.substring(0, endIndex); + if (parentID) { + let parent = allPresets[parentID]; + if (loc) { + const validHere = _sharedLocationManager.locationSetsAt(loc); + if (parent?.locationSetID && !validHere[parent.locationSetID]) { + const candidateIDs = Object.keys(allPresets).filter((k2) => k2.startsWith(parentID)); + parent = allPresets[candidateIDs.find((candidateID) => { + const candidate = allPresets[candidateID]; + return validHere[candidate.locationSetID] && (0, import_lodash.isEqual)(candidate.tags, parent.tags); + })]; + } + } + resolved = inheritFields(parent, which); + } + } + return utilArrayUniq(resolved); + function inheritFields(parent, which2) { + if (!parent) + return []; + if (which2 === "fields") { + return parent.fields().filter(shouldInherit); + } else if (which2 === "moreFields") { + return parent.moreFields(); + } else { + return []; + } + } + function shouldInherit(f3) { + if (f3.key && _this.tags[f3.key] !== void 0 && // inherit anyway if multiple values are allowed or just a checkbox + f3.type !== "multiCombo" && f3.type !== "semiCombo" && f3.type !== "manyCombo" && f3.type !== "check") + return false; + return true; } } - return ids[oldestIDIndex]; - } - - // modules/osm/entity.js - function osmEntity(attrs) { - if (this instanceof osmEntity) - return; - if (attrs && attrs.type) { - return osmEntity[attrs.type].apply(this, arguments); - } else if (attrs && attrs.id) { - return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments); + function stripDiacritics(s2) { + if (s2.normalize) + s2 = s2.normalize("NFD"); + s2 = s2.replace(/[\u0300-\u036f]/g, ""); + return s2; } - return new osmEntity().initialize(arguments); + return _this; } - osmEntity.id = function(type3) { - return osmEntity.id.fromOSM(type3, osmEntity.id.next[type3]--); - }; - osmEntity.id.next = { - changeset: -1, - node: -1, - way: -1, - relation: -1 - }; - osmEntity.id.fromOSM = function(type3, id2) { - return type3[0] + id2; - }; - osmEntity.id.toOSM = function(id2) { - var match = id2.match(/^[cnwr](-?\d+)$/); - if (match) { - return match[1]; - } - return ""; - }; - osmEntity.id.type = function(id2) { - return { "c": "changeset", "n": "node", "w": "way", "r": "relation" }[id2[0]]; - }; - osmEntity.key = function(entity) { - return entity.id + "v" + (entity.v || 0); - }; - var _deprecatedTagValuesByKey; - osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) { - if (!_deprecatedTagValuesByKey) { - _deprecatedTagValuesByKey = {}; - dataDeprecated.forEach(function(d) { - var oldKeys = Object.keys(d.old); - if (oldKeys.length === 1) { - var oldKey = oldKeys[0]; - var oldValue = d.old[oldKey]; - if (oldValue !== "*") { - if (!_deprecatedTagValuesByKey[oldKey]) { - _deprecatedTagValuesByKey[oldKey] = [oldValue]; - } else { - _deprecatedTagValuesByKey[oldKey].push(oldValue); - } - } - } + + // modules/presets/index.js + var _mainPresetIndex = presetIndex(); + function presetIndex() { + const dispatch14 = dispatch_default("favoritePreset", "recentsChange"); + const MAXRECENTS = 30; + const POINT = presetPreset("point", { name: "Point", tags: {}, geometry: ["point", "vertex"], matchScore: 0.1 }); + const LINE = presetPreset("line", { name: "Line", tags: {}, geometry: ["line"], matchScore: 0.1 }); + const AREA = presetPreset("area", { name: "Area", tags: { area: "yes" }, geometry: ["area"], matchScore: 0.1 }); + const RELATION = presetPreset("relation", { name: "Relation", tags: {}, geometry: ["relation"], matchScore: 0.1 }); + let _this = presetCollection([POINT, LINE, AREA, RELATION]); + let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION }; + let _defaults2 = { + point: presetCollection([POINT]), + vertex: presetCollection([POINT]), + line: presetCollection([LINE]), + area: presetCollection([AREA]), + relation: presetCollection([RELATION]) + }; + let _fields = {}; + let _categories = {}; + let _universal = []; + let _addablePresetIDs = null; + let _recents; + let _favorites; + let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; + let _loadPromise; + _this.ensureLoaded = () => { + if (_loadPromise) + return _loadPromise; + return _loadPromise = Promise.all([ + _mainFileFetcher.get("preset_categories"), + _mainFileFetcher.get("preset_defaults"), + _mainFileFetcher.get("preset_presets"), + _mainFileFetcher.get("preset_fields") + ]).then((vals) => { + _this.merge({ + categories: vals[0], + defaults: vals[1], + presets: vals[2], + fields: vals[3] + }); + osmSetAreaKeys(_this.areaKeys()); + osmSetLineTags(_this.lineTags()); + osmSetPointTags(_this.pointTags()); + osmSetVertexTags(_this.vertexTags()); }); - } - return _deprecatedTagValuesByKey; - }; - osmEntity.prototype = { - tags: {}, - initialize: function(sources) { - for (var i2 = 0; i2 < sources.length; ++i2) { - var source = sources[i2]; - for (var prop in source) { - if (Object.prototype.hasOwnProperty.call(source, prop)) { - if (source[prop] === void 0) { - delete this[prop]; - } else { - this[prop] = source[prop]; + }; + _this.merge = (d2) => { + let newLocationSets = []; + if (d2.fields) { + Object.keys(d2.fields).forEach((fieldID) => { + let f3 = d2.fields[fieldID]; + if (f3) { + f3 = presetField(fieldID, f3, _fields); + if (f3.locationSet) + newLocationSets.push(f3); + _fields[fieldID] = f3; + } else { + delete _fields[fieldID]; + } + }); + } + if (d2.presets) { + Object.keys(d2.presets).forEach((presetID) => { + let p2 = d2.presets[presetID]; + if (p2) { + const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID); + p2 = presetPreset(presetID, p2, isAddable, _fields, _presets); + if (p2.locationSet) + newLocationSets.push(p2); + _presets[presetID] = p2; + } else { + const existing = _presets[presetID]; + if (existing && !existing.isFallback()) { + delete _presets[presetID]; } } - } + }); } - if (!this.id && this.type) { - this.id = osmEntity.id(this.type); + if (d2.categories) { + Object.keys(d2.categories).forEach((categoryID) => { + let c2 = d2.categories[categoryID]; + if (c2) { + c2 = presetCategory(categoryID, c2, _presets); + if (c2.locationSet) + newLocationSets.push(c2); + _categories[categoryID] = c2; + } else { + delete _categories[categoryID]; + } + }); } - if (!this.hasOwnProperty("visible")) { - this.visible = true; + _this.collection = Object.values(_presets).concat(Object.values(_categories)); + if (d2.defaults) { + Object.keys(d2.defaults).forEach((geometry) => { + const def = d2.defaults[geometry]; + if (Array.isArray(def)) { + _defaults2[geometry] = presetCollection( + def.map((id2) => _presets[id2] || _categories[id2]).filter(Boolean) + ); + } else { + delete _defaults2[geometry]; + } + }); } - if (debug) { - Object.freeze(this); - Object.freeze(this.tags); - if (this.loc) - Object.freeze(this.loc); - if (this.nodes) - Object.freeze(this.nodes); - if (this.members) - Object.freeze(this.members); + _universal = Object.values(_fields).filter((field) => field.universal); + _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; + _this.collection.forEach((preset) => { + (preset.geometry || []).forEach((geometry) => { + let g3 = _geometryIndex[geometry]; + for (let key in preset.tags) { + g3[key] = g3[key] || {}; + let value = preset.tags[key]; + (g3[key][value] = g3[key][value] || []).push(preset); + } + }); + }); + if (d2.featureCollection && Array.isArray(d2.featureCollection.features)) { + _sharedLocationManager.mergeCustomGeoJSON(d2.featureCollection); } - return this; - }, - copy: function(resolver, copies) { - if (copies[this.id]) - return copies[this.id]; - var copy2 = osmEntity(this, { id: void 0, user: void 0, version: void 0 }); - copies[this.id] = copy2; - return copy2; - }, - osmId: function() { - return osmEntity.id.toOSM(this.id); - }, - isNew: function() { - var osmId = osmEntity.id.toOSM(this.id); - return osmId.length === 0 || osmId[0] === "-"; - }, - update: function(attrs) { - return osmEntity(this, attrs, { v: 1 + (this.v || 0) }); - }, - mergeTags: function(tags) { - var merged = Object.assign({}, this.tags); - var changed = false; - for (var k in tags) { - var t1 = merged[k]; - var t2 = tags[k]; - if (!t1) { - changed = true; - merged[k] = t2; - } else if (t1 !== t2) { - changed = true; - merged[k] = utilUnicodeCharsTruncated( - utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(";"), - 255 - ); - } + if (newLocationSets.length) { + _sharedLocationManager.mergeLocationSets(newLocationSets); } - return changed ? this.update({ tags: merged }) : this; - }, - intersects: function(extent, resolver) { - return this.extent(resolver).intersects(extent); - }, - hasNonGeometryTags: function() { - return Object.keys(this.tags).some(function(k) { - return k !== "area"; + return _this; + }; + _this.match = (entity, resolver) => { + return resolver.transient(entity, "presetMatch", () => { + let geometry = entity.geometry(resolver); + if (geometry === "vertex" && entity.isOnAddressLine(resolver)) { + geometry = "point"; + } + const entityExtent = entity.extent(resolver); + return _this.matchTags(entity.tags, geometry, entityExtent.center()); }); - }, - hasParentRelations: function(resolver) { - return resolver.parentRelations(this).length > 0; - }, - hasInterestingTags: function() { - return Object.keys(this.tags).some(osmIsInterestingTag); - }, - isHighwayIntersection: function() { - return false; - }, - isDegenerate: function() { - return true; - }, - deprecatedTags: function(dataDeprecated) { - var tags = this.tags; - if (Object.keys(tags).length === 0) - return []; - var deprecated = []; - dataDeprecated.forEach(function(d) { - var oldKeys = Object.keys(d.old); - if (d.replace) { - var hasExistingValues = Object.keys(d.replace).some(function(replaceKey) { - if (!tags[replaceKey] || d.old[replaceKey]) - return false; - var replaceValue = d.replace[replaceKey]; - if (replaceValue === "*") - return false; - if (replaceValue === tags[replaceKey]) - return false; - return true; - }); - if (hasExistingValues) - return; + }; + _this.matchTags = (tags, geometry, loc) => { + const keyIndex = _geometryIndex[geometry]; + let bestScore = -1; + let bestMatch; + let matchCandidates = []; + for (let k2 in tags) { + let indexMatches = []; + let valueIndex = keyIndex[k2]; + if (!valueIndex) + continue; + let keyValueMatches = valueIndex[tags[k2]]; + if (keyValueMatches) + indexMatches.push(...keyValueMatches); + let keyStarMatches = valueIndex["*"]; + if (keyStarMatches) + indexMatches.push(...keyStarMatches); + if (indexMatches.length === 0) + continue; + for (let i3 = 0; i3 < indexMatches.length; i3++) { + const candidate = indexMatches[i3]; + const score = candidate.matchScore(tags); + if (score === -1) { + continue; + } + matchCandidates.push({ score, candidate }); + if (score > bestScore) { + bestScore = score; + bestMatch = candidate; + } } - var matchesDeprecatedTags = oldKeys.every(function(oldKey) { - if (!tags[oldKey]) - return false; - if (d.old[oldKey] === "*") - return true; - if (d.old[oldKey] === tags[oldKey]) - return true; - var vals = tags[oldKey].split(";").filter(Boolean); - if (vals.length === 0) { - return false; - } else if (vals.length > 1) { - return vals.indexOf(d.old[oldKey]) !== -1; - } else { - if (tags[oldKey] === d.old[oldKey]) { - if (d.replace && d.old[oldKey] === d.replace[oldKey]) { - var replaceKeys = Object.keys(d.replace); - return !replaceKeys.every(function(replaceKey) { - return tags[replaceKey] === d.replace[replaceKey]; - }); - } else { - return true; - } + } + if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== "+[Q2]" && Array.isArray(loc)) { + const validHere = _sharedLocationManager.locationSetsAt(loc); + if (!validHere[bestMatch.locationSetID]) { + matchCandidates.sort((a2, b2) => a2.score < b2.score ? 1 : -1); + for (let i3 = 0; i3 < matchCandidates.length; i3++) { + const candidateScore = matchCandidates[i3]; + if (!candidateScore.candidate.locationSetID || validHere[candidateScore.candidate.locationSetID]) { + bestMatch = candidateScore.candidate; + bestScore = candidateScore.score; + break; } } + } + } + if (!bestMatch || bestMatch.isFallback()) { + for (let k2 in tags) { + if (/^addr:/.test(k2) && keyIndex["addr:*"] && keyIndex["addr:*"]["*"]) { + bestMatch = keyIndex["addr:*"]["*"][0]; + break; + } + } + } + return bestMatch || _this.fallback(geometry); + }; + _this.allowsVertex = (entity, resolver) => { + if (entity.type !== "node") + return false; + if (Object.keys(entity.tags).length === 0) + return true; + return resolver.transient(entity, "vertexMatch", () => { + if (entity.isOnAddressLine(resolver)) + return true; + const geometries = osmNodeGeometriesForTags(entity.tags); + if (geometries.vertex) + return true; + if (geometries.point) return false; - }); - if (matchesDeprecatedTags) { - deprecated.push(d); + return true; + }); + }; + _this.areaKeys = () => { + const ignore = { + barrier: true, + highway: true, + footway: true, + railway: true, + junction: true, + traffic_calming: true, + type: true + }; + let areaKeys = {}; + const presets = _this.collection.filter((p2) => !p2.suggestion && !p2.replacement); + presets.forEach((p2) => { + const keys2 = p2.tags && Object.keys(p2.tags); + const key = keys2 && keys2.length && keys2[0]; + if (!key) + return; + if (ignore[key]) + return; + if (p2.geometry.indexOf("area") !== -1) { + areaKeys[key] = areaKeys[key] || {}; } }); - return deprecated; - } - }; - - // modules/osm/lanes.js - function osmLanes(entity) { - if (entity.type !== "way") - return null; - if (!entity.tags.highway) - return null; - var tags = entity.tags; - var isOneWay = entity.isOneWay(); - var laneCount = getLaneCount(tags, isOneWay); - var maxspeed = parseMaxspeed(tags); - var laneDirections = parseLaneDirections(tags, isOneWay, laneCount); - var forward = laneDirections.forward; - var backward = laneDirections.backward; - var bothways = laneDirections.bothways; - var turnLanes = {}; - turnLanes.unspecified = parseTurnLanes(tags["turn:lanes"]); - turnLanes.forward = parseTurnLanes(tags["turn:lanes:forward"]); - turnLanes.backward = parseTurnLanes(tags["turn:lanes:backward"]); - var maxspeedLanes = {}; - maxspeedLanes.unspecified = parseMaxspeedLanes(tags["maxspeed:lanes"], maxspeed); - maxspeedLanes.forward = parseMaxspeedLanes(tags["maxspeed:lanes:forward"], maxspeed); - maxspeedLanes.backward = parseMaxspeedLanes(tags["maxspeed:lanes:backward"], maxspeed); - var psvLanes = {}; - psvLanes.unspecified = parseMiscLanes(tags["psv:lanes"]); - psvLanes.forward = parseMiscLanes(tags["psv:lanes:forward"]); - psvLanes.backward = parseMiscLanes(tags["psv:lanes:backward"]); - var busLanes = {}; - busLanes.unspecified = parseMiscLanes(tags["bus:lanes"]); - busLanes.forward = parseMiscLanes(tags["bus:lanes:forward"]); - busLanes.backward = parseMiscLanes(tags["bus:lanes:backward"]); - var taxiLanes = {}; - taxiLanes.unspecified = parseMiscLanes(tags["taxi:lanes"]); - taxiLanes.forward = parseMiscLanes(tags["taxi:lanes:forward"]); - taxiLanes.backward = parseMiscLanes(tags["taxi:lanes:backward"]); - var hovLanes = {}; - hovLanes.unspecified = parseMiscLanes(tags["hov:lanes"]); - hovLanes.forward = parseMiscLanes(tags["hov:lanes:forward"]); - hovLanes.backward = parseMiscLanes(tags["hov:lanes:backward"]); - var hgvLanes = {}; - hgvLanes.unspecified = parseMiscLanes(tags["hgv:lanes"]); - hgvLanes.forward = parseMiscLanes(tags["hgv:lanes:forward"]); - hgvLanes.backward = parseMiscLanes(tags["hgv:lanes:backward"]); - var bicyclewayLanes = {}; - bicyclewayLanes.unspecified = parseBicycleWay(tags["bicycleway:lanes"]); - bicyclewayLanes.forward = parseBicycleWay(tags["bicycleway:lanes:forward"]); - bicyclewayLanes.backward = parseBicycleWay(tags["bicycleway:lanes:backward"]); - var lanesObj = { - forward: [], - backward: [], - unspecified: [] + presets.forEach((p2) => { + let key; + for (key in p2.addTags) { + const value = p2.addTags[key]; + if (key in areaKeys && // probably an area... + p2.geometry.indexOf("line") !== -1 && // but sometimes a line + value !== "*") { + areaKeys[key][value] = true; + } + } + }); + return areaKeys; }; - mapToLanesObj(lanesObj, turnLanes, "turnLane"); - mapToLanesObj(lanesObj, maxspeedLanes, "maxspeed"); - mapToLanesObj(lanesObj, psvLanes, "psv"); - mapToLanesObj(lanesObj, busLanes, "bus"); - mapToLanesObj(lanesObj, taxiLanes, "taxi"); - mapToLanesObj(lanesObj, hovLanes, "hov"); - mapToLanesObj(lanesObj, hgvLanes, "hgv"); - mapToLanesObj(lanesObj, bicyclewayLanes, "bicycleway"); - return { - metadata: { - count: laneCount, - oneway: isOneWay, - forward, - backward, - bothways, - turnLanes, - maxspeed, - maxspeedLanes, - psvLanes, - busLanes, - taxiLanes, - hovLanes, - hgvLanes, - bicyclewayLanes - }, - lanes: lanesObj + _this.lineTags = () => { + return _this.collection.filter((lineTags, d2) => { + if (d2.suggestion || d2.replacement || d2.searchable === false) + return lineTags; + const keys2 = d2.tags && Object.keys(d2.tags); + const key = keys2 && keys2.length && keys2[0]; + if (!key) + return lineTags; + if (d2.geometry.indexOf("line") !== -1) { + lineTags[key] = lineTags[key] || []; + lineTags[key].push(d2.tags); + } + return lineTags; + }, {}); }; - } - function getLaneCount(tags, isOneWay) { - var count; - if (tags.lanes) { - count = parseInt(tags.lanes, 10); - if (count > 0) { - return count; - } - } - switch (tags.highway) { - case "trunk": - case "motorway": - count = isOneWay ? 2 : 4; - break; - default: - count = isOneWay ? 1 : 2; - break; + _this.pointTags = () => { + return _this.collection.reduce((pointTags, d2) => { + if (d2.suggestion || d2.replacement || d2.searchable === false) + return pointTags; + const keys2 = d2.tags && Object.keys(d2.tags); + const key = keys2 && keys2.length && keys2[0]; + if (!key) + return pointTags; + if (d2.geometry.indexOf("point") !== -1) { + pointTags[key] = pointTags[key] || {}; + pointTags[key][d2.tags[key]] = true; + } + return pointTags; + }, {}); + }; + _this.vertexTags = () => { + return _this.collection.reduce((vertexTags, d2) => { + if (d2.suggestion || d2.replacement || d2.searchable === false) + return vertexTags; + const keys2 = d2.tags && Object.keys(d2.tags); + const key = keys2 && keys2.length && keys2[0]; + if (!key) + return vertexTags; + if (d2.geometry.indexOf("vertex") !== -1) { + vertexTags[key] = vertexTags[key] || {}; + vertexTags[key][d2.tags[key]] = true; + } + return vertexTags; + }, {}); + }; + _this.field = (id2) => _fields[id2]; + _this.universal = () => _universal; + _this.defaults = (geometry, n3, startWithRecents, loc, extraPresets) => { + let recents = []; + if (startWithRecents) { + recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4); + } + let defaults; + if (_addablePresetIDs) { + defaults = Array.from(_addablePresetIDs).map(function(id2) { + var preset = _this.item(id2); + if (preset && preset.matchGeometry(geometry)) + return preset; + return null; + }).filter(Boolean); + } else { + defaults = _defaults2[geometry].collection.concat(_this.fallback(geometry)); + } + let result = presetCollection( + utilArrayUniq(recents.concat(defaults).concat(extraPresets || [])).slice(0, n3 - 1) + ); + if (Array.isArray(loc)) { + const validHere = _sharedLocationManager.locationSetsAt(loc); + result.collection = result.collection.filter((a2) => !a2.locationSetID || validHere[a2.locationSetID]); + } + return result; + }; + _this.addablePresetIDs = function(val) { + if (!arguments.length) + return _addablePresetIDs; + if (Array.isArray(val)) + val = new Set(val); + _addablePresetIDs = val; + if (_addablePresetIDs) { + _this.collection.forEach((p2) => { + if (p2.addable) + p2.addable(_addablePresetIDs.has(p2.id)); + }); + } else { + _this.collection.forEach((p2) => { + if (p2.addable) + p2.addable(true); + }); + } + return _this; + }; + _this.recent = () => { + return presetCollection( + utilArrayUniq(_this.getRecents().map((d2) => d2.preset).filter((d2) => d2.searchable !== false)) + ); + }; + function RibbonItem(preset, source) { + let item = {}; + item.preset = preset; + item.source = source; + item.isFavorite = () => item.source === "favorite"; + item.isRecent = () => item.source === "recent"; + item.matches = (preset2) => item.preset.id === preset2.id; + item.minified = () => ({ pID: item.preset.id }); + return item; } - return count; - } - function parseMaxspeed(tags) { - var maxspeed = tags.maxspeed; - if (!maxspeed) - return; - var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/; - if (!maxspeedRegex.test(maxspeed)) - return; - return parseInt(maxspeed, 10); - } - function parseLaneDirections(tags, isOneWay, laneCount) { - var forward = parseInt(tags["lanes:forward"], 10); - var backward = parseInt(tags["lanes:backward"], 10); - var bothways = parseInt(tags["lanes:both_ways"], 10) > 0 ? 1 : 0; - if (parseInt(tags.oneway, 10) === -1) { - forward = 0; - bothways = 0; - backward = laneCount; - } else if (isOneWay) { - forward = laneCount; - bothways = 0; - backward = 0; - } else if (isNaN(forward) && isNaN(backward)) { - backward = Math.floor((laneCount - bothways) / 2); - forward = laneCount - bothways - backward; - } else if (isNaN(forward)) { - if (backward > laneCount - bothways) { - backward = laneCount - bothways; + function ribbonItemForMinified(d2, source) { + if (d2 && d2.pID) { + const preset = _this.item(d2.pID); + if (!preset) + return null; + return RibbonItem(preset, source); } - forward = laneCount - bothways - backward; - } else if (isNaN(backward)) { - if (forward > laneCount - bothways) { - forward = laneCount - bothways; + return null; + } + _this.getGenericRibbonItems = () => { + return ["point", "line", "area"].map((id2) => RibbonItem(_this.item(id2), "generic")); + }; + _this.getAddable = () => { + if (!_addablePresetIDs) + return []; + return _addablePresetIDs.map((id2) => { + const preset = _this.item(id2); + if (preset) + return RibbonItem(preset, "addable"); + return null; + }).filter(Boolean); + }; + function setRecents(items) { + _recents = items; + const minifiedItems = items.map((d2) => d2.minified()); + corePreferences("preset_recents", JSON.stringify(minifiedItems)); + dispatch14.call("recentsChange"); + } + _this.getRecents = () => { + if (!_recents) { + _recents = (JSON.parse(corePreferences("preset_recents")) || []).reduce((acc, d2) => { + let item = ribbonItemForMinified(d2, "recent"); + if (item && item.preset.addable()) + acc.push(item); + return acc; + }, []); } - backward = laneCount - bothways - forward; + return _recents; + }; + _this.addRecent = (preset, besidePreset, after) => { + const recents = _this.getRecents(); + const beforeItem = _this.recentMatching(besidePreset); + let toIndex = recents.indexOf(beforeItem); + if (after) + toIndex += 1; + const newItem = RibbonItem(preset, "recent"); + recents.splice(toIndex, 0, newItem); + setRecents(recents); + }; + _this.removeRecent = (preset) => { + const item = _this.recentMatching(preset); + if (item) { + let items = _this.getRecents(); + items.splice(items.indexOf(item), 1); + setRecents(items); + } + }; + _this.recentMatching = (preset) => { + const items = _this.getRecents(); + for (let i3 in items) { + if (items[i3].matches(preset)) { + return items[i3]; + } + } + return null; + }; + _this.moveItem = (items, fromIndex, toIndex) => { + if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) + return null; + items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]); + return items; + }; + _this.moveRecent = (item, beforeItem) => { + const recents = _this.getRecents(); + const fromIndex = recents.indexOf(item); + const toIndex = recents.indexOf(beforeItem); + const items = _this.moveItem(recents, fromIndex, toIndex); + if (items) + setRecents(items); + }; + _this.setMostRecent = (preset) => { + if (preset.searchable === false) + return; + let items = _this.getRecents(); + let item = _this.recentMatching(preset); + if (item) { + items.splice(items.indexOf(item), 1); + } else { + item = RibbonItem(preset, "recent"); + } + while (items.length >= MAXRECENTS) { + items.pop(); + } + items.unshift(item); + setRecents(items); + }; + function setFavorites(items) { + _favorites = items; + const minifiedItems = items.map((d2) => d2.minified()); + corePreferences("preset_favorites", JSON.stringify(minifiedItems)); + dispatch14.call("favoritePreset"); } - return { - forward, - backward, - bothways + _this.addFavorite = (preset, besidePreset, after) => { + const favorites = _this.getFavorites(); + const beforeItem = _this.favoriteMatching(besidePreset); + let toIndex = favorites.indexOf(beforeItem); + if (after) + toIndex += 1; + const newItem = RibbonItem(preset, "favorite"); + favorites.splice(toIndex, 0, newItem); + setFavorites(favorites); + }; + _this.toggleFavorite = (preset) => { + const favs = _this.getFavorites(); + const favorite = _this.favoriteMatching(preset); + if (favorite) { + favs.splice(favs.indexOf(favorite), 1); + } else { + if (favs.length === 10) { + favs.pop(); + } + favs.push(RibbonItem(preset, "favorite")); + } + setFavorites(favs); + }; + _this.removeFavorite = (preset) => { + const item = _this.favoriteMatching(preset); + if (item) { + const items = _this.getFavorites(); + items.splice(items.indexOf(item), 1); + setFavorites(items); + } + }; + _this.getFavorites = () => { + if (!_favorites) { + let rawFavorites = JSON.parse(corePreferences("preset_favorites")); + if (!rawFavorites) { + rawFavorites = []; + corePreferences("preset_favorites", JSON.stringify(rawFavorites)); + } + _favorites = rawFavorites.reduce((output, d2) => { + const item = ribbonItemForMinified(d2, "favorite"); + if (item && item.preset.addable()) + output.push(item); + return output; + }, []); + } + return _favorites; }; + _this.favoriteMatching = (preset) => { + const favs = _this.getFavorites(); + for (let index in favs) { + if (favs[index].matches(preset)) { + return favs[index]; + } + } + return null; + }; + return utilRebind(_this, dispatch14, "on"); } - function parseTurnLanes(tag) { - if (!tag) - return; - var validValues = [ - "left", - "slight_left", - "sharp_left", - "through", - "right", - "slight_right", - "sharp_right", - "reverse", - "merge_to_left", - "merge_to_right", - "none" - ]; - return tag.split("|").map(function(s) { - if (s === "") - s = "none"; - return s.split(";").map(function(d) { - return validValues.indexOf(d) === -1 ? "unknown" : d; - }); - }); + + // modules/util/util.js + function utilTagText(entity) { + var obj = entity && entity.tags || {}; + return Object.keys(obj).map(function(k2) { + return k2 + "=" + obj[k2]; + }).join(", "); } - function parseMaxspeedLanes(tag, maxspeed) { - if (!tag) - return; - return tag.split("|").map(function(s) { - if (s === "none") - return s; - var m = parseInt(s, 10); - if (s === "" || m === maxspeed) - return null; - return isNaN(m) ? "unknown" : m; - }); + function utilTotalExtent(array2, graph) { + var extent = geoExtent(); + var val, entity; + for (var i3 = 0; i3 < array2.length; i3++) { + val = array2[i3]; + entity = typeof val === "string" ? graph.hasEntity(val) : val; + if (entity) { + extent._extend(entity.extent(graph)); + } + } + return extent; } - function parseMiscLanes(tag) { - if (!tag) - return; - var validValues = [ - "yes", - "no", - "designated" - ]; - return tag.split("|").map(function(s) { - if (s === "") - s = "no"; - return validValues.indexOf(s) === -1 ? "unknown" : s; + function utilTagDiff(oldTags, newTags) { + var tagDiff = []; + var keys2 = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); + keys2.forEach(function(k2) { + var oldVal = oldTags[k2]; + var newVal = newTags[k2]; + if ((oldVal || oldVal === "") && (newVal === void 0 || newVal !== oldVal)) { + tagDiff.push({ + type: "-", + key: k2, + oldVal, + newVal, + display: "- " + k2 + "=" + oldVal + }); + } + if ((newVal || newVal === "") && (oldVal === void 0 || newVal !== oldVal)) { + tagDiff.push({ + type: "+", + key: k2, + oldVal, + newVal, + display: "+ " + k2 + "=" + newVal + }); + } }); + return tagDiff; } - function parseBicycleWay(tag) { - if (!tag) - return; - var validValues = [ - "yes", - "no", - "designated", - "lane" - ]; - return tag.split("|").map(function(s) { - if (s === "") - s = "no"; - return validValues.indexOf(s) === -1 ? "unknown" : s; - }); + function utilEntitySelector(ids) { + return ids.length ? "." + ids.join(",.") : "nothing"; } - function mapToLanesObj(lanesObj, data, key) { - if (data.forward) { - data.forward.forEach(function(l, i2) { - if (!lanesObj.forward[i2]) - lanesObj.forward[i2] = {}; - lanesObj.forward[i2][key] = l; + function utilEntityOrMemberSelector(ids, graph) { + var seen = new Set(ids); + ids.forEach(collectShallowDescendants); + return utilEntitySelector(Array.from(seen)); + function collectShallowDescendants(id2) { + var entity = graph.hasEntity(id2); + if (!entity || entity.type !== "relation") + return; + entity.members.map(function(member) { + return member.id; + }).forEach(function(id3) { + seen.add(id3); }); } - if (data.backward) { - data.backward.forEach(function(l, i2) { - if (!lanesObj.backward[i2]) - lanesObj.backward[i2] = {}; - lanesObj.backward[i2][key] = l; - }); + } + function utilEntityOrDeepMemberSelector(ids, graph) { + return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph)); + } + function utilEntityAndDeepMemberIDs(ids, graph) { + var seen = /* @__PURE__ */ new Set(); + ids.forEach(collectDeepDescendants); + return Array.from(seen); + function collectDeepDescendants(id2) { + if (seen.has(id2)) + return; + seen.add(id2); + var entity = graph.hasEntity(id2); + if (!entity || entity.type !== "relation") + return; + entity.members.map(function(member) { + return member.id; + }).forEach(collectDeepDescendants); } - if (data.unspecified) { - data.unspecified.forEach(function(l, i2) { - if (!lanesObj.unspecified[i2]) - lanesObj.unspecified[i2] = {}; - lanesObj.unspecified[i2][key] = l; - }); + } + function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) { + var idsSet = new Set(ids); + var seen = /* @__PURE__ */ new Set(); + var returners = /* @__PURE__ */ new Set(); + ids.forEach(collectDeepDescendants); + return utilEntitySelector(Array.from(returners)); + function collectDeepDescendants(id2) { + if (seen.has(id2)) + return; + seen.add(id2); + if (!idsSet.has(id2)) { + returners.add(id2); + } + var entity = graph.hasEntity(id2); + if (!entity || entity.type !== "relation") + return; + if (skipMultipolgonMembers && entity.isMultipolygon()) + return; + entity.members.map(function(member) { + return member.id; + }).forEach(collectDeepDescendants); } } - - // modules/osm/way.js - function osmWay() { - if (!(this instanceof osmWay)) { - return new osmWay().initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); + function utilHighlightEntities(ids, highlighted, context) { + context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed("highlighted", highlighted); + } + function utilGetAllNodes(ids, graph) { + var seen = /* @__PURE__ */ new Set(); + var nodes = /* @__PURE__ */ new Set(); + ids.forEach(collectNodes); + return Array.from(nodes); + function collectNodes(id2) { + if (seen.has(id2)) + return; + seen.add(id2); + var entity = graph.hasEntity(id2); + if (!entity) + return; + if (entity.type === "node") { + nodes.add(entity); + } else if (entity.type === "way") { + entity.nodes.forEach(collectNodes); + } else { + entity.members.map(function(member) { + return member.id; + }).forEach(collectNodes); + } } } - osmEntity.way = osmWay; - osmWay.prototype = Object.create(osmEntity.prototype); - Object.assign(osmWay.prototype, { - type: "way", - nodes: [], - copy: function(resolver, copies) { - if (copies[this.id]) - return copies[this.id]; - var copy2 = osmEntity.prototype.copy.call(this, resolver, copies); - var nodes = this.nodes.map(function(id2) { - return resolver.entity(id2).copy(resolver, copies).id; - }); - copy2 = copy2.update({ nodes }); - copies[this.id] = copy2; - return copy2; - }, - extent: function(resolver) { - return resolver.transient(this, "extent", function() { - var extent = geoExtent(); - for (var i2 = 0; i2 < this.nodes.length; i2++) { - var node = resolver.hasEntity(this.nodes[i2]); - if (node) { - extent._extend(node.extent()); - } + function utilDisplayName(entity) { + var localizedNameKey = "name:" + _mainLocalizer.languageCode().toLowerCase(); + var name = entity.tags[localizedNameKey] || entity.tags.name || ""; + if (name) + return name; + var tags = { + direction: entity.tags.direction, + from: entity.tags.from, + network: entity.tags.cycle_network || entity.tags.network, + ref: entity.tags.ref, + to: entity.tags.to, + via: entity.tags.via + }; + var keyComponents = []; + if (tags.network) { + keyComponents.push("network"); + } + if (tags.ref) { + keyComponents.push("ref"); + } + if (entity.tags.route) { + if (tags.direction) { + keyComponents.push("direction"); + } else if (tags.from && tags.to) { + keyComponents.push("from"); + keyComponents.push("to"); + if (tags.via) { + keyComponents.push("via"); } - return extent; - }); - }, - first: function() { - return this.nodes[0]; - }, - last: function() { - return this.nodes[this.nodes.length - 1]; - }, - contains: function(node) { - return this.nodes.indexOf(node) >= 0; - }, - affix: function(node) { - if (this.nodes[0] === node) - return "prefix"; - if (this.nodes[this.nodes.length - 1] === node) - return "suffix"; - }, - layer: function() { - if (isFinite(this.tags.layer)) { - return Math.max(-10, Math.min(+this.tags.layer, 10)); } - if (this.tags.covered === "yes") - return -1; - if (this.tags.location === "overground") - return 1; - if (this.tags.location === "underground") - return -1; - if (this.tags.location === "underwater") - return -10; - if (this.tags.power === "line") - return 10; - if (this.tags.power === "minor_line") - return 10; - if (this.tags.aerialway) - return 10; - if (this.tags.bridge) - return 1; - if (this.tags.cutting) - return -1; - if (this.tags.tunnel) - return -1; - if (this.tags.waterway) - return -1; - if (this.tags.man_made === "pipeline") - return -10; - if (this.tags.boundary) - return -10; - return 0; - }, - impliedLineWidthMeters: function() { - var averageWidths = { - highway: { - motorway: 5, - motorway_link: 5, - trunk: 4.5, - trunk_link: 4.5, - primary: 4, - secondary: 4, - tertiary: 4, - primary_link: 4, - secondary_link: 4, - tertiary_link: 4, - unclassified: 4, - road: 4, - living_street: 4, - bus_guideway: 4, - pedestrian: 4, - residential: 3.5, - service: 3.5, - track: 3, - cycleway: 2.5, - bridleway: 2, - corridor: 2, - steps: 2, - path: 1.5, - footway: 1.5 - }, - railway: { - rail: 2.5, - light_rail: 2.5, - tram: 2.5, - subway: 2.5, - monorail: 2.5, - funicular: 2.5, - disused: 2.5, - preserved: 2.5, - miniature: 1.5, - narrow_gauge: 1.5 - }, - waterway: { - river: 50, - canal: 25, - stream: 5, - tidal_channel: 5, - fish_pass: 2.5, - drain: 2.5, - ditch: 1.5 - } - }; - for (var key in averageWidths) { - if (this.tags[key] && averageWidths[key][this.tags[key]]) { - var width = averageWidths[key][this.tags[key]]; - if (key === "highway") { - var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10); - if (!laneCount) - laneCount = this.isOneWay() ? 1 : 2; - return width * laneCount; - } - return width; - } - } - return null; - }, - isOneWay: function() { - var values = { - "yes": true, - "1": true, - "-1": true, - "reversible": true, - "alternating": true, - "no": false, - "0": false - }; - if (values[this.tags.oneway] !== void 0) { - return values[this.tags.oneway]; - } - for (var key in this.tags) { - if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) { - return true; - } - } - return false; - }, - sidednessIdentifier: function() { - for (var key in this.tags) { - var value = this.tags[key]; - if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) { - if (osmRightSideIsInsideTags[key][value] === true) { - return key; - } else { - return osmRightSideIsInsideTags[key][value]; - } - } - } - return null; - }, - isSided: function() { - if (this.tags.two_sided === "yes") { - return false; - } - return this.sidednessIdentifier() !== null; - }, - lanes: function() { - return osmLanes(this); - }, - isClosed: function() { - return this.nodes.length > 1 && this.first() === this.last(); - }, - isConvex: function(resolver) { - if (!this.isClosed() || this.isDegenerate()) - return null; - var nodes = utilArrayUniq(resolver.childNodes(this)); - var coords = nodes.map(function(n2) { - return n2.loc; - }); - var curr = 0; - var prev = 0; - for (var i2 = 0; i2 < coords.length; i2++) { - var o = coords[(i2 + 1) % coords.length]; - var a = coords[i2]; - var b = coords[(i2 + 2) % coords.length]; - var res = geoVecCross(a, b, o); - curr = res > 0 ? 1 : res < 0 ? -1 : 0; - if (curr === 0) { - continue; - } else if (prev && curr !== prev) { - return false; - } - prev = curr; - } - return true; - }, - tagSuggestingArea: function() { - return osmTagSuggestingArea(this.tags); - }, - isArea: function() { - if (this.tags.area === "yes") - return true; - if (!this.isClosed() || this.tags.area === "no") - return false; - return this.tagSuggestingArea() !== null; - }, - isDegenerate: function() { - return new Set(this.nodes).size < (this.isArea() ? 3 : 2); - }, - areAdjacent: function(n1, n2) { - for (var i2 = 0; i2 < this.nodes.length; i2++) { - if (this.nodes[i2] === n1) { - if (this.nodes[i2 - 1] === n2) - return true; - if (this.nodes[i2 + 1] === n2) - return true; - } - } - return false; - }, - geometry: function(graph) { - return graph.transient(this, "geometry", function() { - return this.isArea() ? "area" : "line"; - }); - }, - segments: function(graph) { - function segmentExtent(graph2) { - var n1 = graph2.hasEntity(this.nodes[0]); - var n2 = graph2.hasEntity(this.nodes[1]); - return n1 && n2 && geoExtent([ - [ - Math.min(n1.loc[0], n2.loc[0]), - Math.min(n1.loc[1], n2.loc[1]) - ], - [ - Math.max(n1.loc[0], n2.loc[0]), - Math.max(n1.loc[1], n2.loc[1]) - ] - ]); - } - return graph.transient(this, "segments", function() { - var segments = []; - for (var i2 = 0; i2 < this.nodes.length - 1; i2++) { - segments.push({ - id: this.id + "-" + i2, - wayId: this.id, - index: i2, - nodes: [this.nodes[i2], this.nodes[i2 + 1]], - extent: segmentExtent - }); - } - return segments; + } + if (keyComponents.length) { + name = _t("inspector.display_name." + keyComponents.join("_"), tags); + } + return name; + } + function utilDisplayNameForPath(entity) { + var name = utilDisplayName(entity); + var isFirefox = utilDetect().browser.toLowerCase().indexOf("firefox") > -1; + var isNewChromium = Number(utilDetect().version.split(".")[0]) >= 96; + if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) { + name = fixRTLTextForSvg(name); + } + return name; + } + function utilDisplayType(id2) { + return { + n: _t("inspector.node"), + w: _t("inspector.way"), + r: _t("inspector.relation") + }[id2.charAt(0)]; + } + function utilDisplayLabel(entity, graphOrGeometry, verbose) { + var result; + var displayName = utilDisplayName(entity); + var preset = typeof graphOrGeometry === "string" ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry); + var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name()); + if (verbose) { + result = [presetName, displayName].filter(Boolean).join(" "); + } else { + result = displayName || presetName; + } + return result || utilDisplayType(entity.id); + } + function utilEntityRoot(entityType) { + return { + node: "n", + way: "w", + relation: "r" + }[entityType]; + } + function utilCombinedTags(entityIDs, graph) { + var tags = {}; + var tagCounts = {}; + var allKeys = /* @__PURE__ */ new Set(); + var entities = entityIDs.map(function(entityID) { + return graph.hasEntity(entityID); + }).filter(Boolean); + entities.forEach(function(entity) { + var keys2 = Object.keys(entity.tags).filter(Boolean); + keys2.forEach(function(key2) { + allKeys.add(key2); }); - }, - close: function() { - if (this.isClosed() || !this.nodes.length) - return this; - var nodes = this.nodes.slice(); - nodes = nodes.filter(noRepeatNodes); - nodes.push(nodes[0]); - return this.update({ nodes }); - }, - unclose: function() { - if (!this.isClosed()) - return this; - var nodes = this.nodes.slice(); - var connector = this.first(); - var i2 = nodes.length - 1; - while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) { - nodes.splice(i2, 1); - i2 = nodes.length - 1; - } - nodes = nodes.filter(noRepeatNodes); - return this.update({ nodes }); - }, - addNode: function(id2, index) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - var max3 = isClosed ? nodes.length - 1 : nodes.length; - if (index === void 0) { - index = max3; - } - if (index < 0 || index > max3) { - throw new RangeError("index " + index + " out of range 0.." + max3); - } - if (isClosed) { - var connector = this.first(); - var i2 = 1; - while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) { - nodes.splice(i2, 1); - if (index > i2) - index--; - } - i2 = nodes.length - 1; - while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) { - nodes.splice(i2, 1); - if (index > i2) - index--; - i2 = nodes.length - 1; - } - } - nodes.splice(index, 0, id2); - nodes = nodes.filter(noRepeatNodes); - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } - return this.update({ nodes }); - }, - updateNode: function(id2, index) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - var max3 = nodes.length - 1; - if (index === void 0 || index < 0 || index > max3) { - throw new RangeError("index " + index + " out of range 0.." + max3); - } - if (isClosed) { - var connector = this.first(); - var i2 = 1; - while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) { - nodes.splice(i2, 1); - if (index > i2) - index--; - } - i2 = nodes.length - 1; - while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) { - nodes.splice(i2, 1); - if (index === i2) - index = 0; - i2 = nodes.length - 1; - } - } - nodes.splice(index, 1, id2); - nodes = nodes.filter(noRepeatNodes); - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } - return this.update({ nodes }); - }, - replaceNode: function(needleID, replacementID) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - for (var i2 = 0; i2 < nodes.length; i2++) { - if (nodes[i2] === needleID) { - nodes[i2] = replacementID; - } - } - nodes = nodes.filter(noRepeatNodes); - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } - return this.update({ nodes }); - }, - removeNode: function(id2) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - nodes = nodes.filter(function(node) { - return node !== id2; - }).filter(noRepeatNodes); - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } - return this.update({ nodes }); - }, - asJXON: function(changeset_id) { - var r = { - way: { - "@id": this.osmId(), - "@version": this.version || 0, - nd: this.nodes.map(function(id2) { - return { keyAttributes: { ref: osmEntity.id.toOSM(id2) } }; - }, this), - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k, v: this.tags[k] } }; - }, this) - } - }; - if (changeset_id) { - r.way["@changeset"] = changeset_id; - } - return r; - }, - asGeoJSON: function(resolver) { - return resolver.transient(this, "GeoJSON", function() { - var coordinates = resolver.childNodes(this).map(function(n2) { - return n2.loc; - }); - if (this.isArea() && this.isClosed()) { - return { - type: "Polygon", - coordinates: [coordinates] - }; + }); + entities.forEach(function(entity) { + allKeys.forEach(function(key2) { + var value = entity.tags[key2]; + if (!tags.hasOwnProperty(key2)) { + tags[key2] = value; } else { - return { - type: "LineString", - coordinates - }; + if (!Array.isArray(tags[key2])) { + if (tags[key2] !== value) { + tags[key2] = [tags[key2], value]; + } + } else { + if (tags[key2].indexOf(value) === -1) { + tags[key2].push(value); + } + } } + var tagHash = key2 + "=" + value; + if (!tagCounts[tagHash]) + tagCounts[tagHash] = 0; + tagCounts[tagHash] += 1; }); - }, - area: function(resolver) { - return resolver.transient(this, "area", function() { - var nodes = resolver.childNodes(this); - var json = { - type: "Polygon", - coordinates: [nodes.map(function(n2) { - return n2.loc; - })] - }; - if (!this.isClosed() && nodes.length) { - json.coordinates[0].push(nodes[0].loc); + }); + for (var key in tags) { + if (!Array.isArray(tags[key])) + continue; + tags[key] = tags[key].sort(function(val12, val2) { + var key2 = key2; + var count2 = tagCounts[key2 + "=" + val2]; + var count1 = tagCounts[key2 + "=" + val12]; + if (count2 !== count1) { + return count2 - count1; } - var area = area_default(json); - if (area > 2 * Math.PI) { - json.coordinates[0] = json.coordinates[0].reverse(); - area = area_default(json); + if (val2 && val12) { + return val12.localeCompare(val2); } - return isNaN(area) ? 0 : area; + return val12 ? 1 : -1; }); } - }); - function noRepeatNodes(node, i2, arr) { - return i2 === 0 || node !== arr[i2 - 1]; + return tags; } - - // modules/osm/multipolygon.js - function osmOldMultipolygonOuterMemberOfRelation(entity, graph) { - if (entity.type !== "relation" || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) { - return false; - } - var outerMember; - for (var memberIndex in entity.members) { - var member = entity.members[memberIndex]; - if (!member.role || member.role === "outer") { - if (outerMember) - return false; - if (member.type !== "way") - return false; - if (!graph.hasEntity(member.id)) - return false; - outerMember = graph.entity(member.id); - if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) { - return false; - } + function utilStringQs(str2) { + var i3 = 0; + while (i3 < str2.length && (str2[i3] === "?" || str2[i3] === "#")) + i3++; + str2 = str2.slice(i3); + return str2.split("&").reduce(function(obj, pair3) { + var parts = pair3.split("="); + if (parts.length === 2) { + obj[parts[0]] = null === parts[1] ? "" : decodeURIComponent(parts[1]); } + return obj; + }, {}); + } + function utilQsString(obj, noencode) { + function softEncode(s2) { + return encodeURIComponent(s2).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent); } - return outerMember; + return Object.keys(obj).sort().map(function(key) { + return encodeURIComponent(key) + "=" + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key])); + }).join("&"); } - function osmIsOldMultipolygonOuterMember(entity, graph) { - if (entity.type !== "way" || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) { - return false; + function utilPrefixDOMProperty(property) { + var prefixes2 = ["webkit", "ms", "moz", "o"]; + var i3 = -1; + var n3 = prefixes2.length; + var s2 = document.body; + if (property in s2) + return property; + property = property.slice(0, 1).toUpperCase() + property.slice(1); + while (++i3 < n3) { + if (prefixes2[i3] + property in s2) { + return prefixes2[i3] + property; + } } - var parents = graph.parentRelations(entity); - if (parents.length !== 1) - return false; - var parent = parents[0]; - if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { - return false; + return false; + } + function utilPrefixCSSProperty(property) { + var prefixes2 = ["webkit", "ms", "Moz", "O"]; + var i3 = -1; + var n3 = prefixes2.length; + var s2 = document.body.style; + if (property.toLowerCase() in s2) { + return property.toLowerCase(); } - var members = parent.members, member; - for (var i2 = 0; i2 < members.length; i2++) { - member = members[i2]; - if (member.id === entity.id && member.role && member.role !== "outer") { - return false; - } - if (member.id !== entity.id && (!member.role || member.role === "outer")) { - return false; + while (++i3 < n3) { + if (prefixes2[i3] + property in s2) { + return "-" + prefixes2[i3].toLowerCase() + property.replace(/([A-Z])/g, "-$1").toLowerCase(); } } - return parent; + return false; } - function osmOldMultipolygonOuterMember(entity, graph) { - if (entity.type !== "way") - return false; - var parents = graph.parentRelations(entity); - if (parents.length !== 1) - return false; - var parent = parents[0]; - if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { - return false; + var transformProperty; + function utilSetTransform(el, x2, y2, scale) { + var prop = transformProperty = transformProperty || utilPrefixCSSProperty("Transform"); + var translate = utilDetect().opera ? "translate(" + x2 + "px," + y2 + "px)" : "translate3d(" + x2 + "px," + y2 + "px,0)"; + return el.style(prop, translate + (scale ? " scale(" + scale + ")" : "")); + } + function utilEditDistance(a2, b2) { + a2 = (0, import_diacritics.remove)(a2.toLowerCase()); + b2 = (0, import_diacritics.remove)(b2.toLowerCase()); + if (a2.length === 0) + return b2.length; + if (b2.length === 0) + return a2.length; + var matrix = []; + var i3, j3; + for (i3 = 0; i3 <= b2.length; i3++) { + matrix[i3] = [i3]; } - var members = parent.members, member, outerMember; - for (var i2 = 0; i2 < members.length; i2++) { - member = members[i2]; - if (!member.role || member.role === "outer") { - if (outerMember) - return false; - outerMember = member; + for (j3 = 0; j3 <= a2.length; j3++) { + matrix[0][j3] = j3; + } + for (i3 = 1; i3 <= b2.length; i3++) { + for (j3 = 1; j3 <= a2.length; j3++) { + if (b2.charAt(i3 - 1) === a2.charAt(j3 - 1)) { + matrix[i3][j3] = matrix[i3 - 1][j3 - 1]; + } else { + matrix[i3][j3] = Math.min( + matrix[i3 - 1][j3 - 1] + 1, + // substitution + Math.min( + matrix[i3][j3 - 1] + 1, + // insertion + matrix[i3 - 1][j3] + 1 + ) + ); + } } } - if (!outerMember) - return false; - var outerEntity = graph.hasEntity(outerMember.id); - if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) { - return false; + return matrix[b2.length][a2.length]; + } + function utilFastMouse(container) { + var rect = container.getBoundingClientRect(); + var rectLeft = rect.left; + var rectTop = rect.top; + var clientLeft = +container.clientLeft; + var clientTop = +container.clientTop; + return function(e3) { + return [ + e3.clientX - rectLeft - clientLeft, + e3.clientY - rectTop - clientTop + ]; + }; + } + function utilAsyncMap(inputs, func, callback) { + var remaining = inputs.length; + var results = []; + var errors = []; + inputs.forEach(function(d2, i3) { + func(d2, function done(err, data) { + errors[i3] = err; + results[i3] = data; + remaining--; + if (!remaining) + callback(errors, results); + }); + }); + } + function utilWrap(index, length) { + if (index < 0) { + index += Math.ceil(-index / length) * length; } - return outerEntity; + return index % length; } - function osmJoinWays(toJoin, graph) { - function resolve(member) { - return graph.childNodes(graph.entity(member.id)); + function utilFunctor(value) { + if (typeof value === "function") + return value; + return function() { + return value; + }; + } + function utilNoAuto(selection2) { + var isText = selection2.size() && selection2.node().tagName.toLowerCase() === "textarea"; + return selection2.attr("autocomplete", "new-password").attr("autocorrect", "off").attr("autocapitalize", "off").attr("spellcheck", isText ? "true" : "false"); + } + function utilHashcode(str2) { + var hash = 0; + if (str2.length === 0) { + return hash; } - function reverse(item2) { - var action = actionReverse(item2.id, { reverseOneway: true }); - sequences.actions.push(action); - return item2 instanceof osmWay ? action(graph).entity(item2.id) : item2; + for (var i3 = 0; i3 < str2.length; i3++) { + var char = str2.charCodeAt(i3); + hash = (hash << 5) - hash + char; + hash = hash & hash; } - toJoin = toJoin.filter(function(member) { - return member.type === "way" && graph.hasEntity(member.id); - }); - var i2; - var joinAsMembers = true; - for (i2 = 0; i2 < toJoin.length; i2++) { - if (toJoin[i2] instanceof osmWay) { - joinAsMembers = false; - break; - } + return hash; + } + function utilSafeClassName(str2) { + return str2.toLowerCase().replace(/[^a-z0-9]+/g, "_"); + } + function utilUniqueDomId(val) { + return "ideditor-" + utilSafeClassName(val.toString()) + "-" + (/* @__PURE__ */ new Date()).getTime().toString(); + } + function utilUnicodeCharsCount(str2) { + return Array.from(str2).length; + } + function utilUnicodeCharsTruncated(str2, limit) { + return Array.from(str2).slice(0, limit).join(""); + } + function toNumericID(id2) { + var match = id2.match(/^[cnwr](-?\d+)$/); + if (match) { + return parseInt(match[1], 10); } - var sequences = []; - sequences.actions = []; - while (toJoin.length) { - var item = toJoin.shift(); - var currWays = [item]; - var currNodes = resolve(item).slice(); - while (toJoin.length) { - var start2 = currNodes[0]; - var end = currNodes[currNodes.length - 1]; - var fn = null; - var nodes = null; - for (i2 = 0; i2 < toJoin.length; i2++) { - item = toJoin[i2]; - nodes = resolve(item); - if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start2 || nodes[0] === start2)) { - currWays[0] = reverse(currWays[0]); - currNodes.reverse(); - start2 = currNodes[0]; - end = currNodes[currNodes.length - 1]; - } - if (nodes[0] === end) { - fn = currNodes.push; - nodes = nodes.slice(1); - break; - } else if (nodes[nodes.length - 1] === end) { - fn = currNodes.push; - nodes = nodes.slice(0, -1).reverse(); - item = reverse(item); - break; - } else if (nodes[nodes.length - 1] === start2) { - fn = currNodes.unshift; - nodes = nodes.slice(0, -1); - break; - } else if (nodes[0] === start2) { - fn = currNodes.unshift; - nodes = nodes.slice(1).reverse(); - item = reverse(item); - break; - } else { - fn = nodes = null; - } - } - if (!nodes) { - break; - } - fn.apply(currWays, [item]); - fn.apply(currNodes, nodes); - toJoin.splice(i2, 1); + return NaN; + } + function compareNumericIDs(left, right) { + if (isNaN(left) && isNaN(right)) + return -1; + if (isNaN(left)) + return 1; + if (isNaN(right)) + return -1; + if (Math.sign(left) !== Math.sign(right)) + return -Math.sign(left); + if (Math.sign(left) < 0) + return Math.sign(right - left); + return Math.sign(left - right); + } + function utilCompareIDs(left, right) { + return compareNumericIDs(toNumericID(left), toNumericID(right)); + } + function utilOldestID(ids) { + if (ids.length === 0) { + return void 0; + } + var oldestIDIndex = 0; + var oldestID = toNumericID(ids[0]); + for (var i3 = 1; i3 < ids.length; i3++) { + var num = toNumericID(ids[i3]); + if (compareNumericIDs(oldestID, num) === 1) { + oldestIDIndex = i3; + oldestID = num; } - currWays.nodes = currNodes; - sequences.push(currWays); } - return sequences; + return ids[oldestIDIndex]; + } + function utilCleanOsmString(val, maxChars) { + if (val === void 0 || val === null) { + val = ""; + } else { + val = val.toString(); + } + val = val.trim(); + if (val.normalize) + val = val.normalize("NFC"); + return utilUnicodeCharsTruncated(val, maxChars); } - // modules/actions/add_member.js - function actionAddMember(relationId, member, memberIndex, insertPair) { - return function action(graph) { - var relation = graph.entity(relationId); - var isPTv2 = /stop|platform/.test(member.role); - if ((isNaN(memberIndex) || insertPair) && member.type === "way" && !isPTv2) { - graph = addWayMember(relation, graph); - } else { - if (isPTv2 && isNaN(memberIndex)) { - memberIndex = 0; - } - graph = graph.replace(relation.addMember(member, memberIndex)); - } - return graph; - }; - function addWayMember(relation, graph) { - var groups, tempWay, insertPairIsReversed, item, i2, j2, k; - var PTv2members = []; - var members = []; - for (i2 = 0; i2 < relation.members.length; i2++) { - var m = relation.members[i2]; - if (/stop|platform/.test(m.role)) { - PTv2members.push(m); - } else { - members.push(m); - } - } - relation = relation.update({ members }); - if (insertPair) { - tempWay = osmWay({ id: "wTemp", nodes: insertPair.nodes }); - graph = graph.replace(tempWay); - var tempMember = { id: tempWay.id, type: "way", role: member.role }; - var tempRelation = relation.replaceMember({ id: insertPair.originalID }, tempMember, true); - groups = utilArrayGroupBy(tempRelation.members, "type"); - groups.way = groups.way || []; - var originalWay = graph.entity(insertPair.originalID); - var insertedWay = graph.entity(insertPair.insertedID); - insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0]; - } else { - groups = utilArrayGroupBy(relation.members, "type"); - groups.way = groups.way || []; - groups.way.push(member); - } - members = withIndex(groups.way); - var joined = osmJoinWays(members, graph); - for (i2 = 0; i2 < joined.length; i2++) { - var segment = joined[i2]; - var nodes = segment.nodes.slice(); - var startIndex = segment[0].index; - for (j2 = 0; j2 < members.length; j2++) { - if (members[j2].index === startIndex) { - break; - } - } - for (k = 0; k < segment.length; k++) { - item = segment[k]; - var way = graph.entity(item.id); - if (tempWay && item.id === tempWay.id) { - var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed; - if (reverse) { - item.pair = [ - { id: insertPair.insertedID, type: "way", role: item.role }, - { id: insertPair.originalID, type: "way", role: item.role } - ]; + // modules/osm/entity.js + function osmEntity(attrs) { + if (this instanceof osmEntity) + return; + if (attrs && attrs.type) { + return osmEntity[attrs.type].apply(this, arguments); + } else if (attrs && attrs.id) { + return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments); + } + return new osmEntity().initialize(arguments); + } + osmEntity.id = function(type2) { + return osmEntity.id.fromOSM(type2, osmEntity.id.next[type2]--); + }; + osmEntity.id.next = { + changeset: -1, + node: -1, + way: -1, + relation: -1 + }; + osmEntity.id.fromOSM = function(type2, id2) { + return type2[0] + id2; + }; + osmEntity.id.toOSM = function(id2) { + var match = id2.match(/^[cnwr](-?\d+)$/); + if (match) { + return match[1]; + } + return ""; + }; + osmEntity.id.type = function(id2) { + return { "c": "changeset", "n": "node", "w": "way", "r": "relation" }[id2[0]]; + }; + osmEntity.key = function(entity) { + return entity.id + "v" + (entity.v || 0); + }; + var _deprecatedTagValuesByKey; + osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) { + if (!_deprecatedTagValuesByKey) { + _deprecatedTagValuesByKey = {}; + dataDeprecated.forEach(function(d2) { + var oldKeys = Object.keys(d2.old); + if (oldKeys.length === 1) { + var oldKey = oldKeys[0]; + var oldValue = d2.old[oldKey]; + if (oldValue !== "*") { + if (!_deprecatedTagValuesByKey[oldKey]) { + _deprecatedTagValuesByKey[oldKey] = [oldValue]; } else { - item.pair = [ - { id: insertPair.originalID, type: "way", role: item.role }, - { id: insertPair.insertedID, type: "way", role: item.role } - ]; + _deprecatedTagValuesByKey[oldKey].push(oldValue); } } - if (k > 0) { - if (j2 + k >= members.length || item.index !== members[j2 + k].index) { - moveMember(members, item.index, j2 + k); + } + }); + } + return _deprecatedTagValuesByKey; + }; + osmEntity.prototype = { + tags: {}, + initialize: function(sources) { + for (var i3 = 0; i3 < sources.length; ++i3) { + var source = sources[i3]; + for (var prop in source) { + if (Object.prototype.hasOwnProperty.call(source, prop)) { + if (source[prop] === void 0) { + delete this[prop]; + } else { + this[prop] = source[prop]; } } - nodes.splice(0, way.nodes.length - 1); } } - if (tempWay) { - graph = graph.remove(tempWay); - } - var wayMembers = []; - for (i2 = 0; i2 < members.length; i2++) { - item = members[i2]; - if (item.index === -1) - continue; - if (item.pair) { - wayMembers.push(item.pair[0]); - wayMembers.push(item.pair[1]); - } else { - wayMembers.push(utilObjectOmit(item, ["index"])); - } + if (!this.id && this.type) { + this.id = osmEntity.id(this.type); } - var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []); - return graph.replace(relation.update({ members: newMembers })); - function moveMember(arr, findIndex, toIndex) { - var i3; - for (i3 = 0; i3 < arr.length; i3++) { - if (arr[i3].index === findIndex) { - break; - } - } - var item2 = Object.assign({}, arr[i3]); - arr[i3].index = -1; - item2.index = toIndex; - arr.splice(toIndex, 0, item2); + if (!this.hasOwnProperty("visible")) { + this.visible = true; } - function withIndex(arr) { - var result = new Array(arr.length); - for (var i3 = 0; i3 < arr.length; i3++) { - result[i3] = Object.assign({}, arr[i3]); - result[i3].index = i3; - } - return result; + if (debug) { + Object.freeze(this); + Object.freeze(this.tags); + if (this.loc) + Object.freeze(this.loc); + if (this.nodes) + Object.freeze(this.nodes); + if (this.members) + Object.freeze(this.members); } - } - } - - // modules/actions/add_midpoint.js - function actionAddMidpoint(midpoint, node) { - return function(graph) { - graph = graph.replace(node.move(midpoint.loc)); - var parents = utilArrayIntersection( - graph.parentWays(graph.entity(midpoint.edge[0])), - graph.parentWays(graph.entity(midpoint.edge[1])) - ); - parents.forEach(function(way) { - for (var i2 = 0; i2 < way.nodes.length - 1; i2++) { - if (geoEdgeEqual([way.nodes[i2], way.nodes[i2 + 1]], midpoint.edge)) { - graph = graph.replace(graph.entity(way.id).addNode(node.id, i2 + 1)); - return; - } - } - }); - return graph; - }; - } - - // modules/actions/add_vertex.js - function actionAddVertex(wayId, nodeId, index) { - return function(graph) { - return graph.replace(graph.entity(wayId).addNode(nodeId, index)); - }; - } - - // modules/actions/change_member.js - function actionChangeMember(relationId, member, memberIndex) { - return function(graph) { - return graph.replace(graph.entity(relationId).updateMember(member, memberIndex)); - }; - } - - // modules/actions/change_preset.js - function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) { - return function action(graph) { - var entity = graph.entity(entityID); - var geometry = entity.geometry(graph); - var tags = entity.tags; - if (oldPreset) - tags = oldPreset.unsetTags(tags, geometry, newPreset && newPreset.addTags ? Object.keys(newPreset.addTags) : null); - if (newPreset) - tags = newPreset.setTags(tags, geometry, skipFieldDefaults); - return graph.replace(entity.update({ tags })); - }; - } - - // modules/actions/change_tags.js - function actionChangeTags(entityId, tags) { - return function(graph) { - var entity = graph.entity(entityId); - return graph.replace(entity.update({ tags })); - }; - } - - // modules/osm/node.js - var cardinal = { - north: 0, - n: 0, - northnortheast: 22, - nne: 22, - northeast: 45, - ne: 45, - eastnortheast: 67, - ene: 67, - east: 90, - e: 90, - eastsoutheast: 112, - ese: 112, - southeast: 135, - se: 135, - southsoutheast: 157, - sse: 157, - south: 180, - s: 180, - southsouthwest: 202, - ssw: 202, - southwest: 225, - sw: 225, - westsouthwest: 247, - wsw: 247, - west: 270, - w: 270, - westnorthwest: 292, - wnw: 292, - northwest: 315, - nw: 315, - northnorthwest: 337, - nnw: 337 - }; - function osmNode() { - if (!(this instanceof osmNode)) { - return new osmNode().initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); - } - } - osmEntity.node = osmNode; - osmNode.prototype = Object.create(osmEntity.prototype); - Object.assign(osmNode.prototype, { - type: "node", - loc: [9999, 9999], - extent: function() { - return new geoExtent(this.loc); + return this; }, - geometry: function(graph) { - return graph.transient(this, "geometry", function() { - return graph.isPoi(this) ? "point" : "vertex"; - }); + copy: function(resolver, copies) { + if (copies[this.id]) + return copies[this.id]; + var copy2 = osmEntity(this, { id: void 0, user: void 0, version: void 0 }); + copies[this.id] = copy2; + return copy2; }, - move: function(loc) { - return this.update({ loc }); + osmId: function() { + return osmEntity.id.toOSM(this.id); }, - isDegenerate: function() { - return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90); + isNew: function() { + var osmId = osmEntity.id.toOSM(this.id); + return osmId.length === 0 || osmId[0] === "-"; }, - directions: function(resolver, projection2) { - var val; - var i2; - if (this.isHighwayIntersection(resolver) && (this.tags.stop || "").toLowerCase() === "all") { - val = "all"; - } else { - val = (this.tags.direction || "").toLowerCase(); - var re2 = /:direction$/i; - var keys = Object.keys(this.tags); - for (i2 = 0; i2 < keys.length; i2++) { - if (re2.test(keys[i2])) { - val = this.tags[keys[i2]].toLowerCase(); - break; - } + update: function(attrs) { + return osmEntity(this, attrs, { v: 1 + (this.v || 0) }); + }, + mergeTags: function(tags) { + var merged = Object.assign({}, this.tags); + var changed = false; + for (var k2 in tags) { + var t1 = merged[k2]; + var t2 = tags[k2]; + if (!t1) { + changed = true; + merged[k2] = t2; + } else if (t1 !== t2) { + changed = true; + merged[k2] = utilUnicodeCharsTruncated( + utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(";"), + 255 + // avoid exceeding character limit; see also context.maxCharsForTagValue() + ); } } - if (val === "") - return []; - var values = val.split(";"); - var results = []; - values.forEach(function(v) { - if (cardinal[v] !== void 0) { - v = cardinal[v]; - } - if (v !== "" && !isNaN(+v)) { - results.push(+v); - return; - } - var lookBackward = this.tags["traffic_sign:backward"] || v === "backward" || v === "both" || v === "all"; - var lookForward = this.tags["traffic_sign:forward"] || v === "forward" || v === "both" || v === "all"; - if (!lookForward && !lookBackward) - return; - var nodeIds = {}; - resolver.parentWays(this).forEach(function(parent) { - var nodes = parent.nodes; - for (i2 = 0; i2 < nodes.length; i2++) { - if (nodes[i2] === this.id) { - if (lookForward && i2 > 0) { - nodeIds[nodes[i2 - 1]] = true; - } - if (lookBackward && i2 < nodes.length - 1) { - nodeIds[nodes[i2 + 1]] = true; - } - } - } - }, this); - Object.keys(nodeIds).forEach(function(nodeId) { - results.push( - geoAngle(this, resolver.entity(nodeId), projection2) * (180 / Math.PI) + 90 - ); - }, this); - }, this); - return utilArrayUniq(results); - }, - isCrossing: function() { - return this.tags.highway === "crossing" || this.tags.railway && this.tags.railway.indexOf("crossing") !== -1; + return changed ? this.update({ tags: merged }) : this; }, - isEndpoint: function(resolver) { - return resolver.transient(this, "isEndpoint", function() { - var id2 = this.id; - return resolver.parentWays(this).filter(function(parent) { - return !parent.isClosed() && !!parent.affix(id2); - }).length > 0; - }); + intersects: function(extent, resolver) { + return this.extent(resolver).intersects(extent); }, - isConnected: function(resolver) { - return resolver.transient(this, "isConnected", function() { - var parents = resolver.parentWays(this); - if (parents.length > 1) { - for (var i2 in parents) { - if (parents[i2].geometry(resolver) === "line" && parents[i2].hasInterestingTags()) - return true; - } - } else if (parents.length === 1) { - var way = parents[0]; - var nodes = way.nodes.slice(); - if (way.isClosed()) { - nodes.pop(); - } - return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id); - } - return false; + hasNonGeometryTags: function() { + return Object.keys(this.tags).some(function(k2) { + return k2 !== "area"; }); }, - parentIntersectionWays: function(resolver) { - return resolver.transient(this, "parentIntersectionWays", function() { - return resolver.parentWays(this).filter(function(parent) { - return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === "line"; - }); - }); + hasParentRelations: function(resolver) { + return resolver.parentRelations(this).length > 0; }, - isIntersection: function(resolver) { - return this.parentIntersectionWays(resolver).length > 1; + hasInterestingTags: function() { + return Object.keys(this.tags).some(osmIsInterestingTag); }, - isHighwayIntersection: function(resolver) { - return resolver.transient(this, "isHighwayIntersection", function() { - return resolver.parentWays(this).filter(function(parent) { - return parent.tags.highway && parent.geometry(resolver) === "line"; - }).length > 1; - }); + isHighwayIntersection: function() { + return false; }, - isOnAddressLine: function(resolver) { - return resolver.transient(this, "isOnAddressLine", function() { - return resolver.parentWays(this).filter(function(parent) { - return parent.tags.hasOwnProperty("addr:interpolation") && parent.geometry(resolver) === "line"; - }).length > 0; - }); + isDegenerate: function() { + return true; }, - asJXON: function(changeset_id) { - var r = { - node: { - "@id": this.osmId(), - "@lon": this.loc[0], - "@lat": this.loc[1], - "@version": this.version || 0, - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k, v: this.tags[k] } }; - }, this) + deprecatedTags: function(dataDeprecated) { + var tags = this.tags; + if (Object.keys(tags).length === 0) + return []; + var deprecated = []; + dataDeprecated.forEach(function(d2) { + var oldKeys = Object.keys(d2.old); + if (d2.replace) { + var hasExistingValues = Object.keys(d2.replace).some(function(replaceKey) { + if (!tags[replaceKey] || d2.old[replaceKey]) + return false; + var replaceValue = d2.replace[replaceKey]; + if (replaceValue === "*") + return false; + if (replaceValue === tags[replaceKey]) + return false; + return true; + }); + if (hasExistingValues) + return; } - }; - if (changeset_id) - r.node["@changeset"] = changeset_id; - return r; - }, - asGeoJSON: function() { - return { - type: "Point", - coordinates: this.loc - }; - } - }); - - // modules/actions/circularize.js - function actionCircularize(wayId, projection2, maxAngle) { - maxAngle = (maxAngle || 20) * Math.PI / 180; - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var way = graph.entity(wayId); - var origNodes = {}; - graph.childNodes(way).forEach(function(node2) { - if (!origNodes[node2.id]) - origNodes[node2.id] = node2; - }); - if (!way.isConvex(graph)) { - graph = action.makeConvex(graph); - } - var nodes = utilArrayUniq(graph.childNodes(way)); - var keyNodes = nodes.filter(function(n2) { - return graph.parentWays(n2).length !== 1; - }); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var keyPoints = keyNodes.map(function(n2) { - return projection2(n2.loc); - }); - var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : centroid_default2(points); - var radius = median(points, function(p) { - return geoVecLength(centroid, p); - }); - var sign2 = area_default3(points) > 0 ? 1 : -1; - var ids, i2, j2, k; - if (!keyNodes.length) { - keyNodes = [nodes[0]]; - keyPoints = [points[0]]; - } - if (keyNodes.length === 1) { - var index = nodes.indexOf(keyNodes[0]); - var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length); - keyNodes.push(nodes[oppositeIndex]); - keyPoints.push(points[oppositeIndex]); - } - for (i2 = 0; i2 < keyPoints.length; i2++) { - var nextKeyNodeIndex = (i2 + 1) % keyNodes.length; - var startNode = keyNodes[i2]; - var endNode = keyNodes[nextKeyNodeIndex]; - var startNodeIndex = nodes.indexOf(startNode); - var endNodeIndex = nodes.indexOf(endNode); - var numberNewPoints = -1; - var indexRange = endNodeIndex - startNodeIndex; - var nearNodes = {}; - var inBetweenNodes = []; - var startAngle, endAngle, totalAngle, eachAngle; - var angle2, loc, node, origNode; - if (indexRange < 0) { - indexRange += nodes.length; - } - var distance = geoVecLength(centroid, keyPoints[i2]) || 1e-4; - keyPoints[i2] = [ - centroid[0] + (keyPoints[i2][0] - centroid[0]) / distance * radius, - centroid[1] + (keyPoints[i2][1] - centroid[1]) / distance * radius - ]; - loc = projection2.invert(keyPoints[i2]); - node = keyNodes[i2]; - origNode = origNodes[node.id]; - node = node.move(geoVecInterp(origNode.loc, loc, t)); - graph = graph.replace(node); - startAngle = Math.atan2(keyPoints[i2][1] - centroid[1], keyPoints[i2][0] - centroid[0]); - endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]); - totalAngle = endAngle - startAngle; - if (totalAngle * sign2 > 0) { - totalAngle = -sign2 * (2 * Math.PI - Math.abs(totalAngle)); - } - do { - numberNewPoints++; - eachAngle = totalAngle / (indexRange + numberNewPoints); - } while (Math.abs(eachAngle) > maxAngle); - for (j2 = 1; j2 < indexRange; j2++) { - angle2 = startAngle + j2 * eachAngle; - loc = projection2.invert([ - centroid[0] + Math.cos(angle2) * radius, - centroid[1] + Math.sin(angle2) * radius - ]); - node = nodes[(j2 + startNodeIndex) % nodes.length]; - origNode = origNodes[node.id]; - nearNodes[node.id] = angle2; - node = node.move(geoVecInterp(origNode.loc, loc, t)); - graph = graph.replace(node); - } - for (j2 = 0; j2 < numberNewPoints; j2++) { - angle2 = startAngle + (indexRange + j2) * eachAngle; - loc = projection2.invert([ - centroid[0] + Math.cos(angle2) * radius, - centroid[1] + Math.sin(angle2) * radius - ]); - var min3 = Infinity; - for (var nodeId in nearNodes) { - var nearAngle = nearNodes[nodeId]; - var dist = Math.abs(nearAngle - angle2); - if (dist < min3) { - min3 = dist; - origNode = origNodes[nodeId]; - } - } - node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) }); - graph = graph.replace(node); - nodes.splice(endNodeIndex + j2, 0, node); - inBetweenNodes.push(node.id); - } - if (indexRange === 1 && inBetweenNodes.length) { - var startIndex1 = way.nodes.lastIndexOf(startNode.id); - var endIndex1 = way.nodes.lastIndexOf(endNode.id); - var wayDirection1 = endIndex1 - startIndex1; - if (wayDirection1 < -1) { - wayDirection1 = 1; - } - var parentWays = graph.parentWays(keyNodes[i2]); - for (j2 = 0; j2 < parentWays.length; j2++) { - var sharedWay = parentWays[j2]; - if (sharedWay === way) - continue; - if (sharedWay.areAdjacent(startNode.id, endNode.id)) { - var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id); - var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id); - var wayDirection2 = endIndex2 - startIndex2; - var insertAt = endIndex2; - if (wayDirection2 < -1) { - wayDirection2 = 1; - } - if (wayDirection1 !== wayDirection2) { - inBetweenNodes.reverse(); - insertAt = startIndex2; - } - for (k = 0; k < inBetweenNodes.length; k++) { - sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k); + var matchesDeprecatedTags = oldKeys.every(function(oldKey) { + if (!tags[oldKey]) + return false; + if (d2.old[oldKey] === "*") + return true; + if (d2.old[oldKey] === tags[oldKey]) + return true; + var vals = tags[oldKey].split(";").filter(Boolean); + if (vals.length === 0) { + return false; + } else if (vals.length > 1) { + return vals.indexOf(d2.old[oldKey]) !== -1; + } else { + if (tags[oldKey] === d2.old[oldKey]) { + if (d2.replace && d2.old[oldKey] === d2.replace[oldKey]) { + var replaceKeys = Object.keys(d2.replace); + return !replaceKeys.every(function(replaceKey) { + return tags[replaceKey] === d2.replace[replaceKey]; + }); + } else { + return true; } - graph = graph.replace(sharedWay); } } + return false; + }); + if (matchesDeprecatedTags) { + deprecated.push(d2); } - } - ids = nodes.map(function(n2) { - return n2.id; }); - ids.push(ids[0]); - way = way.update({ nodes: ids }); - graph = graph.replace(way); - return graph; + return deprecated; + } + }; + + // modules/osm/lanes.js + function osmLanes(entity) { + if (entity.type !== "way") + return null; + if (!entity.tags.highway) + return null; + var tags = entity.tags; + var isOneWay = entity.isOneWay(); + var laneCount = getLaneCount(tags, isOneWay); + var maxspeed = parseMaxspeed(tags); + var laneDirections = parseLaneDirections(tags, isOneWay, laneCount); + var forward = laneDirections.forward; + var backward = laneDirections.backward; + var bothways = laneDirections.bothways; + var turnLanes = {}; + turnLanes.unspecified = parseTurnLanes(tags["turn:lanes"]); + turnLanes.forward = parseTurnLanes(tags["turn:lanes:forward"]); + turnLanes.backward = parseTurnLanes(tags["turn:lanes:backward"]); + var maxspeedLanes = {}; + maxspeedLanes.unspecified = parseMaxspeedLanes(tags["maxspeed:lanes"], maxspeed); + maxspeedLanes.forward = parseMaxspeedLanes(tags["maxspeed:lanes:forward"], maxspeed); + maxspeedLanes.backward = parseMaxspeedLanes(tags["maxspeed:lanes:backward"], maxspeed); + var psvLanes = {}; + psvLanes.unspecified = parseMiscLanes(tags["psv:lanes"]); + psvLanes.forward = parseMiscLanes(tags["psv:lanes:forward"]); + psvLanes.backward = parseMiscLanes(tags["psv:lanes:backward"]); + var busLanes = {}; + busLanes.unspecified = parseMiscLanes(tags["bus:lanes"]); + busLanes.forward = parseMiscLanes(tags["bus:lanes:forward"]); + busLanes.backward = parseMiscLanes(tags["bus:lanes:backward"]); + var taxiLanes = {}; + taxiLanes.unspecified = parseMiscLanes(tags["taxi:lanes"]); + taxiLanes.forward = parseMiscLanes(tags["taxi:lanes:forward"]); + taxiLanes.backward = parseMiscLanes(tags["taxi:lanes:backward"]); + var hovLanes = {}; + hovLanes.unspecified = parseMiscLanes(tags["hov:lanes"]); + hovLanes.forward = parseMiscLanes(tags["hov:lanes:forward"]); + hovLanes.backward = parseMiscLanes(tags["hov:lanes:backward"]); + var hgvLanes = {}; + hgvLanes.unspecified = parseMiscLanes(tags["hgv:lanes"]); + hgvLanes.forward = parseMiscLanes(tags["hgv:lanes:forward"]); + hgvLanes.backward = parseMiscLanes(tags["hgv:lanes:backward"]); + var bicyclewayLanes = {}; + bicyclewayLanes.unspecified = parseBicycleWay(tags["bicycleway:lanes"]); + bicyclewayLanes.forward = parseBicycleWay(tags["bicycleway:lanes:forward"]); + bicyclewayLanes.backward = parseBicycleWay(tags["bicycleway:lanes:backward"]); + var lanesObj = { + forward: [], + backward: [], + unspecified: [] }; - action.makeConvex = function(graph) { - var way = graph.entity(wayId); - var nodes = utilArrayUniq(graph.childNodes(way)); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var sign2 = area_default3(points) > 0 ? 1 : -1; - var hull = hull_default(points); - var i2, j2; - if (sign2 === -1) { - nodes.reverse(); - points.reverse(); - } - for (i2 = 0; i2 < hull.length - 1; i2++) { - var startIndex = points.indexOf(hull[i2]); - var endIndex = points.indexOf(hull[i2 + 1]); - var indexRange = endIndex - startIndex; - if (indexRange < 0) { - indexRange += nodes.length; - } - for (j2 = 1; j2 < indexRange; j2++) { - var point = geoVecInterp(hull[i2], hull[i2 + 1], j2 / indexRange); - var node = nodes[(j2 + startIndex) % nodes.length].move(projection2.invert(point)); - graph = graph.replace(node); - } - } - return graph; + mapToLanesObj(lanesObj, turnLanes, "turnLane"); + mapToLanesObj(lanesObj, maxspeedLanes, "maxspeed"); + mapToLanesObj(lanesObj, psvLanes, "psv"); + mapToLanesObj(lanesObj, busLanes, "bus"); + mapToLanesObj(lanesObj, taxiLanes, "taxi"); + mapToLanesObj(lanesObj, hovLanes, "hov"); + mapToLanesObj(lanesObj, hgvLanes, "hgv"); + mapToLanesObj(lanesObj, bicyclewayLanes, "bicycleway"); + return { + metadata: { + count: laneCount, + oneway: isOneWay, + forward, + backward, + bothways, + turnLanes, + maxspeed, + maxspeedLanes, + psvLanes, + busLanes, + taxiLanes, + hovLanes, + hgvLanes, + bicyclewayLanes + }, + lanes: lanesObj }; - action.disabled = function(graph) { - if (!graph.entity(wayId).isClosed()) { - return "not_closed"; - } - var way = graph.entity(wayId); - var nodes = utilArrayUniq(graph.childNodes(way)); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var hull = hull_default(points); - var epsilonAngle = Math.PI / 180; - if (hull.length !== points.length || hull.length < 3) { - return false; + } + function getLaneCount(tags, isOneWay) { + var count; + if (tags.lanes) { + count = parseInt(tags.lanes, 10); + if (count > 0) { + return count; } - var centroid = centroid_default2(points); - var radius = geoVecLengthSquare(centroid, points[0]); - var i2, actualPoint; - for (i2 = 0; i2 < hull.length; i2++) { - actualPoint = hull[i2]; - var actualDist = geoVecLengthSquare(actualPoint, centroid); - var diff = Math.abs(actualDist - radius); - if (diff > 0.05 * radius) { - return false; - } + } + switch (tags.highway) { + case "trunk": + case "motorway": + count = isOneWay ? 2 : 4; + break; + default: + count = isOneWay ? 1 : 2; + break; + } + return count; + } + function parseMaxspeed(tags) { + var maxspeed = tags.maxspeed; + if (!maxspeed) + return; + var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/; + if (!maxspeedRegex.test(maxspeed)) + return; + return parseInt(maxspeed, 10); + } + function parseLaneDirections(tags, isOneWay, laneCount) { + var forward = parseInt(tags["lanes:forward"], 10); + var backward = parseInt(tags["lanes:backward"], 10); + var bothways = parseInt(tags["lanes:both_ways"], 10) > 0 ? 1 : 0; + if (parseInt(tags.oneway, 10) === -1) { + forward = 0; + bothways = 0; + backward = laneCount; + } else if (isOneWay) { + forward = laneCount; + bothways = 0; + backward = 0; + } else if (isNaN(forward) && isNaN(backward)) { + backward = Math.floor((laneCount - bothways) / 2); + forward = laneCount - bothways - backward; + } else if (isNaN(forward)) { + if (backward > laneCount - bothways) { + backward = laneCount - bothways; } - for (i2 = 0; i2 < hull.length; i2++) { - actualPoint = hull[i2]; - var nextPoint = hull[(i2 + 1) % hull.length]; - var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]); - var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]); - var angle2 = endAngle - startAngle; - if (angle2 < 0) { - angle2 = -angle2; - } - if (angle2 > Math.PI) { - angle2 = 2 * Math.PI - angle2; - } - if (angle2 > maxAngle + epsilonAngle) { - return false; - } + forward = laneCount - bothways - backward; + } else if (isNaN(backward)) { + if (forward > laneCount - bothways) { + forward = laneCount - bothways; } - return "already_circular"; - }; - action.transitionable = true; - return action; - } - - // modules/actions/delete_way.js - function actionDeleteWay(wayID) { - function canDeleteNode(node, graph) { - if (graph.parentWays(node).length || graph.parentRelations(node).length) - return false; - var geometries = osmNodeGeometriesForTags(node.tags); - if (geometries.point) - return false; - if (geometries.vertex) - return true; - return !node.hasInterestingTags(); + backward = laneCount - bothways - forward; } - var action = function(graph) { - var way = graph.entity(wayID); - graph.parentRelations(way).forEach(function(parent) { - parent = parent.removeMembersWithID(wayID); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); - new Set(way.nodes).forEach(function(nodeID) { - graph = graph.replace(way.removeNode(nodeID)); - var node = graph.entity(nodeID); - if (canDeleteNode(node, graph)) { - graph = graph.remove(node); - } - }); - return graph.remove(way); + return { + forward, + backward, + bothways }; - return action; } - - // modules/actions/delete_multiple.js - function actionDeleteMultiple(ids) { - var actions = { - way: actionDeleteWay, - node: actionDeleteNode, - relation: actionDeleteRelation - }; - var action = function(graph) { - ids.forEach(function(id2) { - if (graph.hasEntity(id2)) { - graph = actions[graph.entity(id2).type](id2)(graph); - } + function parseTurnLanes(tag) { + if (!tag) + return; + var validValues = [ + "left", + "slight_left", + "sharp_left", + "through", + "right", + "slight_right", + "sharp_right", + "reverse", + "merge_to_left", + "merge_to_right", + "none" + ]; + return tag.split("|").map(function(s2) { + if (s2 === "") + s2 = "none"; + return s2.split(";").map(function(d2) { + return validValues.indexOf(d2) === -1 ? "unknown" : d2; }); - return graph; - }; - return action; + }); } - - // modules/actions/delete_relation.js - function actionDeleteRelation(relationID, allowUntaggedMembers) { - function canDeleteEntity(entity, graph) { - return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && (!entity.hasInterestingTags() && !allowUntaggedMembers); + function parseMaxspeedLanes(tag, maxspeed) { + if (!tag) + return; + return tag.split("|").map(function(s2) { + if (s2 === "none") + return s2; + var m2 = parseInt(s2, 10); + if (s2 === "" || m2 === maxspeed) + return null; + return isNaN(m2) ? "unknown" : m2; + }); + } + function parseMiscLanes(tag) { + if (!tag) + return; + var validValues = [ + "yes", + "no", + "designated" + ]; + return tag.split("|").map(function(s2) { + if (s2 === "") + s2 = "no"; + return validValues.indexOf(s2) === -1 ? "unknown" : s2; + }); + } + function parseBicycleWay(tag) { + if (!tag) + return; + var validValues = [ + "yes", + "no", + "designated", + "lane" + ]; + return tag.split("|").map(function(s2) { + if (s2 === "") + s2 = "no"; + return validValues.indexOf(s2) === -1 ? "unknown" : s2; + }); + } + function mapToLanesObj(lanesObj, data, key) { + if (data.forward) { + data.forward.forEach(function(l2, i3) { + if (!lanesObj.forward[i3]) + lanesObj.forward[i3] = {}; + lanesObj.forward[i3][key] = l2; + }); } - var action = function(graph) { - var relation = graph.entity(relationID); - graph.parentRelations(relation).forEach(function(parent) { - parent = parent.removeMembersWithID(relationID); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } + if (data.backward) { + data.backward.forEach(function(l2, i3) { + if (!lanesObj.backward[i3]) + lanesObj.backward[i3] = {}; + lanesObj.backward[i3][key] = l2; }); - var memberIDs = utilArrayUniq(relation.members.map(function(m) { - return m.id; - })); - memberIDs.forEach(function(memberID) { - graph = graph.replace(relation.removeMembersWithID(memberID)); - var entity = graph.entity(memberID); - if (canDeleteEntity(entity, graph)) { - graph = actionDeleteMultiple([memberID])(graph); - } + } + if (data.unspecified) { + data.unspecified.forEach(function(l2, i3) { + if (!lanesObj.unspecified[i3]) + lanesObj.unspecified[i3] = {}; + lanesObj.unspecified[i3][key] = l2; }); - return graph.remove(relation); - }; - return action; + } } - // modules/actions/delete_node.js - function actionDeleteNode(nodeId) { - var action = function(graph) { - var node = graph.entity(nodeId); - graph.parentWays(node).forEach(function(parent) { - parent = parent.removeNode(nodeId); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteWay(parent.id)(graph); - } - }); - graph.parentRelations(node).forEach(function(parent) { - parent = parent.removeMembersWithID(nodeId); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); - return graph.remove(node); - }; - return action; + // modules/osm/way.js + function osmWay() { + if (!(this instanceof osmWay)) { + return new osmWay().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } } - - // modules/actions/connect.js - function actionConnect(nodeIDs) { - var action = function(graph) { - var survivor; - var node; - var parents; - var i2, j2; - nodeIDs.reverse(); - var interestingIDs = []; - for (i2 = 0; i2 < nodeIDs.length; i2++) { - node = graph.entity(nodeIDs[i2]); - if (node.hasInterestingTags()) { - if (!node.isNew()) { - interestingIDs.push(node.id); + osmEntity.way = osmWay; + osmWay.prototype = Object.create(osmEntity.prototype); + Object.assign(osmWay.prototype, { + type: "way", + nodes: [], + copy: function(resolver, copies) { + if (copies[this.id]) + return copies[this.id]; + var copy2 = osmEntity.prototype.copy.call(this, resolver, copies); + var nodes = this.nodes.map(function(id2) { + return resolver.entity(id2).copy(resolver, copies).id; + }); + copy2 = copy2.update({ nodes }); + copies[this.id] = copy2; + return copy2; + }, + extent: function(resolver) { + return resolver.transient(this, "extent", function() { + var extent = geoExtent(); + for (var i3 = 0; i3 < this.nodes.length; i3++) { + var node = resolver.hasEntity(this.nodes[i3]); + if (node) { + extent._extend(node.extent()); } } + return extent; + }); + }, + first: function() { + return this.nodes[0]; + }, + last: function() { + return this.nodes[this.nodes.length - 1]; + }, + contains: function(node) { + return this.nodes.indexOf(node) >= 0; + }, + affix: function(node) { + if (this.nodes[0] === node) + return "prefix"; + if (this.nodes[this.nodes.length - 1] === node) + return "suffix"; + }, + layer: function() { + if (isFinite(this.tags.layer)) { + return Math.max(-10, Math.min(+this.tags.layer, 10)); } - survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs)); - for (i2 = 0; i2 < nodeIDs.length; i2++) { - node = graph.entity(nodeIDs[i2]); - if (node.id === survivor.id) - continue; - parents = graph.parentWays(node); - for (j2 = 0; j2 < parents.length; j2++) { - graph = graph.replace(parents[j2].replaceNode(node.id, survivor.id)); + if (this.tags.covered === "yes") + return -1; + if (this.tags.location === "overground") + return 1; + if (this.tags.location === "underground") + return -1; + if (this.tags.location === "underwater") + return -10; + if (this.tags.power === "line") + return 10; + if (this.tags.power === "minor_line") + return 10; + if (this.tags.aerialway) + return 10; + if (this.tags.bridge) + return 1; + if (this.tags.cutting) + return -1; + if (this.tags.tunnel) + return -1; + if (this.tags.waterway) + return -1; + if (this.tags.man_made === "pipeline") + return -10; + if (this.tags.boundary) + return -10; + return 0; + }, + // the approximate width of the line based on its tags except its `width` tag + impliedLineWidthMeters: function() { + var averageWidths = { + highway: { + // width is for single lane + motorway: 5, + motorway_link: 5, + trunk: 4.5, + trunk_link: 4.5, + primary: 4, + secondary: 4, + tertiary: 4, + primary_link: 4, + secondary_link: 4, + tertiary_link: 4, + unclassified: 4, + road: 4, + living_street: 4, + bus_guideway: 4, + pedestrian: 4, + residential: 3.5, + service: 3.5, + track: 3, + cycleway: 2.5, + bridleway: 2, + corridor: 2, + steps: 2, + path: 1.5, + footway: 1.5 + }, + railway: { + // width includes ties and rail bed, not just track gauge + rail: 2.5, + light_rail: 2.5, + tram: 2.5, + subway: 2.5, + monorail: 2.5, + funicular: 2.5, + disused: 2.5, + preserved: 2.5, + miniature: 1.5, + narrow_gauge: 1.5 + }, + waterway: { + river: 50, + canal: 25, + stream: 5, + tidal_channel: 5, + fish_pass: 2.5, + drain: 2.5, + ditch: 1.5 } - parents = graph.parentRelations(node); - for (j2 = 0; j2 < parents.length; j2++) { - graph = graph.replace(parents[j2].replaceMember(node, survivor)); + }; + for (var key in averageWidths) { + if (this.tags[key] && averageWidths[key][this.tags[key]]) { + var width = averageWidths[key][this.tags[key]]; + if (key === "highway") { + var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10); + if (!laneCount) + laneCount = this.isOneWay() ? 1 : 2; + return width * laneCount; + } + return width; } - survivor = survivor.mergeTags(node.tags); - graph = actionDeleteNode(node.id)(graph); } - graph = graph.replace(survivor); - parents = graph.parentWays(survivor); - for (i2 = 0; i2 < parents.length; i2++) { - if (parents[i2].isDegenerate()) { - graph = actionDeleteWay(parents[i2].id)(graph); + return null; + }, + isOneWay: function() { + var values = { + "yes": true, + "1": true, + "-1": true, + "reversible": true, + "alternating": true, + "no": false, + "0": false + }; + if (values[this.tags.oneway] !== void 0) { + return values[this.tags.oneway]; + } + for (var key in this.tags) { + if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) { + return true; } } - return graph; - }; - action.disabled = function(graph) { - var seen = {}; - var restrictionIDs = []; - var survivor; - var node, way; - var relations, relation, role; - var i2, j2, k; - survivor = graph.entity(utilOldestID(nodeIDs)); - for (i2 = 0; i2 < nodeIDs.length; i2++) { - node = graph.entity(nodeIDs[i2]); - relations = graph.parentRelations(node); - for (j2 = 0; j2 < relations.length; j2++) { - relation = relations[j2]; - role = relation.memberById(node.id).role || ""; - if (relation.hasFromViaTo()) { - restrictionIDs.push(relation.id); - } - if (seen[relation.id] !== void 0 && seen[relation.id] !== role) { - return "relation"; + return false; + }, + // Some identifier for tag that implies that this way is "sided", + // i.e. the right side is the 'inside' (e.g. the right side of a + // natural=cliff is lower). + sidednessIdentifier: function() { + for (const realKey in this.tags) { + const value = this.tags[realKey]; + const key = osmRemoveLifecyclePrefix(realKey); + if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) { + if (osmRightSideIsInsideTags[key][value] === true) { + return key; } else { - seen[relation.id] = role; + return osmRightSideIsInsideTags[key][value]; } } } - for (i2 = 0; i2 < nodeIDs.length; i2++) { - node = graph.entity(nodeIDs[i2]); - var parents = graph.parentWays(node); - for (j2 = 0; j2 < parents.length; j2++) { - var parent = parents[j2]; - relations = graph.parentRelations(parent); - for (k = 0; k < relations.length; k++) { - relation = relations[k]; - if (relation.hasFromViaTo()) { - restrictionIDs.push(relation.id); - } - } - } + return null; + }, + isSided: function() { + if (this.tags.two_sided === "yes") { + return false; } - restrictionIDs = utilArrayUniq(restrictionIDs); - for (i2 = 0; i2 < restrictionIDs.length; i2++) { - relation = graph.entity(restrictionIDs[i2]); - if (!relation.isComplete(graph)) + return this.sidednessIdentifier() !== null; + }, + lanes: function() { + return osmLanes(this); + }, + isClosed: function() { + return this.nodes.length > 1 && this.first() === this.last(); + }, + isConvex: function(resolver) { + if (!this.isClosed() || this.isDegenerate()) + return null; + var nodes = utilArrayUniq(resolver.childNodes(this)); + var coords = nodes.map(function(n3) { + return n3.loc; + }); + var curr = 0; + var prev = 0; + for (var i3 = 0; i3 < coords.length; i3++) { + var o2 = coords[(i3 + 1) % coords.length]; + var a2 = coords[i3]; + var b2 = coords[(i3 + 2) % coords.length]; + var res = geoVecCross(a2, b2, o2); + curr = res > 0 ? 1 : res < 0 ? -1 : 0; + if (curr === 0) { continue; - var memberWays = relation.members.filter(function(m) { - return m.type === "way"; - }).map(function(m) { - return graph.entity(m.id); - }); - memberWays = utilArrayUniq(memberWays); - var f2 = relation.memberByRole("from"); - var t = relation.memberByRole("to"); - var isUturn = f2.id === t.id; - var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] }; - for (j2 = 0; j2 < relation.members.length; j2++) { - collectNodes(relation.members[j2], nodes); - } - nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates)); - nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates)); - var filter2 = keyNodeFilter(nodes.keyfrom, nodes.keyto); - nodes.from = nodes.from.filter(filter2); - nodes.via = nodes.via.filter(filter2); - nodes.to = nodes.to.filter(filter2); - var connectFrom = false; - var connectVia = false; - var connectTo = false; - var connectKeyFrom = false; - var connectKeyTo = false; - for (j2 = 0; j2 < nodeIDs.length; j2++) { - var n2 = nodeIDs[j2]; - if (nodes.from.indexOf(n2) !== -1) { - connectFrom = true; - } - if (nodes.via.indexOf(n2) !== -1) { - connectVia = true; - } - if (nodes.to.indexOf(n2) !== -1) { - connectTo = true; - } - if (nodes.keyfrom.indexOf(n2) !== -1) { - connectKeyFrom = true; - } - if (nodes.keyto.indexOf(n2) !== -1) { - connectKeyTo = true; - } - } - if (connectFrom && connectTo && !isUturn) { - return "restriction"; + } else if (prev && curr !== prev) { + return false; } - if (connectFrom && connectVia) { - return "restriction"; + prev = curr; + } + return true; + }, + // returns an object with the tag that implies this is an area, if any + tagSuggestingArea: function() { + return osmTagSuggestingArea(this.tags); + }, + isArea: function() { + if (this.tags.area === "yes") + return true; + if (!this.isClosed() || this.tags.area === "no") + return false; + return this.tagSuggestingArea() !== null; + }, + isDegenerate: function() { + return new Set(this.nodes).size < (this.isArea() ? 3 : 2); + }, + areAdjacent: function(n1, n22) { + for (var i3 = 0; i3 < this.nodes.length; i3++) { + if (this.nodes[i3] === n1) { + if (this.nodes[i3 - 1] === n22) + return true; + if (this.nodes[i3 + 1] === n22) + return true; } - if (connectTo && connectVia) { - return "restriction"; + } + return false; + }, + geometry: function(graph) { + return graph.transient(this, "geometry", function() { + return this.isArea() ? "area" : "line"; + }); + }, + // returns an array of objects representing the segments between the nodes in this way + segments: function(graph) { + function segmentExtent(graph2) { + var n1 = graph2.hasEntity(this.nodes[0]); + var n22 = graph2.hasEntity(this.nodes[1]); + return n1 && n22 && geoExtent([ + [ + Math.min(n1.loc[0], n22.loc[0]), + Math.min(n1.loc[1], n22.loc[1]) + ], + [ + Math.max(n1.loc[0], n22.loc[0]), + Math.max(n1.loc[1], n22.loc[1]) + ] + ]); + } + return graph.transient(this, "segments", function() { + var segments = []; + for (var i3 = 0; i3 < this.nodes.length - 1; i3++) { + segments.push({ + id: this.id + "-" + i3, + wayId: this.id, + index: i3, + nodes: [this.nodes[i3], this.nodes[i3 + 1]], + extent: segmentExtent + }); } - if (connectKeyFrom || connectKeyTo) { - if (nodeIDs.length !== 2) { - return "restriction"; - } - var n0 = null; - var n1 = null; - for (j2 = 0; j2 < memberWays.length; j2++) { - way = memberWays[j2]; - if (way.contains(nodeIDs[0])) { - n0 = nodeIDs[0]; - } - if (way.contains(nodeIDs[1])) { - n1 = nodeIDs[1]; - } - } - if (n0 && n1) { - var ok = false; - for (j2 = 0; j2 < memberWays.length; j2++) { - way = memberWays[j2]; - if (way.areAdjacent(n0, n1)) { - ok = true; - break; - } - } - if (!ok) { - return "restriction"; - } - } + return segments; + }); + }, + // If this way is not closed, append the beginning node to the end of the nodelist to close it. + close: function() { + if (this.isClosed() || !this.nodes.length) + return this; + var nodes = this.nodes.slice(); + nodes = nodes.filter(noRepeatNodes); + nodes.push(nodes[0]); + return this.update({ nodes }); + }, + // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it. + unclose: function() { + if (!this.isClosed()) + return this; + var nodes = this.nodes.slice(); + var connector = this.first(); + var i3 = nodes.length - 1; + while (i3 > 0 && nodes.length > 1 && nodes[i3] === connector) { + nodes.splice(i3, 1); + i3 = nodes.length - 1; + } + nodes = nodes.filter(noRepeatNodes); + return this.update({ nodes }); + }, + // Adds a node (id) in front of the node which is currently at position index. + // If index is undefined, the node will be added to the end of the way for linear ways, + // or just before the final connecting node for circular ways. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is always preserved when adding a node. + addNode: function(id2, index) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max3 = isClosed ? nodes.length - 1 : nodes.length; + if (index === void 0) { + index = max3; + } + if (index < 0 || index > max3) { + throw new RangeError("index " + index + " out of range 0.." + max3); + } + if (isClosed) { + var connector = this.first(); + var i3 = 1; + while (i3 < nodes.length && nodes.length > 2 && nodes[i3] === connector) { + nodes.splice(i3, 1); + if (index > i3) + index--; } - for (j2 = 0; j2 < memberWays.length; j2++) { - way = memberWays[j2].update({}); - for (k = 0; k < nodeIDs.length; k++) { - if (nodeIDs[k] === survivor.id) - continue; - if (way.areAdjacent(nodeIDs[k], survivor.id)) { - way = way.removeNode(nodeIDs[k]); - } else { - way = way.replaceNode(nodeIDs[k], survivor.id); - } - } - if (way.isDegenerate()) { - return "restriction"; - } + i3 = nodes.length - 1; + while (i3 > 0 && nodes.length > 1 && nodes[i3] === connector) { + nodes.splice(i3, 1); + if (index > i3) + index--; + i3 = nodes.length - 1; } } - return false; - function hasDuplicates(n3, i3, arr) { - return arr.indexOf(n3) !== arr.lastIndexOf(n3); + nodes.splice(index, 0, id2); + nodes = nodes.filter(noRepeatNodes); + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); } - function keyNodeFilter(froms, tos) { - return function(n3) { - return froms.indexOf(n3) === -1 && tos.indexOf(n3) === -1; - }; + return this.update({ nodes }); + }, + // Replaces the node which is currently at position index with the given node (id). + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved when updating a node. + updateNode: function(id2, index) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max3 = nodes.length - 1; + if (index === void 0 || index < 0 || index > max3) { + throw new RangeError("index " + index + " out of range 0.." + max3); } - function collectNodes(member, collection) { - var entity = graph.hasEntity(member.id); - if (!entity) - return; - var role2 = member.role || ""; - if (!collection[role2]) { - collection[role2] = []; + if (isClosed) { + var connector = this.first(); + var i3 = 1; + while (i3 < nodes.length && nodes.length > 2 && nodes[i3] === connector) { + nodes.splice(i3, 1); + if (index > i3) + index--; } - if (member.type === "node") { - collection[role2].push(member.id); - if (role2 === "via") { - collection.keyfrom.push(member.id); - collection.keyto.push(member.id); - } - } else if (member.type === "way") { - collection[role2].push.apply(collection[role2], entity.nodes); - if (role2 === "from" || role2 === "via") { - collection.keyfrom.push(entity.first()); - collection.keyfrom.push(entity.last()); - } - if (role2 === "to" || role2 === "via") { - collection.keyto.push(entity.first()); - collection.keyto.push(entity.last()); - } + i3 = nodes.length - 1; + while (i3 > 0 && nodes.length > 1 && nodes[i3] === connector) { + nodes.splice(i3, 1); + if (index === i3) + index = 0; + i3 = nodes.length - 1; } } - }; - return action; - } - - // modules/actions/copy_entities.js - function actionCopyEntities(ids, fromGraph) { - var _copies = {}; - var action = function(graph) { - ids.forEach(function(id3) { - fromGraph.entity(id3).copy(fromGraph, _copies); - }); - for (var id2 in _copies) { - graph = graph.replace(_copies[id2]); - } - return graph; - }; - action.copies = function() { - return _copies; - }; - return action; - } - - // modules/actions/delete_member.js - function actionDeleteMember(relationId, memberIndex) { - return function(graph) { - var relation = graph.entity(relationId).removeMember(memberIndex); - graph = graph.replace(relation); - if (relation.isDegenerate()) { - graph = actionDeleteRelation(relation.id)(graph); + nodes.splice(index, 1, id2); + nodes = nodes.filter(noRepeatNodes); + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); } - return graph; - }; - } - - // modules/actions/discard_tags.js - function actionDiscardTags(difference, discardTags) { - discardTags = discardTags || {}; - return (graph) => { - difference.modified().forEach(checkTags); - difference.created().forEach(checkTags); - return graph; - function checkTags(entity) { - const keys = Object.keys(entity.tags); - let didDiscard = false; - let tags = {}; - for (let i2 = 0; i2 < keys.length; i2++) { - const k = keys[i2]; - if (discardTags[k] || !entity.tags[k]) { - didDiscard = true; - } else { - tags[k] = entity.tags[k]; - } + return this.update({ nodes }); + }, + // Replaces each occurrence of node id needle with replacement. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved. + replaceNode: function(needleID, replacementID) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + for (var i3 = 0; i3 < nodes.length; i3++) { + if (nodes[i3] === needleID) { + nodes[i3] = replacementID; } - if (didDiscard) { - graph = graph.replace(entity.update({ tags })); + } + nodes = nodes.filter(noRepeatNodes); + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); + } + return this.update({ nodes }); + }, + // Removes each occurrence of node id. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved. + removeNode: function(id2) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + nodes = nodes.filter(function(node) { + return node !== id2; + }).filter(noRepeatNodes); + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); + } + return this.update({ nodes }); + }, + asJXON: function(changeset_id) { + var r2 = { + way: { + "@id": this.osmId(), + "@version": this.version || 0, + nd: this.nodes.map(function(id2) { + return { keyAttributes: { ref: osmEntity.id.toOSM(id2) } }; + }, this), + tag: Object.keys(this.tags).map(function(k2) { + return { keyAttributes: { k: k2, v: this.tags[k2] } }; + }, this) } + }; + if (changeset_id) { + r2.way["@changeset"] = changeset_id; } - }; - } - - // modules/actions/disconnect.js - function actionDisconnect(nodeId, newNodeId) { - var wayIds; - var disconnectableRelationTypes = { - "associatedStreet": true, - "enforcement": true, - "site": true - }; - var action = function(graph) { - var node = graph.entity(nodeId); - var connections = action.connections(graph); - connections.forEach(function(connection) { - var way = graph.entity(connection.wayID); - var newNode = osmNode({ id: newNodeId, loc: node.loc, tags: node.tags }); - graph = graph.replace(newNode); - if (connection.index === 0 && way.isArea()) { - graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id)); - } else if (way.isClosed() && connection.index === way.nodes.length - 1) { - graph = graph.replace(way.unclose().addNode(newNode.id)); + return r2; + }, + asGeoJSON: function(resolver) { + return resolver.transient(this, "GeoJSON", function() { + var coordinates = resolver.childNodes(this).map(function(n3) { + return n3.loc; + }); + if (this.isArea() && this.isClosed()) { + return { + type: "Polygon", + coordinates: [coordinates] + }; } else { - graph = graph.replace(way.updateNode(newNode.id, connection.index)); + return { + type: "LineString", + coordinates + }; } }); - return graph; - }; - action.connections = function(graph) { - var candidates = []; - var keeping = false; - var parentWays = graph.parentWays(graph.entity(nodeId)); - var way, waynode; - for (var i2 = 0; i2 < parentWays.length; i2++) { - way = parentWays[i2]; - if (wayIds && wayIds.indexOf(way.id) === -1) { - keeping = true; - continue; + }, + area: function(resolver) { + return resolver.transient(this, "area", function() { + var nodes = resolver.childNodes(this); + var json = { + type: "Polygon", + coordinates: [nodes.map(function(n3) { + return n3.loc; + })] + }; + if (!this.isClosed() && nodes.length) { + json.coordinates[0].push(nodes[0].loc); } - if (way.isArea() && way.nodes[0] === nodeId) { - candidates.push({ wayID: way.id, index: 0 }); - } else { - for (var j2 = 0; j2 < way.nodes.length; j2++) { - waynode = way.nodes[j2]; - if (waynode === nodeId) { - if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j2 === way.nodes.length - 1) { - continue; - } - candidates.push({ wayID: way.id, index: j2 }); - } - } + var area = area_default(json); + if (area > 2 * Math.PI) { + json.coordinates[0] = json.coordinates[0].reverse(); + area = area_default(json); } - } - return keeping ? candidates : candidates.slice(1); - }; - action.disabled = function(graph) { - var connections = action.connections(graph); - if (connections.length === 0) - return "not_connected"; - var parentWays = graph.parentWays(graph.entity(nodeId)); - var seenRelationIds = {}; - var sharedRelation; - parentWays.forEach(function(way) { - var relations = graph.parentRelations(way); - relations.filter((relation) => !disconnectableRelationTypes[relation.tags.type]).forEach(function(relation) { - if (relation.id in seenRelationIds) { - if (wayIds) { - if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) { - sharedRelation = relation; - } - } else { - sharedRelation = relation; - } - } else { - seenRelationIds[relation.id] = way.id; - } - }); + return isNaN(area) ? 0 : area; }); - if (sharedRelation) - return "relation"; - }; - action.limitWays = function(val) { - if (!arguments.length) - return wayIds; - wayIds = val; - return action; - }; - return action; + } + }); + function noRepeatNodes(node, i3, arr) { + return i3 === 0 || node !== arr[i3 - 1]; } - // modules/actions/extract.js - function actionExtract(entityID, projection2) { - var extractedNodeID; - var action = function(graph) { - var entity = graph.entity(entityID); - if (entity.type === "node") { - return extractFromNode(entity, graph); + // modules/osm/multipolygon.js + function osmOldMultipolygonOuterMemberOfRelation(entity, graph) { + if (entity.type !== "relation" || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } + var outerMember; + for (var memberIndex in entity.members) { + var member = entity.members[memberIndex]; + if (!member.role || member.role === "outer") { + if (outerMember) + return false; + if (member.type !== "way") + return false; + if (!graph.hasEntity(member.id)) + return false; + outerMember = graph.entity(member.id); + if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) { + return false; + } } - return extractFromWayOrRelation(entity, graph); - }; - function extractFromNode(node, graph) { - extractedNodeID = node.id; - var replacement = osmNode({ loc: node.loc }); - graph = graph.replace(replacement); - graph = graph.parentWays(node).reduce(function(accGraph, parentWay) { - return accGraph.replace(parentWay.replaceNode(entityID, replacement.id)); - }, graph); - return graph.parentRelations(node).reduce(function(accGraph, parentRel) { - return accGraph.replace(parentRel.replaceMember(node, replacement)); - }, graph); } - function extractFromWayOrRelation(entity, graph) { - var fromGeometry = entity.geometry(graph); - var keysToCopyAndRetain = ["source", "wheelchair"]; - var keysToRetain = ["area"]; - var buildingKeysToRetain = ["architect", "building", "height", "layer"]; - var extractedLoc = path_default(projection2).centroid(entity.asGeoJSON(graph)); - extractedLoc = extractedLoc && projection2.invert(extractedLoc); - if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) { - extractedLoc = entity.extent(graph).center(); + return outerMember; + } + function osmIsOldMultipolygonOuterMember(entity, graph) { + if (entity.type !== "way" || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) { + return false; + } + var parents = graph.parentRelations(entity); + if (parents.length !== 1) + return false; + var parent = parents[0]; + if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } + var members = parent.members, member; + for (var i3 = 0; i3 < members.length; i3++) { + member = members[i3]; + if (member.id === entity.id && member.role && member.role !== "outer") { + return false; } - var indoorAreaValues = { - area: true, - corridor: true, - elevator: true, - level: true, - room: true - }; - var isBuilding = entity.tags.building && entity.tags.building !== "no" || entity.tags["building:part"] && entity.tags["building:part"] !== "no"; - var isIndoorArea = fromGeometry === "area" && entity.tags.indoor && indoorAreaValues[entity.tags.indoor]; - var entityTags = Object.assign({}, entity.tags); - var pointTags = {}; - for (var key in entityTags) { - if (entity.type === "relation" && key === "type") { - continue; - } - if (keysToRetain.indexOf(key) !== -1) { - continue; - } - if (isBuilding) { - if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) - continue; - } - if (isIndoorArea && key === "indoor") { - continue; - } - pointTags[key] = entityTags[key]; - if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) { - continue; - } else if (isIndoorArea && key === "level") { - continue; - } - delete entityTags[key]; + if (member.id !== entity.id && (!member.role || member.role === "outer")) { + return false; } - if (!isBuilding && !isIndoorArea && fromGeometry === "area") { - entityTags.area = "yes"; + } + return parent; + } + function osmOldMultipolygonOuterMember(entity, graph) { + if (entity.type !== "way") + return false; + var parents = graph.parentRelations(entity); + if (parents.length !== 1) + return false; + var parent = parents[0]; + if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } + var members = parent.members, member, outerMember; + for (var i3 = 0; i3 < members.length; i3++) { + member = members[i3]; + if (!member.role || member.role === "outer") { + if (outerMember) + return false; + outerMember = member; } - var replacement = osmNode({ loc: extractedLoc, tags: pointTags }); - graph = graph.replace(replacement); - extractedNodeID = replacement.id; - return graph.replace(entity.update({ tags: entityTags })); } - action.getExtractedNodeID = function() { - return extractedNodeID; - }; - return action; + if (!outerMember) + return false; + var outerEntity = graph.hasEntity(outerMember.id); + if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) { + return false; + } + return outerEntity; } - - // modules/actions/join.js - function actionJoin(ids) { - function groupEntitiesByGeometry(graph) { - var entities = ids.map(function(id2) { - return graph.entity(id2); - }); - return Object.assign( - { line: [] }, - utilArrayGroupBy(entities, function(entity) { - return entity.geometry(graph); - }) - ); + function osmJoinWays(toJoin, graph) { + function resolve(member) { + return graph.childNodes(graph.entity(member.id)); } - var action = function(graph) { - var ways = ids.map(graph.entity, graph); - var survivorID = utilOldestID(ways.map((way) => way.id)); - ways.sort(function(a, b) { - var aSided = a.isSided(); - var bSided = b.isSided(); - return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0; - }); - var sequences = osmJoinWays(ways, graph); - var joined = sequences[0]; - graph = sequences.actions.reduce(function(g, action2) { - return action2(g); - }, graph); - var survivor = graph.entity(survivorID); - survivor = survivor.update({ nodes: joined.nodes.map(function(n2) { - return n2.id; - }) }); - graph = graph.replace(survivor); - joined.forEach(function(way) { - if (way.id === survivorID) - return; - graph.parentRelations(way).forEach(function(parent) { - graph = graph.replace(parent.replaceMember(way, survivor)); - }); - survivor = survivor.mergeTags(way.tags); - graph = graph.replace(survivor); - graph = actionDeleteWay(way.id)(graph); - }); - function checkForSimpleMultipolygon() { - if (!survivor.isClosed()) - return; - var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon2) { - return multipolygon2.members.length === 1; - }); - if (multipolygons.length !== 1) - return; - var multipolygon = multipolygons[0]; - for (var key in survivor.tags) { - if (multipolygon.tags[key] && multipolygon.tags[key] !== survivor.tags[key]) - return; + function reverse(item2) { + var action = actionReverse(item2.id, { reverseOneway: true }); + sequences.actions.push(action); + return item2 instanceof osmWay ? action(graph).entity(item2.id) : item2; + } + toJoin = toJoin.filter(function(member) { + return member.type === "way" && graph.hasEntity(member.id); + }); + var i3; + var joinAsMembers = true; + for (i3 = 0; i3 < toJoin.length; i3++) { + if (toJoin[i3] instanceof osmWay) { + joinAsMembers = false; + break; + } + } + var sequences = []; + sequences.actions = []; + while (toJoin.length) { + var item = toJoin.shift(); + var currWays = [item]; + var currNodes = resolve(item).slice(); + while (toJoin.length) { + var start2 = currNodes[0]; + var end = currNodes[currNodes.length - 1]; + var fn = null; + var nodes = null; + for (i3 = 0; i3 < toJoin.length; i3++) { + item = toJoin[i3]; + nodes = resolve(item); + if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start2 || nodes[0] === start2)) { + currWays[0] = reverse(currWays[0]); + currNodes.reverse(); + start2 = currNodes[0]; + end = currNodes[currNodes.length - 1]; + } + if (nodes[0] === end) { + fn = currNodes.push; + nodes = nodes.slice(1); + break; + } else if (nodes[nodes.length - 1] === end) { + fn = currNodes.push; + nodes = nodes.slice(0, -1).reverse(); + item = reverse(item); + break; + } else if (nodes[nodes.length - 1] === start2) { + fn = currNodes.unshift; + nodes = nodes.slice(0, -1); + break; + } else if (nodes[0] === start2) { + fn = currNodes.unshift; + nodes = nodes.slice(1).reverse(); + item = reverse(item); + break; + } else { + fn = nodes = null; + } } - survivor = survivor.mergeTags(multipolygon.tags); - graph = graph.replace(survivor); - graph = actionDeleteRelation(multipolygon.id, true)(graph); - var tags = Object.assign({}, survivor.tags); - if (survivor.geometry(graph) !== "area") { - tags.area = "yes"; + if (!nodes) { + break; } - delete tags.type; - survivor = survivor.update({ tags }); - graph = graph.replace(survivor); + fn.apply(currWays, [item]); + fn.apply(currNodes, nodes); + toJoin.splice(i3, 1); + } + currWays.nodes = currNodes; + sequences.push(currWays); + } + return sequences; + } + + // modules/actions/add_member.js + function actionAddMember(relationId, member, memberIndex, insertPair) { + return function action(graph) { + var relation = graph.entity(relationId); + var isPTv2 = /stop|platform/.test(member.role); + if ((isNaN(memberIndex) || insertPair) && member.type === "way" && !isPTv2) { + graph = addWayMember(relation, graph); + } else { + if (isPTv2 && isNaN(memberIndex)) { + memberIndex = 0; + } + graph = graph.replace(relation.addMember(member, memberIndex)); } - checkForSimpleMultipolygon(); return graph; }; - action.resultingWayNodesLength = function(graph) { - return ids.reduce(function(count, id2) { - return count + graph.entity(id2).nodes.length; - }, 0) - ids.length - 1; - }; - action.disabled = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - if (ids.length < 2 || ids.length !== geometries.line.length) { - return "not_eligible"; + function addWayMember(relation, graph) { + var groups, tempWay, insertPairIsReversed, item, i3, j3, k2; + var PTv2members = []; + var members = []; + for (i3 = 0; i3 < relation.members.length; i3++) { + var m2 = relation.members[i3]; + if (/stop|platform/.test(m2.role)) { + PTv2members.push(m2); + } else { + members.push(m2); + } } - var joined = osmJoinWays(ids.map(graph.entity, graph), graph); - if (joined.length > 1) { - return "not_adjacent"; + relation = relation.update({ members }); + if (insertPair) { + tempWay = osmWay({ id: "wTemp", nodes: insertPair.nodes }); + graph = graph.replace(tempWay); + var tempMember = { id: tempWay.id, type: "way", role: member.role }; + var tempRelation = relation.replaceMember({ id: insertPair.originalID }, tempMember, true); + groups = utilArrayGroupBy(tempRelation.members, "type"); + groups.way = groups.way || []; + var originalWay = graph.entity(insertPair.originalID); + var insertedWay = graph.entity(insertPair.insertedID); + insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0]; + } else { + groups = utilArrayGroupBy(relation.members, "type"); + groups.way = groups.way || []; + groups.way.push(member); } - var i2; - var sortedParentRelations = function(id2) { - return graph.parentRelations(graph.entity(id2)).filter((rel) => !rel.isRestriction() && !rel.isConnectivity()).sort((a, b) => a.id - b.id); - }; - var relsA = sortedParentRelations(ids[0]); - for (i2 = 1; i2 < ids.length; i2++) { - var relsB = sortedParentRelations(ids[i2]); - if (!utilArrayIdentical(relsA, relsB)) { - return "conflicting_relations"; + members = withIndex(groups.way); + var joined = osmJoinWays(members, graph); + for (i3 = 0; i3 < joined.length; i3++) { + var segment = joined[i3]; + var nodes = segment.nodes.slice(); + var startIndex = segment[0].index; + for (j3 = 0; j3 < members.length; j3++) { + if (members[j3].index === startIndex) { + break; + } } - } - for (i2 = 0; i2 < ids.length - 1; i2++) { - for (var j2 = i2 + 1; j2 < ids.length; j2++) { - var path1 = graph.childNodes(graph.entity(ids[i2])).map(function(e) { - return e.loc; - }); - var path2 = graph.childNodes(graph.entity(ids[j2])).map(function(e) { - return e.loc; - }); - var intersections = geoPathIntersections(path1, path2); - var common = utilArrayIntersection( - joined[0].nodes.map(function(n2) { - return n2.loc.toString(); - }), - intersections.map(function(n2) { - return n2.toString(); - }) - ); - if (common.length !== intersections.length) { - return "paths_intersect"; + for (k2 = 0; k2 < segment.length; k2++) { + item = segment[k2]; + var way = graph.entity(item.id); + if (tempWay && item.id === tempWay.id) { + var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed; + if (reverse) { + item.pair = [ + { id: insertPair.insertedID, type: "way", role: item.role }, + { id: insertPair.originalID, type: "way", role: item.role } + ]; + } else { + item.pair = [ + { id: insertPair.originalID, type: "way", role: item.role }, + { id: insertPair.insertedID, type: "way", role: item.role } + ]; + } + } + if (k2 > 0) { + if (j3 + k2 >= members.length || item.index !== members[j3 + k2].index) { + moveMember(members, item.index, j3 + k2); + } } + nodes.splice(0, way.nodes.length - 1); } } - var nodeIds = joined[0].nodes.map(function(n2) { - return n2.id; - }).slice(1, -1); - var relation; - var tags = {}; - var conflicting = false; - joined[0].forEach(function(way) { - var parents = graph.parentRelations(way); - parents.forEach(function(parent) { - if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function(m) { - return nodeIds.indexOf(m.id) >= 0; - })) { - relation = parent; - } - }); - for (var k in way.tags) { - if (!(k in tags)) { - tags[k] = way.tags[k]; - } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) { - conflicting = true; + if (tempWay) { + graph = graph.remove(tempWay); + } + var wayMembers = []; + for (i3 = 0; i3 < members.length; i3++) { + item = members[i3]; + if (item.index === -1) + continue; + if (item.pair) { + wayMembers.push(item.pair[0]); + wayMembers.push(item.pair[1]); + } else { + wayMembers.push(utilObjectOmit(item, ["index"])); + } + } + var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []); + return graph.replace(relation.update({ members: newMembers })); + function moveMember(arr, findIndex, toIndex) { + var i4; + for (i4 = 0; i4 < arr.length; i4++) { + if (arr[i4].index === findIndex) { + break; } } - }); - if (relation) { - return relation.isRestriction() ? "restriction" : "connectivity"; + var item2 = Object.assign({}, arr[i4]); + arr[i4].index = -1; + item2.index = toIndex; + arr.splice(toIndex, 0, item2); } - if (conflicting) { - return "conflicting_tags"; + function withIndex(arr) { + var result = new Array(arr.length); + for (var i4 = 0; i4 < arr.length; i4++) { + result[i4] = Object.assign({}, arr[i4]); + result[i4].index = i4; + } + return result; } - }; - return action; + } } - // modules/actions/merge.js - function actionMerge(ids) { - function groupEntitiesByGeometry(graph) { - var entities = ids.map(function(id2) { - return graph.entity(id2); - }); - return Object.assign( - { point: [], area: [], line: [], relation: [] }, - utilArrayGroupBy(entities, function(entity) { - return entity.geometry(graph); - }) + // modules/actions/add_midpoint.js + function actionAddMidpoint(midpoint, node) { + return function(graph) { + graph = graph.replace(node.move(midpoint.loc)); + var parents = utilArrayIntersection( + graph.parentWays(graph.entity(midpoint.edge[0])), + graph.parentWays(graph.entity(midpoint.edge[1])) ); - } - var action = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - var target = geometries.area[0] || geometries.line[0]; - var points = geometries.point; - points.forEach(function(point) { - target = target.mergeTags(point.tags); - graph = graph.replace(target); - graph.parentRelations(point).forEach(function(parent) { - graph = graph.replace(parent.replaceMember(point, target)); - }); - var nodes = utilArrayUniq(graph.childNodes(target)); - var removeNode = point; - if (!point.isNew()) { - var inserted = false; - var canBeReplaced = function(node2) { - return !(graph.parentWays(node2).length > 1 || graph.parentRelations(node2).length); - }; - var replaceNode = function(node2) { - graph = graph.replace(point.update({ tags: node2.tags, loc: node2.loc })); - target = target.replaceNode(node2.id, point.id); - graph = graph.replace(target); - removeNode = node2; - inserted = true; - }; - var i2; - var node; - for (i2 = 0; i2 < nodes.length; i2++) { - node = nodes[i2]; - if (canBeReplaced(node) && node.isNew()) { - replaceNode(node); - break; - } - } - if (!inserted && point.hasInterestingTags()) { - for (i2 = 0; i2 < nodes.length; i2++) { - node = nodes[i2]; - if (canBeReplaced(node) && !node.hasInterestingTags()) { - replaceNode(node); - break; - } - } - if (!inserted) { - for (i2 = 0; i2 < nodes.length; i2++) { - node = nodes[i2]; - if (canBeReplaced(node) && utilCompareIDs(point.id, node.id) < 0) { - replaceNode(node); - break; - } - } - } + parents.forEach(function(way) { + for (var i3 = 0; i3 < way.nodes.length - 1; i3++) { + if (geoEdgeEqual([way.nodes[i3], way.nodes[i3 + 1]], midpoint.edge)) { + graph = graph.replace(graph.entity(way.id).addNode(node.id, i3 + 1)); + return; } } - graph = graph.remove(removeNode); }); - if (target.tags.area === "yes") { - var tags = Object.assign({}, target.tags); - delete tags.area; - if (osmTagSuggestingArea(tags)) { - target = target.update({ tags }); - graph = graph.replace(target); - } - } return graph; }; - action.disabled = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) { - return "not_eligible"; - } + } + + // modules/actions/add_vertex.js + function actionAddVertex(wayId, nodeId, index) { + return function(graph) { + return graph.replace(graph.entity(wayId).addNode(nodeId, index)); }; - return action; } - // modules/actions/merge_nodes.js - function actionMergeNodes(nodeIDs, loc) { - function chooseLoc(graph) { - if (!nodeIDs.length) - return null; - var sum = [0, 0]; - var interestingCount = 0; - var interestingLoc; - for (var i2 = 0; i2 < nodeIDs.length; i2++) { - var node = graph.entity(nodeIDs[i2]); - if (node.hasInterestingTags()) { - interestingLoc = ++interestingCount === 1 ? node.loc : null; + // modules/actions/change_member.js + function actionChangeMember(relationId, member, memberIndex) { + return function(graph) { + return graph.replace(graph.entity(relationId).updateMember(member, memberIndex)); + }; + } + + // modules/actions/change_preset.js + function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) { + return function action(graph) { + var entity = graph.entity(entityID); + var geometry = entity.geometry(graph); + var tags = entity.tags; + const loc = entity.extent(graph).center(); + var preserveKeys; + if (newPreset) { + preserveKeys = []; + if (newPreset.addTags) { + preserveKeys = preserveKeys.concat(Object.keys(newPreset.addTags)); + } + if (oldPreset && !oldPreset.id.startsWith(newPreset.id)) { + newPreset.fields(loc).concat(newPreset.moreFields(loc)).filter((f3) => f3.matchGeometry(geometry)).map((f3) => f3.key).filter(Boolean).forEach((key) => preserveKeys.push(key)); } - sum = geoVecAdd(sum, node.loc); } - return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length); - } - var action = function(graph) { - if (nodeIDs.length < 2) - return graph; - var toLoc = loc; - if (!toLoc) { - toLoc = chooseLoc(graph); - } - for (var i2 = 0; i2 < nodeIDs.length; i2++) { - var node = graph.entity(nodeIDs[i2]); - if (node.loc !== toLoc) { - graph = graph.replace(node.move(toLoc)); - } - } - return actionConnect(nodeIDs)(graph); + if (oldPreset) + tags = oldPreset.unsetTags(tags, geometry, preserveKeys, false, loc); + if (newPreset) + tags = newPreset.setTags(tags, geometry, skipFieldDefaults, loc); + return graph.replace(entity.update({ tags })); }; - action.disabled = function(graph) { - if (nodeIDs.length < 2) - return "not_eligible"; - for (var i2 = 0; i2 < nodeIDs.length; i2++) { - var entity = graph.entity(nodeIDs[i2]); - if (entity.type !== "node") - return "not_eligible"; - } - return actionConnect(nodeIDs).disabled(graph); + } + + // modules/actions/change_tags.js + function actionChangeTags(entityId, tags) { + return function(graph) { + var entity = graph.entity(entityId); + return graph.replace(entity.update({ tags })); }; - return action; } - // modules/osm/changeset.js - function osmChangeset() { - if (!(this instanceof osmChangeset)) { - return new osmChangeset().initialize(arguments); + // modules/osm/node.js + var cardinal = { + north: 0, + n: 0, + northnortheast: 22, + nne: 22, + northeast: 45, + ne: 45, + eastnortheast: 67, + ene: 67, + east: 90, + e: 90, + eastsoutheast: 112, + ese: 112, + southeast: 135, + se: 135, + southsoutheast: 157, + sse: 157, + south: 180, + s: 180, + southsouthwest: 202, + ssw: 202, + southwest: 225, + sw: 225, + westsouthwest: 247, + wsw: 247, + west: 270, + w: 270, + westnorthwest: 292, + wnw: 292, + northwest: 315, + nw: 315, + northnorthwest: 337, + nnw: 337 + }; + function osmNode() { + if (!(this instanceof osmNode)) { + return new osmNode().initialize(arguments); } else if (arguments.length) { this.initialize(arguments); } } - osmEntity.changeset = osmChangeset; - osmChangeset.prototype = Object.create(osmEntity.prototype); - Object.assign(osmChangeset.prototype, { - type: "changeset", + osmEntity.node = osmNode; + osmNode.prototype = Object.create(osmEntity.prototype); + Object.assign(osmNode.prototype, { + type: "node", + loc: [9999, 9999], extent: function() { - return new geoExtent(); + return new geoExtent(this.loc); }, - geometry: function() { - return "changeset"; + geometry: function(graph) { + return graph.transient(this, "geometry", function() { + return graph.isPoi(this) ? "point" : "vertex"; + }); }, - asJXON: function() { - return { - osm: { - changeset: { - tag: Object.keys(this.tags).map(function(k) { - return { "@k": k, "@v": this.tags[k] }; - }, this), - "@version": 0.6, - "@generator": "iD" - } - } - }; + move: function(loc) { + return this.update({ loc }); }, - osmChangeJXON: function(changes) { - var changeset_id = this.id; - function nest(x, order) { - var groups = {}; - for (var i2 = 0; i2 < x.length; i2++) { - var tagName = Object.keys(x[i2])[0]; - if (!groups[tagName]) - groups[tagName] = []; - groups[tagName].push(x[i2][tagName]); - } - var ordered = {}; - order.forEach(function(o) { - if (groups[o]) - ordered[o] = groups[o]; - }); - return ordered; - } - function sort(changes2) { - function resolve(item) { - return relations.find(function(relation2) { - return item.keyAttributes.type === "relation" && item.keyAttributes.ref === relation2["@id"]; - }); - } - function isNew(item) { - return !sorted[item["@id"]] && !processing.find(function(proc) { - return proc["@id"] === item["@id"]; - }); - } - var processing = []; - var sorted = {}; - var relations = changes2.relation; - if (!relations) - return changes2; - for (var i2 = 0; i2 < relations.length; i2++) { - var relation = relations[i2]; - if (!sorted[relation["@id"]]) { - processing.push(relation); - } - while (processing.length > 0) { - var next = processing[0], deps = next.member.map(resolve).filter(Boolean).filter(isNew); - if (deps.length === 0) { - sorted[next["@id"]] = next; - processing.shift(); - } else { - processing = deps.concat(processing); - } + isDegenerate: function() { + return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90); + }, + // Inspect tags and geometry to determine which direction(s) this node/vertex points + directions: function(resolver, projection2) { + var val; + var i3; + if (this.isHighwayIntersection(resolver) && (this.tags.stop || "").toLowerCase() === "all") { + val = "all"; + } else { + val = (this.tags.direction || "").toLowerCase(); + var re3 = /:direction$/i; + var keys2 = Object.keys(this.tags); + for (i3 = 0; i3 < keys2.length; i3++) { + if (re3.test(keys2[i3])) { + val = this.tags[keys2[i3]].toLowerCase(); + break; } } - changes2.relation = Object.values(sorted); - return changes2; - } - function rep2(entity) { - return entity.asJXON(changeset_id); } - return { - osmChange: { - "@version": 0.6, - "@generator": "iD", - "create": sort(nest(changes.created.map(rep2), ["node", "way", "relation"])), - "modify": nest(changes.modified.map(rep2), ["node", "way", "relation"]), - "delete": Object.assign(nest(changes.deleted.map(rep2), ["relation", "way", "node"]), { "@if-unused": true }) + if (val === "") + return []; + var values = val.split(";"); + var results = []; + values.forEach(function(v2) { + if (cardinal[v2] !== void 0) { + v2 = cardinal[v2]; } - }; - }, - asGeoJSON: function() { - return {}; - } - }); - - // modules/osm/note.js - function osmNote() { - if (!(this instanceof osmNote)) { - return new osmNote().initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); - } - } - osmNote.id = function() { - return osmNote.id.next--; - }; - osmNote.id.next = -1; - Object.assign(osmNote.prototype, { - type: "note", - initialize: function(sources) { - for (var i2 = 0; i2 < sources.length; ++i2) { - var source = sources[i2]; - for (var prop in source) { - if (Object.prototype.hasOwnProperty.call(source, prop)) { - if (source[prop] === void 0) { - delete this[prop]; - } else { - this[prop] = source[prop]; + if (v2 !== "" && !isNaN(+v2)) { + results.push(+v2); + return; + } + var lookBackward = this.tags["traffic_sign:backward"] || v2 === "backward" || v2 === "both" || v2 === "all"; + var lookForward = this.tags["traffic_sign:forward"] || v2 === "forward" || v2 === "both" || v2 === "all"; + if (!lookForward && !lookBackward) + return; + var nodeIds = {}; + resolver.parentWays(this).forEach(function(parent) { + var nodes = parent.nodes; + for (i3 = 0; i3 < nodes.length; i3++) { + if (nodes[i3] === this.id) { + if (lookForward && i3 > 0) { + nodeIds[nodes[i3 - 1]] = true; + } + if (lookBackward && i3 < nodes.length - 1) { + nodeIds[nodes[i3 + 1]] = true; + } } } - } - } - if (!this.id) { - this.id = osmNote.id().toString(); - } - return this; - }, - extent: function() { - return new geoExtent(this.loc); - }, - update: function(attrs) { - return osmNote(this, attrs); + }, this); + Object.keys(nodeIds).forEach(function(nodeId) { + results.push( + geoAngle(this, resolver.entity(nodeId), projection2) * (180 / Math.PI) + 90 + ); + }, this); + }, this); + return utilArrayUniq(results); }, - isNew: function() { - return this.id < 0; + isCrossing: function() { + return this.tags.highway === "crossing" || this.tags.railway && this.tags.railway.indexOf("crossing") !== -1; }, - move: function(loc) { - return this.update({ loc }); - } - }); - - // modules/osm/relation.js - function osmRelation() { - if (!(this instanceof osmRelation)) { - return new osmRelation().initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); - } - } - osmEntity.relation = osmRelation; - osmRelation.prototype = Object.create(osmEntity.prototype); - osmRelation.creationOrder = function(a, b) { - var aId = parseInt(osmEntity.id.toOSM(a.id), 10); - var bId = parseInt(osmEntity.id.toOSM(b.id), 10); - if (aId < 0 || bId < 0) - return aId - bId; - return bId - aId; - }; - Object.assign(osmRelation.prototype, { - type: "relation", - members: [], - copy: function(resolver, copies) { - if (copies[this.id]) - return copies[this.id]; - var copy2 = osmEntity.prototype.copy.call(this, resolver, copies); - var members = this.members.map(function(member) { - return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id }); + isEndpoint: function(resolver) { + return resolver.transient(this, "isEndpoint", function() { + var id2 = this.id; + return resolver.parentWays(this).filter(function(parent) { + return !parent.isClosed() && !!parent.affix(id2); + }).length > 0; }); - copy2 = copy2.update({ members }); - copies[this.id] = copy2; - return copy2; }, - extent: function(resolver, memo) { - return resolver.transient(this, "extent", function() { - if (memo && memo[this.id]) - return geoExtent(); - memo = memo || {}; - memo[this.id] = true; - var extent = geoExtent(); - for (var i2 = 0; i2 < this.members.length; i2++) { - var member = resolver.hasEntity(this.members[i2].id); - if (member) { - extent._extend(member.extent(resolver, memo)); + isConnected: function(resolver) { + return resolver.transient(this, "isConnected", function() { + var parents = resolver.parentWays(this); + if (parents.length > 1) { + for (var i3 in parents) { + if (parents[i3].geometry(resolver) === "line" && parents[i3].hasInterestingTags()) + return true; + } + } else if (parents.length === 1) { + var way = parents[0]; + var nodes = way.nodes.slice(); + if (way.isClosed()) { + nodes.pop(); } + return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id); } - return extent; + return false; }); }, - geometry: function(graph) { - return graph.transient(this, "geometry", function() { - return this.isMultipolygon() ? "area" : "relation"; + parentIntersectionWays: function(resolver) { + return resolver.transient(this, "parentIntersectionWays", function() { + return resolver.parentWays(this).filter(function(parent) { + return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === "line"; + }); }); }, - isDegenerate: function() { - return this.members.length === 0; - }, - indexedMembers: function() { - var result = new Array(this.members.length); - for (var i2 = 0; i2 < this.members.length; i2++) { - result[i2] = Object.assign({}, this.members[i2], { index: i2 }); - } - return result; - }, - memberByRole: function(role) { - for (var i2 = 0; i2 < this.members.length; i2++) { - if (this.members[i2].role === role) { - return Object.assign({}, this.members[i2], { index: i2 }); - } - } - }, - membersByRole: function(role) { - var result = []; - for (var i2 = 0; i2 < this.members.length; i2++) { - if (this.members[i2].role === role) { - result.push(Object.assign({}, this.members[i2], { index: i2 })); - } - } - return result; - }, - memberById: function(id2) { - for (var i2 = 0; i2 < this.members.length; i2++) { - if (this.members[i2].id === id2) { - return Object.assign({}, this.members[i2], { index: i2 }); - } - } - }, - memberByIdAndRole: function(id2, role) { - for (var i2 = 0; i2 < this.members.length; i2++) { - if (this.members[i2].id === id2 && this.members[i2].role === role) { - return Object.assign({}, this.members[i2], { index: i2 }); - } - } - }, - addMember: function(member, index) { - var members = this.members.slice(); - members.splice(index === void 0 ? members.length : index, 0, member); - return this.update({ members }); - }, - updateMember: function(member, index) { - var members = this.members.slice(); - members.splice(index, 1, Object.assign({}, members[index], member)); - return this.update({ members }); - }, - removeMember: function(index) { - var members = this.members.slice(); - members.splice(index, 1); - return this.update({ members }); + isIntersection: function(resolver) { + return this.parentIntersectionWays(resolver).length > 1; }, - removeMembersWithID: function(id2) { - var members = this.members.filter(function(m) { - return m.id !== id2; + isHighwayIntersection: function(resolver) { + return resolver.transient(this, "isHighwayIntersection", function() { + return resolver.parentWays(this).filter(function(parent) { + return parent.tags.highway && parent.geometry(resolver) === "line"; + }).length > 1; }); - return this.update({ members }); - }, - moveMember: function(fromIndex, toIndex) { - var members = this.members.slice(); - members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]); - return this.update({ members }); }, - replaceMember: function(needle, replacement, keepDuplicates) { - if (!this.memberById(needle.id)) - return this; - var members = []; - for (var i2 = 0; i2 < this.members.length; i2++) { - var member = this.members[i2]; - if (member.id !== needle.id) { - members.push(member); - } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) { - members.push({ id: replacement.id, type: replacement.type, role: member.role }); - } - } - return this.update({ members }); + isOnAddressLine: function(resolver) { + return resolver.transient(this, "isOnAddressLine", function() { + return resolver.parentWays(this).filter(function(parent) { + return parent.tags.hasOwnProperty("addr:interpolation") && parent.geometry(resolver) === "line"; + }).length > 0; + }); }, asJXON: function(changeset_id) { - var r = { - relation: { + var r2 = { + node: { "@id": this.osmId(), + "@lon": this.loc[0], + "@lat": this.loc[1], "@version": this.version || 0, - member: this.members.map(function(member) { - return { - keyAttributes: { - type: member.type, - role: member.role, - ref: osmEntity.id.toOSM(member.id) - } - }; - }, this), - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k, v: this.tags[k] } }; + tag: Object.keys(this.tags).map(function(k2) { + return { keyAttributes: { k: k2, v: this.tags[k2] } }; }, this) } }; - if (changeset_id) { - r.relation["@changeset"] = changeset_id; - } - return r; - }, - asGeoJSON: function(resolver) { - return resolver.transient(this, "GeoJSON", function() { - if (this.isMultipolygon()) { - return { - type: "MultiPolygon", - coordinates: this.multipolygon(resolver) - }; - } else { - return { - type: "FeatureCollection", - properties: this.tags, - features: this.members.map(function(member) { - return Object.assign({ role: member.role }, resolver.entity(member.id).asGeoJSON(resolver)); - }) - }; - } - }); + if (changeset_id) + r2.node["@changeset"] = changeset_id; + return r2; }, - area: function(resolver) { - return resolver.transient(this, "area", function() { - return area_default(this.asGeoJSON(resolver)); + asGeoJSON: function() { + return { + type: "Point", + coordinates: this.loc + }; + } + }); + + // modules/actions/circularize.js + function actionCircularize(wayId, projection2, maxAngle) { + maxAngle = (maxAngle || 20) * Math.PI / 180; + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var way = graph.entity(wayId); + var origNodes = {}; + graph.childNodes(way).forEach(function(node2) { + if (!origNodes[node2.id]) + origNodes[node2.id] = node2; }); - }, - isMultipolygon: function() { - return this.tags.type === "multipolygon"; - }, - isComplete: function(resolver) { - for (var i2 = 0; i2 < this.members.length; i2++) { - if (!resolver.hasEntity(this.members[i2].id)) { - return false; - } + if (!way.isConvex(graph)) { + graph = action.makeConvex(graph); } - return true; - }, - hasFromViaTo: function() { - return this.members.some(function(m) { - return m.role === "from"; - }) && this.members.some(function(m) { - return m.role === "via"; - }) && this.members.some(function(m) { - return m.role === "to"; - }); - }, - isRestriction: function() { - return !!(this.tags.type && this.tags.type.match(/^restriction:?/)); - }, - isValidRestriction: function() { - if (!this.isRestriction()) - return false; - var froms = this.members.filter(function(m) { - return m.role === "from"; - }); - var vias = this.members.filter(function(m) { - return m.role === "via"; - }); - var tos = this.members.filter(function(m) { - return m.role === "to"; + var nodes = utilArrayUniq(graph.childNodes(way)); + var keyNodes = nodes.filter(function(n3) { + return graph.parentWays(n3).length !== 1; }); - if (froms.length !== 1 && this.tags.restriction !== "no_entry") - return false; - if (froms.some(function(m) { - return m.type !== "way"; - })) - return false; - if (tos.length !== 1 && this.tags.restriction !== "no_exit") - return false; - if (tos.some(function(m) { - return m.type !== "way"; - })) - return false; - if (vias.length === 0) - return false; - if (vias.length > 1 && vias.some(function(m) { - return m.type !== "way"; - })) - return false; - return true; - }, - isConnectivity: function() { - return !!(this.tags.type && this.tags.type.match(/^connectivity:?/)); - }, - multipolygon: function(resolver) { - var outers = this.members.filter(function(m) { - return "outer" === (m.role || "outer"); + var points = nodes.map(function(n3) { + return projection2(n3.loc); }); - var inners = this.members.filter(function(m) { - return "inner" === m.role; + var keyPoints = keyNodes.map(function(n3) { + return projection2(n3.loc); }); - outers = osmJoinWays(outers, resolver); - inners = osmJoinWays(inners, resolver); - var sequenceToLineString = function(sequence) { - if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) { - sequence.nodes.push(sequence.nodes[0]); - } - return sequence.nodes.map(function(node) { - return node.loc; - }); - }; - outers = outers.map(sequenceToLineString); - inners = inners.map(sequenceToLineString); - var result = outers.map(function(o2) { - return [area_default({ type: "Polygon", coordinates: [o2] }) > 2 * Math.PI ? o2.reverse() : o2]; + var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : centroid_default2(points); + var radius = median(points, function(p2) { + return geoVecLength(centroid, p2); }); - function findOuter(inner2) { - var o2, outer; - for (o2 = 0; o2 < outers.length; o2++) { - outer = outers[o2]; - if (geoPolygonContainsPolygon(outer, inner2)) { - return o2; - } - } - for (o2 = 0; o2 < outers.length; o2++) { - outer = outers[o2]; - if (geoPolygonIntersectsPolygon(outer, inner2, false)) { - return o2; - } - } + var sign2 = area_default3(points) > 0 ? 1 : -1; + var ids, i3, j3, k2; + if (!keyNodes.length) { + keyNodes = [nodes[0]]; + keyPoints = [points[0]]; } - for (var i2 = 0; i2 < inners.length; i2++) { - var inner = inners[i2]; - if (area_default({ type: "Polygon", coordinates: [inner] }) < 2 * Math.PI) { - inner = inner.reverse(); + if (keyNodes.length === 1) { + var index = nodes.indexOf(keyNodes[0]); + var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length); + keyNodes.push(nodes[oppositeIndex]); + keyPoints.push(points[oppositeIndex]); + } + for (i3 = 0; i3 < keyPoints.length; i3++) { + var nextKeyNodeIndex = (i3 + 1) % keyNodes.length; + var startNode = keyNodes[i3]; + var endNode = keyNodes[nextKeyNodeIndex]; + var startNodeIndex = nodes.indexOf(startNode); + var endNodeIndex = nodes.indexOf(endNode); + var numberNewPoints = -1; + var indexRange = endNodeIndex - startNodeIndex; + var nearNodes = {}; + var inBetweenNodes = []; + var startAngle, endAngle, totalAngle, eachAngle; + var angle2, loc, node, origNode; + if (indexRange < 0) { + indexRange += nodes.length; } - var o = findOuter(inners[i2]); - if (o !== void 0) { - result[o].push(inners[i2]); - } else { - result.push([inners[i2]]); + var distance = geoVecLength(centroid, keyPoints[i3]) || 1e-4; + keyPoints[i3] = [ + centroid[0] + (keyPoints[i3][0] - centroid[0]) / distance * radius, + centroid[1] + (keyPoints[i3][1] - centroid[1]) / distance * radius + ]; + loc = projection2.invert(keyPoints[i3]); + node = keyNodes[i3]; + origNode = origNodes[node.id]; + node = node.move(geoVecInterp(origNode.loc, loc, t2)); + graph = graph.replace(node); + startAngle = Math.atan2(keyPoints[i3][1] - centroid[1], keyPoints[i3][0] - centroid[0]); + endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]); + totalAngle = endAngle - startAngle; + if (totalAngle * sign2 > 0) { + totalAngle = -sign2 * (2 * Math.PI - Math.abs(totalAngle)); } - } - return result; - } - }); - - // modules/osm/qa_item.js - var QAItem = class { - constructor(loc, service, itemType, id2, props) { - this.loc = loc; - this.service = service.title; - this.itemType = itemType; - this.id = id2 ? id2 : `${QAItem.id()}`; - this.update(props); - if (service && typeof service.getIcon === "function") { - this.icon = service.getIcon(itemType); - } - } - update(props) { - const { loc, service, itemType, id: id2 } = this; - Object.keys(props).forEach((prop) => this[prop] = props[prop]); - this.loc = loc; - this.service = service; - this.itemType = itemType; - this.id = id2; - return this; - } - static id() { - return this.nextId--; - } - }; - QAItem.nextId = -1; - - // modules/actions/split.js - function actionSplit(nodeIds, newWayIds) { - if (typeof nodeIds === "string") - nodeIds = [nodeIds]; - var _wayIDs; - var _keepHistoryOn = "longest"; - var _createdWayIDs = []; - function dist(graph, nA, nB) { - var locA = graph.entity(nA).loc; - var locB = graph.entity(nB).loc; - var epsilon3 = 1e-6; - return locA && locB ? geoSphericalDistance(locA, locB) : epsilon3; - } - function splitArea(nodes, idxA, graph) { - var lengths = new Array(nodes.length); - var length; - var i2; - var best = 0; - var idxB; - function wrap2(index) { - return utilWrap(index, nodes.length); - } - length = 0; - for (i2 = wrap2(idxA + 1); i2 !== idxA; i2 = wrap2(i2 + 1)) { - length += dist(graph, nodes[i2], nodes[wrap2(i2 - 1)]); - lengths[i2] = length; - } - length = 0; - for (i2 = wrap2(idxA - 1); i2 !== idxA; i2 = wrap2(i2 - 1)) { - length += dist(graph, nodes[i2], nodes[wrap2(i2 + 1)]); - if (length < lengths[i2]) { - lengths[i2] = length; - } - } - for (i2 = 0; i2 < nodes.length; i2++) { - var cost = lengths[i2] / dist(graph, nodes[idxA], nodes[i2]); - if (cost > best) { - idxB = i2; - best = cost; - } - } - return idxB; - } - function totalLengthBetweenNodes(graph, nodes) { - var totalLength = 0; - for (var i2 = 0; i2 < nodes.length - 1; i2++) { - totalLength += dist(graph, nodes[i2], nodes[i2 + 1]); - } - return totalLength; - } - function split(graph, nodeId, wayA, newWayId) { - var wayB = osmWay({ id: newWayId, tags: wayA.tags }); - var origNodes = wayA.nodes.slice(); - var nodesA; - var nodesB; - var isArea = wayA.isArea(); - var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph); - if (wayA.isClosed()) { - var nodes = wayA.nodes.slice(0, -1); - var idxA = nodes.indexOf(nodeId); - var idxB = splitArea(nodes, idxA, graph); - if (idxB < idxA) { - nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1)); - nodesB = nodes.slice(idxB, idxA + 1); - } else { - nodesA = nodes.slice(idxA, idxB + 1); - nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1)); + do { + numberNewPoints++; + eachAngle = totalAngle / (indexRange + numberNewPoints); + } while (Math.abs(eachAngle) > maxAngle); + for (j3 = 1; j3 < indexRange; j3++) { + angle2 = startAngle + j3 * eachAngle; + loc = projection2.invert([ + centroid[0] + Math.cos(angle2) * radius, + centroid[1] + Math.sin(angle2) * radius + ]); + node = nodes[(j3 + startNodeIndex) % nodes.length]; + origNode = origNodes[node.id]; + nearNodes[node.id] = angle2; + node = node.move(geoVecInterp(origNode.loc, loc, t2)); + graph = graph.replace(node); } - } else { - var idx = wayA.nodes.indexOf(nodeId, 1); - nodesA = wayA.nodes.slice(0, idx + 1); - nodesB = wayA.nodes.slice(idx); - } - var lengthA = totalLengthBetweenNodes(graph, nodesA); - var lengthB = totalLengthBetweenNodes(graph, nodesB); - if (_keepHistoryOn === "longest" && lengthB > lengthA) { - wayA = wayA.update({ nodes: nodesB }); - wayB = wayB.update({ nodes: nodesA }); - var temp = lengthA; - lengthA = lengthB; - lengthB = temp; - } else { - wayA = wayA.update({ nodes: nodesA }); - wayB = wayB.update({ nodes: nodesB }); - } - if (wayA.tags.step_count) { - var stepCount = parseFloat(wayA.tags.step_count); - if (stepCount && isFinite(stepCount) && stepCount > 0 && Math.round(stepCount) === stepCount) { - var tagsA = Object.assign({}, wayA.tags); - var tagsB = Object.assign({}, wayB.tags); - var ratioA = lengthA / (lengthA + lengthB); - var countA = Math.round(stepCount * ratioA); - tagsA.step_count = countA.toString(); - tagsB.step_count = (stepCount - countA).toString(); - wayA = wayA.update({ tags: tagsA }); - wayB = wayB.update({ tags: tagsB }); + for (j3 = 0; j3 < numberNewPoints; j3++) { + angle2 = startAngle + (indexRange + j3) * eachAngle; + loc = projection2.invert([ + centroid[0] + Math.cos(angle2) * radius, + centroid[1] + Math.sin(angle2) * radius + ]); + var min3 = Infinity; + for (var nodeId in nearNodes) { + var nearAngle = nearNodes[nodeId]; + var dist = Math.abs(nearAngle - angle2); + if (dist < min3) { + min3 = dist; + origNode = origNodes[nodeId]; + } + } + node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t2) }); + graph = graph.replace(node); + nodes.splice(endNodeIndex + j3, 0, node); + inBetweenNodes.push(node.id); } - } - graph = graph.replace(wayA); - graph = graph.replace(wayB); - graph.parentRelations(wayA).forEach(function(relation) { - var member; - if (relation.hasFromViaTo()) { - var f2 = relation.memberByRole("from"); - var v = relation.membersByRole("via"); - var t = relation.memberByRole("to"); - var i2; - if (f2.id === wayA.id || t.id === wayA.id) { - var keepB = false; - if (v.length === 1 && v[0].type === "node") { - keepB = wayB.contains(v[0].id); - } else { - for (i2 = 0; i2 < v.length; i2++) { - if (v[i2].type === "way") { - var wayVia = graph.hasEntity(v[i2].id); - if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) { - keepB = true; - break; - } - } + if (indexRange === 1 && inBetweenNodes.length) { + var startIndex1 = way.nodes.lastIndexOf(startNode.id); + var endIndex1 = way.nodes.lastIndexOf(endNode.id); + var wayDirection1 = endIndex1 - startIndex1; + if (wayDirection1 < -1) { + wayDirection1 = 1; + } + var parentWays = graph.parentWays(keyNodes[i3]); + for (j3 = 0; j3 < parentWays.length; j3++) { + var sharedWay = parentWays[j3]; + if (sharedWay === way) + continue; + if (sharedWay.areAdjacent(startNode.id, endNode.id)) { + var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id); + var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id); + var wayDirection2 = endIndex2 - startIndex2; + var insertAt = endIndex2; + if (wayDirection2 < -1) { + wayDirection2 = 1; } - } - if (keepB) { - relation = relation.replaceMember(wayA, wayB); - graph = graph.replace(relation); - } - } else { - for (i2 = 0; i2 < v.length; i2++) { - if (v[i2].type === "way" && v[i2].id === wayA.id) { - member = { - id: wayB.id, - type: "way", - role: "via" - }; - graph = actionAddMember(relation.id, member, v[i2].index + 1)(graph); - break; + if (wayDirection1 !== wayDirection2) { + inBetweenNodes.reverse(); + insertAt = startIndex2; } + for (k2 = 0; k2 < inBetweenNodes.length; k2++) { + sharedWay = sharedWay.addNode(inBetweenNodes[k2], insertAt + k2); + } + graph = graph.replace(sharedWay); } } - } else { - if (relation === isOuter) { - graph = graph.replace(relation.mergeTags(wayA.tags)); - graph = graph.replace(wayA.update({ tags: {} })); - graph = graph.replace(wayB.update({ tags: {} })); - } - member = { - id: wayB.id, - type: "way", - role: relation.memberById(wayA.id).role - }; - var insertPair = { - originalID: wayA.id, - insertedID: wayB.id, - nodes: origNodes - }; - graph = actionAddMember(relation.id, member, void 0, insertPair)(graph); } - }); - if (!isOuter && isArea) { - var multipolygon = osmRelation({ - tags: Object.assign({}, wayA.tags, { type: "multipolygon" }), - members: [ - { id: wayA.id, role: "outer", type: "way" }, - { id: wayB.id, role: "outer", type: "way" } - ] - }); - graph = graph.replace(multipolygon); - graph = graph.replace(wayA.update({ tags: {} })); - graph = graph.replace(wayB.update({ tags: {} })); } - _createdWayIDs.push(wayB.id); + ids = nodes.map(function(n3) { + return n3.id; + }); + ids.push(ids[0]); + way = way.update({ nodes: ids }); + graph = graph.replace(way); return graph; - } - var action = function(graph) { - _createdWayIDs = []; - var newWayIndex = 0; - for (var i2 = 0; i2 < nodeIds.length; i2++) { - var nodeId = nodeIds[i2]; - var candidates = action.waysForNode(nodeId, graph); - for (var j2 = 0; j2 < candidates.length; j2++) { - graph = split(graph, nodeId, candidates[j2], newWayIds && newWayIds[newWayIndex]); - newWayIndex += 1; + }; + action.makeConvex = function(graph) { + var way = graph.entity(wayId); + var nodes = utilArrayUniq(graph.childNodes(way)); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var sign2 = area_default3(points) > 0 ? 1 : -1; + var hull = hull_default(points); + var i3, j3; + if (sign2 === -1) { + nodes.reverse(); + points.reverse(); + } + for (i3 = 0; i3 < hull.length - 1; i3++) { + var startIndex = points.indexOf(hull[i3]); + var endIndex = points.indexOf(hull[i3 + 1]); + var indexRange = endIndex - startIndex; + if (indexRange < 0) { + indexRange += nodes.length; + } + for (j3 = 1; j3 < indexRange; j3++) { + var point2 = geoVecInterp(hull[i3], hull[i3 + 1], j3 / indexRange); + var node = nodes[(j3 + startIndex) % nodes.length].move(projection2.invert(point2)); + graph = graph.replace(node); } } return graph; }; - action.getCreatedWayIDs = function() { - return _createdWayIDs; - }; - action.waysForNode = function(nodeId, graph) { - var node = graph.entity(nodeId); - var splittableParents = graph.parentWays(node).filter(isSplittable); - if (!_wayIDs) { - var hasLine = splittableParents.some(function(parent) { - return parent.geometry(graph) === "line"; - }); - if (hasLine) { - return splittableParents.filter(function(parent) { - return parent.geometry(graph) === "line"; - }); + action.disabled = function(graph) { + if (!graph.entity(wayId).isClosed()) { + return "not_closed"; + } + var way = graph.entity(wayId); + var nodes = utilArrayUniq(graph.childNodes(way)); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var hull = hull_default(points); + var epsilonAngle = Math.PI / 180; + if (hull.length !== points.length || hull.length < 3) { + return false; + } + var centroid = centroid_default2(points); + var radius = geoVecLengthSquare(centroid, points[0]); + var i3, actualPoint; + for (i3 = 0; i3 < hull.length; i3++) { + actualPoint = hull[i3]; + var actualDist = geoVecLengthSquare(actualPoint, centroid); + var diff = Math.abs(actualDist - radius); + if (diff > 0.05 * radius) { + return false; } } - return splittableParents; - function isSplittable(parent) { - if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) + for (i3 = 0; i3 < hull.length; i3++) { + actualPoint = hull[i3]; + var nextPoint = hull[(i3 + 1) % hull.length]; + var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]); + var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]); + var angle2 = endAngle - startAngle; + if (angle2 < 0) { + angle2 = -angle2; + } + if (angle2 > Math.PI) { + angle2 = 2 * Math.PI - angle2; + } + if (angle2 > maxAngle + epsilonAngle) { return false; - if (parent.isClosed()) - return true; - for (var i2 = 1; i2 < parent.nodes.length - 1; i2++) { - if (parent.nodes[i2] === nodeId) - return true; } - return false; } + return "already_circular"; }; - action.ways = function(graph) { - return utilArrayUniq([].concat.apply([], nodeIds.map(function(nodeId) { - return action.waysForNode(nodeId, graph); - }))); - }; - action.disabled = function(graph) { - for (var i2 = 0; i2 < nodeIds.length; i2++) { - var nodeId = nodeIds[i2]; - var candidates = action.waysForNode(nodeId, graph); - if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) { - return "not_eligible"; + action.transitionable = true; + return action; + } + + // modules/actions/delete_way.js + function actionDeleteWay(wayID) { + function canDeleteNode(node, graph) { + if (graph.parentWays(node).length || graph.parentRelations(node).length) + return false; + var geometries = osmNodeGeometriesForTags(node.tags); + if (geometries.point) + return false; + if (geometries.vertex) + return true; + return !node.hasInterestingTags(); + } + var action = function(graph) { + var way = graph.entity(wayID); + graph.parentRelations(way).forEach(function(parent) { + parent = parent.removeMembersWithID(wayID); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); } - } + }); + new Set(way.nodes).forEach(function(nodeID) { + graph = graph.replace(way.removeNode(nodeID)); + var node = graph.entity(nodeID); + if (canDeleteNode(node, graph)) { + graph = graph.remove(node); + } + }); + return graph.remove(way); }; - action.limitWays = function(val) { - if (!arguments.length) - return _wayIDs; - _wayIDs = val; - return action; + return action; + } + + // modules/actions/delete_multiple.js + function actionDeleteMultiple(ids) { + var actions = { + way: actionDeleteWay, + node: actionDeleteNode, + relation: actionDeleteRelation }; - action.keepHistoryOn = function(val) { - if (!arguments.length) - return _keepHistoryOn; - _keepHistoryOn = val; - return action; + var action = function(graph) { + ids.forEach(function(id2) { + if (graph.hasEntity(id2)) { + graph = actions[graph.entity(id2).type](id2)(graph); + } + }); + return graph; }; return action; } - // modules/core/graph.js - function coreGraph(other, mutable) { - if (!(this instanceof coreGraph)) - return new coreGraph(other, mutable); - if (other instanceof coreGraph) { - var base = other.base(); - this.entities = Object.assign(Object.create(base.entities), other.entities); - this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays); - this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels); - } else { - this.entities = /* @__PURE__ */ Object.create({}); - this._parentWays = /* @__PURE__ */ Object.create({}); - this._parentRels = /* @__PURE__ */ Object.create({}); - this.rebase(other || [], [this]); + // modules/actions/delete_relation.js + function actionDeleteRelation(relationID, allowUntaggedMembers) { + function canDeleteEntity(entity, graph) { + return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && (!entity.hasInterestingTags() && !allowUntaggedMembers); } - this.transients = {}; - this._childNodes = {}; - this.frozen = !mutable; + var action = function(graph) { + var relation = graph.entity(relationID); + graph.parentRelations(relation).forEach(function(parent) { + parent = parent.removeMembersWithID(relationID); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); + var memberIDs = utilArrayUniq(relation.members.map(function(m2) { + return m2.id; + })); + memberIDs.forEach(function(memberID) { + graph = graph.replace(relation.removeMembersWithID(memberID)); + var entity = graph.entity(memberID); + if (canDeleteEntity(entity, graph)) { + graph = actionDeleteMultiple([memberID])(graph); + } + }); + return graph.remove(relation); + }; + return action; } - coreGraph.prototype = { - hasEntity: function(id2) { - return this.entities[id2]; - }, - entity: function(id2) { - var entity = this.entities[id2]; - if (!entity) { - entity = this.entities.__proto__[id2]; + + // modules/actions/delete_node.js + function actionDeleteNode(nodeId) { + var action = function(graph) { + var node = graph.entity(nodeId); + graph.parentWays(node).forEach(function(parent) { + parent = parent.removeNode(nodeId); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteWay(parent.id)(graph); + } + }); + graph.parentRelations(node).forEach(function(parent) { + parent = parent.removeMembersWithID(nodeId); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); + return graph.remove(node); + }; + return action; + } + + // modules/actions/connect.js + function actionConnect(nodeIDs) { + var action = function(graph) { + var survivor; + var node; + var parents; + var i3, j3; + nodeIDs.reverse(); + var interestingIDs = []; + for (i3 = 0; i3 < nodeIDs.length; i3++) { + node = graph.entity(nodeIDs[i3]); + if (node.hasInterestingTags()) { + if (!node.isNew()) { + interestingIDs.push(node.id); + } + } } - if (!entity) { - throw new Error("entity " + id2 + " not found"); + survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs)); + for (i3 = 0; i3 < nodeIDs.length; i3++) { + node = graph.entity(nodeIDs[i3]); + if (node.id === survivor.id) + continue; + parents = graph.parentWays(node); + for (j3 = 0; j3 < parents.length; j3++) { + graph = graph.replace(parents[j3].replaceNode(node.id, survivor.id)); + } + parents = graph.parentRelations(node); + for (j3 = 0; j3 < parents.length; j3++) { + graph = graph.replace(parents[j3].replaceMember(node, survivor)); + } + survivor = survivor.mergeTags(node.tags); + graph = actionDeleteNode(node.id)(graph); } - return entity; - }, - geometry: function(id2) { - return this.entity(id2).geometry(this); - }, - transient: function(entity, key, fn) { - var id2 = entity.id; - var transients = this.transients[id2] || (this.transients[id2] = {}); - if (transients[key] !== void 0) { - return transients[key]; + graph = graph.replace(survivor); + parents = graph.parentWays(survivor); + for (i3 = 0; i3 < parents.length; i3++) { + if (parents[i3].isDegenerate()) { + graph = actionDeleteWay(parents[i3].id)(graph); + } } - transients[key] = fn.call(entity); - return transients[key]; - }, - parentWays: function(entity) { - var parents = this._parentWays[entity.id]; - var result = []; - if (parents) { - parents.forEach(function(id2) { - result.push(this.entity(id2)); - }, this); + return graph; + }; + action.disabled = function(graph) { + var seen = {}; + var restrictionIDs = []; + var survivor; + var node, way; + var relations, relation, role; + var i3, j3, k2; + survivor = graph.entity(utilOldestID(nodeIDs)); + for (i3 = 0; i3 < nodeIDs.length; i3++) { + node = graph.entity(nodeIDs[i3]); + relations = graph.parentRelations(node); + for (j3 = 0; j3 < relations.length; j3++) { + relation = relations[j3]; + role = relation.memberById(node.id).role || ""; + if (relation.hasFromViaTo()) { + restrictionIDs.push(relation.id); + } + if (seen[relation.id] !== void 0 && seen[relation.id] !== role) { + return "relation"; + } else { + seen[relation.id] = role; + } + } } - return result; - }, - isPoi: function(entity) { - var parents = this._parentWays[entity.id]; - return !parents || parents.size === 0; - }, - isShared: function(entity) { - var parents = this._parentWays[entity.id]; - return parents && parents.size > 1; - }, - parentRelations: function(entity) { - var parents = this._parentRels[entity.id]; - var result = []; - if (parents) { - parents.forEach(function(id2) { - result.push(this.entity(id2)); - }, this); + for (i3 = 0; i3 < nodeIDs.length; i3++) { + node = graph.entity(nodeIDs[i3]); + var parents = graph.parentWays(node); + for (j3 = 0; j3 < parents.length; j3++) { + var parent = parents[j3]; + relations = graph.parentRelations(parent); + for (k2 = 0; k2 < relations.length; k2++) { + relation = relations[k2]; + if (relation.hasFromViaTo()) { + restrictionIDs.push(relation.id); + } + } + } } - return result; - }, - parentMultipolygons: function(entity) { - return this.parentRelations(entity).filter(function(relation) { - return relation.isMultipolygon(); - }); - }, - childNodes: function(entity) { - if (this._childNodes[entity.id]) - return this._childNodes[entity.id]; - if (!entity.nodes) - return []; - var nodes = []; - for (var i2 = 0; i2 < entity.nodes.length; i2++) { - nodes[i2] = this.entity(entity.nodes[i2]); - } - if (debug) - Object.freeze(nodes); - this._childNodes[entity.id] = nodes; - return this._childNodes[entity.id]; - }, - base: function() { - return { - "entities": Object.getPrototypeOf(this.entities), - "parentWays": Object.getPrototypeOf(this._parentWays), - "parentRels": Object.getPrototypeOf(this._parentRels) - }; - }, - rebase: function(entities, stack, force) { - var base = this.base(); - var i2, j2, k, id2; - for (i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; - if (!entity.visible || !force && base.entities[entity.id]) + restrictionIDs = utilArrayUniq(restrictionIDs); + for (i3 = 0; i3 < restrictionIDs.length; i3++) { + relation = graph.entity(restrictionIDs[i3]); + if (!relation.isComplete(graph)) continue; - base.entities[entity.id] = entity; - this._updateCalculated(void 0, entity, base.parentWays, base.parentRels); - if (entity.type === "way") { - for (j2 = 0; j2 < entity.nodes.length; j2++) { - id2 = entity.nodes[j2]; - for (k = 1; k < stack.length; k++) { - var ents = stack[k].entities; - if (ents.hasOwnProperty(id2) && ents[id2] === void 0) { - delete ents[id2]; - } - } - } + var memberWays = relation.members.filter(function(m2) { + return m2.type === "way"; + }).map(function(m2) { + return graph.entity(m2.id); + }); + memberWays = utilArrayUniq(memberWays); + var f3 = relation.memberByRole("from"); + var t2 = relation.memberByRole("to"); + var isUturn = f3.id === t2.id; + var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] }; + for (j3 = 0; j3 < relation.members.length; j3++) { + collectNodes(relation.members[j3], nodes); } - } - for (i2 = 0; i2 < stack.length; i2++) { - stack[i2]._updateRebased(); - } - }, - _updateRebased: function() { - var base = this.base(); - Object.keys(this._parentWays).forEach(function(child) { - if (base.parentWays[child]) { - base.parentWays[child].forEach(function(id2) { - if (!this.entities.hasOwnProperty(id2)) { - this._parentWays[child].add(id2); - } - }, this); + nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates)); + nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates)); + var filter2 = keyNodeFilter(nodes.keyfrom, nodes.keyto); + nodes.from = nodes.from.filter(filter2); + nodes.via = nodes.via.filter(filter2); + nodes.to = nodes.to.filter(filter2); + var connectFrom = false; + var connectVia = false; + var connectTo = false; + var connectKeyFrom = false; + var connectKeyTo = false; + for (j3 = 0; j3 < nodeIDs.length; j3++) { + var n3 = nodeIDs[j3]; + if (nodes.from.indexOf(n3) !== -1) { + connectFrom = true; + } + if (nodes.via.indexOf(n3) !== -1) { + connectVia = true; + } + if (nodes.to.indexOf(n3) !== -1) { + connectTo = true; + } + if (nodes.keyfrom.indexOf(n3) !== -1) { + connectKeyFrom = true; + } + if (nodes.keyto.indexOf(n3) !== -1) { + connectKeyTo = true; + } } - }, this); - Object.keys(this._parentRels).forEach(function(child) { - if (base.parentRels[child]) { - base.parentRels[child].forEach(function(id2) { - if (!this.entities.hasOwnProperty(id2)) { - this._parentRels[child].add(id2); - } - }, this); + if (connectFrom && connectTo && !isUturn) { + return "restriction"; } - }, this); - this.transients = {}; - }, - _updateCalculated: function(oldentity, entity, parentWays, parentRels) { - parentWays = parentWays || this._parentWays; - parentRels = parentRels || this._parentRels; - var type3 = entity && entity.type || oldentity && oldentity.type; - var removed, added, i2; - if (type3 === "way") { - if (oldentity && entity) { - removed = utilArrayDifference(oldentity.nodes, entity.nodes); - added = utilArrayDifference(entity.nodes, oldentity.nodes); - } else if (oldentity) { - removed = oldentity.nodes; - added = []; - } else if (entity) { - removed = []; - added = entity.nodes; + if (connectFrom && connectVia) { + return "restriction"; } - for (i2 = 0; i2 < removed.length; i2++) { - parentWays[removed[i2]] = new Set(parentWays[removed[i2]]); - parentWays[removed[i2]].delete(oldentity.id); + if (connectTo && connectVia) { + return "restriction"; } - for (i2 = 0; i2 < added.length; i2++) { - parentWays[added[i2]] = new Set(parentWays[added[i2]]); - parentWays[added[i2]].add(entity.id); + if (connectKeyFrom || connectKeyTo) { + if (nodeIDs.length !== 2) { + return "restriction"; + } + var n0 = null; + var n1 = null; + for (j3 = 0; j3 < memberWays.length; j3++) { + way = memberWays[j3]; + if (way.contains(nodeIDs[0])) { + n0 = nodeIDs[0]; + } + if (way.contains(nodeIDs[1])) { + n1 = nodeIDs[1]; + } + } + if (n0 && n1) { + var ok = false; + for (j3 = 0; j3 < memberWays.length; j3++) { + way = memberWays[j3]; + if (way.areAdjacent(n0, n1)) { + ok = true; + break; + } + } + if (!ok) { + return "restriction"; + } + } } - } else if (type3 === "relation") { - var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { - return m.id; - }) : []; - var entityMemberIDs = entity ? entity.members.map(function(m) { - return m.id; - }) : []; - if (oldentity && entity) { - removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs); - added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs); - } else if (oldentity) { - removed = oldentityMemberIDs; - added = []; - } else if (entity) { - removed = []; - added = entityMemberIDs; + for (j3 = 0; j3 < memberWays.length; j3++) { + way = memberWays[j3].update({}); + for (k2 = 0; k2 < nodeIDs.length; k2++) { + if (nodeIDs[k2] === survivor.id) + continue; + if (way.areAdjacent(nodeIDs[k2], survivor.id)) { + way = way.removeNode(nodeIDs[k2]); + } else { + way = way.replaceNode(nodeIDs[k2], survivor.id); + } + } + if (way.isDegenerate()) { + return "restriction"; + } } - for (i2 = 0; i2 < removed.length; i2++) { - parentRels[removed[i2]] = new Set(parentRels[removed[i2]]); - parentRels[removed[i2]].delete(oldentity.id); + } + return false; + function hasDuplicates(n4, i4, arr) { + return arr.indexOf(n4) !== arr.lastIndexOf(n4); + } + function keyNodeFilter(froms, tos) { + return function(n4) { + return froms.indexOf(n4) === -1 && tos.indexOf(n4) === -1; + }; + } + function collectNodes(member, collection) { + var entity = graph.hasEntity(member.id); + if (!entity) + return; + var role2 = member.role || ""; + if (!collection[role2]) { + collection[role2] = []; } - for (i2 = 0; i2 < added.length; i2++) { - parentRels[added[i2]] = new Set(parentRels[added[i2]]); - parentRels[added[i2]].add(entity.id); + if (member.type === "node") { + collection[role2].push(member.id); + if (role2 === "via") { + collection.keyfrom.push(member.id); + collection.keyto.push(member.id); + } + } else if (member.type === "way") { + collection[role2].push.apply(collection[role2], entity.nodes); + if (role2 === "from" || role2 === "via") { + collection.keyfrom.push(entity.first()); + collection.keyfrom.push(entity.last()); + } + if (role2 === "to" || role2 === "via") { + collection.keyto.push(entity.first()); + collection.keyto.push(entity.last()); + } } } - }, - replace: function(entity) { - if (this.entities[entity.id] === entity) - return this; - return this.update(function() { - this._updateCalculated(this.entities[entity.id], entity); - this.entities[entity.id] = entity; - }); - }, - remove: function(entity) { - return this.update(function() { - this._updateCalculated(entity, void 0); - this.entities[entity.id] = void 0; - }); - }, - revert: function(id2) { - var baseEntity = this.base().entities[id2]; - var headEntity = this.entities[id2]; - if (headEntity === baseEntity) - return this; - return this.update(function() { - this._updateCalculated(headEntity, baseEntity); - delete this.entities[id2]; + }; + return action; + } + + // modules/actions/copy_entities.js + function actionCopyEntities(ids, fromGraph) { + var _copies = {}; + var action = function(graph) { + ids.forEach(function(id3) { + fromGraph.entity(id3).copy(fromGraph, _copies); }); - }, - update: function() { - var graph = this.frozen ? coreGraph(this, true) : this; - for (var i2 = 0; i2 < arguments.length; i2++) { - arguments[i2].call(graph, graph); + for (var id2 in _copies) { + graph = graph.replace(_copies[id2]); } - if (this.frozen) - graph.frozen = true; return graph; - }, - load: function(entities) { - var base = this.base(); - this.entities = Object.create(base.entities); - for (var i2 in entities) { - this.entities[i2] = entities[i2]; - this._updateCalculated(base.entities[i2], this.entities[i2]); - } - return this; - } - }; + }; + action.copies = function() { + return _copies; + }; + return action; + } - // modules/osm/intersection.js - function osmTurn(turn) { - if (!(this instanceof osmTurn)) { - return new osmTurn(turn); - } - Object.assign(this, turn); + // modules/actions/delete_member.js + function actionDeleteMember(relationId, memberIndex) { + return function(graph) { + var relation = graph.entity(relationId).removeMember(memberIndex); + graph = graph.replace(relation); + if (relation.isDegenerate()) { + graph = actionDeleteRelation(relation.id)(graph); + } + return graph; + }; } - function osmIntersection(graph, startVertexId, maxDistance) { - maxDistance = maxDistance || 30; - var vgraph = coreGraph(); - var i2, j2, k; - function memberOfRestriction(entity) { - return graph.parentRelations(entity).some(function(r) { - return r.isRestriction(); - }); - } - function isRoad(way2) { - if (way2.isArea() || way2.isDegenerate()) - return false; - var roads = { - "motorway": true, - "motorway_link": true, - "trunk": true, - "trunk_link": true, - "primary": true, - "primary_link": true, - "secondary": true, - "secondary_link": true, - "tertiary": true, - "tertiary_link": true, - "residential": true, - "unclassified": true, - "living_street": true, - "service": true, - "road": true, - "track": true - }; - return roads[way2.tags.highway]; - } - var startNode = graph.entity(startVertexId); - var checkVertices = [startNode]; - var checkWays; - var vertices = []; - var vertexIds = []; - var vertex; - var ways = []; - var wayIds = []; - var way; - var nodes = []; - var node; - var parents = []; - var parent; - var actions = []; - while (checkVertices.length) { - vertex = checkVertices.pop(); - checkWays = graph.parentWays(vertex); - var hasWays = false; - for (i2 = 0; i2 < checkWays.length; i2++) { - way = checkWays[i2]; - if (!isRoad(way) && !memberOfRestriction(way)) - continue; - ways.push(way); - hasWays = true; - nodes = utilArrayUniq(graph.childNodes(way)); - for (j2 = 0; j2 < nodes.length; j2++) { - node = nodes[j2]; - if (node === vertex) - continue; - if (vertices.indexOf(node) !== -1) - continue; - if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) - continue; - var hasParents = false; - parents = graph.parentWays(node); - for (k = 0; k < parents.length; k++) { - parent = parents[k]; - if (parent === way) - continue; - if (ways.indexOf(parent) !== -1) - continue; - if (!isRoad(parent)) - continue; - hasParents = true; - break; - } - if (hasParents) { - checkVertices.push(node); + + // modules/actions/discard_tags.js + function actionDiscardTags(difference, discardTags) { + discardTags = discardTags || {}; + return (graph) => { + difference.modified().forEach(checkTags); + difference.created().forEach(checkTags); + return graph; + function checkTags(entity) { + const keys2 = Object.keys(entity.tags); + let didDiscard = false; + let tags = {}; + for (let i3 = 0; i3 < keys2.length; i3++) { + const k2 = keys2[i3]; + if (discardTags[k2] || !entity.tags[k2]) { + didDiscard = true; + } else { + tags[k2] = entity.tags[k2]; } } - } - if (hasWays) { - vertices.push(vertex); - } - } - vertices = utilArrayUniq(vertices); - ways = utilArrayUniq(ways); - ways.forEach(function(way2) { - graph.childNodes(way2).forEach(function(node2) { - vgraph = vgraph.replace(node2); - }); - vgraph = vgraph.replace(way2); - graph.parentRelations(way2).forEach(function(relation) { - if (relation.isRestriction()) { - if (relation.isValidRestriction(graph)) { - vgraph = vgraph.replace(relation); - } else if (relation.isComplete(graph)) { - actions.push(actionDeleteRelation(relation.id)); - } + if (didDiscard) { + graph = graph.replace(entity.update({ tags })); } - }); - }); - ways.forEach(function(w) { - var way2 = vgraph.entity(w.id); - if (way2.tags.oneway === "-1") { - var action = actionReverse(way2.id, { reverseOneway: true }); - actions.push(action); - vgraph = action(vgraph); - } - }); - var origCount = osmEntity.id.next.way; - vertices.forEach(function(v) { - var splitAll = actionSplit([v.id]).keepHistoryOn("first"); - if (!splitAll.disabled(vgraph)) { - splitAll.ways(vgraph).forEach(function(way2) { - var splitOne = actionSplit([v.id]).limitWays([way2.id]).keepHistoryOn("first"); - actions.push(splitOne); - vgraph = splitOne(vgraph); - }); } - }); - osmEntity.id.next.way = origCount; - vertexIds = vertices.map(function(v) { - return v.id; - }); - vertices = []; - ways = []; - vertexIds.forEach(function(id2) { - var vertex2 = vgraph.entity(id2); - var parents2 = vgraph.parentWays(vertex2); - vertices.push(vertex2); - ways = ways.concat(parents2); - }); - vertices = utilArrayUniq(vertices); - ways = utilArrayUniq(ways); - vertexIds = vertices.map(function(v) { - return v.id; - }); - wayIds = ways.map(function(w) { - return w.id; - }); - function withMetadata(way2, vertexIds2) { - var __oneWay = way2.isOneWay(); - var __first = vertexIds2.indexOf(way2.first()) !== -1; - var __last = vertexIds2.indexOf(way2.last()) !== -1; - var __via = __first && __last; - var __from = __first && !__oneWay || __last; - var __to = __first || __last && !__oneWay; - return way2.update({ - __first, - __last, - __from, - __via, - __to, - __oneWay + }; + } + + // modules/actions/disconnect.js + function actionDisconnect(nodeId, newNodeId) { + var wayIds; + var disconnectableRelationTypes = { + "associatedStreet": true, + "enforcement": true, + "site": true + }; + var action = function(graph) { + var node = graph.entity(nodeId); + var connections = action.connections(graph); + connections.forEach(function(connection) { + var way = graph.entity(connection.wayID); + var newNode = osmNode({ id: newNodeId, loc: node.loc, tags: node.tags }); + graph = graph.replace(newNode); + if (connection.index === 0 && way.isArea()) { + graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id)); + } else if (way.isClosed() && connection.index === way.nodes.length - 1) { + graph = graph.replace(way.unclose().addNode(newNode.id)); + } else { + graph = graph.replace(way.updateNode(newNode.id, connection.index)); + } }); - } - ways = []; - wayIds.forEach(function(id2) { - var way2 = withMetadata(vgraph.entity(id2), vertexIds); - vgraph = vgraph.replace(way2); - ways.push(way2); - }); - var keepGoing; - var removeWayIds = []; - var removeVertexIds = []; - do { - keepGoing = false; - checkVertices = vertexIds.slice(); - for (i2 = 0; i2 < checkVertices.length; i2++) { - var vertexId = checkVertices[i2]; - vertex = vgraph.hasEntity(vertexId); - if (!vertex) { - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); - } - removeVertexIds.push(vertexId); + return graph; + }; + action.connections = function(graph) { + var candidates = []; + var keeping = false; + var parentWays = graph.parentWays(graph.entity(nodeId)); + var way, waynode; + for (var i3 = 0; i3 < parentWays.length; i3++) { + way = parentWays[i3]; + if (wayIds && wayIds.indexOf(way.id) === -1) { + keeping = true; continue; } - parents = vgraph.parentWays(vertex); - if (parents.length < 3) { - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); - } - } - if (parents.length === 2) { - var a = parents[0]; - var b = parents[1]; - var aIsLeaf = a && !a.__via; - var bIsLeaf = b && !b.__via; - var leaf, survivor; - if (aIsLeaf && !bIsLeaf) { - leaf = a; - survivor = b; - } else if (!aIsLeaf && bIsLeaf) { - leaf = b; - survivor = a; - } - if (leaf && survivor) { - survivor = withMetadata(survivor, vertexIds); - vgraph = vgraph.replace(survivor).remove(leaf); - removeWayIds.push(leaf.id); - keepGoing = true; - } - } - parents = vgraph.parentWays(vertex); - if (parents.length < 2) { - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); + if (way.isArea() && way.nodes[0] === nodeId) { + candidates.push({ wayID: way.id, index: 0 }); + } else { + for (var j3 = 0; j3 < way.nodes.length; j3++) { + waynode = way.nodes[j3]; + if (waynode === nodeId) { + if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j3 === way.nodes.length - 1) { + continue; + } + candidates.push({ wayID: way.id, index: j3 }); + } } - removeVertexIds.push(vertexId); - keepGoing = true; - } - if (parents.length < 1) { - vgraph = vgraph.remove(vertex); } } - } while (keepGoing); - vertices = vertices.filter(function(vertex2) { - return removeVertexIds.indexOf(vertex2.id) === -1; - }).map(function(vertex2) { - return vgraph.entity(vertex2.id); - }); - ways = ways.filter(function(way2) { - return removeWayIds.indexOf(way2.id) === -1; - }).map(function(way2) { - return vgraph.entity(way2.id); - }); - var intersection = { - graph: vgraph, - actions, - vertices, - ways + return keeping ? candidates : candidates.slice(1); }; - intersection.turns = function(fromWayId, maxViaWay) { - if (!fromWayId) - return []; - if (!maxViaWay) - maxViaWay = 0; - var vgraph2 = intersection.graph; - var keyVertexIds = intersection.vertices.map(function(v) { - return v.id; - }); - var start2 = vgraph2.entity(fromWayId); - if (!start2 || !(start2.__from || start2.__via)) - return []; - var maxPathLength = maxViaWay * 2 + 3; - var turns = []; - step(start2); - return turns; - function step(entity, currPath, currRestrictions, matchedRestriction) { - currPath = (currPath || []).slice(); - if (currPath.length >= maxPathLength) - return; - currPath.push(entity.id); - currRestrictions = (currRestrictions || []).slice(); - var i3, j3; - if (entity.type === "node") { - var parents2 = vgraph2.parentWays(entity); - var nextWays = []; - for (i3 = 0; i3 < parents2.length; i3++) { - var way2 = parents2[i3]; - if (way2.__oneWay && way2.nodes[0] !== entity.id) - continue; - if (currPath.indexOf(way2.id) !== -1 && currPath.length >= 3) - continue; - var restrict = null; - for (j3 = 0; j3 < currRestrictions.length; j3++) { - var restriction = currRestrictions[j3]; - var f2 = restriction.memberByRole("from"); - var v = restriction.membersByRole("via"); - var t = restriction.memberByRole("to"); - var isOnly = /^only_/.test(restriction.tags.restriction); - var matchesFrom = f2.id === fromWayId; - var matchesViaTo = false; - var isAlongOnlyPath = false; - if (t.id === way2.id) { - if (v.length === 1 && v[0].type === "node") { - matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2); - } else { - var pathVias = []; - for (k = 2; k < currPath.length; k += 2) { - pathVias.push(currPath[k]); - } - var restrictionVias = []; - for (k = 0; k < v.length; k++) { - if (v[k].type === "way") { - restrictionVias.push(v[k].id); - } - } - var diff = utilArrayDifference(pathVias, restrictionVias); - matchesViaTo = !diff.length; - } - } else if (isOnly) { - for (k = 0; k < v.length; k++) { - if (v[k].type === "way" && v[k].id === way2.id) { - isAlongOnlyPath = true; - break; - } - } - } - if (matchesViaTo) { - if (isOnly) { - restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, only: true, end: true }; - } else { - restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, no: true, end: true }; - } - } else { - if (isAlongOnlyPath) { - restrict = { id: restriction.id, direct: false, from: f2.id, only: true, end: false }; - } else if (isOnly) { - restrict = { id: restriction.id, direct: false, from: f2.id, no: true, end: true }; - } - } - if (restrict && restrict.direct) - break; - } - nextWays.push({ way: way2, restrict }); - } - nextWays.forEach(function(nextWay) { - step(nextWay.way, currPath, currRestrictions, nextWay.restrict); - }); - } else { - if (currPath.length >= 3) { - var turnPath = currPath.slice(); - if (matchedRestriction && matchedRestriction.direct === false) { - for (i3 = 0; i3 < turnPath.length; i3++) { - if (turnPath[i3] === matchedRestriction.from) { - turnPath = turnPath.slice(i3); - break; - } - } - } - var turn = pathToTurn(turnPath); - if (turn) { - if (matchedRestriction) { - turn.restrictionID = matchedRestriction.id; - turn.no = matchedRestriction.no; - turn.only = matchedRestriction.only; - turn.direct = matchedRestriction.direct; + action.disabled = function(graph) { + var connections = action.connections(graph); + if (connections.length === 0) + return "not_connected"; + var parentWays = graph.parentWays(graph.entity(nodeId)); + var seenRelationIds = {}; + var sharedRelation; + parentWays.forEach(function(way) { + var relations = graph.parentRelations(way); + relations.filter((relation) => !disconnectableRelationTypes[relation.tags.type]).forEach(function(relation) { + if (relation.id in seenRelationIds) { + if (wayIds) { + if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) { + sharedRelation = relation; } - turns.push(osmTurn(turn)); + } else { + sharedRelation = relation; } - if (currPath[0] === currPath[2]) - return; - } - if (matchedRestriction && matchedRestriction.end) - return; - var n1 = vgraph2.entity(entity.first()); - var n2 = vgraph2.entity(entity.last()); - var dist = geoSphericalDistance(n1.loc, n2.loc); - var nextNodes = []; - if (currPath.length > 1) { - if (dist > maxDistance) - return; - if (!entity.__via) - return; - } - if (!entity.__oneWay && keyVertexIds.indexOf(n1.id) !== -1 && currPath.indexOf(n1.id) === -1) { - nextNodes.push(n1); - } - if (keyVertexIds.indexOf(n2.id) !== -1 && currPath.indexOf(n2.id) === -1) { - nextNodes.push(n2); - } - nextNodes.forEach(function(nextNode) { - var fromRestrictions = vgraph2.parentRelations(entity).filter(function(r) { - if (!r.isRestriction()) - return false; - var f3 = r.memberByRole("from"); - if (!f3 || f3.id !== entity.id) - return false; - var isOnly2 = /^only_/.test(r.tags.restriction); - if (!isOnly2) - return true; - var isOnlyVia = false; - var v2 = r.membersByRole("via"); - if (v2.length === 1 && v2[0].type === "node") { - isOnlyVia = v2[0].id === nextNode.id; - } else { - for (var i4 = 0; i4 < v2.length; i4++) { - if (v2[i4].type !== "way") - continue; - var viaWay = vgraph2.entity(v2[i4].id); - if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) { - isOnlyVia = true; - break; - } - } - } - return isOnlyVia; - }); - step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false); - }); - } - } - function pathToTurn(path) { - if (path.length < 3) - return; - var fromWayId2, fromNodeId, fromVertexId; - var toWayId, toNodeId, toVertexId; - var viaWayIds, viaNodeId, isUturn; - fromWayId2 = path[0]; - toWayId = path[path.length - 1]; - if (path.length === 3 && fromWayId2 === toWayId) { - var way2 = vgraph2.entity(fromWayId2); - if (way2.__oneWay) - return null; - isUturn = true; - viaNodeId = fromVertexId = toVertexId = path[1]; - fromNodeId = toNodeId = adjacentNode(fromWayId2, viaNodeId); - } else { - isUturn = false; - fromVertexId = path[1]; - fromNodeId = adjacentNode(fromWayId2, fromVertexId); - toVertexId = path[path.length - 2]; - toNodeId = adjacentNode(toWayId, toVertexId); - if (path.length === 3) { - viaNodeId = path[1]; } else { - viaWayIds = path.filter(function(entityId) { - return entityId[0] === "w"; - }); - viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); + seenRelationIds[relation.id] = way.id; } - } - return { - key: path.join("_"), - path, - from: { node: fromNodeId, way: fromWayId2, vertex: fromVertexId }, - via: { node: viaNodeId, ways: viaWayIds }, - to: { node: toNodeId, way: toWayId, vertex: toVertexId }, - u: isUturn - }; - function adjacentNode(wayId, affixId) { - var nodes2 = vgraph2.entity(wayId).nodes; - return affixId === nodes2[0] ? nodes2[1] : nodes2[nodes2.length - 2]; - } - } + }); + }); + if (sharedRelation) + return "relation"; }; - return intersection; + action.limitWays = function(val) { + if (!arguments.length) + return wayIds; + wayIds = val; + return action; + }; + return action; } - function osmInferRestriction(graph, turn, projection2) { - var fromWay = graph.entity(turn.from.way); - var fromNode = graph.entity(turn.from.node); - var fromVertex = graph.entity(turn.from.vertex); - var toWay = graph.entity(turn.to.way); - var toNode = graph.entity(turn.to.node); - var toVertex = graph.entity(turn.to.vertex); - var fromOneWay = fromWay.tags.oneway === "yes"; - var toOneWay = toWay.tags.oneway === "yes"; - var angle2 = (geoAngle(fromVertex, fromNode, projection2) - geoAngle(toVertex, toNode, projection2)) * 180 / Math.PI; - while (angle2 < 0) { - angle2 += 360; - } - if (fromNode === toNode) { - return "no_u_turn"; - } - if ((angle2 < 23 || angle2 > 336) && fromOneWay && toOneWay) { - return "no_u_turn"; - } - if ((angle2 < 40 || angle2 > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) { - return "no_u_turn"; - } - if (angle2 < 158) { - return "no_right_turn"; + + // modules/actions/extract.js + function actionExtract(entityID, projection2) { + var extractedNodeID; + var action = function(graph) { + var entity = graph.entity(entityID); + if (entity.type === "node") { + return extractFromNode(entity, graph); + } + return extractFromWayOrRelation(entity, graph); + }; + function extractFromNode(node, graph) { + extractedNodeID = node.id; + var replacement = osmNode({ loc: node.loc }); + graph = graph.replace(replacement); + graph = graph.parentWays(node).reduce(function(accGraph, parentWay) { + return accGraph.replace(parentWay.replaceNode(entityID, replacement.id)); + }, graph); + return graph.parentRelations(node).reduce(function(accGraph, parentRel) { + return accGraph.replace(parentRel.replaceMember(node, replacement)); + }, graph); } - if (angle2 > 202) { - return "no_left_turn"; + function extractFromWayOrRelation(entity, graph) { + var fromGeometry = entity.geometry(graph); + var keysToCopyAndRetain = ["source", "wheelchair"]; + var keysToRetain = ["area"]; + var buildingKeysToRetain = ["architect", "building", "height", "layer"]; + var extractedLoc = path_default(projection2).centroid(entity.asGeoJSON(graph)); + extractedLoc = extractedLoc && projection2.invert(extractedLoc); + if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) { + extractedLoc = entity.extent(graph).center(); + } + var indoorAreaValues = { + area: true, + corridor: true, + elevator: true, + level: true, + room: true + }; + var isBuilding = entity.tags.building && entity.tags.building !== "no" || entity.tags["building:part"] && entity.tags["building:part"] !== "no"; + var isIndoorArea = fromGeometry === "area" && entity.tags.indoor && indoorAreaValues[entity.tags.indoor]; + var entityTags = Object.assign({}, entity.tags); + var pointTags = {}; + for (var key in entityTags) { + if (entity.type === "relation" && key === "type") { + continue; + } + if (keysToRetain.indexOf(key) !== -1) { + continue; + } + if (isBuilding) { + if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) + continue; + } + if (isIndoorArea && key === "indoor") { + continue; + } + pointTags[key] = entityTags[key]; + if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) { + continue; + } else if (isIndoorArea && key === "level") { + continue; + } + delete entityTags[key]; + } + if (!isBuilding && !isIndoorArea && fromGeometry === "area") { + entityTags.area = "yes"; + } + var replacement = osmNode({ loc: extractedLoc, tags: pointTags }); + graph = graph.replace(replacement); + extractedNodeID = replacement.id; + return graph.replace(entity.update({ tags: entityTags })); } - return "no_straight_on"; + action.getExtractedNodeID = function() { + return extractedNodeID; + }; + return action; } - // modules/actions/merge_polygon.js - function actionMergePolygon(ids, newRelationId) { - function groupEntities(graph) { + // modules/actions/join.js + function actionJoin(ids) { + function groupEntitiesByGeometry(graph) { var entities = ids.map(function(id2) { return graph.entity(id2); }); - var geometryGroups = utilArrayGroupBy(entities, function(entity) { - if (entity.type === "way" && entity.isClosed()) { - return "closedWay"; - } else if (entity.type === "relation" && entity.isMultipolygon()) { - return "multipolygon"; - } else { - return "other"; - } - }); return Object.assign( - { closedWay: [], multipolygon: [], other: [] }, - geometryGroups + { line: [] }, + utilArrayGroupBy(entities, function(entity) { + return entity.geometry(graph); + }) ); } var action = function(graph) { - var entities = groupEntities(graph); - var polygons = entities.multipolygon.reduce(function(polygons2, m) { - return polygons2.concat(osmJoinWays(m.members, graph)); - }, []).concat(entities.closedWay.map(function(d) { - var member = [{ id: d.id }]; - member.nodes = graph.childNodes(d); - return member; - })); - var contained = polygons.map(function(w, i2) { - return polygons.map(function(d, n2) { - if (i2 === n2) - return null; - return geoPolygonContainsPolygon( - d.nodes.map(function(n3) { - return n3.loc; - }), - w.nodes.map(function(n3) { - return n3.loc; - }) - ); - }); + var ways = ids.map(graph.entity, graph); + var survivorID = utilOldestID(ways.map((way) => way.id)); + ways.sort(function(a2, b2) { + var aSided = a2.isSided(); + var bSided = b2.isSided(); + return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0; }); - var members = []; - var outer = true; - while (polygons.length) { - extractUncontained(polygons); - polygons = polygons.filter(isContained); - contained = contained.filter(isContained).map(filterContained); - } - function isContained(d, i2) { - return contained[i2].some(function(val) { - return val; - }); - } - function filterContained(d) { - return d.filter(isContained); - } - function extractUncontained(polygons2) { - polygons2.forEach(function(d, i2) { - if (!isContained(d, i2)) { - d.forEach(function(member) { - members.push({ - type: "way", - id: member.id, - role: outer ? "outer" : "inner" - }); - }); - } + var sequences = osmJoinWays(ways, graph); + var joined = sequences[0]; + graph = sequences.actions.reduce(function(g3, action2) { + return action2(g3); + }, graph); + var survivor = graph.entity(survivorID); + survivor = survivor.update({ nodes: joined.nodes.map(function(n3) { + return n3.id; + }) }); + graph = graph.replace(survivor); + joined.forEach(function(way) { + if (way.id === survivorID) + return; + graph.parentRelations(way).forEach(function(parent) { + graph = graph.replace(parent.replaceMember(way, survivor)); }); - outer = !outer; - } - var relation; - if (entities.multipolygon.length > 0) { - var oldestID = utilOldestID(entities.multipolygon.map((entity) => entity.id)); - relation = entities.multipolygon.find((entity) => entity.id === oldestID); - } else { - relation = osmRelation({ id: newRelationId, tags: { type: "multipolygon" } }); - } - entities.multipolygon.forEach(function(m) { - if (m.id !== relation.id) { - relation = relation.mergeTags(m.tags); - graph = graph.remove(m); - } + survivor = survivor.mergeTags(way.tags); + graph = graph.replace(survivor); + graph = actionDeleteWay(way.id)(graph); }); - entities.closedWay.forEach(function(way) { - function isThisOuter(m) { - return m.id === way.id && m.role !== "inner"; + function checkForSimpleMultipolygon() { + if (!survivor.isClosed()) + return; + var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon2) { + return multipolygon2.members.length === 1; + }); + if (multipolygons.length !== 1) + return; + var multipolygon = multipolygons[0]; + for (var key in survivor.tags) { + if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged + multipolygon.tags[key] !== survivor.tags[key]) + return; } - if (members.some(isThisOuter)) { - relation = relation.mergeTags(way.tags); - graph = graph.replace(way.update({ tags: {} })); + survivor = survivor.mergeTags(multipolygon.tags); + graph = graph.replace(survivor); + graph = actionDeleteRelation( + multipolygon.id, + true + /* allow untagged members */ + )(graph); + var tags = Object.assign({}, survivor.tags); + if (survivor.geometry(graph) !== "area") { + tags.area = "yes"; } - }); - return graph.replace(relation.update({ - members, - tags: utilObjectOmit(relation.tags, ["area"]) - })); + delete tags.type; + survivor = survivor.update({ tags }); + graph = graph.replace(survivor); + } + checkForSimpleMultipolygon(); + return graph; + }; + action.resultingWayNodesLength = function(graph) { + return ids.reduce(function(count, id2) { + return count + graph.entity(id2).nodes.length; + }, 0) - ids.length - 1; }; action.disabled = function(graph) { - var entities = groupEntities(graph); - if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) { + var geometries = groupEntitiesByGeometry(graph); + if (ids.length < 2 || ids.length !== geometries.line.length) { return "not_eligible"; } - if (!entities.multipolygon.every(function(r) { - return r.isComplete(graph); - })) { - return "incomplete_relation"; + var joined = osmJoinWays(ids.map(graph.entity, graph), graph); + if (joined.length > 1) { + return "not_adjacent"; } - if (!entities.multipolygon.length) { - var sharedMultipolygons = []; - entities.closedWay.forEach(function(way, i2) { - if (i2 === 0) { - sharedMultipolygons = graph.parentMultipolygons(way); - } else { - sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way)); + var i3; + var sortedParentRelations = function(id2) { + return graph.parentRelations(graph.entity(id2)).filter((rel) => !rel.isRestriction() && !rel.isConnectivity()).sort((a2, b2) => a2.id - b2.id); + }; + var relsA = sortedParentRelations(ids[0]); + for (i3 = 1; i3 < ids.length; i3++) { + var relsB = sortedParentRelations(ids[i3]); + if (!utilArrayIdentical(relsA, relsB)) { + return "conflicting_relations"; + } + } + for (i3 = 0; i3 < ids.length - 1; i3++) { + for (var j3 = i3 + 1; j3 < ids.length; j3++) { + var path1 = graph.childNodes(graph.entity(ids[i3])).map(function(e3) { + return e3.loc; + }); + var path2 = graph.childNodes(graph.entity(ids[j3])).map(function(e3) { + return e3.loc; + }); + var intersections = geoPathIntersections(path1, path2); + var common = utilArrayIntersection( + joined[0].nodes.map(function(n3) { + return n3.loc.toString(); + }), + intersections.map(function(n3) { + return n3.toString(); + }) + ); + if (common.length !== intersections.length) { + return "paths_intersect"; + } + } + } + var nodeIds = joined[0].nodes.map(function(n3) { + return n3.id; + }).slice(1, -1); + var relation; + var tags = {}; + var conflicting = false; + joined[0].forEach(function(way) { + var parents = graph.parentRelations(way); + parents.forEach(function(parent) { + if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function(m2) { + return nodeIds.indexOf(m2.id) >= 0; + })) { + relation = parent; } }); - sharedMultipolygons = sharedMultipolygons.filter(function(relation) { - return relation.members.length === entities.closedWay.length; - }); - if (sharedMultipolygons.length) { - return "not_eligible"; + for (var k2 in way.tags) { + if (!(k2 in tags)) { + tags[k2] = way.tags[k2]; + } else if (tags[k2] && osmIsInterestingTag(k2) && tags[k2] !== way.tags[k2]) { + conflicting = true; + } } - } else if (entities.closedWay.some(function(way) { - return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length; - })) { - return "not_eligible"; + }); + if (relation) { + return relation.isRestriction() ? "restriction" : "connectivity"; + } + if (conflicting) { + return "conflicting_tags"; } }; return action; } - // modules/actions/merge_remote_changes.js - var import_fast_deep_equal = __toESM(require_fast_deep_equal()); - - // node_modules/node-diff3/index.mjs - function LCS(buffer1, buffer2) { - let equivalenceClasses = {}; - for (let j2 = 0; j2 < buffer2.length; j2++) { - const item = buffer2[j2]; - if (equivalenceClasses[item]) { - equivalenceClasses[item].push(j2); - } else { - equivalenceClasses[item] = [j2]; - } + // modules/actions/merge.js + function actionMerge(ids) { + function groupEntitiesByGeometry(graph) { + var entities = ids.map(function(id2) { + return graph.entity(id2); + }); + return Object.assign( + { point: [], area: [], line: [], relation: [] }, + utilArrayGroupBy(entities, function(entity) { + return entity.geometry(graph); + }) + ); } - const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null }; - let candidates = [NULLRESULT]; - for (let i2 = 0; i2 < buffer1.length; i2++) { - const item = buffer1[i2]; - const buffer2indices = equivalenceClasses[item] || []; - let r = 0; - let c = candidates[0]; - for (let jx = 0; jx < buffer2indices.length; jx++) { - const j2 = buffer2indices[jx]; - let s; - for (s = r; s < candidates.length; s++) { - if (candidates[s].buffer2index < j2 && (s === candidates.length - 1 || candidates[s + 1].buffer2index > j2)) { - break; - } - } - if (s < candidates.length) { - const newCandidate = { buffer1index: i2, buffer2index: j2, chain: candidates[s] }; - if (r === candidates.length) { - candidates.push(c); - } else { - candidates[r] = c; + var action = function(graph) { + var geometries = groupEntitiesByGeometry(graph); + var target = geometries.area[0] || geometries.line[0]; + var points = geometries.point; + points.forEach(function(point2) { + target = target.mergeTags(point2.tags); + graph = graph.replace(target); + graph.parentRelations(point2).forEach(function(parent) { + graph = graph.replace(parent.replaceMember(point2, target)); + }); + var nodes = utilArrayUniq(graph.childNodes(target)); + var removeNode = point2; + if (!point2.isNew()) { + var inserted = false; + var canBeReplaced = function(node2) { + return !(graph.parentWays(node2).length > 1 || graph.parentRelations(node2).length); + }; + var replaceNode = function(node2) { + graph = graph.replace(point2.update({ tags: node2.tags, loc: node2.loc })); + target = target.replaceNode(node2.id, point2.id); + graph = graph.replace(target); + removeNode = node2; + inserted = true; + }; + var i3; + var node; + for (i3 = 0; i3 < nodes.length; i3++) { + node = nodes[i3]; + if (canBeReplaced(node) && node.isNew()) { + replaceNode(node); + break; + } } - r = s + 1; - c = newCandidate; - if (r === candidates.length) { - break; + if (!inserted && point2.hasInterestingTags()) { + for (i3 = 0; i3 < nodes.length; i3++) { + node = nodes[i3]; + if (canBeReplaced(node) && !node.hasInterestingTags()) { + replaceNode(node); + break; + } + } + if (!inserted) { + for (i3 = 0; i3 < nodes.length; i3++) { + node = nodes[i3]; + if (canBeReplaced(node) && utilCompareIDs(point2.id, node.id) < 0) { + replaceNode(node); + break; + } + } + } } } + graph = graph.remove(removeNode); + }); + if (target.tags.area === "yes") { + var tags = Object.assign({}, target.tags); + delete tags.area; + if (osmTagSuggestingArea(tags)) { + target = target.update({ tags }); + graph = graph.replace(target); + } } - candidates[r] = c; - } - return candidates[candidates.length - 1]; + return graph; + }; + action.disabled = function(graph) { + var geometries = groupEntitiesByGeometry(graph); + if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) { + return "not_eligible"; + } + }; + return action; } - function diffIndices(buffer1, buffer2) { - const lcs = LCS(buffer1, buffer2); - let result = []; - let tail1 = buffer1.length; - let tail2 = buffer2.length; - for (let candidate = lcs; candidate !== null; candidate = candidate.chain) { - const mismatchLength1 = tail1 - candidate.buffer1index - 1; - const mismatchLength2 = tail2 - candidate.buffer2index - 1; - tail1 = candidate.buffer1index; - tail2 = candidate.buffer2index; - if (mismatchLength1 || mismatchLength2) { - result.push({ - buffer1: [tail1 + 1, mismatchLength1], - buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1), - buffer2: [tail2 + 1, mismatchLength2], - buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2) - }); + + // modules/actions/merge_nodes.js + function actionMergeNodes(nodeIDs, loc) { + function chooseLoc(graph) { + if (!nodeIDs.length) + return null; + var sum = [0, 0]; + var interestingCount = 0; + var interestingLoc; + for (var i3 = 0; i3 < nodeIDs.length; i3++) { + var node = graph.entity(nodeIDs[i3]); + if (node.hasInterestingTags()) { + interestingLoc = ++interestingCount === 1 ? node.loc : null; + } + sum = geoVecAdd(sum, node.loc); } + return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length); } - result.reverse(); - return result; - } - function diff3MergeRegions(a, o, b) { - let hunks = []; - function addHunk(h, ab) { - hunks.push({ - ab, - oStart: h.buffer1[0], - oLength: h.buffer1[1], - abStart: h.buffer2[0], - abLength: h.buffer2[1] - }); - } - diffIndices(o, a).forEach((item) => addHunk(item, "a")); - diffIndices(o, b).forEach((item) => addHunk(item, "b")); - hunks.sort((x, y) => x.oStart - y.oStart); - let results = []; - let currOffset = 0; - function advanceTo(endOffset) { - if (endOffset > currOffset) { - results.push({ - stable: true, - buffer: "o", - bufferStart: currOffset, - bufferLength: endOffset - currOffset, - bufferContent: o.slice(currOffset, endOffset) - }); - currOffset = endOffset; - } - } - while (hunks.length) { - let hunk = hunks.shift(); - let regionStart = hunk.oStart; - let regionEnd = hunk.oStart + hunk.oLength; - let regionHunks = [hunk]; - advanceTo(regionStart); - while (hunks.length) { - const nextHunk = hunks[0]; - const nextHunkStart = nextHunk.oStart; - if (nextHunkStart > regionEnd) - break; - regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength); - regionHunks.push(hunks.shift()); + var action = function(graph) { + if (nodeIDs.length < 2) + return graph; + var toLoc = loc; + if (!toLoc) { + toLoc = chooseLoc(graph); } - if (regionHunks.length === 1) { - if (hunk.abLength > 0) { - const buffer = hunk.ab === "a" ? a : b; - results.push({ - stable: true, - buffer: hunk.ab, - bufferStart: hunk.abStart, - bufferLength: hunk.abLength, - bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength) - }); - } - } else { - let bounds = { - a: [a.length, -1, o.length, -1], - b: [b.length, -1, o.length, -1] - }; - while (regionHunks.length) { - hunk = regionHunks.shift(); - const oStart = hunk.oStart; - const oEnd = oStart + hunk.oLength; - const abStart = hunk.abStart; - const abEnd = abStart + hunk.abLength; - let b2 = bounds[hunk.ab]; - b2[0] = Math.min(abStart, b2[0]); - b2[1] = Math.max(abEnd, b2[1]); - b2[2] = Math.min(oStart, b2[2]); - b2[3] = Math.max(oEnd, b2[3]); + for (var i3 = 0; i3 < nodeIDs.length; i3++) { + var node = graph.entity(nodeIDs[i3]); + if (node.loc !== toLoc) { + graph = graph.replace(node.move(toLoc)); } - const aStart = bounds.a[0] + (regionStart - bounds.a[2]); - const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]); - const bStart = bounds.b[0] + (regionStart - bounds.b[2]); - const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]); - let result = { - stable: false, - aStart, - aLength: aEnd - aStart, - aContent: a.slice(aStart, aEnd), - oStart: regionStart, - oLength: regionEnd - regionStart, - oContent: o.slice(regionStart, regionEnd), - bStart, - bLength: bEnd - bStart, - bContent: b.slice(bStart, bEnd) - }; - results.push(result); } - currOffset = regionEnd; - } - advanceTo(o.length); - return results; - } - function diff3Merge(a, o, b, options2) { - let defaults2 = { - excludeFalseConflicts: true, - stringSeparator: /\s+/ + return actionConnect(nodeIDs)(graph); }; - options2 = Object.assign(defaults2, options2); - if (typeof a === "string") - a = a.split(options2.stringSeparator); - if (typeof o === "string") - o = o.split(options2.stringSeparator); - if (typeof b === "string") - b = b.split(options2.stringSeparator); - let results = []; - const regions = diff3MergeRegions(a, o, b); - let okBuffer = []; - function flushOk() { - if (okBuffer.length) { - results.push({ ok: okBuffer }); - } - okBuffer = []; - } - function isFalseConflict(a2, b2) { - if (a2.length !== b2.length) - return false; - for (let i2 = 0; i2 < a2.length; i2++) { - if (a2[i2] !== b2[i2]) - return false; - } - return true; - } - regions.forEach((region) => { - if (region.stable) { - okBuffer.push(...region.bufferContent); - } else { - if (options2.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) { - okBuffer.push(...region.aContent); - } else { - flushOk(); - results.push({ - conflict: { - a: region.aContent, - aIndex: region.aStart, - o: region.oContent, - oIndex: region.oStart, - b: region.bContent, - bIndex: region.bStart - } - }); - } + action.disabled = function(graph) { + if (nodeIDs.length < 2) + return "not_eligible"; + for (var i3 = 0; i3 < nodeIDs.length; i3++) { + var entity = graph.entity(nodeIDs[i3]); + if (entity.type !== "node") + return "not_eligible"; } - }); - flushOk(); - return results; + return actionConnect(nodeIDs).disabled(graph); + }; + return action; } - // modules/actions/merge_remote_changes.js - var import_lodash = __toESM(require_lodash()); - function actionMergeRemoteChanges(id2, localGraph, remoteGraph, discardTags, formatUser) { - discardTags = discardTags || {}; - var _option = "safe"; - var _conflicts = []; - function user(d) { - return typeof formatUser === "function" ? formatUser(d) : (0, import_lodash.escape)(d); - } - function mergeLocation(remote, target) { - function pointEqual(a, b) { - var epsilon3 = 1e-6; - return Math.abs(a[0] - b[0]) < epsilon3 && Math.abs(a[1] - b[1]) < epsilon3; - } - if (_option === "force_local" || pointEqual(target.loc, remote.loc)) { - return target; - } - if (_option === "force_remote") { - return target.update({ loc: remote.loc }); - } - _conflicts.push(_t.html("merge_remote_changes.conflict.location", { user: { html: user(remote.user) } })); - return target; + // modules/osm/changeset.js + function osmChangeset() { + if (!(this instanceof osmChangeset)) { + return new osmChangeset().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); } - function mergeNodes(base, remote, target) { - if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.nodes, remote.nodes)) { - return target; - } - if (_option === "force_remote") { - return target.update({ nodes: remote.nodes }); - } - var ccount = _conflicts.length; - var o = base.nodes || []; - var a = target.nodes || []; - var b = remote.nodes || []; - var nodes = []; - var hunks = diff3Merge(a, o, b, { excludeFalseConflicts: true }); - for (var i2 = 0; i2 < hunks.length; i2++) { - var hunk = hunks[i2]; - if (hunk.ok) { - nodes.push.apply(nodes, hunk.ok); - } else { - var c = hunk.conflict; - if ((0, import_fast_deep_equal.default)(c.o, c.a)) { - nodes.push.apply(nodes, c.b); - } else if ((0, import_fast_deep_equal.default)(c.o, c.b)) { - nodes.push.apply(nodes, c.a); - } else { - _conflicts.push(_t.html("merge_remote_changes.conflict.nodelist", { user: { html: user(remote.user) } })); - break; + } + osmEntity.changeset = osmChangeset; + osmChangeset.prototype = Object.create(osmEntity.prototype); + Object.assign(osmChangeset.prototype, { + type: "changeset", + extent: function() { + return new geoExtent(); + }, + geometry: function() { + return "changeset"; + }, + asJXON: function() { + return { + osm: { + changeset: { + tag: Object.keys(this.tags).map(function(k2) { + return { "@k": k2, "@v": this.tags[k2] }; + }, this), + "@version": 0.6, + "@generator": "iD" } } - } - return _conflicts.length === ccount ? target.update({ nodes }) : target; - } - function mergeChildren(targetWay, children2, updates, graph) { - function isUsed(node2, targetWay2) { - var hasInterestingParent = graph.parentWays(node2).some(function(way) { - return way.id !== targetWay2.id; + }; + }, + // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange) + // XML. Returns a string. + osmChangeJXON: function(changes) { + var changeset_id = this.id; + function nest(x2, order) { + var groups = {}; + for (var i3 = 0; i3 < x2.length; i3++) { + var tagName = Object.keys(x2[i3])[0]; + if (!groups[tagName]) + groups[tagName] = []; + groups[tagName].push(x2[i3][tagName]); + } + var ordered = {}; + order.forEach(function(o2) { + if (groups[o2]) + ordered[o2] = groups[o2]; }); - return node2.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node2).length > 0; + return ordered; } - var ccount = _conflicts.length; - for (var i2 = 0; i2 < children2.length; i2++) { - var id3 = children2[i2]; - var node = graph.hasEntity(id3); - if (targetWay.nodes.indexOf(id3) === -1) { - if (node && !isUsed(node, targetWay)) { - updates.removeIds.push(id3); - } - continue; + function sort(changes2) { + function resolve(item) { + return relations.find(function(relation2) { + return item.keyAttributes.type === "relation" && item.keyAttributes.ref === relation2["@id"]; + }); } - var local = localGraph.hasEntity(id3); - var remote = remoteGraph.hasEntity(id3); - var target; - if (_option === "force_remote" && remote && remote.visible) { - updates.replacements.push(remote); - } else if (_option === "force_local" && local) { - target = osmEntity(local); - if (remote) { - target = target.update({ version: remote.version }); + function isNew(item) { + return !sorted[item["@id"]] && !processing.find(function(proc) { + return proc["@id"] === item["@id"]; + }); + } + var processing = []; + var sorted = {}; + var relations = changes2.relation; + if (!relations) + return changes2; + for (var i3 = 0; i3 < relations.length; i3++) { + var relation = relations[i3]; + if (!sorted[relation["@id"]]) { + processing.push(relation); } - updates.replacements.push(target); - } else if (_option === "safe" && local && remote && local.version !== remote.version) { - target = osmEntity(local, { version: remote.version }); - if (remote.visible) { - target = mergeLocation(remote, target); - } else { - _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } })); + while (processing.length > 0) { + var next = processing[0], deps = next.member.map(resolve).filter(Boolean).filter(isNew); + if (deps.length === 0) { + sorted[next["@id"]] = next; + processing.shift(); + } else { + processing = deps.concat(processing); + } } - if (_conflicts.length !== ccount) - break; - updates.replacements.push(target); } + changes2.relation = Object.values(sorted); + return changes2; } - return targetWay; - } - function updateChildren(updates, graph) { - for (var i2 = 0; i2 < updates.replacements.length; i2++) { - graph = graph.replace(updates.replacements[i2]); - } - if (updates.removeIds.length) { - graph = actionDeleteMultiple(updates.removeIds)(graph); + function rep2(entity) { + return entity.asJXON(changeset_id); } - return graph; + return { + osmChange: { + "@version": 0.6, + "@generator": "iD", + "create": sort(nest(changes.created.map(rep2), ["node", "way", "relation"])), + "modify": nest(changes.modified.map(rep2), ["node", "way", "relation"]), + "delete": Object.assign(nest(changes.deleted.map(rep2), ["relation", "way", "node"]), { "@if-unused": true }) + } + }; + }, + asGeoJSON: function() { + return {}; } - function mergeMembers(remote, target) { - if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.members, remote.members)) { - return target; - } - if (_option === "force_remote") { - return target.update({ members: remote.members }); - } - _conflicts.push(_t.html("merge_remote_changes.conflict.memberlist", { user: { html: user(remote.user) } })); - return target; + }); + + // modules/osm/note.js + function osmNote() { + if (!(this instanceof osmNote)) { + return new osmNote().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); } - function mergeTags(base, remote, target) { - if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.tags, remote.tags)) { - return target; - } - if (_option === "force_remote") { - return target.update({ tags: remote.tags }); - } - var ccount = _conflicts.length; - var o = base.tags || {}; - var a = target.tags || {}; - var b = remote.tags || {}; - var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function(k2) { - return !discardTags[k2]; - }); - var tags = Object.assign({}, a); - var changed = false; - for (var i2 = 0; i2 < keys.length; i2++) { - var k = keys[i2]; - if (o[k] !== b[k] && a[k] !== b[k]) { - if (o[k] !== a[k]) { - _conflicts.push(_t.html( - "merge_remote_changes.conflict.tags", - { tag: k, local: a[k], remote: b[k], user: { html: user(remote.user) } } - )); - } else { - if (b.hasOwnProperty(k)) { - tags[k] = b[k]; + } + osmNote.id = function() { + return osmNote.id.next--; + }; + osmNote.id.next = -1; + Object.assign(osmNote.prototype, { + type: "note", + initialize: function(sources) { + for (var i3 = 0; i3 < sources.length; ++i3) { + var source = sources[i3]; + for (var prop in source) { + if (Object.prototype.hasOwnProperty.call(source, prop)) { + if (source[prop] === void 0) { + delete this[prop]; } else { - delete tags[k]; + this[prop] = source[prop]; } - changed = true; } } } - return changed && _conflicts.length === ccount ? target.update({ tags }) : target; + if (!this.id) { + this.id = osmNote.id().toString(); + } + return this; + }, + extent: function() { + return new geoExtent(this.loc); + }, + update: function(attrs) { + return osmNote(this, attrs); + }, + isNew: function() { + return this.id < 0; + }, + move: function(loc) { + return this.update({ loc }); } - var action = function(graph) { - var updates = { replacements: [], removeIds: [] }; - var base = graph.base().entities[id2]; - var local = localGraph.entity(id2); - var remote = remoteGraph.entity(id2); - var target = osmEntity(local, { version: remote.version }); - if (!remote.visible) { - if (_option === "force_remote") { - return actionDeleteMultiple([id2])(graph); - } else if (_option === "force_local") { - if (target.type === "way") { - target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph); - graph = updateChildren(updates, graph); + }); + + // modules/osm/relation.js + function osmRelation() { + if (!(this instanceof osmRelation)) { + return new osmRelation().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } + } + osmEntity.relation = osmRelation; + osmRelation.prototype = Object.create(osmEntity.prototype); + osmRelation.creationOrder = function(a2, b2) { + var aId = parseInt(osmEntity.id.toOSM(a2.id), 10); + var bId = parseInt(osmEntity.id.toOSM(b2.id), 10); + if (aId < 0 || bId < 0) + return aId - bId; + return bId - aId; + }; + Object.assign(osmRelation.prototype, { + type: "relation", + members: [], + copy: function(resolver, copies) { + if (copies[this.id]) + return copies[this.id]; + var copy2 = osmEntity.prototype.copy.call(this, resolver, copies); + var members = this.members.map(function(member) { + return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id }); + }); + copy2 = copy2.update({ members }); + copies[this.id] = copy2; + return copy2; + }, + extent: function(resolver, memo) { + return resolver.transient(this, "extent", function() { + if (memo && memo[this.id]) + return geoExtent(); + memo = memo || {}; + memo[this.id] = true; + var extent = geoExtent(); + for (var i3 = 0; i3 < this.members.length; i3++) { + var member = resolver.hasEntity(this.members[i3].id); + if (member) { + extent._extend(member.extent(resolver, memo)); } - return graph.replace(target); - } else { - _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } })); - return graph; } + return extent; + }); + }, + geometry: function(graph) { + return graph.transient(this, "geometry", function() { + return this.isMultipolygon() ? "area" : "relation"; + }); + }, + isDegenerate: function() { + return this.members.length === 0; + }, + // Return an array of members, each extended with an 'index' property whose value + // is the member index. + indexedMembers: function() { + var result = new Array(this.members.length); + for (var i3 = 0; i3 < this.members.length; i3++) { + result[i3] = Object.assign({}, this.members[i3], { index: i3 }); } - if (target.type === "node") { - target = mergeLocation(remote, target); - } else if (target.type === "way") { - graph.rebase(remoteGraph.childNodes(remote), [graph], false); - target = mergeNodes(base, remote, target); - target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph); - } else if (target.type === "relation") { - target = mergeMembers(remote, target); - } - target = mergeTags(base, remote, target); - if (!_conflicts.length) { - graph = updateChildren(updates, graph).replace(target); - } - return graph; - }; - action.withOption = function(opt) { - _option = opt; - return action; - }; - action.conflicts = function() { - return _conflicts; - }; - return action; - } - - // modules/actions/move.js - function actionMove(moveIDs, tryDelta, projection2, cache) { - var _delta = tryDelta; - function setupCache(graph) { - function canMove(nodeID) { - if (moveIDs.indexOf(nodeID) !== -1) - return true; - var parents = graph.parentWays(graph.entity(nodeID)); - if (parents.length < 3) - return true; - var parentsMoving = parents.every(function(way) { - return cache.moving[way.id]; - }); - if (!parentsMoving) - delete cache.moving[nodeID]; - return parentsMoving; - } - function cacheEntities(ids) { - for (var i2 = 0; i2 < ids.length; i2++) { - var id2 = ids[i2]; - if (cache.moving[id2]) - continue; - cache.moving[id2] = true; - var entity = graph.hasEntity(id2); - if (!entity) - continue; - if (entity.type === "node") { - cache.nodes.push(id2); - cache.startLoc[id2] = entity.loc; - } else if (entity.type === "way") { - cache.ways.push(id2); - cacheEntities(entity.nodes); - } else { - cacheEntities(entity.members.map(function(member) { - return member.id; - })); - } + return result; + }, + // Return the first member with the given role. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberByRole: function(role) { + for (var i3 = 0; i3 < this.members.length; i3++) { + if (this.members[i3].role === role) { + return Object.assign({}, this.members[i3], { index: i3 }); } } - function cacheIntersections(ids) { - function isEndpoint(way2, id3) { - return !way2.isClosed() && !!way2.affix(id3); + }, + // Same as memberByRole, but returns all members with the given role + membersByRole: function(role) { + var result = []; + for (var i3 = 0; i3 < this.members.length; i3++) { + if (this.members[i3].role === role) { + result.push(Object.assign({}, this.members[i3], { index: i3 })); } - for (var i2 = 0; i2 < ids.length; i2++) { - var id2 = ids[i2]; - var childNodes = graph.childNodes(graph.entity(id2)); - for (var j2 = 0; j2 < childNodes.length; j2++) { - var node = childNodes[j2]; - var parents = graph.parentWays(node); - if (parents.length !== 2) - continue; - var moved = graph.entity(id2); - var unmoved = null; - for (var k = 0; k < parents.length; k++) { - var way = parents[k]; - if (!cache.moving[way.id]) { - unmoved = way; - break; - } - } - if (!unmoved) - continue; - if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) - continue; - if (moved.isArea() || unmoved.isArea()) - continue; - cache.intersections.push({ - nodeId: node.id, - movedId: moved.id, - unmovedId: unmoved.id, - movedIsEP: isEndpoint(moved, node.id), - unmovedIsEP: isEndpoint(unmoved, node.id) - }); - } + } + return result; + }, + // Return the first member with the given id. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberById: function(id2) { + for (var i3 = 0; i3 < this.members.length; i3++) { + if (this.members[i3].id === id2) { + return Object.assign({}, this.members[i3], { index: i3 }); } } - if (!cache) { - cache = {}; + }, + // Return the first member with the given id and role. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberByIdAndRole: function(id2, role) { + for (var i3 = 0; i3 < this.members.length; i3++) { + if (this.members[i3].id === id2 && this.members[i3].role === role) { + return Object.assign({}, this.members[i3], { index: i3 }); + } } - if (!cache.ok) { - cache.moving = {}; - cache.intersections = []; - cache.replacedVertex = {}; - cache.startLoc = {}; - cache.nodes = []; - cache.ways = []; - cacheEntities(moveIDs); - cacheIntersections(cache.ways); - cache.nodes = cache.nodes.filter(canMove); - cache.ok = true; + }, + addMember: function(member, index) { + var members = this.members.slice(); + members.splice(index === void 0 ? members.length : index, 0, member); + return this.update({ members }); + }, + updateMember: function(member, index) { + var members = this.members.slice(); + members.splice(index, 1, Object.assign({}, members[index], member)); + return this.update({ members }); + }, + removeMember: function(index) { + var members = this.members.slice(); + members.splice(index, 1); + return this.update({ members }); + }, + removeMembersWithID: function(id2) { + var members = this.members.filter(function(m2) { + return m2.id !== id2; + }); + return this.update({ members }); + }, + moveMember: function(fromIndex, toIndex) { + var members = this.members.slice(); + members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]); + return this.update({ members }); + }, + // Wherever a member appears with id `needle.id`, replace it with a member + // with id `replacement.id`, type `replacement.type`, and the original role, + // By default, adding a duplicate member (by id and role) is prevented. + // Return an updated relation. + replaceMember: function(needle, replacement, keepDuplicates) { + if (!this.memberById(needle.id)) + return this; + var members = []; + for (var i3 = 0; i3 < this.members.length; i3++) { + var member = this.members[i3]; + if (member.id !== needle.id) { + members.push(member); + } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) { + members.push({ id: replacement.id, type: replacement.type, role: member.role }); + } } - } - function replaceMovedVertex(nodeId, wayId, graph, delta) { - var way = graph.entity(wayId); - var moved = graph.entity(nodeId); - var movedIndex = way.nodes.indexOf(nodeId); - var len, prevIndex, nextIndex; - if (way.isClosed()) { - len = way.nodes.length - 1; - prevIndex = (movedIndex + len - 1) % len; - nextIndex = (movedIndex + len + 1) % len; - } else { - len = way.nodes.length; - prevIndex = movedIndex - 1; - nextIndex = movedIndex + 1; + return this.update({ members }); + }, + asJXON: function(changeset_id) { + var r2 = { + relation: { + "@id": this.osmId(), + "@version": this.version || 0, + member: this.members.map(function(member) { + return { + keyAttributes: { + type: member.type, + role: member.role, + ref: osmEntity.id.toOSM(member.id) + } + }; + }, this), + tag: Object.keys(this.tags).map(function(k2) { + return { keyAttributes: { k: k2, v: this.tags[k2] } }; + }, this) + } + }; + if (changeset_id) { + r2.relation["@changeset"] = changeset_id; } - var prev = graph.hasEntity(way.nodes[prevIndex]); - var next = graph.hasEntity(way.nodes[nextIndex]); - if (!prev || !next) - return graph; - var key = wayId + "_" + nodeId; - var orig = cache.replacedVertex[key]; - if (!orig) { - orig = osmNode(); - cache.replacedVertex[key] = orig; - cache.startLoc[orig.id] = cache.startLoc[nodeId]; + return r2; + }, + asGeoJSON: function(resolver) { + return resolver.transient(this, "GeoJSON", function() { + if (this.isMultipolygon()) { + return { + type: "MultiPolygon", + coordinates: this.multipolygon(resolver) + }; + } else { + return { + type: "FeatureCollection", + properties: this.tags, + features: this.members.map(function(member) { + return Object.assign({ role: member.role }, resolver.entity(member.id).asGeoJSON(resolver)); + }) + }; + } + }); + }, + area: function(resolver) { + return resolver.transient(this, "area", function() { + return area_default(this.asGeoJSON(resolver)); + }); + }, + isMultipolygon: function() { + return this.tags.type === "multipolygon"; + }, + isComplete: function(resolver) { + for (var i3 = 0; i3 < this.members.length; i3++) { + if (!resolver.hasEntity(this.members[i3].id)) { + return false; + } } - var start2, end; - if (delta) { - start2 = projection2(cache.startLoc[nodeId]); - end = projection2.invert(geoVecAdd(start2, delta)); - } else { - end = cache.startLoc[nodeId]; + return true; + }, + hasFromViaTo: function() { + return this.members.some(function(m2) { + return m2.role === "from"; + }) && this.members.some(function(m2) { + return m2.role === "via"; + }) && this.members.some(function(m2) { + return m2.role === "to"; + }); + }, + isRestriction: function() { + return !!(this.tags.type && this.tags.type.match(/^restriction:?/)); + }, + isValidRestriction: function() { + if (!this.isRestriction()) + return false; + var froms = this.members.filter(function(m2) { + return m2.role === "from"; + }); + var vias = this.members.filter(function(m2) { + return m2.role === "via"; + }); + var tos = this.members.filter(function(m2) { + return m2.role === "to"; + }); + if (froms.length !== 1 && this.tags.restriction !== "no_entry") + return false; + if (froms.some(function(m2) { + return m2.type !== "way"; + })) + return false; + if (tos.length !== 1 && this.tags.restriction !== "no_exit") + return false; + if (tos.some(function(m2) { + return m2.type !== "way"; + })) + return false; + if (vias.length === 0) + return false; + if (vias.length > 1 && vias.some(function(m2) { + return m2.type !== "way"; + })) + return false; + return true; + }, + isConnectivity: function() { + return !!(this.tags.type && this.tags.type.match(/^connectivity:?/)); + }, + // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm], + // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings. + // + // This corresponds to the structure needed for rendering a multipolygon path using a + // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry. + // + // In the case of invalid geometries, this function will still return a result which + // includes the nodes of all way members, but some Nds may be unclosed and some inner + // rings not matched with the intended outer ring. + // + multipolygon: function(resolver) { + var outers = this.members.filter(function(m2) { + return "outer" === (m2.role || "outer"); + }); + var inners = this.members.filter(function(m2) { + return "inner" === m2.role; + }); + outers = osmJoinWays(outers, resolver); + inners = osmJoinWays(inners, resolver); + var sequenceToLineString = function(sequence) { + if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) { + sequence.nodes.push(sequence.nodes[0]); + } + return sequence.nodes.map(function(node) { + return node.loc; + }); + }; + outers = outers.map(sequenceToLineString); + inners = inners.map(sequenceToLineString); + var result = outers.map(function(o3) { + return [area_default({ type: "Polygon", coordinates: [o3] }) > 2 * Math.PI ? o3.reverse() : o3]; + }); + function findOuter(inner2) { + var o3, outer; + for (o3 = 0; o3 < outers.length; o3++) { + outer = outers[o3]; + if (geoPolygonContainsPolygon(outer, inner2)) { + return o3; + } + } + for (o3 = 0; o3 < outers.length; o3++) { + outer = outers[o3]; + if (geoPolygonIntersectsPolygon(outer, inner2, false)) { + return o3; + } + } } - orig = orig.move(end); - var angle2 = Math.abs(geoAngle(orig, prev, projection2) - geoAngle(orig, next, projection2)) * 180 / Math.PI; - if (angle2 > 175 && angle2 < 185) - return graph; - var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection2); - var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection2); - var d1 = geoPathLength(p1); - var d2 = geoPathLength(p2); - var insertAt = d1 <= d2 ? movedIndex : nextIndex; - if (way.isClosed() && insertAt === 0) - insertAt = len; - way = way.addNode(orig.id, insertAt); - return graph.replace(orig).replace(way); + for (var i3 = 0; i3 < inners.length; i3++) { + var inner = inners[i3]; + if (area_default({ type: "Polygon", coordinates: [inner] }) < 2 * Math.PI) { + inner = inner.reverse(); + } + var o2 = findOuter(inners[i3]); + if (o2 !== void 0) { + result[o2].push(inners[i3]); + } else { + result.push([inners[i3]]); + } + } + return result; } - function removeDuplicateVertices(wayId, graph) { - var way = graph.entity(wayId); + }); + + // modules/osm/qa_item.js + var QAItem = class _QAItem { + constructor(loc, service, itemType, id2, props) { + this.loc = loc; + this.service = service.title; + this.itemType = itemType; + this.id = id2 ? id2 : `${_QAItem.id()}`; + this.update(props); + if (service && typeof service.getIcon === "function") { + this.icon = service.getIcon(itemType); + } + } + update(props) { + const { loc, service, itemType, id: id2 } = this; + Object.keys(props).forEach((prop) => this[prop] = props[prop]); + this.loc = loc; + this.service = service; + this.itemType = itemType; + this.id = id2; + return this; + } + // Generic handling for newly created QAItems + static id() { + return this.nextId--; + } + }; + QAItem.nextId = -1; + + // modules/actions/split.js + function actionSplit(nodeIds, newWayIds) { + if (typeof nodeIds === "string") + nodeIds = [nodeIds]; + var _wayIDs; + var _keepHistoryOn = "longest"; + var _createdWayIDs = []; + function dist(graph, nA, nB) { + var locA = graph.entity(nA).loc; + var locB = graph.entity(nB).loc; var epsilon3 = 1e-6; - var prev, curr; - function isInteresting(node, graph2) { - return graph2.parentWays(node).length > 1 || graph2.parentRelations(node).length || node.hasInterestingTags(); + return locA && locB ? geoSphericalDistance(locA, locB) : epsilon3; + } + function splitArea(nodes, idxA, graph) { + var lengths = new Array(nodes.length); + var length; + var i3; + var best = 0; + var idxB; + function wrap2(index) { + return utilWrap(index, nodes.length); } - for (var i2 = 0; i2 < way.nodes.length; i2++) { - curr = graph.entity(way.nodes[i2]); - if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon3)) { - if (!isInteresting(prev, graph)) { - way = way.removeNode(prev.id); - graph = graph.replace(way).remove(prev); - } else if (!isInteresting(curr, graph)) { - way = way.removeNode(curr.id); - graph = graph.replace(way).remove(curr); - } + length = 0; + for (i3 = wrap2(idxA + 1); i3 !== idxA; i3 = wrap2(i3 + 1)) { + length += dist(graph, nodes[i3], nodes[wrap2(i3 - 1)]); + lengths[i3] = length; + } + length = 0; + for (i3 = wrap2(idxA - 1); i3 !== idxA; i3 = wrap2(i3 - 1)) { + length += dist(graph, nodes[i3], nodes[wrap2(i3 + 1)]); + if (length < lengths[i3]) { + lengths[i3] = length; } - prev = curr; } - return graph; + for (i3 = 0; i3 < nodes.length; i3++) { + var cost = lengths[i3] / dist(graph, nodes[idxA], nodes[i3]); + if (cost > best) { + idxB = i3; + best = cost; + } + } + return idxB; } - function unZorroIntersection(intersection, graph) { - var vertex = graph.entity(intersection.nodeId); - var way1 = graph.entity(intersection.movedId); - var way2 = graph.entity(intersection.unmovedId); - var isEP1 = intersection.movedIsEP; - var isEP2 = intersection.unmovedIsEP; - if (isEP1 && isEP2) - return graph; - var nodes1 = graph.childNodes(way1).filter(function(n2) { - return n2 !== vertex; - }); - var nodes2 = graph.childNodes(way2).filter(function(n2) { - return n2 !== vertex; - }); - if (way1.isClosed() && way1.first() === vertex.id) - nodes1.push(nodes1[0]); - if (way2.isClosed() && way2.first() === vertex.id) - nodes2.push(nodes2[0]); - var edge1 = !isEP1 && geoChooseEdge(nodes1, projection2(vertex.loc), projection2); - var edge2 = !isEP2 && geoChooseEdge(nodes2, projection2(vertex.loc), projection2); - var loc; - if (!isEP1 && !isEP2) { - var epsilon3 = 1e-6, maxIter = 10; - for (var i2 = 0; i2 < maxIter; i2++) { - loc = geoVecInterp(edge1.loc, edge2.loc, 0.5); - edge1 = geoChooseEdge(nodes1, projection2(loc), projection2); - edge2 = geoChooseEdge(nodes2, projection2(loc), projection2); - if (Math.abs(edge1.distance - edge2.distance) < epsilon3) - break; + function totalLengthBetweenNodes(graph, nodes) { + var totalLength = 0; + for (var i3 = 0; i3 < nodes.length - 1; i3++) { + totalLength += dist(graph, nodes[i3], nodes[i3 + 1]); + } + return totalLength; + } + function split(graph, nodeId, wayA, newWayId) { + var wayB = osmWay({ id: newWayId, tags: wayA.tags }); + var origNodes = wayA.nodes.slice(); + var nodesA; + var nodesB; + var isArea = wayA.isArea(); + var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph); + if (wayA.isClosed()) { + var nodes = wayA.nodes.slice(0, -1); + var idxA = nodes.indexOf(nodeId); + var idxB = splitArea(nodes, idxA, graph); + if (idxB < idxA) { + nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1)); + nodesB = nodes.slice(idxB, idxA + 1); + } else { + nodesA = nodes.slice(idxA, idxB + 1); + nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1)); } - } else if (!isEP1) { - loc = edge1.loc; } else { - loc = edge2.loc; + var idx = wayA.nodes.indexOf(nodeId, 1); + nodesA = wayA.nodes.slice(0, idx + 1); + nodesB = wayA.nodes.slice(idx); } - graph = graph.replace(vertex.move(loc)); - if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) { - way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index); - graph = graph.replace(way1); + var lengthA = totalLengthBetweenNodes(graph, nodesA); + var lengthB = totalLengthBetweenNodes(graph, nodesB); + if (_keepHistoryOn === "longest" && lengthB > lengthA) { + wayA = wayA.update({ nodes: nodesB }); + wayB = wayB.update({ nodes: nodesA }); + var temp = lengthA; + lengthA = lengthB; + lengthB = temp; + } else { + wayA = wayA.update({ nodes: nodesA }); + wayB = wayB.update({ nodes: nodesB }); } - if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) { - way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index); - graph = graph.replace(way2); + if (wayA.tags.step_count) { + var stepCount = Number(wayA.tags.step_count); + if (stepCount && // ensure a number + isFinite(stepCount) && // ensure positive + stepCount > 0 && // ensure integer + Math.round(stepCount) === stepCount) { + var tagsA = Object.assign({}, wayA.tags); + var tagsB = Object.assign({}, wayB.tags); + var ratioA = lengthA / (lengthA + lengthB); + var countA = Math.round(stepCount * ratioA); + tagsA.step_count = countA.toString(); + tagsB.step_count = (stepCount - countA).toString(); + wayA = wayA.update({ tags: tagsA }); + wayB = wayB.update({ tags: tagsB }); + } } - return graph; - } - function cleanupIntersections(graph) { - for (var i2 = 0; i2 < cache.intersections.length; i2++) { - var obj = cache.intersections[i2]; - graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta); - graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null); - graph = unZorroIntersection(obj, graph); - graph = removeDuplicateVertices(obj.movedId, graph); - graph = removeDuplicateVertices(obj.unmovedId, graph); + graph = graph.replace(wayA); + graph = graph.replace(wayB); + graph.parentRelations(wayA).forEach(function(relation) { + var member; + if (relation.hasFromViaTo()) { + var f3 = relation.memberByRole("from"); + var v2 = relation.membersByRole("via"); + var t2 = relation.memberByRole("to"); + var i3; + if (f3.id === wayA.id || t2.id === wayA.id) { + var keepB = false; + if (v2.length === 1 && v2[0].type === "node") { + keepB = wayB.contains(v2[0].id); + } else { + for (i3 = 0; i3 < v2.length; i3++) { + if (v2[i3].type === "way") { + var wayVia = graph.hasEntity(v2[i3].id); + if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) { + keepB = true; + break; + } + } + } + } + if (keepB) { + relation = relation.replaceMember(wayA, wayB); + graph = graph.replace(relation); + } + } else { + for (i3 = 0; i3 < v2.length; i3++) { + if (v2[i3].type === "way" && v2[i3].id === wayA.id) { + member = { + id: wayB.id, + type: "way", + role: "via" + }; + graph = actionAddMember(relation.id, member, v2[i3].index + 1)(graph); + break; + } + } + } + } else { + if (relation === isOuter) { + graph = graph.replace(relation.mergeTags(wayA.tags)); + graph = graph.replace(wayA.update({ tags: {} })); + graph = graph.replace(wayB.update({ tags: {} })); + } + member = { + id: wayB.id, + type: "way", + role: relation.memberById(wayA.id).role + }; + var insertPair = { + originalID: wayA.id, + insertedID: wayB.id, + nodes: origNodes + }; + graph = actionAddMember(relation.id, member, void 0, insertPair)(graph); + } + }); + if (!isOuter && isArea) { + var multipolygon = osmRelation({ + tags: Object.assign({}, wayA.tags, { type: "multipolygon" }), + members: [ + { id: wayA.id, role: "outer", type: "way" }, + { id: wayB.id, role: "outer", type: "way" } + ] + }); + graph = graph.replace(multipolygon); + graph = graph.replace(wayA.update({ tags: {} })); + graph = graph.replace(wayB.update({ tags: {} })); } + _createdWayIDs.push(wayB.id); return graph; } - function limitDelta(graph) { - function moveNode(loc) { - return geoVecAdd(projection2(loc), _delta); + var action = function(graph) { + _createdWayIDs = []; + var newWayIndex = 0; + for (var i3 = 0; i3 < nodeIds.length; i3++) { + var nodeId = nodeIds[i3]; + var candidates = action.waysForNode(nodeId, graph); + for (var j3 = 0; j3 < candidates.length; j3++) { + graph = split(graph, nodeId, candidates[j3], newWayIds && newWayIds[newWayIndex]); + newWayIndex += 1; + } } - for (var i2 = 0; i2 < cache.intersections.length; i2++) { - var obj = cache.intersections[i2]; - if (obj.movedIsEP && obj.unmovedIsEP) - continue; - if (!obj.movedIsEP) - continue; - var node = graph.entity(obj.nodeId); - var start2 = projection2(node.loc); - var end = geoVecAdd(start2, _delta); - var movedNodes = graph.childNodes(graph.entity(obj.movedId)); - var movedPath = movedNodes.map(function(n2) { - return moveNode(n2.loc); - }); - var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)); - var unmovedPath = unmovedNodes.map(function(n2) { - return projection2(n2.loc); + return graph; + }; + action.getCreatedWayIDs = function() { + return _createdWayIDs; + }; + action.waysForNode = function(nodeId, graph) { + var node = graph.entity(nodeId); + var splittableParents = graph.parentWays(node).filter(isSplittable); + if (!_wayIDs) { + var hasLine = splittableParents.some(function(parent) { + return parent.geometry(graph) === "line"; }); - var hits = geoPathIntersections(movedPath, unmovedPath); - for (var j2 = 0; i2 < hits.length; i2++) { - if (geoVecEqual(hits[j2], end)) - continue; - var edge = geoChooseEdge(unmovedNodes, end, projection2); - _delta = geoVecSubtract(projection2(edge.loc), start2); + if (hasLine) { + return splittableParents.filter(function(parent) { + return parent.geometry(graph) === "line"; + }); } } - } - var action = function(graph) { - if (_delta[0] === 0 && _delta[1] === 0) - return graph; - setupCache(graph); - if (cache.intersections.length) { - limitDelta(graph); - } - for (var i2 = 0; i2 < cache.nodes.length; i2++) { - var node = graph.entity(cache.nodes[i2]); - var start2 = projection2(node.loc); - var end = geoVecAdd(start2, _delta); - graph = graph.replace(node.move(projection2.invert(end))); - } - if (cache.intersections.length) { - graph = cleanupIntersections(graph); + return splittableParents; + function isSplittable(parent) { + if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) + return false; + if (parent.isClosed()) + return true; + for (var i3 = 1; i3 < parent.nodes.length - 1; i3++) { + if (parent.nodes[i3] === nodeId) + return true; + } + return false; } - return graph; }; - action.delta = function() { - return _delta; + action.ways = function(graph) { + return utilArrayUniq([].concat.apply([], nodeIds.map(function(nodeId) { + return action.waysForNode(nodeId, graph); + }))); }; - return action; - } - - // modules/actions/move_member.js - function actionMoveMember(relationId, fromIndex, toIndex) { - return function(graph) { - return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex)); + action.disabled = function(graph) { + for (var i3 = 0; i3 < nodeIds.length; i3++) { + var nodeId = nodeIds[i3]; + var candidates = action.waysForNode(nodeId, graph); + if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) { + return "not_eligible"; + } + } }; - } - - // modules/actions/move_node.js - function actionMoveNode(nodeID, toLoc) { - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var node = graph.entity(nodeID); - return graph.replace( - node.move(geoVecInterp(node.loc, toLoc, t)) - ); + action.limitWays = function(val) { + if (!arguments.length) + return _wayIDs; + _wayIDs = val; + return action; + }; + action.keepHistoryOn = function(val) { + if (!arguments.length) + return _keepHistoryOn; + _keepHistoryOn = val; + return action; }; - action.transitionable = true; return action; } - // modules/actions/noop.js - function actionNoop() { - return function(graph) { - return graph; - }; + // modules/core/graph.js + function coreGraph(other, mutable) { + if (!(this instanceof coreGraph)) + return new coreGraph(other, mutable); + if (other instanceof coreGraph) { + var base = other.base(); + this.entities = Object.assign(Object.create(base.entities), other.entities); + this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays); + this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels); + } else { + this.entities = /* @__PURE__ */ Object.create({}); + this._parentWays = /* @__PURE__ */ Object.create({}); + this._parentRels = /* @__PURE__ */ Object.create({}); + this.rebase(other || [], [this]); + } + this.transients = {}; + this._childNodes = {}; + this.frozen = !mutable; } - - // modules/actions/orthogonalize.js - function actionOrthogonalize(wayID, projection2, vertexID, degThresh, ep) { - var epsilon3 = ep || 1e-4; - var threshold = degThresh || 13; - var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); - var upperThreshold = Math.cos(threshold * Math.PI / 180); - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var way = graph.entity(wayID); - way = way.removeNode(""); - if (way.tags.nonsquare) { - var tags = Object.assign({}, way.tags); - delete tags.nonsquare; - way = way.update({ tags }); + coreGraph.prototype = { + hasEntity: function(id2) { + return this.entities[id2]; + }, + entity: function(id2) { + var entity = this.entities[id2]; + if (!entity) { + entity = this.entities.__proto__[id2]; } - graph = graph.replace(way); - var isClosed = way.isClosed(); - var nodes = graph.childNodes(way).slice(); - if (isClosed) - nodes.pop(); - if (vertexID !== void 0) { - nodes = nodeSubset(nodes, vertexID, isClosed); - if (nodes.length !== 3) - return graph; + if (!entity) { + throw new Error("entity " + id2 + " not found"); } - var nodeCount = {}; - var points = []; - var corner = { i: 0, dotp: 1 }; - var node, point, loc, score, motions, i2, j2; - for (i2 = 0; i2 < nodes.length; i2++) { - node = nodes[i2]; - nodeCount[node.id] = (nodeCount[node.id] || 0) + 1; - points.push({ id: node.id, coord: projection2(node.loc) }); + return entity; + }, + geometry: function(id2) { + return this.entity(id2).geometry(this); + }, + transient: function(entity, key, fn) { + var id2 = entity.id; + var transients = this.transients[id2] || (this.transients[id2] = {}); + if (transients[key] !== void 0) { + return transients[key]; } - if (points.length === 3) { - for (i2 = 0; i2 < 1e3; i2++) { - motions = points.map(calcMotion); - points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]); - score = corner.dotp; - if (score < epsilon3) { - break; + transients[key] = fn.call(entity); + return transients[key]; + }, + parentWays: function(entity) { + var parents = this._parentWays[entity.id]; + var result = []; + if (parents) { + parents.forEach(function(id2) { + result.push(this.entity(id2)); + }, this); + } + return result; + }, + isPoi: function(entity) { + var parents = this._parentWays[entity.id]; + return !parents || parents.size === 0; + }, + isShared: function(entity) { + var parents = this._parentWays[entity.id]; + return parents && parents.size > 1; + }, + parentRelations: function(entity) { + var parents = this._parentRels[entity.id]; + var result = []; + if (parents) { + parents.forEach(function(id2) { + result.push(this.entity(id2)); + }, this); + } + return result; + }, + parentMultipolygons: function(entity) { + return this.parentRelations(entity).filter(function(relation) { + return relation.isMultipolygon(); + }); + }, + childNodes: function(entity) { + if (this._childNodes[entity.id]) + return this._childNodes[entity.id]; + if (!entity.nodes) + return []; + var nodes = []; + for (var i3 = 0; i3 < entity.nodes.length; i3++) { + nodes[i3] = this.entity(entity.nodes[i3]); + } + if (debug) + Object.freeze(nodes); + this._childNodes[entity.id] = nodes; + return this._childNodes[entity.id]; + }, + base: function() { + return { + "entities": Object.getPrototypeOf(this.entities), + "parentWays": Object.getPrototypeOf(this._parentWays), + "parentRels": Object.getPrototypeOf(this._parentRels) + }; + }, + // Unlike other graph methods, rebase mutates in place. This is because it + // is used only during the history operation that merges newly downloaded + // data into each state. To external consumers, it should appear as if the + // graph always contained the newly downloaded data. + rebase: function(entities, stack, force) { + var base = this.base(); + var i3, j3, k2, id2; + for (i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; + if (!entity.visible || !force && base.entities[entity.id]) + continue; + base.entities[entity.id] = entity; + this._updateCalculated(void 0, entity, base.parentWays, base.parentRels); + if (entity.type === "way") { + for (j3 = 0; j3 < entity.nodes.length; j3++) { + id2 = entity.nodes[j3]; + for (k2 = 1; k2 < stack.length; k2++) { + var ents = stack[k2].entities; + if (ents.hasOwnProperty(id2) && ents[id2] === void 0) { + delete ents[id2]; + } + } } } - node = graph.entity(nodes[corner.i].id); - loc = projection2.invert(points[corner.i].coord); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); - } else { - var straights = []; - var simplified = []; - for (i2 = 0; i2 < points.length; i2++) { - point = points[i2]; - var dotp = 0; - if (isClosed || i2 > 0 && i2 < points.length - 1) { - var a = points[(i2 - 1 + points.length) % points.length]; - var b = points[(i2 + 1) % points.length]; - dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord)); - } - if (dotp > upperThreshold) { - straights.push(point); - } else { - simplified.push(point); - } + } + for (i3 = 0; i3 < stack.length; i3++) { + stack[i3]._updateRebased(); + } + }, + _updateRebased: function() { + var base = this.base(); + Object.keys(this._parentWays).forEach(function(child) { + if (base.parentWays[child]) { + base.parentWays[child].forEach(function(id2) { + if (!this.entities.hasOwnProperty(id2)) { + this._parentWays[child].add(id2); + } + }, this); } - var bestPoints = clonePoints(simplified); - var originalPoints = clonePoints(simplified); - score = Infinity; - for (i2 = 0; i2 < 1e3; i2++) { - motions = simplified.map(calcMotion); - for (j2 = 0; j2 < motions.length; j2++) { - simplified[j2].coord = geoVecAdd(simplified[j2].coord, motions[j2]); - } - var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon3, threshold); - if (newScore < score) { - bestPoints = clonePoints(simplified); - score = newScore; - } - if (score < epsilon3) { - break; - } + }, this); + Object.keys(this._parentRels).forEach(function(child) { + if (base.parentRels[child]) { + base.parentRels[child].forEach(function(id2) { + if (!this.entities.hasOwnProperty(id2)) { + this._parentRels[child].add(id2); + } + }, this); } - var bestCoords = bestPoints.map(function(p) { - return p.coord; - }); - if (isClosed) - bestCoords.push(bestCoords[0]); - for (i2 = 0; i2 < bestPoints.length; i2++) { - point = bestPoints[i2]; - if (!geoVecEqual(originalPoints[i2].coord, point.coord)) { - node = graph.entity(point.id); - loc = projection2.invert(point.coord); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); - } + }, this); + this.transients = {}; + }, + // Updates calculated properties (parentWays, parentRels) for the specified change + _updateCalculated: function(oldentity, entity, parentWays, parentRels) { + parentWays = parentWays || this._parentWays; + parentRels = parentRels || this._parentRels; + var type2 = entity && entity.type || oldentity && oldentity.type; + var removed, added, i3; + if (type2 === "way") { + if (oldentity && entity) { + removed = utilArrayDifference(oldentity.nodes, entity.nodes); + added = utilArrayDifference(entity.nodes, oldentity.nodes); + } else if (oldentity) { + removed = oldentity.nodes; + added = []; + } else if (entity) { + removed = []; + added = entity.nodes; } - for (i2 = 0; i2 < straights.length; i2++) { - point = straights[i2]; - if (nodeCount[point.id] > 1) - continue; - node = graph.entity(point.id); - if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) { - graph = actionDeleteNode(node.id)(graph); - } else { - var choice = geoVecProject(point.coord, bestCoords); - if (choice) { - loc = projection2.invert(choice.target); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); - } - } + for (i3 = 0; i3 < removed.length; i3++) { + parentWays[removed[i3]] = new Set(parentWays[removed[i3]]); + parentWays[removed[i3]].delete(oldentity.id); } - } - return graph; - function clonePoints(array2) { - return array2.map(function(p) { - return { id: p.id, coord: [p.coord[0], p.coord[1]] }; - }); - } - function calcMotion(point2, i3, array2) { - if (!isClosed && (i3 === 0 || i3 === array2.length - 1)) - return [0, 0]; - if (nodeCount[array2[i3].id] > 1) - return [0, 0]; - var a2 = array2[(i3 - 1 + array2.length) % array2.length].coord; - var origin = point2.coord; - var b2 = array2[(i3 + 1) % array2.length].coord; - var p = geoVecSubtract(a2, origin); - var q = geoVecSubtract(b2, origin); - var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q)); - p = geoVecNormalize(p); - q = geoVecNormalize(q); - var dotp2 = p[0] * q[0] + p[1] * q[1]; - var val = Math.abs(dotp2); - if (val < lowerThreshold) { - corner.i = i3; - corner.dotp = val; - var vec = geoVecNormalize(geoVecAdd(p, q)); - return geoVecScale(vec, 0.1 * dotp2 * scale); + for (i3 = 0; i3 < added.length; i3++) { + parentWays[added[i3]] = new Set(parentWays[added[i3]]); + parentWays[added[i3]].add(entity.id); } - return [0, 0]; - } - }; - function nodeSubset(nodes, vertexID2, isClosed) { - var first = isClosed ? 0 : 1; - var last = isClosed ? nodes.length : nodes.length - 1; - for (var i2 = first; i2 < last; i2++) { - if (nodes[i2].id === vertexID2) { - return [ - nodes[(i2 - 1 + nodes.length) % nodes.length], - nodes[i2], - nodes[(i2 + 1) % nodes.length] - ]; + } else if (type2 === "relation") { + var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m2) { + return m2.id; + }) : []; + var entityMemberIDs = entity ? entity.members.map(function(m2) { + return m2.id; + }) : []; + if (oldentity && entity) { + removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs); + added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs); + } else if (oldentity) { + removed = oldentityMemberIDs; + added = []; + } else if (entity) { + removed = []; + added = entityMemberIDs; + } + for (i3 = 0; i3 < removed.length; i3++) { + parentRels[removed[i3]] = new Set(parentRels[removed[i3]]); + parentRels[removed[i3]].delete(oldentity.id); + } + for (i3 = 0; i3 < added.length; i3++) { + parentRels[added[i3]] = new Set(parentRels[added[i3]]); + parentRels[added[i3]].add(entity.id); } } - return []; - } - action.disabled = function(graph) { - var way = graph.entity(wayID); - way = way.removeNode(""); - graph = graph.replace(way); - var isClosed = way.isClosed(); - var nodes = graph.childNodes(way).slice(); - if (isClosed) - nodes.pop(); - var allowStraightAngles = false; - if (vertexID !== void 0) { - allowStraightAngles = true; - nodes = nodeSubset(nodes, vertexID, isClosed); - if (nodes.length !== 3) - return "end_vertex"; - } - var coords = nodes.map(function(n2) { - return projection2(n2.loc); + }, + replace: function(entity) { + if (this.entities[entity.id] === entity) + return this; + return this.update(function() { + this._updateCalculated(this.entities[entity.id], entity); + this.entities[entity.id] = entity; }); - var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles); - if (score === null) { - return "not_squarish"; - } else if (score === 0) { - return "square_enough"; - } else { - return false; - } - }; - action.transitionable = true; - return action; - } - - // modules/actions/restrict_turn.js - function actionRestrictTurn(turn, restrictionType, restrictionID) { - return function(graph) { - var fromWay = graph.entity(turn.from.way); - var toWay = graph.entity(turn.to.way); - var viaNode = turn.via.node && graph.entity(turn.via.node); - var viaWays = turn.via.ways && turn.via.ways.map(function(id2) { - return graph.entity(id2); + }, + remove: function(entity) { + return this.update(function() { + this._updateCalculated(entity, void 0); + this.entities[entity.id] = void 0; }); - var members = []; - members.push({ id: fromWay.id, type: "way", role: "from" }); - if (viaNode) { - members.push({ id: viaNode.id, type: "node", role: "via" }); - } else if (viaWays) { - viaWays.forEach(function(viaWay) { - members.push({ id: viaWay.id, type: "way", role: "via" }); - }); + }, + revert: function(id2) { + var baseEntity = this.base().entities[id2]; + var headEntity = this.entities[id2]; + if (headEntity === baseEntity) + return this; + return this.update(function() { + this._updateCalculated(headEntity, baseEntity); + delete this.entities[id2]; + }); + }, + update: function() { + var graph = this.frozen ? coreGraph(this, true) : this; + for (var i3 = 0; i3 < arguments.length; i3++) { + arguments[i3].call(graph, graph); } - members.push({ id: toWay.id, type: "way", role: "to" }); - return graph.replace(osmRelation({ - id: restrictionID, - tags: { - type: "restriction", - restriction: restrictionType - }, - members - })); - }; - } - - // modules/actions/revert.js - function actionRevert(id2) { - var action = function(graph) { - var entity = graph.hasEntity(id2), base = graph.base().entities[id2]; - if (entity && !base) { - if (entity.type === "node") { - graph.parentWays(entity).forEach(function(parent) { - parent = parent.removeNode(id2); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteWay(parent.id)(graph); - } - }); - } - graph.parentRelations(entity).forEach(function(parent) { - parent = parent.removeMembersWithID(id2); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); + if (this.frozen) + graph.frozen = true; + return graph; + }, + // Obliterates any existing entities + load: function(entities) { + var base = this.base(); + this.entities = Object.create(base.entities); + for (var i3 in entities) { + this.entities[i3] = entities[i3]; + this._updateCalculated(base.entities[i3], this.entities[i3]); } - return graph.revert(id2); - }; - return action; - } + return this; + } + }; - // modules/actions/rotate.js - function actionRotate(rotateIds, pivot, angle2, projection2) { - var action = function(graph) { - return graph.update(function(graph2) { - utilGetAllNodes(rotateIds, graph2).forEach(function(node) { - var point = geoRotate([projection2(node.loc)], angle2, pivot)[0]; - graph2 = graph2.replace(node.move(projection2.invert(point))); - }); - }); - }; - return action; + // modules/osm/intersection.js + function osmTurn(turn) { + if (!(this instanceof osmTurn)) { + return new osmTurn(turn); + } + Object.assign(this, turn); } - - // modules/actions/scale.js - function actionScale(ids, pivotLoc, scaleFactor, projection2) { - return function(graph) { - return graph.update(function(graph2) { - let point, radial; - utilGetAllNodes(ids, graph2).forEach(function(node) { - point = projection2(node.loc); - radial = [ - point[0] - pivotLoc[0], - point[1] - pivotLoc[1] - ]; - point = [ - pivotLoc[0] + scaleFactor * radial[0], - pivotLoc[1] + scaleFactor * radial[1] - ]; - graph2 = graph2.replace(node.move(projection2.invert(point))); - }); + function osmIntersection(graph, startVertexId, maxDistance) { + maxDistance = maxDistance || 30; + var vgraph = coreGraph(); + var i3, j3, k2; + function memberOfRestriction(entity) { + return graph.parentRelations(entity).some(function(r2) { + return r2.isRestriction(); }); - }; - } - - // modules/actions/straighten_nodes.js - function actionStraightenNodes(nodeIDs, projection2) { - function positionAlongWay(a, o, b) { - return geoVecDot(a, b, o) / geoVecDot(b, b, o); } - function getEndpoints(points) { - var ssr = geoGetSmallestSurroundingRectangle(points); - var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2]; - var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2]; - var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2]; - var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2]; - var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2); - if (isLong) { - return [p1, q1]; - } - return [p2, q2]; + function isRoad(way2) { + if (way2.isArea() || way2.isDegenerate()) + return false; + var roads = { + "motorway": true, + "motorway_link": true, + "trunk": true, + "trunk_link": true, + "primary": true, + "primary_link": true, + "secondary": true, + "secondary_link": true, + "tertiary": true, + "tertiary_link": true, + "residential": true, + "unclassified": true, + "living_street": true, + "service": true, + "road": true, + "track": true + }; + return roads[way2.tags.highway]; } - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var nodes = nodeIDs.map(function(id2) { - return graph.entity(id2); - }); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var endpoints = getEndpoints(points); - var startPoint = endpoints[0]; - var endPoint = endpoints[1]; - for (var i2 = 0; i2 < points.length; i2++) { - var node = nodes[i2]; - var point = points[i2]; - var u = positionAlongWay(point, startPoint, endPoint); - var point2 = geoVecInterp(startPoint, endPoint, u); - var loc2 = projection2.invert(point2); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t))); - } - return graph; - }; - action.disabled = function(graph) { - var nodes = nodeIDs.map(function(id2) { - return graph.entity(id2); - }); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var endpoints = getEndpoints(points); - var startPoint = endpoints[0]; - var endPoint = endpoints[1]; - var maxDistance = 0; - for (var i2 = 0; i2 < points.length; i2++) { - var point = points[i2]; - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var dist = geoVecLength(p, point); - if (!isNaN(dist) && dist > maxDistance) { - maxDistance = dist; + var startNode = graph.entity(startVertexId); + var checkVertices = [startNode]; + var checkWays; + var vertices = []; + var vertexIds = []; + var vertex; + var ways = []; + var wayIds = []; + var way; + var nodes = []; + var node; + var parents = []; + var parent; + var actions = []; + while (checkVertices.length) { + vertex = checkVertices.pop(); + checkWays = graph.parentWays(vertex); + var hasWays = false; + for (i3 = 0; i3 < checkWays.length; i3++) { + way = checkWays[i3]; + if (!isRoad(way) && !memberOfRestriction(way)) + continue; + ways.push(way); + hasWays = true; + nodes = utilArrayUniq(graph.childNodes(way)); + for (j3 = 0; j3 < nodes.length; j3++) { + node = nodes[j3]; + if (node === vertex) + continue; + if (vertices.indexOf(node) !== -1) + continue; + if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) + continue; + var hasParents = false; + parents = graph.parentWays(node); + for (k2 = 0; k2 < parents.length; k2++) { + parent = parents[k2]; + if (parent === way) + continue; + if (ways.indexOf(parent) !== -1) + continue; + if (!isRoad(parent)) + continue; + hasParents = true; + break; + } + if (hasParents) { + checkVertices.push(node); + } } } - if (maxDistance < 1e-4) { - return "straight_enough"; + if (hasWays) { + vertices.push(vertex); } - }; - action.transitionable = true; - return action; - } - - // modules/actions/straighten_way.js - function actionStraightenWay(selectedIDs, projection2) { - function positionAlongWay(a, o, b) { - return geoVecDot(a, b, o) / geoVecDot(b, b, o); } - function allNodes(graph) { - var nodes = []; - var startNodes = []; - var endNodes = []; - var remainingWays = []; - var selectedWays = selectedIDs.filter(function(w) { - return graph.entity(w).type === "way"; - }); - var selectedNodes = selectedIDs.filter(function(n2) { - return graph.entity(n2).type === "node"; - }); - for (var i2 = 0; i2 < selectedWays.length; i2++) { - var way = graph.entity(selectedWays[i2]); - nodes = way.nodes.slice(0); - remainingWays.push(nodes); - startNodes.push(nodes[0]); - endNodes.push(nodes[nodes.length - 1]); - } - startNodes = startNodes.filter(function(n2) { - return startNodes.indexOf(n2) === startNodes.lastIndexOf(n2); - }); - endNodes = endNodes.filter(function(n2) { - return endNodes.indexOf(n2) === endNodes.lastIndexOf(n2); + vertices = utilArrayUniq(vertices); + ways = utilArrayUniq(ways); + ways.forEach(function(way2) { + graph.childNodes(way2).forEach(function(node2) { + vgraph = vgraph.replace(node2); }); - var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0]; - var nextWay = []; - nodes = []; - var getNextWay = function(currNode2, remainingWays2) { - return remainingWays2.filter(function(way2) { - return way2[0] === currNode2 || way2[way2.length - 1] === currNode2; - })[0]; - }; - while (remainingWays.length) { - nextWay = getNextWay(currNode, remainingWays); - remainingWays = utilArrayDifference(remainingWays, [nextWay]); - if (nextWay[0] !== currNode) { - nextWay.reverse(); + vgraph = vgraph.replace(way2); + graph.parentRelations(way2).forEach(function(relation) { + if (relation.isRestriction()) { + if (relation.isValidRestriction(graph)) { + vgraph = vgraph.replace(relation); + } else if (relation.isComplete(graph)) { + actions.push(actionDeleteRelation(relation.id)); + } } - nodes = nodes.concat(nextWay); - currNode = nodes[nodes.length - 1]; + }); + }); + ways.forEach(function(w2) { + var way2 = vgraph.entity(w2.id); + if (way2.tags.oneway === "-1") { + var action = actionReverse(way2.id, { reverseOneway: true }); + actions.push(action); + vgraph = action(vgraph); } - if (selectedNodes.length === 2) { - var startNodeIdx = nodes.indexOf(selectedNodes[0]); - var endNodeIdx = nodes.indexOf(selectedNodes[1]); - var sortedStartEnd = [startNodeIdx, endNodeIdx]; - sortedStartEnd.sort(function(a, b) { - return a - b; + }); + var origCount = osmEntity.id.next.way; + vertices.forEach(function(v2) { + var splitAll = actionSplit([v2.id]).keepHistoryOn("first"); + if (!splitAll.disabled(vgraph)) { + splitAll.ways(vgraph).forEach(function(way2) { + var splitOne = actionSplit([v2.id]).limitWays([way2.id]).keepHistoryOn("first"); + actions.push(splitOne); + vgraph = splitOne(vgraph); }); - nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1); } - return nodes.map(function(n2) { - return graph.entity(n2); + }); + osmEntity.id.next.way = origCount; + vertexIds = vertices.map(function(v2) { + return v2.id; + }); + vertices = []; + ways = []; + vertexIds.forEach(function(id2) { + var vertex2 = vgraph.entity(id2); + var parents2 = vgraph.parentWays(vertex2); + vertices.push(vertex2); + ways = ways.concat(parents2); + }); + vertices = utilArrayUniq(vertices); + ways = utilArrayUniq(ways); + vertexIds = vertices.map(function(v2) { + return v2.id; + }); + wayIds = ways.map(function(w2) { + return w2.id; + }); + function withMetadata(way2, vertexIds2) { + var __oneWay = way2.isOneWay(); + var __first = vertexIds2.indexOf(way2.first()) !== -1; + var __last = vertexIds2.indexOf(way2.last()) !== -1; + var __via = __first && __last; + var __from = __first && !__oneWay || __last; + var __to = __first || __last && !__oneWay; + return way2.update({ + __first, + __last, + __from, + __via, + __to, + __oneWay }); } - function shouldKeepNode(node, graph) { - return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags(); - } - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var nodes = allNodes(graph); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var startPoint = points[0]; - var endPoint = points[points.length - 1]; - var toDelete = []; - var i2; - for (i2 = 1; i2 < points.length - 1; i2++) { - var node = nodes[i2]; - var point = points[i2]; - if (t < 1 || shouldKeepNode(node, graph)) { - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var loc2 = projection2.invert(p); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t))); - } else { - if (toDelete.indexOf(node) === -1) { - toDelete.push(node); + ways = []; + wayIds.forEach(function(id2) { + var way2 = withMetadata(vgraph.entity(id2), vertexIds); + vgraph = vgraph.replace(way2); + ways.push(way2); + }); + var keepGoing; + var removeWayIds = []; + var removeVertexIds = []; + do { + keepGoing = false; + checkVertices = vertexIds.slice(); + for (i3 = 0; i3 < checkVertices.length; i3++) { + var vertexId = checkVertices[i3]; + vertex = vgraph.hasEntity(vertexId); + if (!vertex) { + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); } + removeVertexIds.push(vertexId); + continue; } - } - for (i2 = 0; i2 < toDelete.length; i2++) { - graph = actionDeleteNode(toDelete[i2].id)(graph); - } - return graph; - }; - action.disabled = function(graph) { - var nodes = allNodes(graph); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - var startPoint = points[0]; - var endPoint = points[points.length - 1]; - var threshold = 0.2 * geoVecLength(startPoint, endPoint); - var i2; - if (threshold === 0) { - return "too_bendy"; - } - var maxDistance = 0; - for (i2 = 1; i2 < points.length - 1; i2++) { - var point = points[i2]; - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var dist = geoVecLength(p, point); - if (isNaN(dist) || dist > threshold) { - return "too_bendy"; - } else if (dist > maxDistance) { - maxDistance = dist; + parents = vgraph.parentWays(vertex); + if (parents.length < 3) { + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); + } + } + if (parents.length === 2) { + var a2 = parents[0]; + var b2 = parents[1]; + var aIsLeaf = a2 && !a2.__via; + var bIsLeaf = b2 && !b2.__via; + var leaf, survivor; + if (aIsLeaf && !bIsLeaf) { + leaf = a2; + survivor = b2; + } else if (!aIsLeaf && bIsLeaf) { + leaf = b2; + survivor = a2; + } + if (leaf && survivor) { + survivor = withMetadata(survivor, vertexIds); + vgraph = vgraph.replace(survivor).remove(leaf); + removeWayIds.push(leaf.id); + keepGoing = true; + } + } + parents = vgraph.parentWays(vertex); + if (parents.length < 2) { + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); + } + removeVertexIds.push(vertexId); + keepGoing = true; + } + if (parents.length < 1) { + vgraph = vgraph.remove(vertex); } } - var keepingAllNodes = nodes.every(function(node, i3) { - return i3 === 0 || i3 === nodes.length - 1 || shouldKeepNode(node, graph); - }); - if (maxDistance < 1e-4 && keepingAllNodes) { - return "straight_enough"; - } - }; - action.transitionable = true; - return action; - } - - // modules/actions/unrestrict_turn.js - function actionUnrestrictTurn(turn) { - return function(graph) { - return actionDeleteRelation(turn.restrictionID)(graph); + } while (keepGoing); + vertices = vertices.filter(function(vertex2) { + return removeVertexIds.indexOf(vertex2.id) === -1; + }).map(function(vertex2) { + return vgraph.entity(vertex2.id); + }); + ways = ways.filter(function(way2) { + return removeWayIds.indexOf(way2.id) === -1; + }).map(function(way2) { + return vgraph.entity(way2.id); + }); + var intersection = { + graph: vgraph, + actions, + vertices, + ways }; - } - - // modules/actions/reflect.js - function actionReflect(reflectIds, projection2) { - var _useLongAxis = true; - var action = function(graph, t) { - if (t === null || !isFinite(t)) - t = 1; - t = Math.min(Math.max(+t, 0), 1); - var nodes = utilGetAllNodes(reflectIds, graph); - var points = nodes.map(function(n2) { - return projection2(n2.loc); + intersection.turns = function(fromWayId, maxViaWay) { + if (!fromWayId) + return []; + if (!maxViaWay) + maxViaWay = 0; + var vgraph2 = intersection.graph; + var keyVertexIds = intersection.vertices.map(function(v2) { + return v2.id; }); - var ssr = geoGetSmallestSurroundingRectangle(points); - var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2]; - var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2]; - var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2]; - var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2]; - var p, q; - var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2); - if (_useLongAxis && isLong || !_useLongAxis && !isLong) { - p = p1; - q = q1; - } else { - p = p2; - q = q2; - } - var dx = q[0] - p[0]; - var dy = q[1] - p[1]; - var a = (dx * dx - dy * dy) / (dx * dx + dy * dy); - var b = 2 * dx * dy / (dx * dx + dy * dy); - for (var i2 = 0; i2 < nodes.length; i2++) { - var node = nodes[i2]; - var c = projection2(node.loc); - var c2 = [ - a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0], - b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1] - ]; - var loc2 = projection2.invert(c2); - node = node.move(geoVecInterp(node.loc, loc2, t)); - graph = graph.replace(node); - } - return graph; - }; - action.useLongAxis = function(val) { - if (!arguments.length) - return _useLongAxis; - _useLongAxis = val; - return action; - }; - action.transitionable = true; - return action; - } - - // modules/actions/upgrade_tags.js - function actionUpgradeTags(entityId, oldTags, replaceTags) { - return function(graph) { - var entity = graph.entity(entityId); - var tags = Object.assign({}, entity.tags); - var transferValue; - var semiIndex; - for (var oldTagKey in oldTags) { - if (!(oldTagKey in tags)) - continue; - if (oldTags[oldTagKey] === "*") { - transferValue = tags[oldTagKey]; - delete tags[oldTagKey]; - } else if (oldTags[oldTagKey] === tags[oldTagKey]) { - delete tags[oldTagKey]; + var start2 = vgraph2.entity(fromWayId); + if (!start2 || !(start2.__from || start2.__via)) + return []; + var maxPathLength = maxViaWay * 2 + 3; + var turns = []; + step(start2); + return turns; + function step(entity, currPath, currRestrictions, matchedRestriction) { + currPath = (currPath || []).slice(); + if (currPath.length >= maxPathLength) + return; + currPath.push(entity.id); + currRestrictions = (currRestrictions || []).slice(); + if (entity.type === "node") { + stepNode(entity, currPath, currRestrictions); } else { - var vals = tags[oldTagKey].split(";").filter(Boolean); - var oldIndex = vals.indexOf(oldTags[oldTagKey]); - if (vals.length === 1 || oldIndex === -1) { - delete tags[oldTagKey]; - } else { - if (replaceTags && replaceTags[oldTagKey]) { - semiIndex = oldIndex; - } - vals.splice(oldIndex, 1); - tags[oldTagKey] = vals.join(";"); - } + stepWay(entity, currPath, currRestrictions, matchedRestriction); } } - if (replaceTags) { - for (var replaceKey in replaceTags) { - var replaceValue = replaceTags[replaceKey]; - if (replaceValue === "*") { - if (tags[replaceKey] && tags[replaceKey] !== "no") { + function stepNode(entity, currPath, currRestrictions) { + var i4, j4; + var parents2 = vgraph2.parentWays(entity); + var nextWays = []; + for (i4 = 0; i4 < parents2.length; i4++) { + var way2 = parents2[i4]; + if (way2.__oneWay && way2.nodes[0] !== entity.id) + continue; + if (currPath.indexOf(way2.id) !== -1 && currPath.length >= 3) + continue; + var restrict = null; + for (j4 = 0; j4 < currRestrictions.length; j4++) { + var restriction = currRestrictions[j4]; + var f3 = restriction.memberByRole("from"); + var v2 = restriction.membersByRole("via"); + var t2 = restriction.memberByRole("to"); + var isNo = /^no_/.test(restriction.tags.restriction); + var isOnly = /^only_/.test(restriction.tags.restriction); + if (!(isNo || isOnly)) { continue; - } else { - tags[replaceKey] = "yes"; } - } else if (replaceValue === "$1") { - tags[replaceKey] = transferValue; - } else { - if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== void 0) { - var existingVals = tags[replaceKey].split(";").filter(Boolean); - if (existingVals.indexOf(replaceValue) === -1) { - existingVals.splice(semiIndex, 0, replaceValue); - tags[replaceKey] = existingVals.join(";"); + var matchesFrom = f3.id === fromWayId; + var matchesViaTo = false; + var isAlongOnlyPath = false; + if (t2.id === way2.id) { + if (v2.length === 1 && v2[0].type === "node") { + matchesViaTo = v2[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2); + } else { + var pathVias = []; + for (k2 = 2; k2 < currPath.length; k2 += 2) { + pathVias.push(currPath[k2]); + } + var restrictionVias = []; + for (k2 = 0; k2 < v2.length; k2++) { + if (v2[k2].type === "way") { + restrictionVias.push(v2[k2].id); + } + } + var diff = utilArrayDifference(pathVias, restrictionVias); + matchesViaTo = !diff.length; + } + } else if (isOnly) { + for (k2 = 0; k2 < v2.length; k2++) { + if (v2[k2].type === "way" && v2[k2].id === way2.id) { + isAlongOnlyPath = true; + break; + } + } + } + if (matchesViaTo) { + if (isOnly) { + restrict = { id: restriction.id, direct: matchesFrom, from: f3.id, only: true, end: true }; + } else { + restrict = { id: restriction.id, direct: matchesFrom, from: f3.id, no: true, end: true }; } } else { - tags[replaceKey] = replaceValue; + if (isAlongOnlyPath) { + restrict = { id: restriction.id, direct: false, from: f3.id, only: true, end: false }; + } else if (isOnly) { + restrict = { id: restriction.id, direct: false, from: f3.id, no: true, end: true }; + } } + if (restrict && restrict.direct) + break; } + nextWays.push({ way: way2, restrict }); } + nextWays.forEach(function(nextWay) { + step(nextWay.way, currPath, currRestrictions, nextWay.restrict); + }); } - return graph.replace(entity.update({ tags })); - }; - } - - // modules/behavior/edit.js - function behaviorEdit(context) { - function behavior() { - context.map().minzoom(context.minEditableZoom()); - } - behavior.off = function() { - context.map().minzoom(0); - }; - return behavior; - } - - // modules/behavior/hover.js - function behaviorHover(context) { - var dispatch10 = dispatch_default("hover"); - var _selection = select_default2(null); - var _newNodeId = null; - var _initialNodeID = null; - var _altDisables; - var _ignoreVertex; - var _targets = []; - var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; - function keydown(d3_event) { - if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) { - _selection.selectAll(".hover").classed("hover-suppressed", true).classed("hover", false); - _selection.classed("hover-disabled", true); - dispatch10.call("hover", this, null); - } - } - function keyup(d3_event) { - if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) { - _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false).classed("hover", true); - _selection.classed("hover-disabled", false); - dispatch10.call("hover", this, _targets); - } - } - function behavior(selection2) { - _selection = selection2; - _targets = []; - if (_initialNodeID) { - _newNodeId = _initialNodeID; - _initialNodeID = null; - } else { - _newNodeId = null; - } - _selection.on(_pointerPrefix + "over.hover", pointerover).on(_pointerPrefix + "out.hover", pointerout).on(_pointerPrefix + "down.hover", pointerover); - select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", pointerout, true).on("keydown.hover", keydown).on("keyup.hover", keyup); - function eventTarget(d3_event) { - var datum2 = d3_event.target && d3_event.target.__data__; - if (typeof datum2 !== "object") - return null; - if (!(datum2 instanceof osmEntity) && datum2.properties && datum2.properties.entity instanceof osmEntity) { - return datum2.properties.entity; + function stepWay(entity, currPath, currRestrictions, matchedRestriction) { + var i4; + if (currPath.length >= 3) { + var turnPath = currPath.slice(); + if (matchedRestriction && matchedRestriction.direct === false) { + for (i4 = 0; i4 < turnPath.length; i4++) { + if (turnPath[i4] === matchedRestriction.from) { + turnPath = turnPath.slice(i4); + break; + } + } + } + var turn = pathToTurn(turnPath); + if (turn) { + if (matchedRestriction) { + turn.restrictionID = matchedRestriction.id; + turn.no = matchedRestriction.no; + turn.only = matchedRestriction.only; + turn.direct = matchedRestriction.direct; + } + turns.push(osmTurn(turn)); + } + if (currPath[0] === currPath[2]) + return; } - return datum2; - } - function pointerover(d3_event) { - if (context.mode().id.indexOf("drag") === -1 && (!d3_event.pointerType || d3_event.pointerType === "mouse") && d3_event.buttons) + if (matchedRestriction && matchedRestriction.end) return; - var target = eventTarget(d3_event); - if (target && _targets.indexOf(target) === -1) { - _targets.push(target); - updateHover(d3_event, _targets); - } - } - function pointerout(d3_event) { - var target = eventTarget(d3_event); - var index = _targets.indexOf(target); - if (index !== -1) { - _targets.splice(index); - updateHover(d3_event, _targets); + var n1 = vgraph2.entity(entity.first()); + var n22 = vgraph2.entity(entity.last()); + var dist = geoSphericalDistance(n1.loc, n22.loc); + var nextNodes = []; + if (currPath.length > 1) { + if (dist > maxDistance) + return; + if (!entity.__via) + return; } - } - function allowsVertex(d) { - return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph()); - } - function modeAllowsHover(target) { - var mode = context.mode(); - if (mode.id === "add-point") { - return mode.preset.matchGeometry("vertex") || target.type !== "way" && target.geometry(context.graph()) !== "vertex"; + if (!entity.__oneWay && // bidirectional.. + keyVertexIds.indexOf(n1.id) !== -1 && // key vertex.. + currPath.indexOf(n1.id) === -1) { + nextNodes.push(n1); } - return true; - } - function updateHover(d3_event, targets) { - _selection.selectAll(".hover").classed("hover", false); - _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false); - var mode = context.mode(); - if (!_newNodeId && (mode.id === "draw-line" || mode.id === "draw-area")) { - var node = targets.find(function(target) { - return target instanceof osmEntity && target.type === "node"; - }); - _newNodeId = node && node.id; + if (keyVertexIds.indexOf(n22.id) !== -1 && // key vertex.. + currPath.indexOf(n22.id) === -1) { + nextNodes.push(n22); } - targets = targets.filter(function(datum3) { - if (datum3 instanceof osmEntity) { - return datum3.id !== _newNodeId && (datum3.type !== "node" || !_ignoreVertex || allowsVertex(datum3)) && modeAllowsHover(datum3); - } - return true; - }); - var selector = ""; - for (var i2 in targets) { - var datum2 = targets[i2]; - if (datum2.__featurehash__) { - selector += ", .data" + datum2.__featurehash__; - } else if (datum2 instanceof QAItem) { - selector += ", ." + datum2.service + ".itemId-" + datum2.id; - } else if (datum2 instanceof osmNote) { - selector += ", .note-" + datum2.id; - } else if (datum2 instanceof osmEntity) { - selector += ", ." + datum2.id; - if (datum2.type === "relation") { - for (var j2 in datum2.members) { - selector += ", ." + datum2.members[j2].id; + nextNodes.forEach(function(nextNode) { + var fromRestrictions = vgraph2.parentRelations(entity).filter(function(r2) { + if (!r2.isRestriction()) + return false; + var f3 = r2.memberByRole("from"); + if (!f3 || f3.id !== entity.id) + return false; + var isOnly = /^only_/.test(r2.tags.restriction); + if (!isOnly) + return true; + var isOnlyVia = false; + var v2 = r2.membersByRole("via"); + if (v2.length === 1 && v2[0].type === "node") { + isOnlyVia = v2[0].id === nextNode.id; + } else { + for (var i5 = 0; i5 < v2.length; i5++) { + if (v2[i5].type !== "way") + continue; + var viaWay = vgraph2.entity(v2[i5].id); + if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) { + isOnlyVia = true; + break; + } } } + return isOnlyVia; + }); + step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false); + }); + } + function pathToTurn(path) { + if (path.length < 3) + return; + var fromWayId2, fromNodeId, fromVertexId; + var toWayId, toNodeId, toVertexId; + var viaWayIds, viaNodeId, isUturn; + fromWayId2 = path[0]; + toWayId = path[path.length - 1]; + if (path.length === 3 && fromWayId2 === toWayId) { + var way2 = vgraph2.entity(fromWayId2); + if (way2.__oneWay) + return null; + isUturn = true; + viaNodeId = fromVertexId = toVertexId = path[1]; + fromNodeId = toNodeId = adjacentNode(fromWayId2, viaNodeId); + } else { + isUturn = false; + fromVertexId = path[1]; + fromNodeId = adjacentNode(fromWayId2, fromVertexId); + toVertexId = path[path.length - 2]; + toNodeId = adjacentNode(toWayId, toVertexId); + if (path.length === 3) { + viaNodeId = path[1]; + } else { + viaWayIds = path.filter(function(entityId) { + return entityId[0] === "w"; + }); + viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); } } - var suppressed = _altDisables && d3_event && d3_event.altKey; - if (selector.trim().length) { - selector = selector.slice(1); - _selection.selectAll(selector).classed(suppressed ? "hover-suppressed" : "hover", true); + return { + key: path.join("_"), + path, + from: { node: fromNodeId, way: fromWayId2, vertex: fromVertexId }, + via: { node: viaNodeId, ways: viaWayIds }, + to: { node: toNodeId, way: toWayId, vertex: toVertexId }, + u: isUturn + }; + function adjacentNode(wayId, affixId) { + var nodes2 = vgraph2.entity(wayId).nodes; + return affixId === nodes2[0] ? nodes2[1] : nodes2[nodes2.length - 2]; } - dispatch10.call("hover", this, !suppressed && targets); } - } - behavior.off = function(selection2) { - selection2.selectAll(".hover").classed("hover", false); - selection2.selectAll(".hover-suppressed").classed("hover-suppressed", false); - selection2.classed("hover-disabled", false); - selection2.on(_pointerPrefix + "over.hover", null).on(_pointerPrefix + "out.hover", null).on(_pointerPrefix + "down.hover", null); - select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", null, true).on("keydown.hover", null).on("keyup.hover", null); - }; - behavior.altDisables = function(val) { - if (!arguments.length) - return _altDisables; - _altDisables = val; - return behavior; - }; - behavior.ignoreVertex = function(val) { - if (!arguments.length) - return _ignoreVertex; - _ignoreVertex = val; - return behavior; }; - behavior.initialNodeID = function(nodeId) { - _initialNodeID = nodeId; - return behavior; - }; - return utilRebind(behavior, dispatch10, "on"); + return intersection; + } + function osmInferRestriction(graph, turn, projection2) { + var fromWay = graph.entity(turn.from.way); + var fromNode = graph.entity(turn.from.node); + var fromVertex = graph.entity(turn.from.vertex); + var toWay = graph.entity(turn.to.way); + var toNode = graph.entity(turn.to.node); + var toVertex = graph.entity(turn.to.vertex); + var fromOneWay = fromWay.tags.oneway === "yes"; + var toOneWay = toWay.tags.oneway === "yes"; + var angle2 = (geoAngle(fromVertex, fromNode, projection2) - geoAngle(toVertex, toNode, projection2)) * 180 / Math.PI; + while (angle2 < 0) { + angle2 += 360; + } + if (fromNode === toNode) { + return "no_u_turn"; + } + if ((angle2 < 23 || angle2 > 336) && fromOneWay && toOneWay) { + return "no_u_turn"; + } + if ((angle2 < 40 || angle2 > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) { + return "no_u_turn"; + } + if (angle2 < 158) { + return "no_right_turn"; + } + if (angle2 > 202) { + return "no_left_turn"; + } + return "no_straight_on"; } - // modules/behavior/draw.js - var _disableSpace = false; - var _lastSpace = null; - function behaviorDraw(context) { - var dispatch10 = dispatch_default( - "move", - "down", - "downcancel", - "click", - "clickWay", - "clickNode", - "undo", - "cancel", - "finish" - ); - var keybinding = utilKeybinding("draw"); - var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on("hover", context.ui().sidebar.hover); - var _edit = behaviorEdit(context); - var _closeTolerance = 4; - var _tolerance = 12; - var _mouseLeave = false; - var _lastMouse = null; - var _lastPointerUpEvent; - var _downPointer; - var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; - function datum2(d3_event) { - var mode = context.mode(); - var isNote = mode && mode.id.indexOf("note") !== -1; - if (d3_event.altKey || isNote) - return {}; - var element; - if (d3_event.type === "keydown") { - element = _lastMouse && _lastMouse.target; - } else { - element = d3_event.target; - } - var d = element.__data__; - return d && d.properties && d.properties.target ? d : {}; - } - function pointerdown(d3_event) { - if (_downPointer) - return; - var pointerLocGetter = utilFastMouse(this); - _downPointer = { - id: d3_event.pointerId || "mouse", - pointerLocGetter, - downTime: +new Date(), - downLoc: pointerLocGetter(d3_event) - }; - dispatch10.call("down", this, d3_event, datum2(d3_event)); + // modules/actions/merge_polygon.js + function actionMergePolygon(ids, newRelationId) { + function groupEntities(graph) { + var entities = ids.map(function(id2) { + return graph.entity(id2); + }); + var geometryGroups = utilArrayGroupBy(entities, function(entity) { + if (entity.type === "way" && entity.isClosed()) { + return "closedWay"; + } else if (entity.type === "relation" && entity.isMultipolygon()) { + return "multipolygon"; + } else { + return "other"; + } + }); + return Object.assign( + { closedWay: [], multipolygon: [], other: [] }, + geometryGroups + ); } - function pointerup(d3_event) { - if (!_downPointer || _downPointer.id !== (d3_event.pointerId || "mouse")) - return; - var downPointer = _downPointer; - _downPointer = null; - _lastPointerUpEvent = d3_event; - if (downPointer.isCancelled) - return; - var t2 = +new Date(); - var p2 = downPointer.pointerLocGetter(d3_event); - var dist = geoVecLength(downPointer.downLoc, p2); - if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) { - select_default2(window).on("click.draw-block", function() { - d3_event.stopPropagation(); - }, true); - context.map().dblclickZoomEnable(false); - window.setTimeout(function() { - context.map().dblclickZoomEnable(true); - select_default2(window).on("click.draw-block", null); - }, 500); - click(d3_event, p2); + var action = function(graph) { + var entities = groupEntities(graph); + var polygons = entities.multipolygon.reduce(function(polygons2, m2) { + return polygons2.concat(osmJoinWays(m2.members, graph)); + }, []).concat(entities.closedWay.map(function(d2) { + var member = [{ id: d2.id }]; + member.nodes = graph.childNodes(d2); + return member; + })); + var contained = polygons.map(function(w2, i3) { + return polygons.map(function(d2, n3) { + if (i3 === n3) + return null; + return geoPolygonContainsPolygon( + d2.nodes.map(function(n4) { + return n4.loc; + }), + w2.nodes.map(function(n4) { + return n4.loc; + }) + ); + }); + }); + var members = []; + var outer = true; + while (polygons.length) { + extractUncontained(polygons); + polygons = polygons.filter(isContained); + contained = contained.filter(isContained).map(filterContained); } - } - function pointermove(d3_event) { - if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse") && !_downPointer.isCancelled) { - var p2 = _downPointer.pointerLocGetter(d3_event); - var dist = geoVecLength(_downPointer.downLoc, p2); - if (dist >= _closeTolerance) { - _downPointer.isCancelled = true; - dispatch10.call("downcancel", this); - } + function isContained(d2, i3) { + return contained[i3].some(function(val) { + return val; + }); } - if (d3_event.pointerType && d3_event.pointerType !== "mouse" || d3_event.buttons || _downPointer) - return; - if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== "mouse" && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100) - return; - _lastMouse = d3_event; - dispatch10.call("move", this, d3_event, datum2(d3_event)); - } - function pointercancel(d3_event) { - if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse")) { - if (!_downPointer.isCancelled) { - dispatch10.call("downcancel", this); - } - _downPointer = null; + function filterContained(d2) { + return d2.filter(isContained); } - } - function mouseenter() { - _mouseLeave = false; - } - function mouseleave() { - _mouseLeave = true; - } - function allowsVertex(d) { - return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph()); - } - function click(d3_event, loc) { - var d = datum2(d3_event); - var target = d && d.properties && d.properties.entity; - var mode = context.mode(); - if (target && target.type === "node" && allowsVertex(target)) { - dispatch10.call("clickNode", this, target, d); - return; - } else if (target && target.type === "way" && (mode.id !== "add-point" || mode.preset.matchGeometry("vertex"))) { - var choice = geoChooseEdge( - context.graph().childNodes(target), - loc, - context.projection, - context.activeID() - ); - if (choice) { - var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]]; - dispatch10.call("clickWay", this, choice.loc, edge, d); - return; - } - } else if (mode.id !== "add-point" || mode.preset.matchGeometry("point")) { - var locLatLng = context.projection.invert(loc); - dispatch10.call("click", this, locLatLng, d); + function extractUncontained(polygons2) { + polygons2.forEach(function(d2, i3) { + if (!isContained(d2, i3)) { + d2.forEach(function(member) { + members.push({ + type: "way", + id: member.id, + role: outer ? "outer" : "inner" + }); + }); + } + }); + outer = !outer; } - } - function space(d3_event) { - d3_event.preventDefault(); - d3_event.stopPropagation(); - var currSpace = context.map().mouse(); - if (_disableSpace && _lastSpace) { - var dist = geoVecLength(_lastSpace, currSpace); - if (dist > _tolerance) { - _disableSpace = false; - } + var relation; + if (entities.multipolygon.length > 0) { + var oldestID = utilOldestID(entities.multipolygon.map((entity) => entity.id)); + relation = entities.multipolygon.find((entity) => entity.id === oldestID); + } else { + relation = osmRelation({ id: newRelationId, tags: { type: "multipolygon" } }); } - if (_disableSpace || _mouseLeave || !_lastMouse) - return; - _lastSpace = currSpace; - _disableSpace = true; - select_default2(window).on("keyup.space-block", function() { - d3_event.preventDefault(); - d3_event.stopPropagation(); - _disableSpace = false; - select_default2(window).on("keyup.space-block", null); + entities.multipolygon.forEach(function(m2) { + if (m2.id !== relation.id) { + relation = relation.mergeTags(m2.tags); + graph = graph.remove(m2); + } }); - var loc = context.map().mouse() || context.projection(context.map().center()); - click(d3_event, loc); - } - function backspace(d3_event) { - d3_event.preventDefault(); - dispatch10.call("undo"); - } - function del(d3_event) { - d3_event.preventDefault(); - dispatch10.call("cancel"); - } - function ret(d3_event) { - d3_event.preventDefault(); - dispatch10.call("finish"); - } - function behavior(selection2) { - context.install(_hover); - context.install(_edit); - _downPointer = null; - keybinding.on("\u232B", backspace).on("\u2326", del).on("\u238B", ret).on("\u21A9", ret).on("space", space).on("\u2325space", space); - selection2.on("mouseenter.draw", mouseenter).on("mouseleave.draw", mouseleave).on(_pointerPrefix + "down.draw", pointerdown).on(_pointerPrefix + "move.draw", pointermove); - select_default2(window).on(_pointerPrefix + "up.draw", pointerup, true).on("pointercancel.draw", pointercancel, true); - select_default2(document).call(keybinding); - return behavior; - } - behavior.off = function(selection2) { - context.ui().sidebar.hover.cancel(); - context.uninstall(_hover); - context.uninstall(_edit); - selection2.on("mouseenter.draw", null).on("mouseleave.draw", null).on(_pointerPrefix + "down.draw", null).on(_pointerPrefix + "move.draw", null); - select_default2(window).on(_pointerPrefix + "up.draw", null).on("pointercancel.draw", null); - select_default2(document).call(keybinding.unbind); - }; - behavior.hover = function() { - return _hover; + entities.closedWay.forEach(function(way) { + function isThisOuter(m2) { + return m2.id === way.id && m2.role !== "inner"; + } + if (members.some(isThisOuter)) { + relation = relation.mergeTags(way.tags); + graph = graph.replace(way.update({ tags: {} })); + } + }); + return graph.replace(relation.update({ + members, + tags: utilObjectOmit(relation.tags, ["area"]) + })); }; - return utilRebind(behavior, dispatch10, "on"); - } - - // modules/behavior/breathe.js - var import_fast_deep_equal2 = __toESM(require_fast_deep_equal()); - - // node_modules/d3-scale/src/init.js - function initRange(domain2, range3) { - switch (arguments.length) { - case 0: - break; - case 1: - this.range(domain2); - break; - default: - this.range(range3).domain(domain2); - break; - } - return this; - } - - // node_modules/d3-scale/src/constant.js - function constants(x) { - return function() { - return x; + action.disabled = function(graph) { + var entities = groupEntities(graph); + if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) { + return "not_eligible"; + } + if (!entities.multipolygon.every(function(r2) { + return r2.isComplete(graph); + })) { + return "incomplete_relation"; + } + if (!entities.multipolygon.length) { + var sharedMultipolygons = []; + entities.closedWay.forEach(function(way, i3) { + if (i3 === 0) { + sharedMultipolygons = graph.parentMultipolygons(way); + } else { + sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way)); + } + }); + sharedMultipolygons = sharedMultipolygons.filter(function(relation) { + return relation.members.length === entities.closedWay.length; + }); + if (sharedMultipolygons.length) { + return "not_eligible"; + } + } else if (entities.closedWay.some(function(way) { + return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length; + })) { + return "not_eligible"; + } }; + return action; } - // node_modules/d3-scale/src/number.js - function number2(x) { - return +x; - } + // modules/actions/merge_remote_changes.js + var import_fast_deep_equal = __toESM(require_fast_deep_equal()); - // node_modules/d3-scale/src/continuous.js - var unit = [0, 1]; - function identity3(x) { - return x; - } - function normalize(a, b) { - return (b -= a = +a) ? function(x) { - return (x - a) / b; - } : constants(isNaN(b) ? NaN : 0.5); - } - function clamper(a, b) { - var t; - if (a > b) - t = a, a = b, b = t; - return function(x) { - return Math.max(a, Math.min(b, x)); - }; - } - function bimap(domain2, range3, interpolate) { - var d0 = domain2[0], d1 = domain2[1], r0 = range3[0], r1 = range3[1]; - if (d1 < d0) - d0 = normalize(d1, d0), r0 = interpolate(r1, r0); - else - d0 = normalize(d0, d1), r0 = interpolate(r0, r1); - return function(x) { - return r0(d0(x)); - }; - } - function polymap(domain2, range3, interpolate) { - var j2 = Math.min(domain2.length, range3.length) - 1, d = new Array(j2), r = new Array(j2), i2 = -1; - if (domain2[j2] < domain2[0]) { - domain2 = domain2.slice().reverse(); - range3 = range3.slice().reverse(); + // node_modules/node-diff3/index.mjs + function LCS(buffer1, buffer2) { + let equivalenceClasses = {}; + for (let j3 = 0; j3 < buffer2.length; j3++) { + const item = buffer2[j3]; + if (equivalenceClasses[item]) { + equivalenceClasses[item].push(j3); + } else { + equivalenceClasses[item] = [j3]; + } } - while (++i2 < j2) { - d[i2] = normalize(domain2[i2], domain2[i2 + 1]); - r[i2] = interpolate(range3[i2], range3[i2 + 1]); + const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null }; + let candidates = [NULLRESULT]; + for (let i3 = 0; i3 < buffer1.length; i3++) { + const item = buffer1[i3]; + const buffer2indices = equivalenceClasses[item] || []; + let r2 = 0; + let c2 = candidates[0]; + for (let jx = 0; jx < buffer2indices.length; jx++) { + const j3 = buffer2indices[jx]; + let s2; + for (s2 = r2; s2 < candidates.length; s2++) { + if (candidates[s2].buffer2index < j3 && (s2 === candidates.length - 1 || candidates[s2 + 1].buffer2index > j3)) { + break; + } + } + if (s2 < candidates.length) { + const newCandidate = { buffer1index: i3, buffer2index: j3, chain: candidates[s2] }; + if (r2 === candidates.length) { + candidates.push(c2); + } else { + candidates[r2] = c2; + } + r2 = s2 + 1; + c2 = newCandidate; + if (r2 === candidates.length) { + break; + } + } + } + candidates[r2] = c2; } - return function(x) { - var i3 = bisect_default(domain2, x, 1, j2) - 1; - return r[i3](d[i3](x)); - }; - } - function copy(source, target) { - return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown()); + return candidates[candidates.length - 1]; } - function transformer2() { - var domain2 = unit, range3 = unit, interpolate = value_default, transform2, untransform, unknown, clamp3 = identity3, piecewise, output, input; - function rescale() { - var n2 = Math.min(domain2.length, range3.length); - if (clamp3 !== identity3) - clamp3 = clamper(domain2[0], domain2[n2 - 1]); - piecewise = n2 > 2 ? polymap : bimap; - output = input = null; - return scale; - } - function scale(x) { - return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain2.map(transform2), range3, interpolate)))(transform2(clamp3(x))); + function diffIndices(buffer1, buffer2) { + const lcs = LCS(buffer1, buffer2); + let result = []; + let tail1 = buffer1.length; + let tail2 = buffer2.length; + for (let candidate = lcs; candidate !== null; candidate = candidate.chain) { + const mismatchLength1 = tail1 - candidate.buffer1index - 1; + const mismatchLength2 = tail2 - candidate.buffer2index - 1; + tail1 = candidate.buffer1index; + tail2 = candidate.buffer2index; + if (mismatchLength1 || mismatchLength2) { + result.push({ + buffer1: [tail1 + 1, mismatchLength1], + buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1), + buffer2: [tail2 + 1, mismatchLength2], + buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2) + }); + } } - scale.invert = function(y) { - return clamp3(untransform((input || (input = piecewise(range3, domain2.map(transform2), number_default)))(y))); - }; - scale.domain = function(_) { - return arguments.length ? (domain2 = Array.from(_, number2), rescale()) : domain2.slice(); - }; - scale.range = function(_) { - return arguments.length ? (range3 = Array.from(_), rescale()) : range3.slice(); - }; - scale.rangeRound = function(_) { - return range3 = Array.from(_), interpolate = round_default, rescale(); - }; - scale.clamp = function(_) { - return arguments.length ? (clamp3 = _ ? true : identity3, rescale()) : clamp3 !== identity3; - }; - scale.interpolate = function(_) { - return arguments.length ? (interpolate = _, rescale()) : interpolate; - }; - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - return function(t, u) { - transform2 = t, untransform = u; - return rescale(); - }; - } - function continuous() { - return transformer2()(identity3, identity3); - } - - // node_modules/d3-format/src/formatDecimal.js - function formatDecimal_default(x) { - return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10); - } - function formatDecimalParts(x, p) { - if ((i2 = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) - return null; - var i2, coefficient = x.slice(0, i2); - return [ - coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, - +x.slice(i2 + 1) - ]; - } - - // node_modules/d3-format/src/exponent.js - function exponent_default(x) { - return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; + result.reverse(); + return result; } - - // node_modules/d3-format/src/formatGroup.js - function formatGroup_default(grouping, thousands) { - return function(value, width) { - var i2 = value.length, t = [], j2 = 0, g = grouping[0], length = 0; - while (i2 > 0 && g > 0) { - if (length + g + 1 > width) - g = Math.max(1, width - length); - t.push(value.substring(i2 -= g, i2 + g)); - if ((length += g + 1) > width) + function diff3MergeRegions(a2, o2, b2) { + let hunks = []; + function addHunk(h2, ab) { + hunks.push({ + ab, + oStart: h2.buffer1[0], + oLength: h2.buffer1[1], + // length of o to remove + abStart: h2.buffer2[0], + abLength: h2.buffer2[1] + // length of a/b to insert + // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1]) + }); + } + diffIndices(o2, a2).forEach((item) => addHunk(item, "a")); + diffIndices(o2, b2).forEach((item) => addHunk(item, "b")); + hunks.sort((x2, y2) => x2.oStart - y2.oStart); + let results = []; + let currOffset = 0; + function advanceTo(endOffset) { + if (endOffset > currOffset) { + results.push({ + stable: true, + buffer: "o", + bufferStart: currOffset, + bufferLength: endOffset - currOffset, + bufferContent: o2.slice(currOffset, endOffset) + }); + currOffset = endOffset; + } + } + while (hunks.length) { + let hunk = hunks.shift(); + let regionStart = hunk.oStart; + let regionEnd = hunk.oStart + hunk.oLength; + let regionHunks = [hunk]; + advanceTo(regionStart); + while (hunks.length) { + const nextHunk = hunks[0]; + const nextHunkStart = nextHunk.oStart; + if (nextHunkStart > regionEnd) break; - g = grouping[j2 = (j2 + 1) % grouping.length]; + regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength); + regionHunks.push(hunks.shift()); } - return t.reverse().join(thousands); - }; + if (regionHunks.length === 1) { + if (hunk.abLength > 0) { + const buffer = hunk.ab === "a" ? a2 : b2; + results.push({ + stable: true, + buffer: hunk.ab, + bufferStart: hunk.abStart, + bufferLength: hunk.abLength, + bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength) + }); + } + } else { + let bounds = { + a: [a2.length, -1, o2.length, -1], + b: [b2.length, -1, o2.length, -1] + }; + while (regionHunks.length) { + hunk = regionHunks.shift(); + const oStart = hunk.oStart; + const oEnd = oStart + hunk.oLength; + const abStart = hunk.abStart; + const abEnd = abStart + hunk.abLength; + let b3 = bounds[hunk.ab]; + b3[0] = Math.min(abStart, b3[0]); + b3[1] = Math.max(abEnd, b3[1]); + b3[2] = Math.min(oStart, b3[2]); + b3[3] = Math.max(oEnd, b3[3]); + } + const aStart = bounds.a[0] + (regionStart - bounds.a[2]); + const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]); + const bStart = bounds.b[0] + (regionStart - bounds.b[2]); + const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]); + let result = { + stable: false, + aStart, + aLength: aEnd - aStart, + aContent: a2.slice(aStart, aEnd), + oStart: regionStart, + oLength: regionEnd - regionStart, + oContent: o2.slice(regionStart, regionEnd), + bStart, + bLength: bEnd - bStart, + bContent: b2.slice(bStart, bEnd) + }; + results.push(result); + } + currOffset = regionEnd; + } + advanceTo(o2.length); + return results; } - - // node_modules/d3-format/src/formatNumerals.js - function formatNumerals_default(numerals) { - return function(value) { - return value.replace(/[0-9]/g, function(i2) { - return numerals[+i2]; - }); + function diff3Merge(a2, o2, b2, options2) { + let defaults = { + excludeFalseConflicts: true, + stringSeparator: /\s+/ }; - } - - // node_modules/d3-format/src/formatSpecifier.js - var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; - function formatSpecifier(specifier) { - if (!(match = re.exec(specifier))) - throw new Error("invalid format: " + specifier); - var match; - return new FormatSpecifier({ - fill: match[1], - align: match[2], - sign: match[3], - symbol: match[4], - zero: match[5], - width: match[6], - comma: match[7], - precision: match[8] && match[8].slice(1), - trim: match[9], - type: match[10] + options2 = Object.assign(defaults, options2); + if (typeof a2 === "string") + a2 = a2.split(options2.stringSeparator); + if (typeof o2 === "string") + o2 = o2.split(options2.stringSeparator); + if (typeof b2 === "string") + b2 = b2.split(options2.stringSeparator); + let results = []; + const regions = diff3MergeRegions(a2, o2, b2); + let okBuffer = []; + function flushOk() { + if (okBuffer.length) { + results.push({ ok: okBuffer }); + } + okBuffer = []; + } + function isFalseConflict(a3, b3) { + if (a3.length !== b3.length) + return false; + for (let i3 = 0; i3 < a3.length; i3++) { + if (a3[i3] !== b3[i3]) + return false; + } + return true; + } + regions.forEach((region) => { + if (region.stable) { + okBuffer.push(...region.bufferContent); + } else { + if (options2.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) { + okBuffer.push(...region.aContent); + } else { + flushOk(); + results.push({ + conflict: { + a: region.aContent, + aIndex: region.aStart, + o: region.oContent, + oIndex: region.oStart, + b: region.bContent, + bIndex: region.bStart + } + }); + } + } }); + flushOk(); + return results; } - formatSpecifier.prototype = FormatSpecifier.prototype; - function FormatSpecifier(specifier) { - this.fill = specifier.fill === void 0 ? " " : specifier.fill + ""; - this.align = specifier.align === void 0 ? ">" : specifier.align + ""; - this.sign = specifier.sign === void 0 ? "-" : specifier.sign + ""; - this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + ""; - this.zero = !!specifier.zero; - this.width = specifier.width === void 0 ? void 0 : +specifier.width; - this.comma = !!specifier.comma; - this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision; - this.trim = !!specifier.trim; - this.type = specifier.type === void 0 ? "" : specifier.type + ""; - } - FormatSpecifier.prototype.toString = function() { - return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type; - }; - // node_modules/d3-format/src/formatTrim.js - function formatTrim_default(s) { - out: - for (var n2 = s.length, i2 = 1, i0 = -1, i1; i2 < n2; ++i2) { - switch (s[i2]) { - case ".": - i0 = i1 = i2; - break; - case "0": - if (i0 === 0) - i0 = i2; - i1 = i2; - break; - default: - if (!+s[i2]) - break out; - if (i0 > 0) - i0 = 0; + // modules/actions/merge_remote_changes.js + var import_lodash2 = __toESM(require_lodash()); + function actionMergeRemoteChanges(id2, localGraph, remoteGraph, discardTags, formatUser) { + discardTags = discardTags || {}; + var _option = "safe"; + var _conflicts = []; + function user(d2) { + return typeof formatUser === "function" ? formatUser(d2) : (0, import_lodash2.escape)(d2); + } + function mergeLocation(remote, target) { + function pointEqual(a2, b2) { + var epsilon3 = 1e-6; + return Math.abs(a2[0] - b2[0]) < epsilon3 && Math.abs(a2[1] - b2[1]) < epsilon3; + } + if (_option === "force_local" || pointEqual(target.loc, remote.loc)) { + return target; + } + if (_option === "force_remote") { + return target.update({ loc: remote.loc }); + } + _conflicts.push(_t.html("merge_remote_changes.conflict.location", { user: { html: user(remote.user) } })); + return target; + } + function mergeNodes(base, remote, target) { + if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.nodes, remote.nodes)) { + return target; + } + if (_option === "force_remote") { + return target.update({ nodes: remote.nodes }); + } + var ccount = _conflicts.length; + var o2 = base.nodes || []; + var a2 = target.nodes || []; + var b2 = remote.nodes || []; + var nodes = []; + var hunks = diff3Merge(a2, o2, b2, { excludeFalseConflicts: true }); + for (var i3 = 0; i3 < hunks.length; i3++) { + var hunk = hunks[i3]; + if (hunk.ok) { + nodes.push.apply(nodes, hunk.ok); + } else { + var c2 = hunk.conflict; + if ((0, import_fast_deep_equal.default)(c2.o, c2.a)) { + nodes.push.apply(nodes, c2.b); + } else if ((0, import_fast_deep_equal.default)(c2.o, c2.b)) { + nodes.push.apply(nodes, c2.a); + } else { + _conflicts.push(_t.html("merge_remote_changes.conflict.nodelist", { user: { html: user(remote.user) } })); break; + } } } - return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; - } - - // node_modules/d3-format/src/formatPrefixAuto.js - var prefixExponent; - function formatPrefixAuto_default(x, p) { - var d = formatDecimalParts(x, p); - if (!d) - return x + ""; - var coefficient = d[0], exponent = d[1], i2 = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n2 = coefficient.length; - return i2 === n2 ? coefficient : i2 > n2 ? coefficient + new Array(i2 - n2 + 1).join("0") : i2 > 0 ? coefficient.slice(0, i2) + "." + coefficient.slice(i2) : "0." + new Array(1 - i2).join("0") + formatDecimalParts(x, Math.max(0, p + i2 - 1))[0]; - } - - // node_modules/d3-format/src/formatRounded.js - function formatRounded_default(x, p) { - var d = formatDecimalParts(x, p); - if (!d) - return x + ""; - var coefficient = d[0], exponent = d[1]; - return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0"); - } - - // node_modules/d3-format/src/formatTypes.js - var formatTypes_default = { - "%": (x, p) => (x * 100).toFixed(p), - "b": (x) => Math.round(x).toString(2), - "c": (x) => x + "", - "d": formatDecimal_default, - "e": (x, p) => x.toExponential(p), - "f": (x, p) => x.toFixed(p), - "g": (x, p) => x.toPrecision(p), - "o": (x) => Math.round(x).toString(8), - "p": (x, p) => formatRounded_default(x * 100, p), - "r": formatRounded_default, - "s": formatPrefixAuto_default, - "X": (x) => Math.round(x).toString(16).toUpperCase(), - "x": (x) => Math.round(x).toString(16) - }; - - // node_modules/d3-format/src/identity.js - function identity_default3(x) { - return x; - } - - // node_modules/d3-format/src/locale.js - var map = Array.prototype.map; - var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; - function locale_default(locale2) { - var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default3 : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default3 : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + ""; - function newFormat(specifier) { - specifier = formatSpecifier(specifier); - var fill = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision2 = specifier.precision, trim = specifier.trim, type3 = specifier.type; - if (type3 === "n") - comma = true, type3 = "g"; - else if (!formatTypes_default[type3]) - precision2 === void 0 && (precision2 = 12), trim = true, type3 = "g"; - if (zero3 || fill === "0" && align === "=") - zero3 = true, fill = "0", align = "="; - var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type3) ? "0" + type3.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type3) ? percent : ""; - var formatType = formatTypes_default[type3], maybeSuffix = /[defgprs%]/.test(type3); - precision2 = precision2 === void 0 ? 6 : /[gprs]/.test(type3) ? Math.max(1, Math.min(21, precision2)) : Math.max(0, Math.min(20, precision2)); - function format2(value) { - var valuePrefix = prefix, valueSuffix = suffix, i2, n2, c; - if (type3 === "c") { - valueSuffix = formatType(value) + valueSuffix; - value = ""; - } else { - value = +value; - var valueNegative = value < 0 || 1 / value < 0; - value = isNaN(value) ? nan : formatType(Math.abs(value), precision2); - if (trim) - value = formatTrim_default(value); - if (valueNegative && +value === 0 && sign2 !== "+") - valueNegative = false; - valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix; - valueSuffix = (type3 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : ""); - if (maybeSuffix) { - i2 = -1, n2 = value.length; - while (++i2 < n2) { - if (c = value.charCodeAt(i2), 48 > c || c > 57) { - valueSuffix = (c === 46 ? decimal + value.slice(i2 + 1) : value.slice(i2)) + valueSuffix; - value = value.slice(0, i2); - break; - } - } + return _conflicts.length === ccount ? target.update({ nodes }) : target; + } + function mergeChildren(targetWay, children2, updates, graph) { + function isUsed(node2, targetWay2) { + var hasInterestingParent = graph.parentWays(node2).some(function(way) { + return way.id !== targetWay2.id; + }); + return node2.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node2).length > 0; + } + var ccount = _conflicts.length; + for (var i3 = 0; i3 < children2.length; i3++) { + var id3 = children2[i3]; + var node = graph.hasEntity(id3); + if (targetWay.nodes.indexOf(id3) === -1) { + if (node && !isUsed(node, targetWay)) { + updates.removeIds.push(id3); } + continue; } - if (comma && !zero3) - value = group(value, Infinity); - var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : ""; - if (comma && zero3) - value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; - switch (align) { - case "<": - value = valuePrefix + value + valueSuffix + padding; - break; - case "=": - value = valuePrefix + padding + value + valueSuffix; - break; - case "^": - value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); - break; - default: - value = padding + valuePrefix + value + valueSuffix; + var local = localGraph.hasEntity(id3); + var remote = remoteGraph.hasEntity(id3); + var target; + if (_option === "force_remote" && remote && remote.visible) { + updates.replacements.push(remote); + } else if (_option === "force_local" && local) { + target = osmEntity(local); + if (remote) { + target = target.update({ version: remote.version }); + } + updates.replacements.push(target); + } else if (_option === "safe" && local && remote && local.version !== remote.version) { + target = osmEntity(local, { version: remote.version }); + if (remote.visible) { + target = mergeLocation(remote, target); + } else { + _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } })); + } + if (_conflicts.length !== ccount) break; + updates.replacements.push(target); } - return numerals(value); } - format2.toString = function() { - return specifier + ""; - }; - return format2; - } - function formatPrefix2(specifier, value) { - var f2 = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3]; - return function(value2) { - return f2(k * value2) + prefix; - }; + return targetWay; } - return { - format: newFormat, - formatPrefix: formatPrefix2 - }; - } - - // node_modules/d3-format/src/defaultLocale.js - var locale; - var format; - var formatPrefix; - defaultLocale({ - thousands: ",", - grouping: [3], - currency: ["$", ""] - }); - function defaultLocale(definition) { - locale = locale_default(definition); - format = locale.format; - formatPrefix = locale.formatPrefix; - return locale; - } - - // node_modules/d3-format/src/precisionFixed.js - function precisionFixed_default(step) { - return Math.max(0, -exponent_default(Math.abs(step))); - } - - // node_modules/d3-format/src/precisionPrefix.js - function precisionPrefix_default(step, value) { - return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step))); - } - - // node_modules/d3-format/src/precisionRound.js - function precisionRound_default(step, max3) { - step = Math.abs(step), max3 = Math.abs(max3) - step; - return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1; - } - - // node_modules/d3-scale/src/tickFormat.js - function tickFormat(start2, stop, count, specifier) { - var step = tickStep(start2, stop, count), precision2; - specifier = formatSpecifier(specifier == null ? ",f" : specifier); - switch (specifier.type) { - case "s": { - var value = Math.max(Math.abs(start2), Math.abs(stop)); - if (specifier.precision == null && !isNaN(precision2 = precisionPrefix_default(step, value))) - specifier.precision = precision2; - return formatPrefix(specifier, value); - } - case "": - case "e": - case "g": - case "p": - case "r": { - if (specifier.precision == null && !isNaN(precision2 = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop))))) - specifier.precision = precision2 - (specifier.type === "e"); - break; + function updateChildren(updates, graph) { + for (var i3 = 0; i3 < updates.replacements.length; i3++) { + graph = graph.replace(updates.replacements[i3]); } - case "f": - case "%": { - if (specifier.precision == null && !isNaN(precision2 = precisionFixed_default(step))) - specifier.precision = precision2 - (specifier.type === "%") * 2; - break; + if (updates.removeIds.length) { + graph = actionDeleteMultiple(updates.removeIds)(graph); } + return graph; } - return format(specifier); - } - - // node_modules/d3-scale/src/linear.js - function linearish(scale) { - var domain2 = scale.domain; - scale.ticks = function(count) { - var d = domain2(); - return ticks(d[0], d[d.length - 1], count == null ? 10 : count); - }; - scale.tickFormat = function(count, specifier) { - var d = domain2(); - return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); - }; - scale.nice = function(count) { - if (count == null) - count = 10; - var d = domain2(); - var i0 = 0; - var i1 = d.length - 1; - var start2 = d[i0]; - var stop = d[i1]; - var prestep; - var step; - var maxIter = 10; - if (stop < start2) { - step = start2, start2 = stop, stop = step; - step = i0, i0 = i1, i1 = step; + function mergeMembers(remote, target) { + if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.members, remote.members)) { + return target; } - while (maxIter-- > 0) { - step = tickIncrement(start2, stop, count); - if (step === prestep) { - d[i0] = start2; - d[i1] = stop; - return domain2(d); - } else if (step > 0) { - start2 = Math.floor(start2 / step) * step; - stop = Math.ceil(stop / step) * step; - } else if (step < 0) { - start2 = Math.ceil(start2 * step) / step; - stop = Math.floor(stop * step) / step; - } else { - break; - } - prestep = step; + if (_option === "force_remote") { + return target.update({ members: remote.members }); } - return scale; - }; - return scale; - } - function linear3() { - var scale = continuous(); - scale.copy = function() { - return copy(scale, linear3()); - }; - initRange.apply(scale, arguments); - return linearish(scale); - } - - // node_modules/d3-scale/src/quantize.js - function quantize() { - var x05 = 0, x12 = 1, n2 = 1, domain2 = [0.5], range3 = [0, 1], unknown; - function scale(x) { - return x != null && x <= x ? range3[bisect_default(domain2, x, 0, n2)] : unknown; - } - function rescale() { - var i2 = -1; - domain2 = new Array(n2); - while (++i2 < n2) - domain2[i2] = ((i2 + 1) * x12 - (i2 - n2) * x05) / (n2 + 1); - return scale; - } - scale.domain = function(_) { - return arguments.length ? ([x05, x12] = _, x05 = +x05, x12 = +x12, rescale()) : [x05, x12]; - }; - scale.range = function(_) { - return arguments.length ? (n2 = (range3 = Array.from(_)).length - 1, rescale()) : range3.slice(); - }; - scale.invertExtent = function(y) { - var i2 = range3.indexOf(y); - return i2 < 0 ? [NaN, NaN] : i2 < 1 ? [x05, domain2[0]] : i2 >= n2 ? [domain2[n2 - 1], x12] : [domain2[i2 - 1], domain2[i2]]; - }; - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : scale; - }; - scale.thresholds = function() { - return domain2.slice(); - }; - scale.copy = function() { - return quantize().domain([x05, x12]).range(range3).unknown(unknown); - }; - return initRange.apply(linearish(scale), arguments); - } - - // modules/behavior/breathe.js - function behaviorBreathe() { - var duration = 800; - var steps = 4; - var selector = ".selected.shadow, .selected .shadow"; - var _selected = select_default2(null); - var _classed = ""; - var _params = {}; - var _done = false; - var _timer; - function ratchetyInterpolator(a, b, steps2, units) { - a = parseFloat(a); - b = parseFloat(b); - var sample = quantize().domain([0, 1]).range(quantize_default(number_default(a, b), steps2)); - return function(t) { - return String(sample(t)) + (units || ""); - }; - } - function reset(selection2) { - selection2.style("stroke-opacity", null).style("stroke-width", null).style("fill-opacity", null).style("r", null); - } - function setAnimationParams(transition2, fromTo) { - var toFrom = fromTo === "from" ? "to" : "from"; - transition2.styleTween("stroke-opacity", function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].opacity, - _params[d.id][fromTo].opacity, - steps - ); - }).styleTween("stroke-width", function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].width, - _params[d.id][fromTo].width, - steps, - "px" - ); - }).styleTween("fill-opacity", function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].opacity, - _params[d.id][fromTo].opacity, - steps - ); - }).styleTween("r", function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].width, - _params[d.id][fromTo].width, - steps, - "px" - ); - }); - } - function calcAnimationParams(selection2) { - selection2.call(reset).each(function(d) { - var s = select_default2(this); - var tag = s.node().tagName; - var p = { "from": {}, "to": {} }; - var opacity; - var width; - if (tag === "circle") { - opacity = parseFloat(s.style("fill-opacity") || 0.5); - width = parseFloat(s.style("r") || 15.5); - } else { - opacity = parseFloat(s.style("stroke-opacity") || 0.7); - width = parseFloat(s.style("stroke-width") || 10); - } - p.tag = tag; - p.from.opacity = opacity * 0.6; - p.to.opacity = opacity * 1.25; - p.from.width = width * 0.7; - p.to.width = width * (tag === "circle" ? 1.5 : 1); - _params[d.id] = p; - }); + _conflicts.push(_t.html("merge_remote_changes.conflict.memberlist", { user: { html: user(remote.user) } })); + return target; } - function run(surface, fromTo) { - var toFrom = fromTo === "from" ? "to" : "from"; - var currSelected = surface.selectAll(selector); - var currClassed = surface.attr("class"); - if (_done || currSelected.empty()) { - _selected.call(reset); - _selected = select_default2(null); - return; + function mergeTags(base, remote, target) { + if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.tags, remote.tags)) { + return target; } - if (!(0, import_fast_deep_equal2.default)(currSelected.data(), _selected.data()) || currClassed !== _classed) { - _selected.call(reset); - _classed = currClassed; - _selected = currSelected.call(calcAnimationParams); + if (_option === "force_remote") { + return target.update({ tags: remote.tags }); } - var didCallNextRun = false; - _selected.transition().duration(duration).call(setAnimationParams, fromTo).on("end", function() { - if (!didCallNextRun) { - surface.call(run, toFrom); - didCallNextRun = true; - } - if (!select_default2(this).classed("selected")) { - reset(select_default2(this)); - } + var ccount = _conflicts.length; + var o2 = base.tags || {}; + var a2 = target.tags || {}; + var b2 = remote.tags || {}; + var keys2 = utilArrayUnion(utilArrayUnion(Object.keys(o2), Object.keys(a2)), Object.keys(b2)).filter(function(k3) { + return !discardTags[k3]; }); - } - function behavior(surface) { - _done = false; - _timer = timer(function() { - if (surface.selectAll(selector).empty()) { - return false; + var tags = Object.assign({}, a2); + var changed = false; + for (var i3 = 0; i3 < keys2.length; i3++) { + var k2 = keys2[i3]; + if (o2[k2] !== b2[k2] && a2[k2] !== b2[k2]) { + if (o2[k2] !== a2[k2]) { + _conflicts.push(_t.html( + "merge_remote_changes.conflict.tags", + { tag: k2, local: a2[k2], remote: b2[k2], user: { html: user(remote.user) } } + )); + } else { + if (b2.hasOwnProperty(k2)) { + tags[k2] = b2[k2]; + } else { + delete tags[k2]; + } + changed = true; + } } - surface.call(run, "from"); - _timer.stop(); - return true; - }, 20); + } + return changed && _conflicts.length === ccount ? target.update({ tags }) : target; } - behavior.restartIfNeeded = function(surface) { - if (_selected.empty()) { - surface.call(run, "from"); - if (_timer) { - _timer.stop(); + var action = function(graph) { + var updates = { replacements: [], removeIds: [] }; + var base = graph.base().entities[id2]; + var local = localGraph.entity(id2); + var remote = remoteGraph.entity(id2); + var target = osmEntity(local, { version: remote.version }); + if (!remote.visible) { + if (_option === "force_remote") { + return actionDeleteMultiple([id2])(graph); + } else if (_option === "force_local") { + if (target.type === "way") { + target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph); + graph = updateChildren(updates, graph); + } + return graph.replace(target); + } else { + _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } })); + return graph; } } - }; - behavior.off = function() { - _done = true; - if (_timer) { - _timer.stop(); - } - _selected.interrupt().call(reset); - }; - return behavior; - } - - // modules/behavior/operation.js - function behaviorOperation(context) { - var _operation; - function keypress(d3_event) { - if (!context.map().withinEditableZoom()) - return; - if (_operation.availableForKeypress && !_operation.availableForKeypress()) - return; - d3_event.preventDefault(); - var disabled = _operation.disabled(); - if (disabled) { - context.ui().flash.duration(4e3).iconName("#iD-operation-" + _operation.id).iconClass("operation disabled").label(_operation.tooltip())(); - } else { - context.ui().flash.duration(2e3).iconName("#iD-operation-" + _operation.id).iconClass("operation").label(_operation.annotation() || _operation.title)(); - if (_operation.point) - _operation.point(null); - _operation(); + if (target.type === "node") { + target = mergeLocation(remote, target); + } else if (target.type === "way") { + graph.rebase(remoteGraph.childNodes(remote), [graph], false); + target = mergeNodes(base, remote, target); + target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph); + } else if (target.type === "relation") { + target = mergeMembers(remote, target); } - } - function behavior() { - if (_operation && _operation.available()) { - context.keybinding().on(_operation.keys, keypress); + target = mergeTags(base, remote, target); + if (!_conflicts.length) { + graph = updateChildren(updates, graph).replace(target); } - return behavior; - } - behavior.off = function() { - context.keybinding().off(_operation.keys); + return graph; }; - behavior.which = function(_) { - if (!arguments.length) - return _operation; - _operation = _; - return behavior; + action.withOption = function(opt) { + _option = opt; + return action; }; - return behavior; + action.conflicts = function() { + return _conflicts; + }; + return action; } - // modules/operations/circularize.js - function operationCircularize(context, selectedIDs) { - var _extent; - var _actions = selectedIDs.map(getAction).filter(Boolean); - var _amount = _actions.length === 1 ? "single" : "multiple"; - var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) { - return n2.loc; - }); - function getAction(entityID) { - var entity = context.entity(entityID); - if (entity.type !== "way" || new Set(entity.nodes).size <= 1) - return null; - if (!_extent) { - _extent = entity.extent(context.graph()); - } else { - _extent = _extent.extend(entity.extent(context.graph())); - } - return actionCircularize(entityID, context.projection); - } - var operation = function() { - if (!_actions.length) - return; - var combinedAction = function(graph, t) { - _actions.forEach(function(action) { - if (!action.disabled(graph)) { - graph = action(graph, t); - } + // modules/actions/move.js + function actionMove(moveIDs, tryDelta, projection2, cache) { + var _delta = tryDelta; + function setupCache(graph) { + function canMove(nodeID) { + if (moveIDs.indexOf(nodeID) !== -1) + return true; + var parents = graph.parentWays(graph.entity(nodeID)); + if (parents.length < 3) + return true; + var parentsMoving = parents.every(function(way) { + return cache.moving[way.id]; }); - return graph; - }; - combinedAction.transitionable = true; - context.perform(combinedAction, operation.annotation()); - window.setTimeout(function() { - context.validator().validate(); - }, 300); - }; - operation.available = function() { - return _actions.length && selectedIDs.length === _actions.length; - }; - operation.disabled = function() { - if (!_actions.length) - return ""; - var actionDisableds = _actions.map(function(action) { - return action.disabled(context.graph()); - }).filter(Boolean); - if (actionDisableds.length === _actions.length) { - if (new Set(actionDisableds).size > 1) { - return "multiple_blockers"; + if (!parentsMoving) + delete cache.moving[nodeID]; + return parentsMoving; + } + function cacheEntities(ids) { + for (var i3 = 0; i3 < ids.length; i3++) { + var id2 = ids[i3]; + if (cache.moving[id2]) + continue; + cache.moving[id2] = true; + var entity = graph.hasEntity(id2); + if (!entity) + continue; + if (entity.type === "node") { + cache.nodes.push(id2); + cache.startLoc[id2] = entity.loc; + } else if (entity.type === "way") { + cache.ways.push(id2); + cacheEntities(entity.nodes); + } else { + cacheEntities(entity.members.map(function(member) { + return member.id; + })); + } } - return actionDisableds[0]; - } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = _coords.filter(function(loc) { - return !osm.isDataLoaded(loc); - }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); + function cacheIntersections(ids) { + function isEndpoint(way2, id3) { + return !way2.isClosed() && !!way2.affix(id3); + } + for (var i3 = 0; i3 < ids.length; i3++) { + var id2 = ids[i3]; + var childNodes = graph.childNodes(graph.entity(id2)); + for (var j3 = 0; j3 < childNodes.length; j3++) { + var node = childNodes[j3]; + var parents = graph.parentWays(node); + if (parents.length !== 2) + continue; + var moved = graph.entity(id2); + var unmoved = null; + for (var k2 = 0; k2 < parents.length; k2++) { + var way = parents[k2]; + if (!cache.moving[way.id]) { + unmoved = way; + break; + } + } + if (!unmoved) + continue; + if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) + continue; + if (moved.isArea() || unmoved.isArea()) + continue; + cache.intersections.push({ + nodeId: node.id, + movedId: moved.id, + unmovedId: unmoved.id, + movedIsEP: isEndpoint(moved, node.id), + unmovedIsEP: isEndpoint(unmoved, node.id) }); - return true; } } - return false; } - }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.circularize." + disable + "." + _amount) : _t.append("operations.circularize.description." + _amount); - }; - operation.annotation = function() { - return _t("operations.circularize.annotation.feature", { n: _actions.length }); - }; - operation.id = "circularize"; - operation.keys = [_t("operations.circularize.key")]; - operation.title = _t.append("operations.circularize.title"); - operation.behavior = behaviorOperation(context).which(operation); - return operation; - } - - // modules/ui/cmd.js - var uiCmd = function(code) { - var detected = utilDetect(); - if (detected.os === "mac") { - return code; - } - if (detected.os === "win") { - if (code === "\u2318\u21E7Z") - return "Ctrl+Y"; + if (!cache) { + cache = {}; + } + if (!cache.ok) { + cache.moving = {}; + cache.intersections = []; + cache.replacedVertex = {}; + cache.startLoc = {}; + cache.nodes = []; + cache.ways = []; + cacheEntities(moveIDs); + cacheIntersections(cache.ways); + cache.nodes = cache.nodes.filter(canMove); + cache.ok = true; + } } - var result = "", replacements = { - "\u2318": "Ctrl", - "\u21E7": "Shift", - "\u2325": "Alt", - "\u232B": "Backspace", - "\u2326": "Delete" - }; - for (var i2 = 0; i2 < code.length; i2++) { - if (code[i2] in replacements) { - result += replacements[code[i2]] + (i2 < code.length - 1 ? "+" : ""); + function replaceMovedVertex(nodeId, wayId, graph, delta) { + var way = graph.entity(wayId); + var moved = graph.entity(nodeId); + var movedIndex = way.nodes.indexOf(nodeId); + var len, prevIndex, nextIndex; + if (way.isClosed()) { + len = way.nodes.length - 1; + prevIndex = (movedIndex + len - 1) % len; + nextIndex = (movedIndex + len + 1) % len; } else { - result += code[i2]; + len = way.nodes.length; + prevIndex = movedIndex - 1; + nextIndex = movedIndex + 1; } - } - return result; - }; - uiCmd.display = function(code) { - if (code.length !== 1) - return code; - var detected = utilDetect(); - var mac = detected.os === "mac"; - var replacements = { - "\u2318": mac ? "\u2318 " + _t("shortcuts.key.cmd") : _t("shortcuts.key.ctrl"), - "\u21E7": mac ? "\u21E7 " + _t("shortcuts.key.shift") : _t("shortcuts.key.shift"), - "\u2325": mac ? "\u2325 " + _t("shortcuts.key.option") : _t("shortcuts.key.alt"), - "\u2303": mac ? "\u2303 " + _t("shortcuts.key.ctrl") : _t("shortcuts.key.ctrl"), - "\u232B": mac ? "\u232B " + _t("shortcuts.key.delete") : _t("shortcuts.key.backspace"), - "\u2326": mac ? "\u2326 " + _t("shortcuts.key.del") : _t("shortcuts.key.del"), - "\u2196": mac ? "\u2196 " + _t("shortcuts.key.pgup") : _t("shortcuts.key.pgup"), - "\u2198": mac ? "\u2198 " + _t("shortcuts.key.pgdn") : _t("shortcuts.key.pgdn"), - "\u21DE": mac ? "\u21DE " + _t("shortcuts.key.home") : _t("shortcuts.key.home"), - "\u21DF": mac ? "\u21DF " + _t("shortcuts.key.end") : _t("shortcuts.key.end"), - "\u21B5": mac ? "\u23CE " + _t("shortcuts.key.return") : _t("shortcuts.key.enter"), - "\u238B": mac ? "\u238B " + _t("shortcuts.key.esc") : _t("shortcuts.key.esc"), - "\u2630": mac ? "\u2630 " + _t("shortcuts.key.menu") : _t("shortcuts.key.menu") - }; - return replacements[code] || code; - }; - - // modules/operations/delete.js - function operationDelete(context, selectedIDs) { - var multi = selectedIDs.length === 1 ? "single" : "multiple"; - var action = actionDeleteMultiple(selectedIDs); - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n2) { - return n2.loc; - }); - var extent = utilTotalExtent(selectedIDs, context.graph()); - var operation = function() { - var nextSelectedID; - var nextSelectedLoc; - if (selectedIDs.length === 1) { - var id2 = selectedIDs[0]; - var entity = context.entity(id2); - var geometry = entity.geometry(context.graph()); - var parents = context.graph().parentWays(entity); - var parent = parents[0]; - if (geometry === "vertex") { - var nodes2 = parent.nodes; - var i2 = nodes2.indexOf(id2); - if (i2 === 0) { - i2++; - } else if (i2 === nodes2.length - 1) { - i2--; - } else { - var a = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 - 1]).loc); - var b = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 + 1]).loc); - i2 = a < b ? i2 - 1 : i2 + 1; - } - nextSelectedID = nodes2[i2]; - nextSelectedLoc = context.entity(nextSelectedID).loc; - } + var prev = graph.hasEntity(way.nodes[prevIndex]); + var next = graph.hasEntity(way.nodes[nextIndex]); + if (!prev || !next) + return graph; + var key = wayId + "_" + nodeId; + var orig = cache.replacedVertex[key]; + if (!orig) { + orig = osmNode(); + cache.replacedVertex[key] = orig; + cache.startLoc[orig.id] = cache.startLoc[nodeId]; } - context.perform(action, operation.annotation()); - context.validator().validate(); - if (nextSelectedID && nextSelectedLoc) { - if (context.hasEntity(nextSelectedID)) { - context.enter(modeSelect(context, [nextSelectedID]).follow(true)); - } else { - context.map().centerEase(nextSelectedLoc); - context.enter(modeBrowse(context)); - } + var start2, end; + if (delta) { + start2 = projection2(cache.startLoc[nodeId]); + end = projection2.invert(geoVecAdd(start2, delta)); } else { - context.enter(modeBrowse(context)); + end = cache.startLoc[nodeId]; } - }; - operation.available = function() { - return true; - }; - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; - } else if (selectedIDs.some(protectedMember)) { - return "part_of_relation"; - } else if (selectedIDs.some(incompleteRelation)) { - return "incomplete_relation"; - } else if (selectedIDs.some(hasWikidataTag)) { - return "has_wikidata_tag"; + orig = orig.move(end); + var angle2 = Math.abs(geoAngle(orig, prev, projection2) - geoAngle(orig, next, projection2)) * 180 / Math.PI; + if (angle2 > 175 && angle2 < 185) + return graph; + var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection2); + var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection2); + var d1 = geoPathLength(p1); + var d2 = geoPathLength(p2); + var insertAt = d1 <= d2 ? movedIndex : nextIndex; + if (way.isClosed() && insertAt === 0) + insertAt = len; + way = way.addNode(orig.id, insertAt); + return graph.replace(orig).replace(way); + } + function removeDuplicateVertices(wayId, graph) { + var way = graph.entity(wayId); + var epsilon3 = 1e-6; + var prev, curr; + function isInteresting(node, graph2) { + return graph2.parentWays(node).length > 1 || graph2.parentRelations(node).length || node.hasInterestingTags(); } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { - return !osm.isDataLoaded(loc); - }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); - }); - return true; + for (var i3 = 0; i3 < way.nodes.length; i3++) { + curr = graph.entity(way.nodes[i3]); + if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon3)) { + if (!isInteresting(prev, graph)) { + way = way.removeNode(prev.id); + graph = graph.replace(way).remove(prev); + } else if (!isInteresting(curr, graph)) { + way = way.removeNode(curr.id); + graph = graph.replace(way).remove(curr); } } - return false; + prev = curr; } - function hasWikidataTag(id2) { - var entity = context.entity(id2); - return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0; + return graph; + } + function unZorroIntersection(intersection, graph) { + var vertex = graph.entity(intersection.nodeId); + var way1 = graph.entity(intersection.movedId); + var way2 = graph.entity(intersection.unmovedId); + var isEP1 = intersection.movedIsEP; + var isEP2 = intersection.unmovedIsEP; + if (isEP1 && isEP2) + return graph; + var nodes1 = graph.childNodes(way1).filter(function(n3) { + return n3 !== vertex; + }); + var nodes2 = graph.childNodes(way2).filter(function(n3) { + return n3 !== vertex; + }); + if (way1.isClosed() && way1.first() === vertex.id) + nodes1.push(nodes1[0]); + if (way2.isClosed() && way2.first() === vertex.id) + nodes2.push(nodes2[0]); + var edge1 = !isEP1 && geoChooseEdge(nodes1, projection2(vertex.loc), projection2); + var edge2 = !isEP2 && geoChooseEdge(nodes2, projection2(vertex.loc), projection2); + var loc; + if (!isEP1 && !isEP2) { + var epsilon3 = 1e-6, maxIter = 10; + for (var i3 = 0; i3 < maxIter; i3++) { + loc = geoVecInterp(edge1.loc, edge2.loc, 0.5); + edge1 = geoChooseEdge(nodes1, projection2(loc), projection2); + edge2 = geoChooseEdge(nodes2, projection2(loc), projection2); + if (Math.abs(edge1.distance - edge2.distance) < epsilon3) + break; + } + } else if (!isEP1) { + loc = edge1.loc; + } else { + loc = edge2.loc; } - function incompleteRelation(id2) { - var entity = context.entity(id2); - return entity.type === "relation" && !entity.isComplete(context.graph()); + graph = graph.replace(vertex.move(loc)); + if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) { + way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index); + graph = graph.replace(way1); } - function protectedMember(id2) { - var entity = context.entity(id2); - if (entity.type !== "way") - return false; - var parents = context.graph().parentRelations(entity); - for (var i2 = 0; i2 < parents.length; i2++) { - var parent = parents[i2]; - var type3 = parent.tags.type; - var role = parent.memberById(id2).role || "outer"; - if (type3 === "route" || type3 === "boundary" || type3 === "multipolygon" && role === "outer") { - return true; - } - } - return false; + if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) { + way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index); + graph = graph.replace(way2); } - }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.delete." + disable + "." + multi) : _t.append("operations.delete.description." + multi); - }; - operation.annotation = function() { - return selectedIDs.length === 1 ? _t("operations.delete.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.delete.annotation.feature", { n: selectedIDs.length }); - }; - operation.id = "delete"; - operation.keys = [uiCmd("\u2318\u232B"), uiCmd("\u2318\u2326"), uiCmd("\u2326")]; - operation.title = _t.append("operations.delete.title"); - operation.behavior = behaviorOperation(context).which(operation); - return operation; - } - - // modules/operations/orthogonalize.js - function operationOrthogonalize(context, selectedIDs) { - var _extent; - var _type; - var _actions = selectedIDs.map(chooseAction).filter(Boolean); - var _amount = _actions.length === 1 ? "single" : "multiple"; - var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) { - return n2.loc; - }); - function chooseAction(entityID) { - var entity = context.entity(entityID); - var geometry = entity.geometry(context.graph()); - if (!_extent) { - _extent = entity.extent(context.graph()); - } else { - _extent = _extent.extend(entity.extent(context.graph())); + return graph; + } + function cleanupIntersections(graph) { + for (var i3 = 0; i3 < cache.intersections.length; i3++) { + var obj = cache.intersections[i3]; + graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta); + graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null); + graph = unZorroIntersection(obj, graph); + graph = removeDuplicateVertices(obj.movedId, graph); + graph = removeDuplicateVertices(obj.unmovedId, graph); } - if (entity.type === "way" && new Set(entity.nodes).size > 2) { - if (_type && _type !== "feature") - return null; - _type = "feature"; - return actionOrthogonalize(entityID, context.projection); - } else if (geometry === "vertex") { - if (_type && _type !== "corner") - return null; - _type = "corner"; - var graph = context.graph(); - var parents = graph.parentWays(entity); - if (parents.length === 1) { - var way = parents[0]; - if (way.nodes.indexOf(entityID) !== -1) { - return actionOrthogonalize(way.id, context.projection, entityID); - } + return graph; + } + function limitDelta(graph) { + function moveNode(loc) { + return geoVecAdd(projection2(loc), _delta); + } + for (var i3 = 0; i3 < cache.intersections.length; i3++) { + var obj = cache.intersections[i3]; + if (obj.movedIsEP && obj.unmovedIsEP) + continue; + if (!obj.movedIsEP) + continue; + var node = graph.entity(obj.nodeId); + var start2 = projection2(node.loc); + var end = geoVecAdd(start2, _delta); + var movedNodes = graph.childNodes(graph.entity(obj.movedId)); + var movedPath = movedNodes.map(function(n3) { + return moveNode(n3.loc); + }); + var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)); + var unmovedPath = unmovedNodes.map(function(n3) { + return projection2(n3.loc); + }); + var hits = geoPathIntersections(movedPath, unmovedPath); + for (var j3 = 0; i3 < hits.length; i3++) { + if (geoVecEqual(hits[j3], end)) + continue; + var edge = geoChooseEdge(unmovedNodes, end, projection2); + _delta = geoVecSubtract(projection2(edge.loc), start2); } } - return null; } - var operation = function() { - if (!_actions.length) - return; - var combinedAction = function(graph, t) { - _actions.forEach(function(action) { - if (!action.disabled(graph)) { - graph = action(graph, t); - } - }); + var action = function(graph) { + if (_delta[0] === 0 && _delta[1] === 0) return graph; - }; - combinedAction.transitionable = true; - context.perform(combinedAction, operation.annotation()); - window.setTimeout(function() { - context.validator().validate(); - }, 300); - }; - operation.available = function() { - return _actions.length && selectedIDs.length === _actions.length; - }; - operation.disabled = function() { - if (!_actions.length) - return ""; - var actionDisableds = _actions.map(function(action) { - return action.disabled(context.graph()); - }).filter(Boolean); - if (actionDisableds.length === _actions.length) { - if (new Set(actionDisableds).size > 1) { - return "multiple_blockers"; - } - return actionDisableds[0]; - } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; + setupCache(graph); + if (cache.intersections.length) { + limitDelta(graph); } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = _coords.filter(function(loc) { - return !osm.isDataLoaded(loc); - }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); - }); - return true; - } - } - return false; + for (var i3 = 0; i3 < cache.nodes.length; i3++) { + var node = graph.entity(cache.nodes[i3]); + var start2 = projection2(node.loc); + var end = geoVecAdd(start2, _delta); + graph = graph.replace(node.move(projection2.invert(end))); } + if (cache.intersections.length) { + graph = cleanupIntersections(graph); + } + return graph; }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.orthogonalize." + disable + "." + _amount) : _t.append("operations.orthogonalize.description." + _type + "." + _amount); - }; - operation.annotation = function() { - return _t("operations.orthogonalize.annotation." + _type, { n: _actions.length }); + action.delta = function() { + return _delta; }; - operation.id = "orthogonalize"; - operation.keys = [_t("operations.orthogonalize.key")]; - operation.title = _t.append("operations.orthogonalize.title"); - operation.behavior = behaviorOperation(context).which(operation); - return operation; + return action; } - // modules/operations/reflect.js - function operationReflectShort(context, selectedIDs) { - return operationReflect(context, selectedIDs, "short"); - } - function operationReflectLong(context, selectedIDs) { - return operationReflect(context, selectedIDs, "long"); + // modules/actions/move_member.js + function actionMoveMember(relationId, fromIndex, toIndex) { + return function(graph) { + return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex)); + }; } - function operationReflect(context, selectedIDs, axis) { - axis = axis || "long"; - var multi = selectedIDs.length === 1 ? "single" : "multiple"; - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n2) { - return n2.loc; - }); - var extent = utilTotalExtent(selectedIDs, context.graph()); - var operation = function() { - var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === "long")); - context.perform(action, operation.annotation()); - window.setTimeout(function() { - context.validator().validate(); - }, 300); + + // modules/actions/move_node.js + function actionMoveNode(nodeID, toLoc) { + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var node = graph.entity(nodeID); + return graph.replace( + node.move(geoVecInterp(node.loc, toLoc, t2)) + ); }; - operation.available = function() { - return nodes.length >= 3; + action.transitionable = true; + return action; + } + + // modules/actions/noop.js + function actionNoop() { + return function(graph) { + return graph; }; - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; - } else if (selectedIDs.some(incompleteRelation)) { - return "incomplete_relation"; + } + + // modules/actions/orthogonalize.js + function actionOrthogonalize(wayID, projection2, vertexID, degThresh, ep) { + var epsilon3 = ep || 1e-4; + var threshold = degThresh || 13; + var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); + var upperThreshold = Math.cos(threshold * Math.PI / 180); + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var way = graph.entity(wayID); + way = way.removeNode(""); + if (way.tags.nonsquare) { + var tags = Object.assign({}, way.tags); + delete tags.nonsquare; + way = way.update({ tags }); } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { - return !osm.isDataLoaded(loc); - }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); - }); - return true; + graph = graph.replace(way); + var isClosed = way.isClosed(); + var nodes = graph.childNodes(way).slice(); + if (isClosed) + nodes.pop(); + if (vertexID !== void 0) { + nodes = nodeSubset(nodes, vertexID, isClosed); + if (nodes.length !== 3) + return graph; + } + var nodeCount = {}; + var points = []; + var corner = { i: 0, dotp: 1 }; + var node, point2, loc, score, motions, i3, j3; + for (i3 = 0; i3 < nodes.length; i3++) { + node = nodes[i3]; + nodeCount[node.id] = (nodeCount[node.id] || 0) + 1; + points.push({ id: node.id, coord: projection2(node.loc) }); + } + if (points.length === 3) { + for (i3 = 0; i3 < 1e3; i3++) { + motions = points.map(calcMotion); + points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]); + score = corner.dotp; + if (score < epsilon3) { + break; + } + } + node = graph.entity(nodes[corner.i].id); + loc = projection2.invert(points[corner.i].coord); + graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t2))); + } else { + var straights = []; + var simplified = []; + for (i3 = 0; i3 < points.length; i3++) { + point2 = points[i3]; + var dotp = 0; + if (isClosed || i3 > 0 && i3 < points.length - 1) { + var a2 = points[(i3 - 1 + points.length) % points.length]; + var b2 = points[(i3 + 1) % points.length]; + dotp = Math.abs(geoOrthoNormalizedDotProduct(a2.coord, b2.coord, point2.coord)); + } + if (dotp > upperThreshold) { + straights.push(point2); + } else { + simplified.push(point2); + } + } + var bestPoints = clonePoints(simplified); + var originalPoints = clonePoints(simplified); + score = Infinity; + for (i3 = 0; i3 < 1e3; i3++) { + motions = simplified.map(calcMotion); + for (j3 = 0; j3 < motions.length; j3++) { + simplified[j3].coord = geoVecAdd(simplified[j3].coord, motions[j3]); + } + var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon3, threshold); + if (newScore < score) { + bestPoints = clonePoints(simplified); + score = newScore; + } + if (score < epsilon3) { + break; + } + } + var bestCoords = bestPoints.map(function(p2) { + return p2.coord; + }); + if (isClosed) + bestCoords.push(bestCoords[0]); + for (i3 = 0; i3 < bestPoints.length; i3++) { + point2 = bestPoints[i3]; + if (!geoVecEqual(originalPoints[i3].coord, point2.coord)) { + node = graph.entity(point2.id); + loc = projection2.invert(point2.coord); + graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t2))); + } + } + for (i3 = 0; i3 < straights.length; i3++) { + point2 = straights[i3]; + if (nodeCount[point2.id] > 1) + continue; + node = graph.entity(point2.id); + if (t2 === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) { + graph = actionDeleteNode(node.id)(graph); + } else { + var choice = geoVecProject(point2.coord, bestCoords); + if (choice) { + loc = projection2.invert(choice.target); + graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t2))); + } } } - return false; } - function incompleteRelation(id2) { - var entity = context.entity(id2); - return entity.type === "relation" && !entity.isComplete(context.graph()); + return graph; + function clonePoints(array2) { + return array2.map(function(p2) { + return { id: p2.id, coord: [p2.coord[0], p2.coord[1]] }; + }); + } + function calcMotion(point3, i4, array2) { + if (!isClosed && (i4 === 0 || i4 === array2.length - 1)) + return [0, 0]; + if (nodeCount[array2[i4].id] > 1) + return [0, 0]; + var a3 = array2[(i4 - 1 + array2.length) % array2.length].coord; + var origin = point3.coord; + var b3 = array2[(i4 + 1) % array2.length].coord; + var p2 = geoVecSubtract(a3, origin); + var q2 = geoVecSubtract(b3, origin); + var scale = 2 * Math.min(geoVecLength(p2), geoVecLength(q2)); + p2 = geoVecNormalize(p2); + q2 = geoVecNormalize(q2); + var dotp2 = p2[0] * q2[0] + p2[1] * q2[1]; + var val = Math.abs(dotp2); + if (val < lowerThreshold) { + corner.i = i4; + corner.dotp = val; + var vec = geoVecNormalize(geoVecAdd(p2, q2)); + return geoVecScale(vec, 0.1 * dotp2 * scale); + } + return [0, 0]; } }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.reflect." + disable + "." + multi) : _t.append("operations.reflect.description." + axis + "." + multi); - }; - operation.annotation = function() { - return _t("operations.reflect.annotation." + axis + ".feature", { n: selectedIDs.length }); + function nodeSubset(nodes, vertexID2, isClosed) { + var first = isClosed ? 0 : 1; + var last = isClosed ? nodes.length : nodes.length - 1; + for (var i3 = first; i3 < last; i3++) { + if (nodes[i3].id === vertexID2) { + return [ + nodes[(i3 - 1 + nodes.length) % nodes.length], + nodes[i3], + nodes[(i3 + 1) % nodes.length] + ]; + } + } + return []; + } + action.disabled = function(graph) { + var way = graph.entity(wayID); + way = way.removeNode(""); + graph = graph.replace(way); + var isClosed = way.isClosed(); + var nodes = graph.childNodes(way).slice(); + if (isClosed) + nodes.pop(); + var allowStraightAngles = false; + if (vertexID !== void 0) { + allowStraightAngles = true; + nodes = nodeSubset(nodes, vertexID, isClosed); + if (nodes.length !== 3) + return "end_vertex"; + } + var coords = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles); + if (score === null) { + return "not_squarish"; + } else if (score === 0) { + return "square_enough"; + } else { + return false; + } }; - operation.id = "reflect-" + axis; - operation.keys = [_t("operations.reflect.key." + axis)]; - operation.title = _t.append("operations.reflect.title." + axis); - operation.behavior = behaviorOperation(context).which(operation); - return operation; + action.transitionable = true; + return action; } - // modules/operations/move.js - function operationMove(context, selectedIDs) { - var multi = selectedIDs.length === 1 ? "single" : "multiple"; - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n2) { - return n2.loc; - }); - var extent = utilTotalExtent(selectedIDs, context.graph()); - var operation = function() { - context.enter(modeMove(context, selectedIDs)); - }; - operation.available = function() { - return selectedIDs.length > 0; - }; - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; - } else if (selectedIDs.some(incompleteRelation)) { - return "incomplete_relation"; + // modules/actions/restrict_turn.js + function actionRestrictTurn(turn, restrictionType, restrictionID) { + return function(graph) { + var fromWay = graph.entity(turn.from.way); + var toWay = graph.entity(turn.to.way); + var viaNode = turn.via.node && graph.entity(turn.via.node); + var viaWays = turn.via.ways && turn.via.ways.map(function(id2) { + return graph.entity(id2); + }); + var members = []; + members.push({ id: fromWay.id, type: "way", role: "from" }); + if (viaNode) { + members.push({ id: viaNode.id, type: "node", role: "via" }); + } else if (viaWays) { + viaWays.forEach(function(viaWay) { + members.push({ id: viaWay.id, type: "way", role: "via" }); + }); } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { - return !osm.isDataLoaded(loc); + members.push({ id: toWay.id, type: "way", role: "to" }); + return graph.replace(osmRelation({ + id: restrictionID, + tags: { + type: "restriction", + restriction: restrictionType + }, + members + })); + }; + } + + // modules/actions/revert.js + function actionRevert(id2) { + var action = function(graph) { + var entity = graph.hasEntity(id2), base = graph.base().entities[id2]; + if (entity && !base) { + if (entity.type === "node") { + graph.parentWays(entity).forEach(function(parent) { + parent = parent.removeNode(id2); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteWay(parent.id)(graph); + } }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); - }); - return true; - } } - return false; - } - function incompleteRelation(id2) { - var entity = context.entity(id2); - return entity.type === "relation" && !entity.isComplete(context.graph()); + graph.parentRelations(entity).forEach(function(parent) { + parent = parent.removeMembersWithID(id2); + graph = graph.replace(parent); + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); } + return graph.revert(id2); }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.move." + disable + "." + multi) : _t.append("operations.move.description." + multi); + return action; + } + + // modules/actions/rotate.js + function actionRotate(rotateIds, pivot, angle2, projection2) { + var action = function(graph) { + return graph.update(function(graph2) { + utilGetAllNodes(rotateIds, graph2).forEach(function(node) { + var point2 = geoRotate([projection2(node.loc)], angle2, pivot)[0]; + graph2 = graph2.replace(node.move(projection2.invert(point2))); + }); + }); }; - operation.annotation = function() { - return selectedIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.move.annotation.feature", { n: selectedIDs.length }); + return action; + } + + // modules/actions/scale.js + function actionScale(ids, pivotLoc, scaleFactor, projection2) { + return function(graph) { + return graph.update(function(graph2) { + let point2, radial; + utilGetAllNodes(ids, graph2).forEach(function(node) { + point2 = projection2(node.loc); + radial = [ + point2[0] - pivotLoc[0], + point2[1] - pivotLoc[1] + ]; + point2 = [ + pivotLoc[0] + scaleFactor * radial[0], + pivotLoc[1] + scaleFactor * radial[1] + ]; + graph2 = graph2.replace(node.move(projection2.invert(point2))); + }); + }); }; - operation.id = "move"; - operation.keys = [_t("operations.move.key")]; - operation.title = _t.append("operations.move.title"); - operation.behavior = behaviorOperation(context).which(operation); - operation.mouseOnly = true; - return operation; } - // modules/modes/rotate.js - function modeRotate(context, entityIDs) { - var _tolerancePx = 4; - var mode = { - id: "rotate", - button: "browse" + // modules/actions/straighten_nodes.js + function actionStraightenNodes(nodeIDs, projection2) { + function positionAlongWay(a2, o2, b2) { + return geoVecDot(a2, b2, o2) / geoVecDot(b2, b2, o2); + } + function getEndpoints(points) { + var ssr = geoGetSmallestSurroundingRectangle(points); + var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2]; + var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2]; + var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2]; + var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2]; + var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2); + if (isLong) { + return [p1, q1]; + } + return [p2, q2]; + } + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var nodes = nodeIDs.map(function(id2) { + return graph.entity(id2); + }); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var endpoints = getEndpoints(points); + var startPoint = endpoints[0]; + var endPoint = endpoints[1]; + for (var i3 = 0; i3 < points.length; i3++) { + var node = nodes[i3]; + var point2 = points[i3]; + var u2 = positionAlongWay(point2, startPoint, endPoint); + var point22 = geoVecInterp(startPoint, endPoint, u2); + var loc2 = projection2.invert(point22); + graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t2))); + } + return graph; }; - var keybinding = utilKeybinding("rotate"); - var behaviors = [ - behaviorEdit(context), - operationCircularize(context, entityIDs).behavior, - operationDelete(context, entityIDs).behavior, - operationMove(context, entityIDs).behavior, - operationOrthogonalize(context, entityIDs).behavior, - operationReflectLong(context, entityIDs).behavior, - operationReflectShort(context, entityIDs).behavior - ]; - var annotation = entityIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.rotate.annotation.feature", { n: entityIDs.length }); - var _prevGraph; - var _prevAngle; - var _prevTransform; - var _pivot; - var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; - function doRotate(d3_event) { - var fn; - if (context.graph() !== _prevGraph) { - fn = context.perform; - } else { - fn = context.replace; + action.disabled = function(graph) { + var nodes = nodeIDs.map(function(id2) { + return graph.entity(id2); + }); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var endpoints = getEndpoints(points); + var startPoint = endpoints[0]; + var endPoint = endpoints[1]; + var maxDistance = 0; + for (var i3 = 0; i3 < points.length; i3++) { + var point2 = points[i3]; + var u2 = positionAlongWay(point2, startPoint, endPoint); + var p2 = geoVecInterp(startPoint, endPoint, u2); + var dist = geoVecLength(p2, point2); + if (!isNaN(dist) && dist > maxDistance) { + maxDistance = dist; + } } - var projection2 = context.projection; - var currTransform = projection2.transform(); - if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) { - var nodes = utilGetAllNodes(entityIDs, context.graph()); - var points = nodes.map(function(n2) { - return projection2(n2.loc); - }); - _pivot = getPivot(points); - _prevAngle = void 0; + if (maxDistance < 1e-4) { + return "straight_enough"; } - var currMouse = context.map().mouse(d3_event); - var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]); - if (typeof _prevAngle === "undefined") - _prevAngle = currAngle; - var delta = currAngle - _prevAngle; - fn(actionRotate(entityIDs, _pivot, delta, projection2)); - _prevTransform = currTransform; - _prevAngle = currAngle; - _prevGraph = context.graph(); + }; + action.transitionable = true; + return action; + } + + // modules/actions/straighten_way.js + function actionStraightenWay(selectedIDs, projection2) { + function positionAlongWay(a2, o2, b2) { + return geoVecDot(a2, b2, o2) / geoVecDot(b2, b2, o2); } - function getPivot(points) { - var _pivot2; - if (points.length === 1) { - _pivot2 = points[0]; - } else if (points.length === 2) { - _pivot2 = geoVecInterp(points[0], points[1], 0.5); - } else { - var polygonHull = hull_default(points); - if (polygonHull.length === 2) { - _pivot2 = geoVecInterp(points[0], points[1], 0.5); - } else { - _pivot2 = centroid_default2(hull_default(points)); + function allNodes(graph) { + var nodes = []; + var startNodes = []; + var endNodes = []; + var remainingWays = []; + var selectedWays = selectedIDs.filter(function(w2) { + return graph.entity(w2).type === "way"; + }); + var selectedNodes = selectedIDs.filter(function(n3) { + return graph.entity(n3).type === "node"; + }); + for (var i3 = 0; i3 < selectedWays.length; i3++) { + var way = graph.entity(selectedWays[i3]); + nodes = way.nodes.slice(0); + remainingWays.push(nodes); + startNodes.push(nodes[0]); + endNodes.push(nodes[nodes.length - 1]); + } + startNodes = startNodes.filter(function(n3) { + return startNodes.indexOf(n3) === startNodes.lastIndexOf(n3); + }); + endNodes = endNodes.filter(function(n3) { + return endNodes.indexOf(n3) === endNodes.lastIndexOf(n3); + }); + var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0]; + var nextWay = []; + nodes = []; + var getNextWay = function(currNode2, remainingWays2) { + return remainingWays2.filter(function(way2) { + return way2[0] === currNode2 || way2[way2.length - 1] === currNode2; + })[0]; + }; + while (remainingWays.length) { + nextWay = getNextWay(currNode, remainingWays); + remainingWays = utilArrayDifference(remainingWays, [nextWay]); + if (nextWay[0] !== currNode) { + nextWay.reverse(); } + nodes = nodes.concat(nextWay); + currNode = nodes[nodes.length - 1]; } - return _pivot2; - } - function finish(d3_event) { - d3_event.stopPropagation(); - context.replace(actionNoop(), annotation); - context.enter(modeSelect(context, entityIDs)); - } - function cancel() { - if (_prevGraph) - context.pop(); - context.enter(modeSelect(context, entityIDs)); + if (selectedNodes.length === 2) { + var startNodeIdx = nodes.indexOf(selectedNodes[0]); + var endNodeIdx = nodes.indexOf(selectedNodes[1]); + var sortedStartEnd = [startNodeIdx, endNodeIdx]; + sortedStartEnd.sort(function(a2, b2) { + return a2 - b2; + }); + nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1); + } + return nodes.map(function(n3) { + return graph.entity(n3); + }); } - function undone() { - context.enter(modeBrowse(context)); + function shouldKeepNode(node, graph) { + return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags(); } - mode.enter = function() { - _prevGraph = null; - context.features().forceVisible(entityIDs); - behaviors.forEach(context.install); - var downEvent; - context.surface().on(_pointerPrefix + "down.modeRotate", function(d3_event) { - downEvent = d3_event; + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var nodes = allNodes(graph); + var points = nodes.map(function(n3) { + return projection2(n3.loc); }); - select_default2(window).on(_pointerPrefix + "move.modeRotate", doRotate, true).on(_pointerPrefix + "up.modeRotate", function(d3_event) { - if (!downEvent) - return; - var mapNode = context.container().select(".main-map").node(); - var pointGetter = utilFastMouse(mapNode); - var p1 = pointGetter(downEvent); - var p2 = pointGetter(d3_event); - var dist = geoVecLength(p1, p2); - if (dist <= _tolerancePx) - finish(d3_event); - downEvent = null; - }, true); - context.history().on("undone.modeRotate", undone); - keybinding.on("\u238B", cancel).on("\u21A9", finish); - select_default2(document).call(keybinding); + var startPoint = points[0]; + var endPoint = points[points.length - 1]; + var toDelete = []; + var i3; + for (i3 = 1; i3 < points.length - 1; i3++) { + var node = nodes[i3]; + var point2 = points[i3]; + if (t2 < 1 || shouldKeepNode(node, graph)) { + var u2 = positionAlongWay(point2, startPoint, endPoint); + var p2 = geoVecInterp(startPoint, endPoint, u2); + var loc2 = projection2.invert(p2); + graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t2))); + } else { + if (toDelete.indexOf(node) === -1) { + toDelete.push(node); + } + } + } + for (i3 = 0; i3 < toDelete.length; i3++) { + graph = actionDeleteNode(toDelete[i3].id)(graph); + } + return graph; }; - mode.exit = function() { - behaviors.forEach(context.uninstall); - context.surface().on(_pointerPrefix + "down.modeRotate", null); - select_default2(window).on(_pointerPrefix + "move.modeRotate", null, true).on(_pointerPrefix + "up.modeRotate", null, true); - context.history().on("undone.modeRotate", null); - select_default2(document).call(keybinding.unbind); - context.features().forceVisible([]); + action.disabled = function(graph) { + var nodes = allNodes(graph); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var startPoint = points[0]; + var endPoint = points[points.length - 1]; + var threshold = 0.2 * geoVecLength(startPoint, endPoint); + var i3; + if (threshold === 0) { + return "too_bendy"; + } + var maxDistance = 0; + for (i3 = 1; i3 < points.length - 1; i3++) { + var point2 = points[i3]; + var u2 = positionAlongWay(point2, startPoint, endPoint); + var p2 = geoVecInterp(startPoint, endPoint, u2); + var dist = geoVecLength(p2, point2); + if (isNaN(dist) || dist > threshold) { + return "too_bendy"; + } else if (dist > maxDistance) { + maxDistance = dist; + } + } + var keepingAllNodes = nodes.every(function(node, i4) { + return i4 === 0 || i4 === nodes.length - 1 || shouldKeepNode(node, graph); + }); + if (maxDistance < 1e-4 && // Allow straightening even if already straight in order to remove extraneous nodes + keepingAllNodes) { + return "straight_enough"; + } }; - mode.selectedIDs = function() { - if (!arguments.length) - return entityIDs; - return mode; + action.transitionable = true; + return action; + } + + // modules/actions/unrestrict_turn.js + function actionUnrestrictTurn(turn) { + return function(graph) { + return actionDeleteRelation(turn.restrictionID)(graph); }; - return mode; } - // modules/operations/rotate.js - function operationRotate(context, selectedIDs) { - var multi = selectedIDs.length === 1 ? "single" : "multiple"; - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n2) { - return n2.loc; - }); - var extent = utilTotalExtent(selectedIDs, context.graph()); - var operation = function() { - context.enter(modeRotate(context, selectedIDs)); - }; - operation.available = function() { - return nodes.length >= 2; - }; - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return "too_large"; - } else if (someMissing()) { - return "not_downloaded"; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return "connected_to_hidden"; - } else if (selectedIDs.some(incompleteRelation)) { - return "incomplete_relation"; - } - return false; - function someMissing() { - if (context.inIntro()) - return false; - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { - return !osm.isDataLoaded(loc); - }); - if (missing.length) { - missing.forEach(function(loc) { - context.loadTileAtLoc(loc); - }); - return true; - } - } - return false; - } - function incompleteRelation(id2) { - var entity = context.entity(id2); - return entity.type === "relation" && !entity.isComplete(context.graph()); + // modules/actions/reflect.js + function actionReflect(reflectIds, projection2) { + var _useLongAxis = true; + var action = function(graph, t2) { + if (t2 === null || !isFinite(t2)) + t2 = 1; + t2 = Math.min(Math.max(+t2, 0), 1); + var nodes = utilGetAllNodes(reflectIds, graph); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + var ssr = geoGetSmallestSurroundingRectangle(points); + var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2]; + var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2]; + var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2]; + var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2]; + var p3, q3; + var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2); + if (_useLongAxis && isLong || !_useLongAxis && !isLong) { + p3 = p1; + q3 = q1; + } else { + p3 = p2; + q3 = q2; + } + var dx = q3[0] - p3[0]; + var dy = q3[1] - p3[1]; + var a2 = (dx * dx - dy * dy) / (dx * dx + dy * dy); + var b2 = 2 * dx * dy / (dx * dx + dy * dy); + for (var i3 = 0; i3 < nodes.length; i3++) { + var node = nodes[i3]; + var c2 = projection2(node.loc); + var c22 = [ + a2 * (c2[0] - p3[0]) + b2 * (c2[1] - p3[1]) + p3[0], + b2 * (c2[0] - p3[0]) - a2 * (c2[1] - p3[1]) + p3[1] + ]; + var loc2 = projection2.invert(c22); + node = node.move(geoVecInterp(node.loc, loc2, t2)); + graph = graph.replace(node); } + return graph; }; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? _t.append("operations.rotate." + disable + "." + multi) : _t.append("operations.rotate.description." + multi); - }; - operation.annotation = function() { - return selectedIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.rotate.annotation.feature", { n: selectedIDs.length }); + action.useLongAxis = function(val) { + if (!arguments.length) + return _useLongAxis; + _useLongAxis = val; + return action; }; - operation.id = "rotate"; - operation.keys = [_t("operations.rotate.key")]; - operation.title = _t.append("operations.rotate.title"); - operation.behavior = behaviorOperation(context).which(operation); - operation.mouseOnly = true; - return operation; + action.transitionable = true; + return action; } - // modules/modes/move.js - function modeMove(context, entityIDs, baseGraph) { - var _tolerancePx = 4; - var mode = { - id: "move", - button: "browse" - }; - var keybinding = utilKeybinding("move"); - var behaviors = [ - behaviorEdit(context), - operationCircularize(context, entityIDs).behavior, - operationDelete(context, entityIDs).behavior, - operationOrthogonalize(context, entityIDs).behavior, - operationReflectLong(context, entityIDs).behavior, - operationReflectShort(context, entityIDs).behavior, - operationRotate(context, entityIDs).behavior - ]; - var annotation = entityIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.move.annotation.feature", { n: entityIDs.length }); - var _prevGraph; - var _cache4; - var _origin; - var _nudgeInterval; - var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; - function doMove(nudge) { - nudge = nudge || [0, 0]; - var fn; - if (_prevGraph !== context.graph()) { - _cache4 = {}; - _origin = context.map().mouseCoordinates(); - fn = context.perform; - } else { - fn = context.overwrite; - } - var currMouse = context.map().mouse(); - var origMouse = context.projection(_origin); - var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge); - fn(actionMove(entityIDs, delta, context.projection, _cache4)); - _prevGraph = context.graph(); - } - function startNudge(nudge) { - if (_nudgeInterval) - window.clearInterval(_nudgeInterval); - _nudgeInterval = window.setInterval(function() { - context.map().pan(nudge); - doMove(nudge); - }, 50); - } - function stopNudge() { - if (_nudgeInterval) { - window.clearInterval(_nudgeInterval); - _nudgeInterval = null; - } - } - function move() { - doMove(); - var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions()); - if (nudge) { - startNudge(nudge); - } else { - stopNudge(); + // modules/actions/upgrade_tags.js + function actionUpgradeTags(entityId, oldTags, replaceTags) { + return function(graph) { + var entity = graph.entity(entityId); + var tags = Object.assign({}, entity.tags); + var transferValue; + var semiIndex; + for (var oldTagKey in oldTags) { + if (!(oldTagKey in tags)) + continue; + if (oldTags[oldTagKey] === "*") { + transferValue = tags[oldTagKey]; + delete tags[oldTagKey]; + } else if (oldTags[oldTagKey] === tags[oldTagKey]) { + delete tags[oldTagKey]; + } else { + var vals = tags[oldTagKey].split(";").filter(Boolean); + var oldIndex = vals.indexOf(oldTags[oldTagKey]); + if (vals.length === 1 || oldIndex === -1) { + delete tags[oldTagKey]; + } else { + if (replaceTags && replaceTags[oldTagKey]) { + semiIndex = oldIndex; + } + vals.splice(oldIndex, 1); + tags[oldTagKey] = vals.join(";"); + } + } } - } - function finish(d3_event) { - d3_event.stopPropagation(); - context.replace(actionNoop(), annotation); - context.enter(modeSelect(context, entityIDs)); - stopNudge(); - } - function cancel() { - if (baseGraph) { - while (context.graph() !== baseGraph) - context.pop(); - context.enter(modeBrowse(context)); - } else { - if (_prevGraph) - context.pop(); - context.enter(modeSelect(context, entityIDs)); + if (replaceTags) { + for (var replaceKey in replaceTags) { + var replaceValue = replaceTags[replaceKey]; + if (replaceValue === "*") { + if (tags[replaceKey] && tags[replaceKey] !== "no") { + continue; + } else { + tags[replaceKey] = "yes"; + } + } else if (replaceValue === "$1") { + tags[replaceKey] = transferValue; + } else { + if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== void 0) { + var existingVals = tags[replaceKey].split(";").filter(Boolean); + if (existingVals.indexOf(replaceValue) === -1) { + existingVals.splice(semiIndex, 0, replaceValue); + tags[replaceKey] = existingVals.join(";"); + } + } else { + tags[replaceKey] = replaceValue; + } + } + } } - stopNudge(); - } - function undone() { - context.enter(modeBrowse(context)); - } - mode.enter = function() { - _origin = context.map().mouseCoordinates(); - _prevGraph = null; - _cache4 = {}; - context.features().forceVisible(entityIDs); - behaviors.forEach(context.install); - var downEvent; - context.surface().on(_pointerPrefix + "down.modeMove", function(d3_event) { - downEvent = d3_event; - }); - select_default2(window).on(_pointerPrefix + "move.modeMove", move, true).on(_pointerPrefix + "up.modeMove", function(d3_event) { - if (!downEvent) - return; - var mapNode = context.container().select(".main-map").node(); - var pointGetter = utilFastMouse(mapNode); - var p1 = pointGetter(downEvent); - var p2 = pointGetter(d3_event); - var dist = geoVecLength(p1, p2); - if (dist <= _tolerancePx) - finish(d3_event); - downEvent = null; - }, true); - context.history().on("undone.modeMove", undone); - keybinding.on("\u238B", cancel).on("\u21A9", finish); - select_default2(document).call(keybinding); - }; - mode.exit = function() { - stopNudge(); - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); - context.surface().on(_pointerPrefix + "down.modeMove", null); - select_default2(window).on(_pointerPrefix + "move.modeMove", null, true).on(_pointerPrefix + "up.modeMove", null, true); - context.history().on("undone.modeMove", null); - select_default2(document).call(keybinding.unbind); - context.features().forceVisible([]); - }; - mode.selectedIDs = function() { - if (!arguments.length) - return entityIDs; - return mode; + return graph.replace(entity.update({ tags })); }; - return mode; } - // modules/behavior/paste.js - function behaviorPaste(context) { - function doPaste(d3_event) { - if (!context.map().withinEditableZoom()) - return; - d3_event.preventDefault(); - var baseGraph = context.graph(); - var mouse = context.map().mouse(); - var projection2 = context.projection; - var viewport = geoExtent(projection2.clipExtent()).polygon(); - if (!geoPointInPolygon(mouse, viewport)) - return; - var oldIDs = context.copyIDs(); - if (!oldIDs.length) - return; - var extent = geoExtent(); - var oldGraph = context.copyGraph(); - var newIDs = []; - var action = actionCopyEntities(oldIDs, oldGraph); - context.perform(action); - var copies = action.copies(); - var originals = /* @__PURE__ */ new Set(); - Object.values(copies).forEach(function(entity) { - originals.add(entity.id); - }); - for (var id2 in copies) { - var oldEntity = oldGraph.entity(id2); - var newEntity = copies[id2]; - extent._extend(oldEntity.extent(oldGraph)); - var parents = context.graph().parentWays(newEntity); - var parentCopied = parents.some(function(parent) { - return originals.has(parent.id); - }); - if (!parentCopied) { - newIDs.push(newEntity.id); - } - } - var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center()); - var delta = geoVecSubtract(mouse, copyPoint); - context.perform(actionMove(newIDs, delta, projection2)); - context.enter(modeMove(context, newIDs, baseGraph)); - } + // modules/behavior/edit.js + function behaviorEdit(context) { function behavior() { - context.keybinding().on(uiCmd("\u2318V"), doPaste); - return behavior; + context.map().minzoom(context.minEditableZoom()); } behavior.off = function() { - context.keybinding().off(uiCmd("\u2318V")); + context.map().minzoom(0); }; return behavior; } - // modules/behavior/drag.js - function behaviorDrag() { - var dispatch10 = dispatch_default("start", "move", "end"); - var _tolerancePx = 1; - var _penTolerancePx = 4; - var _origin = null; - var _selector = ""; - var _targetNode; - var _targetEntity; - var _surface; - var _pointerId; + // modules/behavior/hover.js + function behaviorHover(context) { + var dispatch14 = dispatch_default("hover"); + var _selection = select_default2(null); + var _newNodeId = null; + var _initialNodeID = null; + var _altDisables; + var _ignoreVertex; + var _targets = []; var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; - var d3_event_userSelectProperty = utilPrefixCSSProperty("UserSelect"); - var d3_event_userSelectSuppress = function() { - var selection2 = selection_default(); - var select = selection2.style(d3_event_userSelectProperty); - selection2.style(d3_event_userSelectProperty, "none"); - return function() { - selection2.style(d3_event_userSelectProperty, select); - }; - }; - function pointerdown(d3_event) { - if (_pointerId) - return; - _pointerId = d3_event.pointerId || "mouse"; - _targetNode = this; - var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode); - var offset; - var startOrigin = pointerLocGetter(d3_event); - var started = false; - var selectEnable = d3_event_userSelectSuppress(); - select_default2(window).on(_pointerPrefix + "move.drag", pointermove).on(_pointerPrefix + "up.drag pointercancel.drag", pointerup, true); - if (_origin) { - offset = _origin.call(_targetNode, _targetEntity); - offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]]; + function keydown(d3_event) { + if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) { + _selection.selectAll(".hover").classed("hover-suppressed", true).classed("hover", false); + _selection.classed("hover-disabled", true); + dispatch14.call("hover", this, null); + } + } + function keyup(d3_event) { + if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) { + _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false).classed("hover", true); + _selection.classed("hover-disabled", false); + dispatch14.call("hover", this, _targets); + } + } + function behavior(selection2) { + _selection = selection2; + _targets = []; + if (_initialNodeID) { + _newNodeId = _initialNodeID; + _initialNodeID = null; } else { - offset = [0, 0]; + _newNodeId = null; } - d3_event.stopPropagation(); - function pointermove(d3_event2) { - if (_pointerId !== (d3_event2.pointerId || "mouse")) - return; - var p = pointerLocGetter(d3_event2); - if (!started) { - var dist = geoVecLength(startOrigin, p); - var tolerance = d3_event2.pointerType === "pen" ? _penTolerancePx : _tolerancePx; - if (dist < tolerance) - return; - started = true; - dispatch10.call("start", this, d3_event2, _targetEntity); - } else { - startOrigin = p; - d3_event2.stopPropagation(); - d3_event2.preventDefault(); - var dx = p[0] - startOrigin[0]; - var dy = p[1] - startOrigin[1]; - dispatch10.call("move", this, d3_event2, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]); + _selection.on(_pointerPrefix + "over.hover", pointerover).on(_pointerPrefix + "out.hover", pointerout).on(_pointerPrefix + "down.hover", pointerover); + select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", pointerout, true).on("keydown.hover", keydown).on("keyup.hover", keyup); + function eventTarget(d3_event) { + var datum2 = d3_event.target && d3_event.target.__data__; + if (typeof datum2 !== "object") + return null; + if (!(datum2 instanceof osmEntity) && datum2.properties && datum2.properties.entity instanceof osmEntity) { + return datum2.properties.entity; } + return datum2; } - function pointerup(d3_event2) { - if (_pointerId !== (d3_event2.pointerId || "mouse")) + function pointerover(d3_event) { + if (context.mode().id.indexOf("drag") === -1 && (!d3_event.pointerType || d3_event.pointerType === "mouse") && d3_event.buttons) return; - _pointerId = null; - if (started) { - dispatch10.call("end", this, d3_event2, _targetEntity); - d3_event2.preventDefault(); + var target = eventTarget(d3_event); + if (target && _targets.indexOf(target) === -1) { + _targets.push(target); + updateHover(d3_event, _targets); } - select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null); - selectEnable(); } - } - function behavior(selection2) { - var matchesSelector = utilPrefixDOMProperty("matchesSelector"); - var delegate = pointerdown; - if (_selector) { - delegate = function(d3_event) { - var root3 = this; - var target = d3_event.target; - for (; target && target !== root3; target = target.parentNode) { - var datum2 = target.__data__; - _targetEntity = datum2 instanceof osmNote ? datum2 : datum2 && datum2.properties && datum2.properties.entity; - if (_targetEntity && target[matchesSelector](_selector)) { - return pointerdown.call(target, d3_event); + function pointerout(d3_event) { + var target = eventTarget(d3_event); + var index = _targets.indexOf(target); + if (index !== -1) { + _targets.splice(index); + updateHover(d3_event, _targets); + } + } + function allowsVertex(d2) { + return d2.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d2, context.graph()); + } + function modeAllowsHover(target) { + var mode = context.mode(); + if (mode.id === "add-point") { + return mode.preset.matchGeometry("vertex") || target.type !== "way" && target.geometry(context.graph()) !== "vertex"; + } + return true; + } + function updateHover(d3_event, targets) { + _selection.selectAll(".hover").classed("hover", false); + _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false); + var mode = context.mode(); + if (!_newNodeId && (mode.id === "draw-line" || mode.id === "draw-area")) { + var node = targets.find(function(target) { + return target instanceof osmEntity && target.type === "node"; + }); + _newNodeId = node && node.id; + } + targets = targets.filter(function(datum3) { + if (datum3 instanceof osmEntity) { + return datum3.id !== _newNodeId && (datum3.type !== "node" || !_ignoreVertex || allowsVertex(datum3)) && modeAllowsHover(datum3); + } + return true; + }); + var selector = ""; + for (var i3 in targets) { + var datum2 = targets[i3]; + if (datum2.__featurehash__) { + selector += ", .data" + datum2.__featurehash__; + } else if (datum2 instanceof QAItem) { + selector += ", ." + datum2.service + ".itemId-" + datum2.id; + } else if (datum2 instanceof osmNote) { + selector += ", .note-" + datum2.id; + } else if (datum2 instanceof osmEntity) { + selector += ", ." + datum2.id; + if (datum2.type === "relation") { + for (var j3 in datum2.members) { + selector += ", ." + datum2.members[j3].id; + } } } - }; + } + var suppressed = _altDisables && d3_event && d3_event.altKey; + if (selector.trim().length) { + selector = selector.slice(1); + _selection.selectAll(selector).classed(suppressed ? "hover-suppressed" : "hover", true); + } + dispatch14.call("hover", this, !suppressed && targets); } - selection2.on(_pointerPrefix + "down.drag" + _selector, delegate); } behavior.off = function(selection2) { - selection2.on(_pointerPrefix + "down.drag" + _selector, null); - }; - behavior.selector = function(_) { - if (!arguments.length) - return _selector; - _selector = _; - return behavior; - }; - behavior.origin = function(_) { - if (!arguments.length) - return _origin; - _origin = _; - return behavior; - }; - behavior.cancel = function() { - select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null); - return behavior; + selection2.selectAll(".hover").classed("hover", false); + selection2.selectAll(".hover-suppressed").classed("hover-suppressed", false); + selection2.classed("hover-disabled", false); + selection2.on(_pointerPrefix + "over.hover", null).on(_pointerPrefix + "out.hover", null).on(_pointerPrefix + "down.hover", null); + select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", null, true).on("keydown.hover", null).on("keyup.hover", null); }; - behavior.targetNode = function(_) { + behavior.altDisables = function(val) { if (!arguments.length) - return _targetNode; - _targetNode = _; + return _altDisables; + _altDisables = val; return behavior; }; - behavior.targetEntity = function(_) { + behavior.ignoreVertex = function(val) { if (!arguments.length) - return _targetEntity; - _targetEntity = _; + return _ignoreVertex; + _ignoreVertex = val; return behavior; }; - behavior.surface = function(_) { - if (!arguments.length) - return _surface; - _surface = _; + behavior.initialNodeID = function(nodeId) { + _initialNodeID = nodeId; return behavior; }; - return utilRebind(behavior, dispatch10, "on"); + return utilRebind(behavior, dispatch14, "on"); } - // modules/modes/drag_node.js - function modeDragNode(context) { - var mode = { - id: "drag-node", - button: "browse" - }; - var hover = behaviorHover(context).altDisables(true).on("hover", context.ui().sidebar.hover); - var edit2 = behaviorEdit(context); - var _nudgeInterval; - var _restoreSelectedIDs = []; - var _wasMidpoint = false; - var _isCancelled = false; - var _activeEntity; - var _startLoc; - var _lastLoc; - function startNudge(d3_event, entity, nudge) { - if (_nudgeInterval) - window.clearInterval(_nudgeInterval); - _nudgeInterval = window.setInterval(function() { - context.map().pan(nudge); - doMove(d3_event, entity, nudge); - }, 50); - } - function stopNudge() { - if (_nudgeInterval) { - window.clearInterval(_nudgeInterval); - _nudgeInterval = null; + // modules/behavior/draw.js + var _disableSpace = false; + var _lastSpace = null; + function behaviorDraw(context) { + var dispatch14 = dispatch_default( + "move", + "down", + "downcancel", + "click", + "clickWay", + "clickNode", + "undo", + "cancel", + "finish" + ); + var keybinding = utilKeybinding("draw"); + var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on("hover", context.ui().sidebar.hover); + var _edit = behaviorEdit(context); + var _closeTolerance = 4; + var _tolerance = 12; + var _mouseLeave = false; + var _lastMouse = null; + var _lastPointerUpEvent; + var _downPointer; + var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; + function datum2(d3_event) { + var mode = context.mode(); + var isNote = mode && mode.id.indexOf("note") !== -1; + if (d3_event.altKey || isNote) + return {}; + var element; + if (d3_event.type === "keydown") { + element = _lastMouse && _lastMouse.target; + } else { + element = d3_event.target; } + var d2 = element.__data__; + return d2 && d2.properties && d2.properties.target ? d2 : {}; } - function moveAnnotation(entity) { - return _t("operations.move.annotation." + entity.geometry(context.graph())); + function pointerdown(d3_event) { + if (_downPointer) + return; + var pointerLocGetter = utilFastMouse(this); + _downPointer = { + id: d3_event.pointerId || "mouse", + pointerLocGetter, + downTime: +/* @__PURE__ */ new Date(), + downLoc: pointerLocGetter(d3_event) + }; + dispatch14.call("down", this, d3_event, datum2(d3_event)); } - function connectAnnotation(nodeEntity, targetEntity) { - var nodeGeometry = nodeEntity.geometry(context.graph()); - var targetGeometry = targetEntity.geometry(context.graph()); - if (nodeGeometry === "vertex" && targetGeometry === "vertex") { - var nodeParentWayIDs = context.graph().parentWays(nodeEntity); - var targetParentWayIDs = context.graph().parentWays(targetEntity); - var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs); - if (sharedParentWays.length !== 0) { - if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) { - return _t("operations.connect.annotation.from_vertex.to_adjacent_vertex"); - } - return _t("operations.connect.annotation.from_vertex.to_sibling_vertex"); - } + function pointerup(d3_event) { + if (!_downPointer || _downPointer.id !== (d3_event.pointerId || "mouse")) + return; + var downPointer = _downPointer; + _downPointer = null; + _lastPointerUpEvent = d3_event; + if (downPointer.isCancelled) + return; + var t2 = +/* @__PURE__ */ new Date(); + var p2 = downPointer.pointerLocGetter(d3_event); + var dist = geoVecLength(downPointer.downLoc, p2); + if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) { + select_default2(window).on("click.draw-block", function() { + d3_event.stopPropagation(); + }, true); + context.map().dblclickZoomEnable(false); + window.setTimeout(function() { + context.map().dblclickZoomEnable(true); + select_default2(window).on("click.draw-block", null); + }, 500); + click(d3_event, p2); } - return _t("operations.connect.annotation.from_" + nodeGeometry + ".to_" + targetGeometry); } - function shouldSnapToNode(target) { - if (!_activeEntity) - return false; - return _activeEntity.geometry(context.graph()) !== "vertex" || (target.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(target, context.graph())); - } - function origin(entity) { - return context.projection(entity.loc); - } - function keydown(d3_event) { - if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) { - if (context.surface().classed("nope")) { - context.surface().classed("nope-suppressed", true); + function pointermove(d3_event) { + if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse") && !_downPointer.isCancelled) { + var p2 = _downPointer.pointerLocGetter(d3_event); + var dist = geoVecLength(_downPointer.downLoc, p2); + if (dist >= _closeTolerance) { + _downPointer.isCancelled = true; + dispatch14.call("downcancel", this); } - context.surface().classed("nope", false).classed("nope-disabled", true); } + if (d3_event.pointerType && d3_event.pointerType !== "mouse" || d3_event.buttons || _downPointer) + return; + if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== "mouse" && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100) + return; + _lastMouse = d3_event; + dispatch14.call("move", this, d3_event, datum2(d3_event)); } - function keyup(d3_event) { - if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) { - if (context.surface().classed("nope-suppressed")) { - context.surface().classed("nope", true); + function pointercancel(d3_event) { + if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse")) { + if (!_downPointer.isCancelled) { + dispatch14.call("downcancel", this); } - context.surface().classed("nope-suppressed", false).classed("nope-disabled", false); + _downPointer = null; } } - function start2(d3_event, entity) { - _wasMidpoint = entity.type === "midpoint"; - var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); - _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden; - if (_isCancelled) { - if (hasHidden) { - context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("modes.drag_node.connected_to_hidden"))(); - } - return drag.cancel(); - } - if (_wasMidpoint) { - var midpoint = entity; - entity = osmNode(); - context.perform(actionAddMidpoint(midpoint, entity)); - entity = context.entity(entity.id); - var vertex = context.surface().selectAll("." + entity.id); - drag.targetNode(vertex.node()).targetEntity(entity); - } else { - context.perform(actionNoop()); - } - _activeEntity = entity; - _startLoc = entity.loc; - hover.ignoreVertex(entity.geometry(context.graph()) === "vertex"); - context.surface().selectAll("." + _activeEntity.id).classed("active", true); - context.enter(mode); + function mouseenter() { + _mouseLeave = false; } - function datum2(d3_event) { - if (!d3_event || d3_event.altKey) { - return {}; - } else { - var d = d3_event.target.__data__; - return d && d.properties && d.properties.target ? d : {}; - } + function mouseleave() { + _mouseLeave = true; } - function doMove(d3_event, entity, nudge) { - nudge = nudge || [0, 0]; - var currPoint = d3_event && d3_event.point || context.projection(_lastLoc); - var currMouse = geoVecSubtract(currPoint, nudge); - var loc = context.projection.invert(currMouse); - var target, edge; - if (!_nudgeInterval) { - var d = datum2(d3_event); - target = d && d.properties && d.properties.entity; - var targetLoc = target && target.loc; - var targetNodes = d && d.properties && d.properties.nodes; - if (targetLoc) { - if (shouldSnapToNode(target)) { - loc = targetLoc; - } - } else if (targetNodes) { - edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id); - if (edge) { - loc = edge.loc; - } + function allowsVertex(d2) { + return d2.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d2, context.graph()); + } + function click(d3_event, loc) { + var d2 = datum2(d3_event); + var target = d2 && d2.properties && d2.properties.entity; + var mode = context.mode(); + if (target && target.type === "node" && allowsVertex(target)) { + dispatch14.call("clickNode", this, target, d2); + return; + } else if (target && target.type === "way" && (mode.id !== "add-point" || mode.preset.matchGeometry("vertex"))) { + var choice = geoChooseEdge( + context.graph().childNodes(target), + loc, + context.projection, + context.activeID() + ); + if (choice) { + var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]]; + dispatch14.call("clickWay", this, choice.loc, edge, d2); + return; } + } else if (mode.id !== "add-point" || mode.preset.matchGeometry("point")) { + var locLatLng = context.projection.invert(loc); + dispatch14.call("click", this, locLatLng, d2); } - context.replace( - actionMoveNode(entity.id, loc) - ); - var isInvalid = false; - if (target) { - isInvalid = hasRelationConflict(entity, target, edge, context.graph()); - } - if (!isInvalid) { - isInvalid = hasInvalidGeometry(entity, context.graph()); - } - var nope = context.surface().classed("nope"); - if (isInvalid === "relation" || isInvalid === "restriction") { - if (!nope) { - context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append( - "operations.connect." + isInvalid, - { relation: _mainPresetIndex.item("type/restriction").name() } - ))(); - } - } else if (isInvalid) { - var errorID = isInvalid === "line" ? "lines" : "areas"; - context.ui().flash.duration(3e3).iconName("#iD-icon-no").label(_t.append("self_intersection.error." + errorID))(); - } else { - if (nope) { - context.ui().flash.duration(1).label("")(); + } + function space(d3_event) { + d3_event.preventDefault(); + d3_event.stopPropagation(); + var currSpace = context.map().mouse(); + if (_disableSpace && _lastSpace) { + var dist = geoVecLength(_lastSpace, currSpace); + if (dist > _tolerance) { + _disableSpace = false; } } - var nopeDisabled = context.surface().classed("nope-disabled"); - if (nopeDisabled) { - context.surface().classed("nope", false).classed("nope-suppressed", isInvalid); - } else { - context.surface().classed("nope", isInvalid).classed("nope-suppressed", false); - } - _lastLoc = loc; + if (_disableSpace || _mouseLeave || !_lastMouse) + return; + _lastSpace = currSpace; + _disableSpace = true; + select_default2(window).on("keyup.space-block", function() { + d3_event.preventDefault(); + d3_event.stopPropagation(); + _disableSpace = false; + select_default2(window).on("keyup.space-block", null); + }); + var loc = context.map().mouse() || // or the map center if the mouse has never entered the map + context.projection(context.map().center()); + click(d3_event, loc); } - function hasRelationConflict(entity, target, edge, graph) { - var testGraph = graph.update(); - if (edge) { - var midpoint = osmNode(); - var action = actionAddMidpoint({ - loc: edge.loc, - edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] - }, midpoint); - testGraph = action(testGraph); - target = midpoint; - } - var ids = [entity.id, target.id]; - return actionConnect(ids).disabled(testGraph); + function backspace(d3_event) { + d3_event.preventDefault(); + dispatch14.call("undo"); } - function hasInvalidGeometry(entity, graph) { - var parents = graph.parentWays(entity); - var i2, j2, k; - for (i2 = 0; i2 < parents.length; i2++) { - var parent = parents[i2]; - var nodes = []; - var activeIndex = null; - var relations = graph.parentRelations(parent); - for (j2 = 0; j2 < relations.length; j2++) { - if (!relations[j2].isMultipolygon()) - continue; - var rings = osmJoinWays(relations[j2].members, graph); - for (k = 0; k < rings.length; k++) { - nodes = rings[k].nodes; - if (nodes.find(function(n2) { - return n2.id === entity.id; - })) { - activeIndex = k; - if (geoHasSelfIntersections(nodes, entity.id)) { - return "multipolygonMember"; - } - } - rings[k].coords = nodes.map(function(n2) { - return n2.loc; - }); - } - for (k = 0; k < rings.length; k++) { - if (k === activeIndex) - continue; - if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { - return "multipolygonRing"; - } - } - } - if (activeIndex === null) { - nodes = parent.nodes.map(function(nodeID) { - return graph.entity(nodeID); - }); - if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { - return parent.geometry(graph); - } - } - } - return false; + function del(d3_event) { + d3_event.preventDefault(); + dispatch14.call("cancel"); } - function move(d3_event, entity, point) { - if (_isCancelled) - return; - d3_event.stopPropagation(); - context.surface().classed("nope-disabled", d3_event.altKey); - _lastLoc = context.projection.invert(point); - doMove(d3_event, entity); - var nudge = geoViewportEdge(point, context.map().dimensions()); - if (nudge) { - startNudge(d3_event, entity, nudge); - } else { - stopNudge(); - } + function ret(d3_event) { + d3_event.preventDefault(); + dispatch14.call("finish"); } - function end(d3_event, entity) { - if (_isCancelled) - return; - var wasPoint = entity.geometry(context.graph()) === "point"; - var d = datum2(d3_event); - var nope = d && d.properties && d.properties.nope || context.surface().classed("nope"); - var target = d && d.properties && d.properties.entity; - if (nope) { - context.perform( - _actionBounceBack(entity.id, _startLoc) - ); - } else if (target && target.type === "way") { - var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id); - context.replace( - actionAddMidpoint({ - loc: choice.loc, - edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] - }, entity), - connectAnnotation(entity, target) - ); - } else if (target && target.type === "node" && shouldSnapToNode(target)) { - context.replace( - actionConnect([target.id, entity.id]), - connectAnnotation(entity, target) - ); - } else if (_wasMidpoint) { - context.replace( - actionNoop(), - _t("operations.add.annotation.vertex") - ); - } else { - context.replace( - actionNoop(), - moveAnnotation(entity) - ); - } - if (wasPoint) { - context.enter(modeSelect(context, [entity.id])); - } else { - var reselection = _restoreSelectedIDs.filter(function(id2) { - return context.graph().hasEntity(id2); - }); - if (reselection.length) { - context.enter(modeSelect(context, reselection)); - } else { - context.enter(modeBrowse(context)); - } - } + function behavior(selection2) { + context.install(_hover); + context.install(_edit); + _downPointer = null; + keybinding.on("\u232B", backspace).on("\u2326", del).on("\u238B", ret).on("\u21A9", ret).on("space", space).on("\u2325space", space); + selection2.on("mouseenter.draw", mouseenter).on("mouseleave.draw", mouseleave).on(_pointerPrefix + "down.draw", pointerdown).on(_pointerPrefix + "move.draw", pointermove); + select_default2(window).on(_pointerPrefix + "up.draw", pointerup, true).on("pointercancel.draw", pointercancel, true); + select_default2(document).call(keybinding); + return behavior; } - function _actionBounceBack(nodeID, toLoc) { - var moveNode = actionMoveNode(nodeID, toLoc); - var action = function(graph, t) { - if (t === 1) - context.pop(); - return moveNode(graph, t); - }; - action.transitionable = true; - return action; + behavior.off = function(selection2) { + context.ui().sidebar.hover.cancel(); + context.uninstall(_hover); + context.uninstall(_edit); + selection2.on("mouseenter.draw", null).on("mouseleave.draw", null).on(_pointerPrefix + "down.draw", null).on(_pointerPrefix + "move.draw", null); + select_default2(window).on(_pointerPrefix + "up.draw", null).on("pointercancel.draw", null); + select_default2(document).call(keybinding.unbind); + }; + behavior.hover = function() { + return _hover; + }; + return utilRebind(behavior, dispatch14, "on"); + } + + // modules/behavior/breathe.js + var import_fast_deep_equal2 = __toESM(require_fast_deep_equal()); + + // node_modules/d3-scale/src/init.js + function initRange(domain2, range3) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain2); + break; + default: + this.range(range3).domain(domain2); + break; } - function cancel() { - drag.cancel(); - context.enter(modeBrowse(context)); + return this; + } + + // node_modules/d3-scale/src/constant.js + function constants(x2) { + return function() { + return x2; + }; + } + + // node_modules/d3-scale/src/number.js + function number2(x2) { + return +x2; + } + + // node_modules/d3-scale/src/continuous.js + var unit = [0, 1]; + function identity3(x2) { + return x2; + } + function normalize(a2, b2) { + return (b2 -= a2 = +a2) ? function(x2) { + return (x2 - a2) / b2; + } : constants(isNaN(b2) ? NaN : 0.5); + } + function clamper(a2, b2) { + var t2; + if (a2 > b2) + t2 = a2, a2 = b2, b2 = t2; + return function(x2) { + return Math.max(a2, Math.min(b2, x2)); + }; + } + function bimap(domain2, range3, interpolate) { + var d0 = domain2[0], d1 = domain2[1], r0 = range3[0], r1 = range3[1]; + if (d1 < d0) + d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else + d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x2) { + return r0(d0(x2)); + }; + } + function polymap(domain2, range3, interpolate) { + var j3 = Math.min(domain2.length, range3.length) - 1, d2 = new Array(j3), r2 = new Array(j3), i3 = -1; + if (domain2[j3] < domain2[0]) { + domain2 = domain2.slice().reverse(); + range3 = range3.slice().reverse(); } - var drag = behaviorDrag().selector(".layer-touch.points .target").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end); - mode.enter = function() { - context.install(hover); - context.install(edit2); - select_default2(window).on("keydown.dragNode", keydown).on("keyup.dragNode", keyup); - context.history().on("undone.drag-node", cancel); + while (++i3 < j3) { + d2[i3] = normalize(domain2[i3], domain2[i3 + 1]); + r2[i3] = interpolate(range3[i3], range3[i3 + 1]); + } + return function(x2) { + var i4 = bisect_default(domain2, x2, 1, j3) - 1; + return r2[i4](d2[i4](x2)); }; - mode.exit = function() { - context.ui().sidebar.hover.cancel(); - context.uninstall(hover); - context.uninstall(edit2); - select_default2(window).on("keydown.dragNode", null).on("keyup.dragNode", null); - context.history().on("undone.drag-node", null); - _activeEntity = null; - context.surface().classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false).selectAll(".active").classed("active", false); - stopNudge(); + } + function copy(source, target) { + return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown()); + } + function transformer2() { + var domain2 = unit, range3 = unit, interpolate = value_default, transform2, untransform, unknown, clamp3 = identity3, piecewise, output, input; + function rescale() { + var n3 = Math.min(domain2.length, range3.length); + if (clamp3 !== identity3) + clamp3 = clamper(domain2[0], domain2[n3 - 1]); + piecewise = n3 > 2 ? polymap : bimap; + output = input = null; + return scale; + } + function scale(x2) { + return x2 == null || isNaN(x2 = +x2) ? unknown : (output || (output = piecewise(domain2.map(transform2), range3, interpolate)))(transform2(clamp3(x2))); + } + scale.invert = function(y2) { + return clamp3(untransform((input || (input = piecewise(range3, domain2.map(transform2), number_default)))(y2))); }; - mode.selectedIDs = function() { - if (!arguments.length) - return _activeEntity ? [_activeEntity.id] : []; - return mode; + scale.domain = function(_2) { + return arguments.length ? (domain2 = Array.from(_2, number2), rescale()) : domain2.slice(); }; - mode.activeID = function() { - if (!arguments.length) - return _activeEntity && _activeEntity.id; - return mode; + scale.range = function(_2) { + return arguments.length ? (range3 = Array.from(_2), rescale()) : range3.slice(); }; - mode.restoreSelectedIDs = function(_) { - if (!arguments.length) - return _restoreSelectedIDs; - _restoreSelectedIDs = _; - return mode; + scale.rangeRound = function(_2) { + return range3 = Array.from(_2), interpolate = round_default, rescale(); + }; + scale.clamp = function(_2) { + return arguments.length ? (clamp3 = _2 ? true : identity3, rescale()) : clamp3 !== identity3; + }; + scale.interpolate = function(_2) { + return arguments.length ? (interpolate = _2, rescale()) : interpolate; + }; + scale.unknown = function(_2) { + return arguments.length ? (unknown = _2, scale) : unknown; + }; + return function(t2, u2) { + transform2 = t2, untransform = u2; + return rescale(); }; - mode.behavior = drag; - return mode; + } + function continuous() { + return transformer2()(identity3, identity3); } - // modules/services/keepRight.js - var import_rbush = __toESM(require_rbush_min()); - - // node_modules/d3-fetch/src/text.js - function responseText(response) { - if (!response.ok) - throw new Error(response.status + " " + response.statusText); - return response.text(); + // node_modules/d3-format/src/formatDecimal.js + function formatDecimal_default(x2) { + return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString("en").replace(/,/g, "") : x2.toString(10); } - function text_default3(input, init2) { - return fetch(input, init2).then(responseText); + function formatDecimalParts(x2, p2) { + if ((i3 = (x2 = p2 ? x2.toExponential(p2 - 1) : x2.toExponential()).indexOf("e")) < 0) + return null; + var i3, coefficient = x2.slice(0, i3); + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x2.slice(i3 + 1) + ]; } - // node_modules/d3-fetch/src/json.js - function responseJson(response) { - if (!response.ok) - throw new Error(response.status + " " + response.statusText); - if (response.status === 204 || response.status === 205) - return; - return response.json(); + // node_modules/d3-format/src/exponent.js + function exponent_default(x2) { + return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN; } - function json_default(input, init2) { - return fetch(input, init2).then(responseJson); + + // node_modules/d3-format/src/formatGroup.js + function formatGroup_default(grouping, thousands) { + return function(value, width) { + var i3 = value.length, t2 = [], j3 = 0, g3 = grouping[0], length = 0; + while (i3 > 0 && g3 > 0) { + if (length + g3 + 1 > width) + g3 = Math.max(1, width - length); + t2.push(value.substring(i3 -= g3, i3 + g3)); + if ((length += g3 + 1) > width) + break; + g3 = grouping[j3 = (j3 + 1) % grouping.length]; + } + return t2.reverse().join(thousands); + }; } - // node_modules/d3-fetch/src/xml.js - function parser(type3) { - return (input, init2) => text_default3(input, init2).then((text2) => new DOMParser().parseFromString(text2, type3)); + // node_modules/d3-format/src/formatNumerals.js + function formatNumerals_default(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i3) { + return numerals[+i3]; + }); + }; } - var xml_default = parser("application/xml"); - var html = parser("text/html"); - var svg = parser("image/svg+xml"); - // modules/services/keepRight.js - var tiler = utilTiler(); - var dispatch2 = dispatch_default("loaded"); - var _tileZoom = 14; - var _krUrlRoot = "https://www.keepright.at"; - var _krData = { errorTypes: {}, localizeStrings: {} }; - var _cache; - var _krRuleset = [ - 30, - 40, - 50, - 60, - 70, - 90, - 100, - 110, - 120, - 130, - 150, - 160, - 170, - 180, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 210, - 220, - 230, - 231, - 232, - 270, - 280, - 281, - 282, - 283, - 284, - 285, - 290, - 291, - 292, - 293, - 294, - 295, - 296, - 297, - 298, - 300, - 310, - 311, - 312, - 313, - 320, - 350, - 360, - 370, - 380, - 390, - 400, - 401, - 402, - 410, - 411, - 412, - 413 - ]; - function abortRequest(controller) { - if (controller) { - controller.abort(); - } + // node_modules/d3-format/src/formatSpecifier.js + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) + throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); } - function abortUnwantedRequests(cache, tiles) { - Object.keys(cache.inflightTile).forEach((k) => { - const wanted = tiles.find((tile) => k === tile.id); - if (!wanted) { - abortRequest(cache.inflightTile[k]); - delete cache.inflightTile[k]; + formatSpecifier.prototype = FormatSpecifier.prototype; + function FormatSpecifier(specifier) { + this.fill = specifier.fill === void 0 ? " " : specifier.fill + ""; + this.align = specifier.align === void 0 ? ">" : specifier.align + ""; + this.sign = specifier.sign === void 0 ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === void 0 ? void 0 : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === void 0 ? "" : specifier.type + ""; + } + FormatSpecifier.prototype.toString = function() { + return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type; + }; + + // node_modules/d3-format/src/formatTrim.js + function formatTrim_default(s2) { + out: + for (var n3 = s2.length, i3 = 1, i0 = -1, i1; i3 < n3; ++i3) { + switch (s2[i3]) { + case ".": + i0 = i1 = i3; + break; + case "0": + if (i0 === 0) + i0 = i3; + i1 = i3; + break; + default: + if (!+s2[i3]) + break out; + if (i0 > 0) + i0 = 0; + break; + } } - }); + return i0 > 0 ? s2.slice(0, i0) + s2.slice(i1 + 1) : s2; } - function encodeIssueRtree(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; + + // node_modules/d3-format/src/formatPrefixAuto.js + var prefixExponent; + function formatPrefixAuto_default(x2, p2) { + var d2 = formatDecimalParts(x2, p2); + if (!d2) + return x2 + ""; + var coefficient = d2[0], exponent = d2[1], i3 = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n3 = coefficient.length; + return i3 === n3 ? coefficient : i3 > n3 ? coefficient + new Array(i3 - n3 + 1).join("0") : i3 > 0 ? coefficient.slice(0, i3) + "." + coefficient.slice(i3) : "0." + new Array(1 - i3).join("0") + formatDecimalParts(x2, Math.max(0, p2 + i3 - 1))[0]; } - function updateRtree(item, replace) { - _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id); - if (replace) { - _cache.rtree.insert(item); - } + + // node_modules/d3-format/src/formatRounded.js + function formatRounded_default(x2, p2) { + var d2 = formatDecimalParts(x2, p2); + if (!d2) + return x2 + ""; + var coefficient = d2[0], exponent = d2[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0"); } - function tokenReplacements(d) { - if (!(d instanceof QAItem)) - return; - const replacements = {}; - const issueTemplate = _krData.errorTypes[d.whichType]; - if (!issueTemplate) { - console.log("No Template: ", d.whichType); - console.log(" ", d.description); - return; - } - if (!issueTemplate.regex) - return; - const errorRegex = new RegExp(issueTemplate.regex, "i"); - const errorMatch = errorRegex.exec(d.description); - if (!errorMatch) { - console.log("Unmatched: ", d.whichType); - console.log(" ", d.description); - console.log(" ", errorRegex); - return; - } - for (let i2 = 1; i2 < errorMatch.length; i2++) { - let capture = errorMatch[i2]; - let idType; - idType = "IDs" in issueTemplate ? issueTemplate.IDs[i2 - 1] : ""; - if (idType && capture) { - capture = parseError(capture, idType); - } else { - const compare = capture.toLowerCase(); - if (_krData.localizeStrings[compare]) { - capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]); + + // node_modules/d3-format/src/formatTypes.js + var formatTypes_default = { + "%": (x2, p2) => (x2 * 100).toFixed(p2), + "b": (x2) => Math.round(x2).toString(2), + "c": (x2) => x2 + "", + "d": formatDecimal_default, + "e": (x2, p2) => x2.toExponential(p2), + "f": (x2, p2) => x2.toFixed(p2), + "g": (x2, p2) => x2.toPrecision(p2), + "o": (x2) => Math.round(x2).toString(8), + "p": (x2, p2) => formatRounded_default(x2 * 100, p2), + "r": formatRounded_default, + "s": formatPrefixAuto_default, + "X": (x2) => Math.round(x2).toString(16).toUpperCase(), + "x": (x2) => Math.round(x2).toString(16) + }; + + // node_modules/d3-format/src/identity.js + function identity_default3(x2) { + return x2; + } + + // node_modules/d3-format/src/locale.js + var map = Array.prototype.map; + var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; + function locale_default(locale2) { + var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default3 : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default3 : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + ""; + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + var fill = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision2 = specifier.precision, trim = specifier.trim, type2 = specifier.type; + if (type2 === "n") + comma = true, type2 = "g"; + else if (!formatTypes_default[type2]) + precision2 === void 0 && (precision2 = 12), trim = true, type2 = "g"; + if (zero3 || fill === "0" && align === "=") + zero3 = true, fill = "0", align = "="; + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : ""; + var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2); + precision2 = precision2 === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision2)) : Math.max(0, Math.min(20, precision2)); + function format2(value) { + var valuePrefix = prefix, valueSuffix = suffix, i3, n3, c2; + if (type2 === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; } else { - capture = unescape_default(capture); + value = +value; + var valueNegative = value < 0 || 1 / value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision2); + if (trim) + value = formatTrim_default(value); + if (valueNegative && +value === 0 && sign2 !== "+") + valueNegative = false; + valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix; + valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : ""); + if (maybeSuffix) { + i3 = -1, n3 = value.length; + while (++i3 < n3) { + if (c2 = value.charCodeAt(i3), 48 > c2 || c2 > 57) { + valueSuffix = (c2 === 46 ? decimal + value.slice(i3 + 1) : value.slice(i3)) + valueSuffix; + value = value.slice(0, i3); + break; + } + } + } + } + if (comma && !zero3) + value = group(value, Infinity); + var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : ""; + if (comma && zero3) + value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; } + return numerals(value); } - replacements["var" + i2] = capture; + format2.toString = function() { + return specifier + ""; + }; + return format2; } - return replacements; - } - function parseError(capture, idType) { - const compare = capture.toLowerCase(); - if (_krData.localizeStrings[compare]) { - capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]); + function formatPrefix2(specifier, value) { + var f3 = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e3 = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k2 = Math.pow(10, -e3), prefix = prefixes[8 + e3 / 3]; + return function(value2) { + return f3(k2 * value2) + prefix; + }; } - switch (idType) { - case "this": - capture = linkErrorObject2(capture); - break; - case "url": - capture = linkURL(capture); - break; - case "n": - case "w": - case "r": - capture = linkEntity2(idType + capture); - break; - case "20": - capture = parse20(capture); - break; - case "211": - capture = parse211(capture); - break; - case "231": - capture = parse231(capture); - break; - case "294": - capture = parse294(capture); + return { + format: newFormat, + formatPrefix: formatPrefix2 + }; + } + + // node_modules/d3-format/src/defaultLocale.js + var locale; + var format; + var formatPrefix; + defaultLocale({ + thousands: ",", + grouping: [3], + currency: ["$", ""] + }); + function defaultLocale(definition) { + locale = locale_default(definition); + format = locale.format; + formatPrefix = locale.formatPrefix; + return locale; + } + + // node_modules/d3-format/src/precisionFixed.js + function precisionFixed_default(step) { + return Math.max(0, -exponent_default(Math.abs(step))); + } + + // node_modules/d3-format/src/precisionPrefix.js + function precisionPrefix_default(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step))); + } + + // node_modules/d3-format/src/precisionRound.js + function precisionRound_default(step, max3) { + step = Math.abs(step), max3 = Math.abs(max3) - step; + return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1; + } + + // node_modules/d3-scale/src/tickFormat.js + function tickFormat(start2, stop, count, specifier) { + var step = tickStep(start2, stop, count), precision2; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start2), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision2 = precisionPrefix_default(step, value))) + specifier.precision = precision2; + return formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision2 = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop))))) + specifier.precision = precision2 - (specifier.type === "e"); break; - case "370": - capture = parse370(capture); + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision2 = precisionFixed_default(step))) + specifier.precision = precision2 - (specifier.type === "%") * 2; break; + } } - return capture; - function linkErrorObject2(d) { - return { html: `${d}` }; + return format(specifier); + } + + // node_modules/d3-scale/src/linear.js + function linearish(scale) { + var domain2 = scale.domain; + scale.ticks = function(count) { + var d2 = domain2(); + return ticks(d2[0], d2[d2.length - 1], count == null ? 10 : count); + }; + scale.tickFormat = function(count, specifier) { + var d2 = domain2(); + return tickFormat(d2[0], d2[d2.length - 1], count == null ? 10 : count, specifier); + }; + scale.nice = function(count) { + if (count == null) + count = 10; + var d2 = domain2(); + var i0 = 0; + var i1 = d2.length - 1; + var start2 = d2[i0]; + var stop = d2[i1]; + var prestep; + var step; + var maxIter = 10; + if (stop < start2) { + step = start2, start2 = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + while (maxIter-- > 0) { + step = tickIncrement(start2, stop, count); + if (step === prestep) { + d2[i0] = start2; + d2[i1] = stop; + return domain2(d2); + } else if (step > 0) { + start2 = Math.floor(start2 / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start2 = Math.ceil(start2 * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + return scale; + }; + return scale; + } + function linear3() { + var scale = continuous(); + scale.copy = function() { + return copy(scale, linear3()); + }; + initRange.apply(scale, arguments); + return linearish(scale); + } + + // node_modules/d3-scale/src/quantize.js + function quantize() { + var x05 = 0, x12 = 1, n3 = 1, domain2 = [0.5], range3 = [0, 1], unknown; + function scale(x2) { + return x2 != null && x2 <= x2 ? range3[bisect_default(domain2, x2, 0, n3)] : unknown; } - function linkEntity2(d) { - return { html: `${d}` }; + function rescale() { + var i3 = -1; + domain2 = new Array(n3); + while (++i3 < n3) + domain2[i3] = ((i3 + 1) * x12 - (i3 - n3) * x05) / (n3 + 1); + return scale; } - function linkURL(d) { - return { html: `${d}` }; + scale.domain = function(_2) { + return arguments.length ? ([x05, x12] = _2, x05 = +x05, x12 = +x12, rescale()) : [x05, x12]; + }; + scale.range = function(_2) { + return arguments.length ? (n3 = (range3 = Array.from(_2)).length - 1, rescale()) : range3.slice(); + }; + scale.invertExtent = function(y2) { + var i3 = range3.indexOf(y2); + return i3 < 0 ? [NaN, NaN] : i3 < 1 ? [x05, domain2[0]] : i3 >= n3 ? [domain2[n3 - 1], x12] : [domain2[i3 - 1], domain2[i3]]; + }; + scale.unknown = function(_2) { + return arguments.length ? (unknown = _2, scale) : scale; + }; + scale.thresholds = function() { + return domain2.slice(); + }; + scale.copy = function() { + return quantize().domain([x05, x12]).range(range3).unknown(unknown); + }; + return initRange.apply(linearish(scale), arguments); + } + + // modules/behavior/breathe.js + function behaviorBreathe() { + var duration = 800; + var steps = 4; + var selector = ".selected.shadow, .selected .shadow"; + var _selected = select_default2(null); + var _classed = ""; + var _params = {}; + var _done = false; + var _timer; + function ratchetyInterpolator(a2, b2, steps2, units) { + a2 = Number(a2); + b2 = Number(b2); + var sample = quantize().domain([0, 1]).range(quantize_default(number_default(a2, b2), steps2)); + return function(t2) { + return String(sample(t2)) + (units || ""); + }; } - function parse211(capture2) { - let newList = []; - const items = capture2.split(", "); - items.forEach((item) => { - let id2 = linkEntity2("n" + item.slice(1)); - newList.push(id2); - }); - return newList.join(", "); + function reset(selection2) { + selection2.style("stroke-opacity", null).style("stroke-width", null).style("fill-opacity", null).style("r", null); } - function parse231(capture2) { - let newList = []; - const items = capture2.split("),"); - items.forEach((item) => { - const match = item.match(/\#(\d+)\((.+)\)?/); - if (match !== null && match.length > 2) { - newList.push( - linkEntity2("w" + match[1]) + " " + _t("QA.keepRight.errorTypes.231.layer", { layer: match[2] }) - ); - } + function setAnimationParams(transition2, fromTo) { + var toFrom = fromTo === "from" ? "to" : "from"; + transition2.styleTween("stroke-opacity", function(d2) { + return ratchetyInterpolator( + _params[d2.id][toFrom].opacity, + _params[d2.id][fromTo].opacity, + steps + ); + }).styleTween("stroke-width", function(d2) { + return ratchetyInterpolator( + _params[d2.id][toFrom].width, + _params[d2.id][fromTo].width, + steps, + "px" + ); + }).styleTween("fill-opacity", function(d2) { + return ratchetyInterpolator( + _params[d2.id][toFrom].opacity, + _params[d2.id][fromTo].opacity, + steps + ); + }).styleTween("r", function(d2) { + return ratchetyInterpolator( + _params[d2.id][toFrom].width, + _params[d2.id][fromTo].width, + steps, + "px" + ); }); - return newList.join(", "); } - function parse294(capture2) { - let newList = []; - const items = capture2.split(","); - items.forEach((item) => { - item = item.split(" "); - const role = `"${item[0]}"`; - const idType2 = item[1].slice(0, 1); - let id2 = item[2].slice(1); - id2 = linkEntity2(idType2 + id2); - newList.push(`${role} ${item[1]} ${id2}`); + function calcAnimationParams(selection2) { + selection2.call(reset).each(function(d2) { + var s2 = select_default2(this); + var tag = s2.node().tagName; + var p2 = { "from": {}, "to": {} }; + var opacity; + var width; + if (tag === "circle") { + opacity = Number(s2.style("fill-opacity") || 0.5); + width = Number(s2.style("r") || 15.5); + } else { + opacity = Number(s2.style("stroke-opacity") || 0.7); + width = Number(s2.style("stroke-width") || 10); + } + p2.tag = tag; + p2.from.opacity = opacity * 0.6; + p2.to.opacity = opacity * 1.25; + p2.from.width = width * 0.7; + p2.to.width = width * (tag === "circle" ? 1.5 : 1); + _params[d2.id] = p2; }); - return newList.join(", "); } - function parse370(capture2) { - if (!capture2) - return ""; - const match = capture2.match(/\(including the name (\'.+\')\)/); - if (match && match.length) { - return _t("QA.keepRight.errorTypes.370.including_the_name", { name: match[1] }); + function run(surface, fromTo) { + var toFrom = fromTo === "from" ? "to" : "from"; + var currSelected = surface.selectAll(selector); + var currClassed = surface.attr("class"); + if (_done || currSelected.empty()) { + _selected.call(reset); + _selected = select_default2(null); + return; } - return ""; - } - function parse20(capture2) { - let newList = []; - const items = capture2.split(","); - items.forEach((item) => { - const id2 = linkEntity2("n" + item.slice(1)); - newList.push(id2); + if (!(0, import_fast_deep_equal2.default)(currSelected.data(), _selected.data()) || currClassed !== _classed) { + _selected.call(reset); + _classed = currClassed; + _selected = currSelected.call(calcAnimationParams); + } + var didCallNextRun = false; + _selected.transition().duration(duration).call(setAnimationParams, fromTo).on("end", function() { + if (!didCallNextRun) { + surface.call(run, toFrom); + didCallNextRun = true; + } + if (!select_default2(this).classed("selected")) { + reset(select_default2(this)); + } }); - return newList.join(", "); } - } - var keepRight_default = { - title: "keepRight", - init() { - _mainFileFetcher.get("keepRight").then((d) => _krData = d); - if (!_cache) { - this.reset(); + function behavior(surface) { + _done = false; + _timer = timer(function() { + if (surface.selectAll(selector).empty()) { + return false; + } + surface.call(run, "from"); + _timer.stop(); + return true; + }, 20); + } + behavior.restartIfNeeded = function(surface) { + if (_selected.empty()) { + surface.call(run, "from"); + if (_timer) { + _timer.stop(); + } } - this.event = utilRebind(this, dispatch2, "on"); - }, - reset() { - if (_cache) { - Object.values(_cache.inflightTile).forEach(abortRequest); + }; + behavior.off = function() { + _done = true; + if (_timer) { + _timer.stop(); } - _cache = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new import_rbush.default() - }; - }, - loadIssues(projection2) { - const options2 = { - format: "geojson", - ch: _krRuleset - }; - const tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection2); - abortUnwantedRequests(_cache, tiles); - tiles.forEach((tile) => { - if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) - return; - const [left, top, right, bottom] = tile.extent.rectangle(); - const params = Object.assign({}, options2, { left, bottom, right, top }); - const url = `${_krUrlRoot}/export.php?` + utilQsString(params); - const controller = new AbortController(); - _cache.inflightTile[tile.id] = controller; - json_default(url, { signal: controller.signal }).then((data) => { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - if (!data || !data.features || !data.features.length) { - throw new Error("No Data"); - } - data.features.forEach((feature3) => { - const { - properties: { - error_type: itemType, - error_id: id2, - comment = null, - object_id: objectId, - object_type: objectType, - schema, - title - } - } = feature3; - let { - geometry: { coordinates: loc }, - properties: { description = "" } - } = feature3; - const issueTemplate = _krData.errorTypes[itemType]; - const parentIssueType = (Math.floor(itemType / 10) * 10).toString(); - const whichType = issueTemplate ? itemType : parentIssueType; - const whichTemplate = _krData.errorTypes[whichType]; - switch (whichType) { - case "170": - description = `This feature has a FIXME tag: ${description}`; - break; - case "292": - case "293": - description = description.replace("A turn-", "This turn-"); - break; - case "294": - case "295": - case "296": - case "297": - case "298": - description = `This turn-restriction~${description}`; - break; - case "300": - description = "This highway is missing a maxspeed tag"; - break; - case "411": - case "412": - case "413": - description = `This feature~${description}`; - break; - } - let coincident = false; - do { - let delta = coincident ? [1e-5, 0] : [0, 1e-5]; - loc = geoVecAdd(loc, delta); - let bbox = geoExtent(loc).bbox(); - coincident = _cache.rtree.search(bbox).length; - } while (coincident); - let d = new QAItem(loc, this, itemType, id2, { - comment, - description, - whichType, - parentIssueType, - severity: whichTemplate.severity || "error", - objectId, - objectType, - schema, - title - }); - d.replacements = tokenReplacements(d); - _cache.data[id2] = d; - _cache.rtree.insert(encodeIssueRtree(d)); - }); - dispatch2.call("loaded"); - }).catch(() => { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - }); - }); - }, - postUpdate(d, callback) { - if (_cache.inflightPost[d.id]) { - return callback({ message: "Error update already inflight", status: -2 }, d); - } - const params = { schema: d.schema, id: d.id }; - if (d.newStatus) { - params.st = d.newStatus; - } - if (d.newComment !== void 0) { - params.co = d.newComment; - } - const url = `${_krUrlRoot}/comment.php?` + utilQsString(params); - const controller = new AbortController(); - _cache.inflightPost[d.id] = controller; - json_default(url, { signal: controller.signal }).finally(() => { - delete _cache.inflightPost[d.id]; - if (d.newStatus === "ignore") { - this.removeItem(d); - } else if (d.newStatus === "ignore_t") { - this.removeItem(d); - _cache.closed[`${d.schema}:${d.id}`] = true; - } else { - d = this.replaceItem(d.update({ - comment: d.newComment, - newComment: void 0, - newState: void 0 - })); - } - if (callback) - callback(null, d); - }); - }, - getItems(projection2) { - const viewport = projection2.clipExtent(); - const min3 = [viewport[0][0], viewport[1][1]]; - const max3 = [viewport[1][0], viewport[0][1]]; - const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); - return _cache.rtree.search(bbox).map((d) => d.data); - }, - getError(id2) { - return _cache.data[id2]; - }, - replaceItem(item) { - if (!(item instanceof QAItem) || !item.id) + _selected.interrupt().call(reset); + }; + return behavior; + } + + // modules/behavior/operation.js + function behaviorOperation(context) { + var _operation; + function keypress(d3_event) { + if (!context.map().withinEditableZoom()) return; - _cache.data[item.id] = item; - updateRtree(encodeIssueRtree(item), true); - return item; - }, - removeItem(item) { - if (!(item instanceof QAItem) || !item.id) + if (_operation.availableForKeypress && !_operation.availableForKeypress()) return; - delete _cache.data[item.id]; - updateRtree(encodeIssueRtree(item), false); - }, - issueURL(item) { - return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`; - }, - getClosedIDs() { - return Object.keys(_cache.closed).sort(); - } - }; - - // modules/services/improveOSM.js - var import_rbush2 = __toESM(require_rbush_min()); - var tiler2 = utilTiler(); - var dispatch3 = dispatch_default("loaded"); - var _tileZoom2 = 14; - var _impOsmUrls = { - ow: "https://grab.community.improve-osm.org/directionOfFlowService", - mr: "https://grab.community.improve-osm.org/missingGeoService", - tr: "https://grab.community.improve-osm.org/turnRestrictionService" - }; - var _impOsmData = { icons: {} }; - var _cache2; - function abortRequest2(i2) { - Object.values(i2).forEach((controller) => { - if (controller) { - controller.abort(); - } - }); - } - function abortUnwantedRequests2(cache, tiles) { - Object.keys(cache.inflightTile).forEach((k) => { - const wanted = tiles.find((tile) => k === tile.id); - if (!wanted) { - abortRequest2(cache.inflightTile[k]); - delete cache.inflightTile[k]; + d3_event.preventDefault(); + var disabled = _operation.disabled(); + if (disabled) { + context.ui().flash.duration(4e3).iconName("#iD-operation-" + _operation.id).iconClass("operation disabled").label(_operation.tooltip())(); + } else { + context.ui().flash.duration(2e3).iconName("#iD-operation-" + _operation.id).iconClass("operation").label(_operation.annotation() || _operation.title)(); + if (_operation.point) + _operation.point(null); + _operation(); } - }); - } - function encodeIssueRtree2(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; - } - function updateRtree2(item, replace) { - _cache2.rtree.remove(item, (a, b) => a.data.id === b.data.id); - if (replace) { - _cache2.rtree.insert(item); - } - } - function linkErrorObject(d) { - return { html: `${d}` }; - } - function linkEntity(d) { - return { html: `${d}` }; - } - function pointAverage(points) { - if (points.length) { - const sum = points.reduce( - (acc, point) => geoVecAdd(acc, [point.lon, point.lat]), - [0, 0] - ); - return geoVecScale(sum, 1 / points.length); - } else { - return [0, 0]; } - } - function relativeBearing(p1, p2) { - let angle2 = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat); - if (angle2 < 0) { - angle2 += 2 * Math.PI; + function behavior() { + if (_operation && _operation.available()) { + context.keybinding().on(_operation.keys, keypress); + } + return behavior; } - return angle2 * 180 / Math.PI; - } - function cardinalDirection(bearing) { - const dir = 45 * Math.round(bearing / 45); - const compass = { - 0: "north", - 45: "northeast", - 90: "east", - 135: "southeast", - 180: "south", - 225: "southwest", - 270: "west", - 315: "northwest", - 360: "north" + behavior.off = function() { + context.keybinding().off(_operation.keys); }; - return _t(`QA.improveOSM.directions.${compass[dir]}`); - } - function preventCoincident(loc, bumpUp) { - let coincident = false; - do { - let delta = coincident ? [1e-5, 0] : bumpUp ? [0, 1e-5] : [0, 0]; - loc = geoVecAdd(loc, delta); - let bbox = geoExtent(loc).bbox(); - coincident = _cache2.rtree.search(bbox).length; - } while (coincident); - return loc; + behavior.which = function(_2) { + if (!arguments.length) + return _operation; + _operation = _2; + return behavior; + }; + return behavior; } - var improveOSM_default = { - title: "improveOSM", - init() { - _mainFileFetcher.get("qa_data").then((d) => _impOsmData = d.improveOSM); - if (!_cache2) { - this.reset(); - } - this.event = utilRebind(this, dispatch3, "on"); - }, - reset() { - if (_cache2) { - Object.values(_cache2.inflightTile).forEach(abortRequest2); + + // modules/operations/circularize.js + function operationCircularize(context, selectedIDs) { + var _extent; + var _actions = selectedIDs.map(getAction).filter(Boolean); + var _amount = _actions.length === 1 ? "single" : "multiple"; + var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n3) { + return n3.loc; + }); + function getAction(entityID) { + var entity = context.entity(entityID); + if (entity.type !== "way" || new Set(entity.nodes).size <= 1) + return null; + if (!_extent) { + _extent = entity.extent(context.graph()); + } else { + _extent = _extent.extend(entity.extent(context.graph())); } - _cache2 = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new import_rbush2.default() - }; - }, - loadIssues(projection2) { - const options2 = { - client: "iD", - status: "OPEN", - zoom: "19" - }; - const tiles = tiler2.zoomExtent([_tileZoom2, _tileZoom2]).getTiles(projection2); - abortUnwantedRequests2(_cache2, tiles); - tiles.forEach((tile) => { - if (_cache2.loadedTile[tile.id] || _cache2.inflightTile[tile.id]) - return; - const [east, north, west, south] = tile.extent.rectangle(); - const params = Object.assign({}, options2, { east, south, west, north }); - const requests = {}; - Object.keys(_impOsmUrls).forEach((k) => { - const kParams = Object.assign( - {}, - params, - k === "mr" ? { type: "PARKING,ROAD,BOTH,PATH" } : { confidenceLevel: "C1" } - ); - const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams); - const controller = new AbortController(); - requests[k] = controller; - json_default(url, { signal: controller.signal }).then((data) => { - delete _cache2.inflightTile[tile.id][k]; - if (!Object.keys(_cache2.inflightTile[tile.id]).length) { - delete _cache2.inflightTile[tile.id]; - _cache2.loadedTile[tile.id] = true; - } - if (data.roadSegments) { - data.roadSegments.forEach((feature3) => { - const { points, wayId, fromNodeId, toNodeId } = feature3; - const itemId = `${wayId}${fromNodeId}${toNodeId}`; - let mid = points.length / 2; - let loc; - if (mid % 1 === 0) { - loc = pointAverage([points[mid - 1], points[mid]]); - } else { - mid = points[Math.floor(mid)]; - loc = [mid.lon, mid.lat]; - } - loc = preventCoincident(loc, false); - let d = new QAItem(loc, this, k, itemId, { - issueKey: k, - identifier: { - wayId, - fromNodeId, - toNodeId - }, - objectId: wayId, - objectType: "way" - }); - d.replacements = { - percentage: feature3.percentOfTrips, - num_trips: feature3.numberOfTrips, - highway: linkErrorObject(_t("QA.keepRight.error_parts.highway")), - from_node: linkEntity("n" + feature3.fromNodeId), - to_node: linkEntity("n" + feature3.toNodeId) - }; - _cache2.data[d.id] = d; - _cache2.rtree.insert(encodeIssueRtree2(d)); - }); - } - if (data.tiles) { - data.tiles.forEach((feature3) => { - const { type: type3, x, y, numberOfTrips } = feature3; - const geoType = type3.toLowerCase(); - const itemId = `${geoType}${x}${y}${numberOfTrips}`; - let loc = pointAverage(feature3.points); - loc = preventCoincident(loc, false); - let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, { - issueKey: k, - identifier: { x, y } - }); - d.replacements = { - num_trips: numberOfTrips, - geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`) - }; - if (numberOfTrips === -1) { - d.desc = _t("QA.improveOSM.error_types.mr.description_alt", d.replacements); - } - _cache2.data[d.id] = d; - _cache2.rtree.insert(encodeIssueRtree2(d)); - }); - } - if (data.entities) { - data.entities.forEach((feature3) => { - const { point, id: id2, segments, numberOfPasses, turnType } = feature3; - const itemId = `${id2.replace(/[,:+#]/g, "_")}`; - const loc = preventCoincident([point.lon, point.lat], true); - const ids = id2.split(","); - const from_way = ids[0]; - const via_node = ids[3]; - const to_way = ids[2].split(":")[1]; - let d = new QAItem(loc, this, k, itemId, { - issueKey: k, - identifier: id2, - objectId: via_node, - objectType: "node" - }); - const [p1, p2] = segments[0].points; - const dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); - d.replacements = { - num_passed: numberOfPasses, - num_trips: segments[0].numberOfTrips, - turn_restriction: turnType.toLowerCase(), - from_way: linkEntity("w" + from_way), - to_way: linkEntity("w" + to_way), - travel_direction: dir_of_travel, - junction: linkErrorObject(_t("QA.keepRight.error_parts.this_node")) - }; - _cache2.data[d.id] = d; - _cache2.rtree.insert(encodeIssueRtree2(d)); - dispatch3.call("loaded"); - }); - } - }).catch(() => { - delete _cache2.inflightTile[tile.id][k]; - if (!Object.keys(_cache2.inflightTile[tile.id]).length) { - delete _cache2.inflightTile[tile.id]; - _cache2.loadedTile[tile.id] = true; - } - }); + return actionCircularize(entityID, context.projection); + } + var operation = function() { + if (!_actions.length) + return; + var combinedAction = function(graph, t2) { + _actions.forEach(function(action) { + if (!action.disabled(graph)) { + graph = action(graph, t2); + } }); - _cache2.inflightTile[tile.id] = requests; - }); - }, - getComments(item) { - if (item.comments) { - return Promise.resolve(item); - } - const key = item.issueKey; - let qParams = {}; - if (key === "ow") { - qParams = item.identifier; - } else if (key === "mr") { - qParams.tileX = item.identifier.x; - qParams.tileY = item.identifier.y; - } else if (key === "tr") { - qParams.targetId = item.identifier; - } - const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams); - const cacheComments = (data) => { - item.comments = data.comments ? data.comments.reverse() : []; - this.replaceItem(item); + return graph; }; - return json_default(url).then(cacheComments).then(() => item); - }, - postUpdate(d, callback) { - if (!osm_default.authenticated()) { - return callback({ message: "Not Authenticated", status: -3 }, d); - } - if (_cache2.inflightPost[d.id]) { - return callback({ message: "Error update already inflight", status: -2 }, d); - } - osm_default.userDetails(sendPayload.bind(this)); - function sendPayload(err, user) { - if (err) { - return callback(err, d); - } - const key = d.issueKey; - const url = `${_impOsmUrls[key]}/comment`; - const payload = { - username: user.display_name, - targetIds: [d.identifier] - }; - if (d.newStatus) { - payload.status = d.newStatus; - payload.text = "status changed"; - } - if (d.newComment) { - payload.text = d.newComment; + combinedAction.transitionable = true; + context.perform(combinedAction, operation.annotation()); + window.setTimeout(function() { + context.validator().validate(); + }, 300); + }; + operation.available = function() { + return _actions.length && selectedIDs.length === _actions.length; + }; + operation.disabled = function() { + if (!_actions.length) + return ""; + var actionDisableds = _actions.map(function(action) { + return action.disabled(context.graph()); + }).filter(Boolean); + if (actionDisableds.length === _actions.length) { + if (new Set(actionDisableds).size > 1) { + return "multiple_blockers"; } - const controller = new AbortController(); - _cache2.inflightPost[d.id] = controller; - const options2 = { - method: "POST", - signal: controller.signal, - body: JSON.stringify(payload) - }; - json_default(url, options2).then(() => { - delete _cache2.inflightPost[d.id]; - if (!d.newStatus) { - const now3 = new Date(); - let comments = d.comments ? d.comments : []; - comments.push({ - username: payload.username, - text: payload.text, - timestamp: now3.getTime() / 1e3 + return actionDisableds[0]; + } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; + } + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = _coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); }); - this.replaceItem(d.update({ - comments, - newComment: void 0 - })); - } else { - this.removeItem(d); - if (d.newStatus === "SOLVED") { - if (!(d.issueKey in _cache2.closed)) { - _cache2.closed[d.issueKey] = 0; - } - _cache2.closed[d.issueKey] += 1; - } + return true; } - if (callback) - callback(null, d); - }).catch((err2) => { - delete _cache2.inflightPost[d.id]; - if (callback) - callback(err2.message); - }); + } + return false; } - }, - getItems(projection2) { - const viewport = projection2.clipExtent(); - const min3 = [viewport[0][0], viewport[1][1]]; - const max3 = [viewport[1][0], viewport[0][1]]; - const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); - return _cache2.rtree.search(bbox).map((d) => d.data); - }, - getError(id2) { - return _cache2.data[id2]; - }, - getIcon(itemType) { - return _impOsmData.icons[itemType]; - }, - replaceItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) - return; - _cache2.data[issue.id] = issue; - updateRtree2(encodeIssueRtree2(issue), true); - return issue; - }, - removeItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) - return; - delete _cache2.data[issue.id]; - updateRtree2(encodeIssueRtree2(issue), false); - }, - getClosedCounts() { - return _cache2.closed; - } - }; + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.circularize." + disable + "." + _amount) : _t.append("operations.circularize.description." + _amount); + }; + operation.annotation = function() { + return _t("operations.circularize.annotation.feature", { n: _actions.length }); + }; + operation.id = "circularize"; + operation.keys = [_t("operations.circularize.key")]; + operation.title = _t.append("operations.circularize.title"); + operation.behavior = behaviorOperation(context).which(operation); + return operation; + } - // modules/services/osmose.js - var import_rbush3 = __toESM(require_rbush_min()); - - // node_modules/marked/lib/marked.esm.js - function getDefaults() { - return { - async: false, - baseUrl: null, - breaks: false, - extensions: null, - gfm: true, - headerIds: true, - headerPrefix: "", - highlight: null, - langPrefix: "language-", - mangle: true, - pedantic: false, - renderer: null, - sanitize: false, - sanitizer: null, - silent: false, - smartLists: false, - smartypants: false, - tokenizer: null, - walkTokens: null, - xhtml: false + // modules/ui/cmd.js + var uiCmd = function(code) { + var detected = utilDetect(); + if (detected.os === "mac") { + return code; + } + if (detected.os === "win") { + if (code === "\u2318\u21E7Z") + return "Ctrl+Y"; + } + var result = "", replacements = { + "\u2318": "Ctrl", + "\u21E7": "Shift", + "\u2325": "Alt", + "\u232B": "Backspace", + "\u2326": "Delete" }; - } - var defaults = getDefaults(); - function changeDefaults(newDefaults) { - defaults = newDefaults; - } - var escapeTest = /[&<>"']/; - var escapeReplace = /[&<>"']/g; - var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; - var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; - var escapeReplacements = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'" - }; - var getEscapeReplacement = (ch) => escapeReplacements[ch]; - function escape4(html2, encode) { - if (encode) { - if (escapeTest.test(html2)) { - return html2.replace(escapeReplace, getEscapeReplacement); - } - } else { - if (escapeTestNoEncode.test(html2)) { - return html2.replace(escapeReplaceNoEncode, getEscapeReplacement); + for (var i3 = 0; i3 < code.length; i3++) { + if (code[i3] in replacements) { + result += replacements[code[i3]] + (i3 < code.length - 1 ? "+" : ""); + } else { + result += code[i3]; } } - return html2; - } - var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; - function unescape3(html2) { - return html2.replace(unescapeTest, (_, n2) => { - n2 = n2.toLowerCase(); - if (n2 === "colon") - return ":"; - if (n2.charAt(0) === "#") { - return n2.charAt(1) === "x" ? String.fromCharCode(parseInt(n2.substring(2), 16)) : String.fromCharCode(+n2.substring(1)); - } - return ""; + return result; + }; + uiCmd.display = function(code) { + if (code.length !== 1) + return code; + var detected = utilDetect(); + var mac = detected.os === "mac"; + var replacements = { + "\u2318": mac ? "\u2318 " + _t("shortcuts.key.cmd") : _t("shortcuts.key.ctrl"), + "\u21E7": mac ? "\u21E7 " + _t("shortcuts.key.shift") : _t("shortcuts.key.shift"), + "\u2325": mac ? "\u2325 " + _t("shortcuts.key.option") : _t("shortcuts.key.alt"), + "\u2303": mac ? "\u2303 " + _t("shortcuts.key.ctrl") : _t("shortcuts.key.ctrl"), + "\u232B": mac ? "\u232B " + _t("shortcuts.key.delete") : _t("shortcuts.key.backspace"), + "\u2326": mac ? "\u2326 " + _t("shortcuts.key.del") : _t("shortcuts.key.del"), + "\u2196": mac ? "\u2196 " + _t("shortcuts.key.pgup") : _t("shortcuts.key.pgup"), + "\u2198": mac ? "\u2198 " + _t("shortcuts.key.pgdn") : _t("shortcuts.key.pgdn"), + "\u21DE": mac ? "\u21DE " + _t("shortcuts.key.home") : _t("shortcuts.key.home"), + "\u21DF": mac ? "\u21DF " + _t("shortcuts.key.end") : _t("shortcuts.key.end"), + "\u21B5": mac ? "\u23CE " + _t("shortcuts.key.return") : _t("shortcuts.key.enter"), + "\u238B": mac ? "\u238B " + _t("shortcuts.key.esc") : _t("shortcuts.key.esc"), + "\u2630": mac ? "\u2630 " + _t("shortcuts.key.menu") : _t("shortcuts.key.menu") + }; + return replacements[code] || code; + }; + + // modules/operations/delete.js + function operationDelete(context, selectedIDs) { + var multi = selectedIDs.length === 1 ? "single" : "multiple"; + var action = actionDeleteMultiple(selectedIDs); + var nodes = utilGetAllNodes(selectedIDs, context.graph()); + var coords = nodes.map(function(n3) { + return n3.loc; }); - } - var caret = /(^|[^\[])\^/g; - function edit(regex, opt) { - regex = typeof regex === "string" ? regex : regex.source; - opt = opt || ""; - const obj = { - replace: (name, val) => { - val = val.source || val; - val = val.replace(caret, "$1"); - regex = regex.replace(name, val); - return obj; - }, - getRegex: () => { - return new RegExp(regex, opt); + var extent = utilTotalExtent(selectedIDs, context.graph()); + var operation = function() { + var nextSelectedID; + var nextSelectedLoc; + if (selectedIDs.length === 1) { + var id2 = selectedIDs[0]; + var entity = context.entity(id2); + var geometry = entity.geometry(context.graph()); + var parents = context.graph().parentWays(entity); + var parent = parents[0]; + if (geometry === "vertex") { + var nodes2 = parent.nodes; + var i3 = nodes2.indexOf(id2); + if (i3 === 0) { + i3++; + } else if (i3 === nodes2.length - 1) { + i3--; + } else { + var a2 = geoSphericalDistance(entity.loc, context.entity(nodes2[i3 - 1]).loc); + var b2 = geoSphericalDistance(entity.loc, context.entity(nodes2[i3 + 1]).loc); + i3 = a2 < b2 ? i3 - 1 : i3 + 1; + } + nextSelectedID = nodes2[i3]; + nextSelectedLoc = context.entity(nextSelectedID).loc; + } } - }; - return obj; - } - var nonWordAndColonTest = /[^\w:]/g; - var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; - function cleanUrl(sanitize, base, href) { - if (sanitize) { - let prot; - try { - prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase(); - } catch (e) { - return null; + context.perform(action, operation.annotation()); + context.validator().validate(); + if (nextSelectedID && nextSelectedLoc) { + if (context.hasEntity(nextSelectedID)) { + context.enter(modeSelect(context, [nextSelectedID]).follow(true)); + } else { + context.map().centerEase(nextSelectedLoc); + context.enter(modeBrowse(context)); + } + } else { + context.enter(modeBrowse(context)); } - if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) { - return null; + }; + operation.available = function() { + return true; + }; + operation.disabled = function() { + if (extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; + } else if (selectedIDs.some(protectedMember)) { + return "part_of_relation"; + } else if (selectedIDs.some(incompleteRelation)) { + return "incomplete_relation"; + } else if (selectedIDs.some(hasWikidataTag)) { + return "has_wikidata_tag"; } - } - if (base && !originIndependentUrl.test(href)) { - href = resolveUrl(base, href); - } - try { - href = encodeURI(href).replace(/%25/g, "%"); - } catch (e) { - return null; - } - return href; - } - var baseUrls = {}; - var justDomain = /^[^:]+:\/*[^/]*$/; - var protocol = /^([^:]+:)[\s\S]*$/; - var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; - function resolveUrl(base, href) { - if (!baseUrls[" " + base]) { - if (justDomain.test(base)) { - baseUrls[" " + base] = base + "/"; - } else { - baseUrls[" " + base] = rtrim(base, "/", true); + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); + }); + return true; + } + } + return false; } - } - base = baseUrls[" " + base]; - const relativeBase = base.indexOf(":") === -1; - if (href.substring(0, 2) === "//") { - if (relativeBase) { - return href; + function hasWikidataTag(id2) { + var entity = context.entity(id2); + return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0; } - return base.replace(protocol, "$1") + href; - } else if (href.charAt(0) === "/") { - if (relativeBase) { - return href; + function incompleteRelation(id2) { + var entity = context.entity(id2); + return entity.type === "relation" && !entity.isComplete(context.graph()); } - return base.replace(domain, "$1") + href; - } else { - return base + href; - } - } - var noopTest = { exec: function noopTest2() { - } }; - function merge2(obj) { - let i2 = 1, target, key; - for (; i2 < arguments.length; i2++) { - target = arguments[i2]; - for (key in target) { - if (Object.prototype.hasOwnProperty.call(target, key)) { - obj[key] = target[key]; + function protectedMember(id2) { + var entity = context.entity(id2); + if (entity.type !== "way") + return false; + var parents = context.graph().parentRelations(entity); + for (var i3 = 0; i3 < parents.length; i3++) { + var parent = parents[i3]; + var type2 = parent.tags.type; + var role = parent.memberById(id2).role || "outer"; + if (type2 === "route" || type2 === "boundary" || type2 === "multipolygon" && role === "outer") { + return true; + } } + return false; } - } - return obj; - } - function splitCells(tableRow, count) { - const row = tableRow.replace(/\|/g, (match, offset, str2) => { - let escaped = false, curr = offset; - while (--curr >= 0 && str2[curr] === "\\") - escaped = !escaped; - if (escaped) { - return "|"; - } else { - return " |"; - } - }), cells = row.split(/ \|/); - let i2 = 0; - if (!cells[0].trim()) { - cells.shift(); - } - if (cells.length > 0 && !cells[cells.length - 1].trim()) { - cells.pop(); - } - if (cells.length > count) { - cells.splice(count); - } else { - while (cells.length < count) - cells.push(""); - } - for (; i2 < cells.length; i2++) { - cells[i2] = cells[i2].trim().replace(/\\\|/g, "|"); - } - return cells; + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.delete." + disable + "." + multi) : _t.append("operations.delete.description." + multi); + }; + operation.annotation = function() { + return selectedIDs.length === 1 ? _t("operations.delete.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.delete.annotation.feature", { n: selectedIDs.length }); + }; + operation.id = "delete"; + operation.keys = [uiCmd("\u2318\u232B"), uiCmd("\u2318\u2326"), uiCmd("\u2326")]; + operation.title = _t.append("operations.delete.title"); + operation.behavior = behaviorOperation(context).which(operation); + return operation; } - function rtrim(str2, c, invert) { - const l = str2.length; - if (l === 0) { - return ""; - } - let suffLen = 0; - while (suffLen < l) { - const currChar = str2.charAt(l - suffLen - 1); - if (currChar === c && !invert) { - suffLen++; - } else if (currChar !== c && invert) { - suffLen++; + + // modules/operations/orthogonalize.js + function operationOrthogonalize(context, selectedIDs) { + var _extent; + var _type; + var _actions = selectedIDs.map(chooseAction).filter(Boolean); + var _amount = _actions.length === 1 ? "single" : "multiple"; + var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n3) { + return n3.loc; + }); + function chooseAction(entityID) { + var entity = context.entity(entityID); + var geometry = entity.geometry(context.graph()); + if (!_extent) { + _extent = entity.extent(context.graph()); } else { - break; + _extent = _extent.extend(entity.extent(context.graph())); } - } - return str2.slice(0, l - suffLen); - } - function findClosingBracket(str2, b) { - if (str2.indexOf(b[1]) === -1) { - return -1; - } - const l = str2.length; - let level = 0, i2 = 0; - for (; i2 < l; i2++) { - if (str2[i2] === "\\") { - i2++; - } else if (str2[i2] === b[0]) { - level++; - } else if (str2[i2] === b[1]) { - level--; - if (level < 0) { - return i2; + if (entity.type === "way" && new Set(entity.nodes).size > 2) { + if (_type && _type !== "feature") + return null; + _type = "feature"; + return actionOrthogonalize(entityID, context.projection); + } else if (geometry === "vertex") { + if (_type && _type !== "corner") + return null; + _type = "corner"; + var graph = context.graph(); + var parents = graph.parentWays(entity); + if (parents.length === 1) { + var way = parents[0]; + if (way.nodes.indexOf(entityID) !== -1) { + return actionOrthogonalize(way.id, context.projection, entityID); + } } } + return null; } - return -1; - } - function checkSanitizeDeprecation(opt) { - if (opt && opt.sanitize && !opt.silent) { - console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options"); - } - } - function repeatString(pattern, count) { - if (count < 1) { - return ""; - } - let result = ""; - while (count > 1) { - if (count & 1) { - result += pattern; - } - count >>= 1; - pattern += pattern; - } - return result + pattern; - } - function outputLink(cap, link2, raw, lexer2) { - const href = link2.href; - const title = link2.title ? escape4(link2.title) : null; - const text2 = cap[1].replace(/\\([\[\]])/g, "$1"); - if (cap[0].charAt(0) !== "!") { - lexer2.state.inLink = true; - const token = { - type: "link", - raw, - href, - title, - text: text2, - tokens: lexer2.inlineTokens(text2) + var operation = function() { + if (!_actions.length) + return; + var combinedAction = function(graph, t2) { + _actions.forEach(function(action) { + if (!action.disabled(graph)) { + graph = action(graph, t2); + } + }); + return graph; }; - lexer2.state.inLink = false; - return token; - } - return { - type: "image", - raw, - href, - title, - text: escape4(text2) + combinedAction.transitionable = true; + context.perform(combinedAction, operation.annotation()); + window.setTimeout(function() { + context.validator().validate(); + }, 300); }; - } - function indentCodeCompensation(raw, text2) { - const matchIndentToCode = raw.match(/^(\s+)(?:```)/); - if (matchIndentToCode === null) { - return text2; - } - const indentToCode = matchIndentToCode[1]; - return text2.split("\n").map((node) => { - const matchIndentInNode = node.match(/^\s+/); - if (matchIndentInNode === null) { - return node; + operation.available = function() { + return _actions.length && selectedIDs.length === _actions.length; + }; + operation.disabled = function() { + if (!_actions.length) + return ""; + var actionDisableds = _actions.map(function(action) { + return action.disabled(context.graph()); + }).filter(Boolean); + if (actionDisableds.length === _actions.length) { + if (new Set(actionDisableds).size > 1) { + return "multiple_blockers"; + } + return actionDisableds[0]; + } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; } - const [indentInNode] = matchIndentInNode; - if (indentInNode.length >= indentToCode.length) { - return node.slice(indentToCode.length); + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = _coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); + }); + return true; + } + } + return false; } - return node; - }).join("\n"); + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.orthogonalize." + disable + "." + _amount) : _t.append("operations.orthogonalize.description." + _type + "." + _amount); + }; + operation.annotation = function() { + return _t("operations.orthogonalize.annotation." + _type, { n: _actions.length }); + }; + operation.id = "orthogonalize"; + operation.keys = [_t("operations.orthogonalize.key")]; + operation.title = _t.append("operations.orthogonalize.title"); + operation.behavior = behaviorOperation(context).which(operation); + return operation; } - var Tokenizer = class { - constructor(options2) { - this.options = options2 || defaults; - } - space(src) { - const cap = this.rules.block.newline.exec(src); - if (cap && cap[0].length > 0) { - return { - type: "space", - raw: cap[0] - }; + + // modules/operations/reflect.js + function operationReflectShort(context, selectedIDs) { + return operationReflect(context, selectedIDs, "short"); + } + function operationReflectLong(context, selectedIDs) { + return operationReflect(context, selectedIDs, "long"); + } + function operationReflect(context, selectedIDs, axis) { + axis = axis || "long"; + var multi = selectedIDs.length === 1 ? "single" : "multiple"; + var nodes = utilGetAllNodes(selectedIDs, context.graph()); + var coords = nodes.map(function(n3) { + return n3.loc; + }); + var extent = utilTotalExtent(selectedIDs, context.graph()); + var operation = function() { + var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === "long")); + context.perform(action, operation.annotation()); + window.setTimeout(function() { + context.validator().validate(); + }, 300); + }; + operation.available = function() { + return nodes.length >= 3; + }; + operation.disabled = function() { + if (extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; + } else if (selectedIDs.some(incompleteRelation)) { + return "incomplete_relation"; } - } - code(src) { - const cap = this.rules.block.code.exec(src); - if (cap) { - const text2 = cap[0].replace(/^ {1,4}/gm, ""); - return { - type: "code", - raw: cap[0], - codeBlockStyle: "indented", - text: !this.options.pedantic ? rtrim(text2, "\n") : text2 - }; + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); + }); + return true; + } + } + return false; } - } - fences(src) { - const cap = this.rules.block.fences.exec(src); - if (cap) { - const raw = cap[0]; - const text2 = indentCodeCompensation(raw, cap[3] || ""); - return { - type: "code", - raw, - lang: cap[2] ? cap[2].trim() : cap[2], - text: text2 - }; + function incompleteRelation(id2) { + var entity = context.entity(id2); + return entity.type === "relation" && !entity.isComplete(context.graph()); } - } - heading(src) { - const cap = this.rules.block.heading.exec(src); - if (cap) { - let text2 = cap[2].trim(); - if (/#$/.test(text2)) { - const trimmed = rtrim(text2, "#"); - if (this.options.pedantic) { - text2 = trimmed.trim(); - } else if (!trimmed || / $/.test(trimmed)) { - text2 = trimmed.trim(); + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.reflect." + disable + "." + multi) : _t.append("operations.reflect.description." + axis + "." + multi); + }; + operation.annotation = function() { + return _t("operations.reflect.annotation." + axis + ".feature", { n: selectedIDs.length }); + }; + operation.id = "reflect-" + axis; + operation.keys = [_t("operations.reflect.key." + axis)]; + operation.title = _t.append("operations.reflect.title." + axis); + operation.behavior = behaviorOperation(context).which(operation); + return operation; + } + + // modules/operations/move.js + function operationMove(context, selectedIDs) { + var multi = selectedIDs.length === 1 ? "single" : "multiple"; + var nodes = utilGetAllNodes(selectedIDs, context.graph()); + var coords = nodes.map(function(n3) { + return n3.loc; + }); + var extent = utilTotalExtent(selectedIDs, context.graph()); + var operation = function() { + context.enter(modeMove(context, selectedIDs)); + }; + operation.available = function() { + return selectedIDs.length > 0; + }; + operation.disabled = function() { + if (extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; + } else if (selectedIDs.some(incompleteRelation)) { + return "incomplete_relation"; + } + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); + }); + return true; } } - return { - type: "heading", - raw: cap[0], - depth: cap[1].length, - text: text2, - tokens: this.lexer.inline(text2) - }; + return false; } - } - hr(src) { - const cap = this.rules.block.hr.exec(src); - if (cap) { - return { - type: "hr", - raw: cap[0] - }; + function incompleteRelation(id2) { + var entity = context.entity(id2); + return entity.type === "relation" && !entity.isComplete(context.graph()); } - } - blockquote(src) { - const cap = this.rules.block.blockquote.exec(src); - if (cap) { - const text2 = cap[0].replace(/^ *>[ \t]?/gm, ""); - return { - type: "blockquote", - raw: cap[0], - tokens: this.lexer.blockTokens(text2, []), - text: text2 - }; + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.move." + disable + "." + multi) : _t.append("operations.move.description." + multi); + }; + operation.annotation = function() { + return selectedIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.move.annotation.feature", { n: selectedIDs.length }); + }; + operation.id = "move"; + operation.keys = [_t("operations.move.key")]; + operation.title = _t.append("operations.move.title"); + operation.behavior = behaviorOperation(context).which(operation); + operation.mouseOnly = true; + return operation; + } + + // modules/modes/rotate.js + function modeRotate(context, entityIDs) { + var _tolerancePx = 4; + var mode = { + id: "rotate", + button: "browse" + }; + var keybinding = utilKeybinding("rotate"); + var behaviors = [ + behaviorEdit(context), + operationCircularize(context, entityIDs).behavior, + operationDelete(context, entityIDs).behavior, + operationMove(context, entityIDs).behavior, + operationOrthogonalize(context, entityIDs).behavior, + operationReflectLong(context, entityIDs).behavior, + operationReflectShort(context, entityIDs).behavior + ]; + var annotation = entityIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.rotate.annotation.feature", { n: entityIDs.length }); + var _prevGraph; + var _prevAngle; + var _prevTransform; + var _pivot; + var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; + function doRotate(d3_event) { + var fn; + if (context.graph() !== _prevGraph) { + fn = context.perform; + } else { + fn = context.replace; } - } - list(src) { - let cap = this.rules.block.list.exec(src); - if (cap) { - let raw, istask, ischecked, indent2, i2, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly; - let bull = cap[1].trim(); - const isordered = bull.length > 1; - const list = { - type: "list", - raw: "", - ordered: isordered, - start: isordered ? +bull.slice(0, -1) : "", - loose: false, - items: [] - }; - bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; - if (this.options.pedantic) { - bull = isordered ? bull : "[*+-]"; - } - const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`); - while (src) { - endEarly = false; - if (!(cap = itemRegex.exec(src))) { - break; - } - if (this.rules.block.hr.test(src)) { - break; - } - raw = cap[0]; - src = src.substring(raw.length); - line = cap[2].split("\n", 1)[0]; - nextLine = src.split("\n", 1)[0]; - if (this.options.pedantic) { - indent2 = 2; - itemContents = line.trimLeft(); - } else { - indent2 = cap[2].search(/[^ ]/); - indent2 = indent2 > 4 ? 1 : indent2; - itemContents = line.slice(indent2); - indent2 += cap[1].length; - } - blankLine = false; - if (!line && /^ *$/.test(nextLine)) { - raw += nextLine + "\n"; - src = src.substring(nextLine.length + 1); - endEarly = true; - } - if (!endEarly) { - const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))`); - const hrRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`); - const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:\`\`\`|~~~)`); - const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}#`); - while (src) { - rawLine = src.split("\n", 1)[0]; - line = rawLine; - if (this.options.pedantic) { - line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, " "); - } - if (fencesBeginRegex.test(line)) { - break; - } - if (headingBeginRegex.test(line)) { - break; - } - if (nextBulletRegex.test(line)) { - break; - } - if (hrRegex.test(src)) { - break; - } - if (line.search(/[^ ]/) >= indent2 || !line.trim()) { - itemContents += "\n" + line.slice(indent2); - } else if (!blankLine) { - itemContents += "\n" + line; - } else { - break; - } - if (!blankLine && !line.trim()) { - blankLine = true; - } - raw += rawLine + "\n"; - src = src.substring(rawLine.length + 1); - } - } - if (!list.loose) { - if (endsWithBlankLine) { - list.loose = true; - } else if (/\n *\n *$/.test(raw)) { - endsWithBlankLine = true; - } - } - if (this.options.gfm) { - istask = /^\[[ xX]\] /.exec(itemContents); - if (istask) { - ischecked = istask[0] !== "[ ] "; - itemContents = itemContents.replace(/^\[[ xX]\] +/, ""); - } - } - list.items.push({ - type: "list_item", - raw, - task: !!istask, - checked: ischecked, - loose: false, - text: itemContents - }); - list.raw += raw; - } - list.items[list.items.length - 1].raw = raw.trimRight(); - list.items[list.items.length - 1].text = itemContents.trimRight(); - list.raw = list.raw.trimRight(); - const l = list.items.length; - for (i2 = 0; i2 < l; i2++) { - this.lexer.state.top = false; - list.items[i2].tokens = this.lexer.blockTokens(list.items[i2].text, []); - const spacers = list.items[i2].tokens.filter((t) => t.type === "space"); - const hasMultipleLineBreaks = spacers.every((t) => { - const chars = t.raw.split(""); - let lineBreaks = 0; - for (const char of chars) { - if (char === "\n") { - lineBreaks += 1; - } - if (lineBreaks > 1) { - return true; - } - } - return false; - }); - if (!list.loose && spacers.length && hasMultipleLineBreaks) { - list.loose = true; - list.items[i2].loose = true; - } - } - return list; + var projection2 = context.projection; + var currTransform = projection2.transform(); + if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) { + var nodes = utilGetAllNodes(entityIDs, context.graph()); + var points = nodes.map(function(n3) { + return projection2(n3.loc); + }); + _pivot = getPivot(points); + _prevAngle = void 0; } + var currMouse = context.map().mouse(d3_event); + var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]); + if (typeof _prevAngle === "undefined") + _prevAngle = currAngle; + var delta = currAngle - _prevAngle; + fn(actionRotate(entityIDs, _pivot, delta, projection2)); + _prevTransform = currTransform; + _prevAngle = currAngle; + _prevGraph = context.graph(); } - html(src) { - const cap = this.rules.block.html.exec(src); - if (cap) { - const token = { - type: "html", - raw: cap[0], - pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"), - text: cap[0] - }; - if (this.options.sanitize) { - const text2 = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]); - token.type = "paragraph"; - token.text = text2; - token.tokens = this.lexer.inline(text2); + function getPivot(points) { + var _pivot2; + if (points.length === 1) { + _pivot2 = points[0]; + } else if (points.length === 2) { + _pivot2 = geoVecInterp(points[0], points[1], 0.5); + } else { + var polygonHull = hull_default(points); + if (polygonHull.length === 2) { + _pivot2 = geoVecInterp(points[0], points[1], 0.5); + } else { + _pivot2 = centroid_default2(hull_default(points)); } - return token; } + return _pivot2; } - def(src) { - const cap = this.rules.block.def.exec(src); - if (cap) { - if (cap[3]) - cap[3] = cap[3].substring(1, cap[3].length - 1); - const tag = cap[1].toLowerCase().replace(/\s+/g, " "); - return { - type: "def", - tag, - raw: cap[0], - href: cap[2], - title: cap[3] - }; - } + function finish(d3_event) { + d3_event.stopPropagation(); + context.replace(actionNoop(), annotation); + context.enter(modeSelect(context, entityIDs)); } - table(src) { - const cap = this.rules.block.table.exec(src); - if (cap) { - const item = { - type: "table", - header: splitCells(cap[1]).map((c) => { - return { text: c }; - }), - align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */), - rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : [] - }; - if (item.header.length === item.align.length) { - item.raw = cap[0]; - let l = item.align.length; - let i2, j2, k, row; - for (i2 = 0; i2 < l; i2++) { - if (/^ *-+: *$/.test(item.align[i2])) { - item.align[i2] = "right"; - } else if (/^ *:-+: *$/.test(item.align[i2])) { - item.align[i2] = "center"; - } else if (/^ *:-+ *$/.test(item.align[i2])) { - item.align[i2] = "left"; - } else { - item.align[i2] = null; - } - } - l = item.rows.length; - for (i2 = 0; i2 < l; i2++) { - item.rows[i2] = splitCells(item.rows[i2], item.header.length).map((c) => { - return { text: c }; + function cancel() { + if (_prevGraph) + context.pop(); + context.enter(modeSelect(context, entityIDs)); + } + function undone() { + context.enter(modeBrowse(context)); + } + mode.enter = function() { + _prevGraph = null; + context.features().forceVisible(entityIDs); + behaviors.forEach(context.install); + var downEvent; + context.surface().on(_pointerPrefix + "down.modeRotate", function(d3_event) { + downEvent = d3_event; + }); + select_default2(window).on(_pointerPrefix + "move.modeRotate", doRotate, true).on(_pointerPrefix + "up.modeRotate", function(d3_event) { + if (!downEvent) + return; + var mapNode = context.container().select(".main-map").node(); + var pointGetter = utilFastMouse(mapNode); + var p1 = pointGetter(downEvent); + var p2 = pointGetter(d3_event); + var dist = geoVecLength(p1, p2); + if (dist <= _tolerancePx) + finish(d3_event); + downEvent = null; + }, true); + context.history().on("undone.modeRotate", undone); + keybinding.on("\u238B", cancel).on("\u21A9", finish); + select_default2(document).call(keybinding); + }; + mode.exit = function() { + behaviors.forEach(context.uninstall); + context.surface().on(_pointerPrefix + "down.modeRotate", null); + select_default2(window).on(_pointerPrefix + "move.modeRotate", null, true).on(_pointerPrefix + "up.modeRotate", null, true); + context.history().on("undone.modeRotate", null); + select_default2(document).call(keybinding.unbind); + context.features().forceVisible([]); + }; + mode.selectedIDs = function() { + if (!arguments.length) + return entityIDs; + return mode; + }; + return mode; + } + + // modules/operations/rotate.js + function operationRotate(context, selectedIDs) { + var multi = selectedIDs.length === 1 ? "single" : "multiple"; + var nodes = utilGetAllNodes(selectedIDs, context.graph()); + var coords = nodes.map(function(n3) { + return n3.loc; + }); + var extent = utilTotalExtent(selectedIDs, context.graph()); + var operation = function() { + context.enter(modeRotate(context, selectedIDs)); + }; + operation.available = function() { + return nodes.length >= 2; + }; + operation.disabled = function() { + if (extent.percentContainedIn(context.map().extent()) < 0.8) { + return "too_large"; + } else if (someMissing()) { + return "not_downloaded"; + } else if (selectedIDs.some(context.hasHiddenConnections)) { + return "connected_to_hidden"; + } else if (selectedIDs.some(incompleteRelation)) { + return "incomplete_relation"; + } + return false; + function someMissing() { + if (context.inIntro()) + return false; + var osm = context.connection(); + if (osm) { + var missing = coords.filter(function(loc) { + return !osm.isDataLoaded(loc); + }); + if (missing.length) { + missing.forEach(function(loc) { + context.loadTileAtLoc(loc); }); + return true; } - l = item.header.length; - for (j2 = 0; j2 < l; j2++) { - item.header[j2].tokens = this.lexer.inline(item.header[j2].text); - } - l = item.rows.length; - for (j2 = 0; j2 < l; j2++) { - row = item.rows[j2]; - for (k = 0; k < row.length; k++) { - row[k].tokens = this.lexer.inline(row[k].text); - } - } - return item; } + return false; } - } - lheading(src) { - const cap = this.rules.block.lheading.exec(src); - if (cap) { - return { - type: "heading", - raw: cap[0], - depth: cap[2].charAt(0) === "=" ? 1 : 2, - text: cap[1], - tokens: this.lexer.inline(cap[1]) - }; + function incompleteRelation(id2) { + var entity = context.entity(id2); + return entity.type === "relation" && !entity.isComplete(context.graph()); } - } - paragraph(src) { - const cap = this.rules.block.paragraph.exec(src); - if (cap) { - const text2 = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1]; - return { - type: "paragraph", - raw: cap[0], - text: text2, - tokens: this.lexer.inline(text2) - }; + }; + operation.tooltip = function() { + var disable = operation.disabled(); + return disable ? _t.append("operations.rotate." + disable + "." + multi) : _t.append("operations.rotate.description." + multi); + }; + operation.annotation = function() { + return selectedIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.rotate.annotation.feature", { n: selectedIDs.length }); + }; + operation.id = "rotate"; + operation.keys = [_t("operations.rotate.key")]; + operation.title = _t.append("operations.rotate.title"); + operation.behavior = behaviorOperation(context).which(operation); + operation.mouseOnly = true; + return operation; + } + + // modules/modes/move.js + function modeMove(context, entityIDs, baseGraph) { + var _tolerancePx = 4; + var mode = { + id: "move", + button: "browse" + }; + var keybinding = utilKeybinding("move"); + var behaviors = [ + behaviorEdit(context), + operationCircularize(context, entityIDs).behavior, + operationDelete(context, entityIDs).behavior, + operationOrthogonalize(context, entityIDs).behavior, + operationReflectLong(context, entityIDs).behavior, + operationReflectShort(context, entityIDs).behavior, + operationRotate(context, entityIDs).behavior + ]; + var annotation = entityIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.move.annotation.feature", { n: entityIDs.length }); + var _prevGraph; + var _cache4; + var _origin; + var _nudgeInterval; + var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; + function doMove(nudge) { + nudge = nudge || [0, 0]; + var fn; + if (_prevGraph !== context.graph()) { + _cache4 = {}; + _origin = context.map().mouseCoordinates(); + fn = context.perform; + } else { + fn = context.overwrite; } + var currMouse = context.map().mouse(); + var origMouse = context.projection(_origin); + var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge); + fn(actionMove(entityIDs, delta, context.projection, _cache4)); + _prevGraph = context.graph(); } - text(src) { - const cap = this.rules.block.text.exec(src); - if (cap) { - return { - type: "text", - raw: cap[0], - text: cap[0], - tokens: this.lexer.inline(cap[0]) - }; - } + function startNudge(nudge) { + if (_nudgeInterval) + window.clearInterval(_nudgeInterval); + _nudgeInterval = window.setInterval(function() { + context.map().pan(nudge); + doMove(nudge); + }, 50); } - escape(src) { - const cap = this.rules.inline.escape.exec(src); - if (cap) { - return { - type: "escape", - raw: cap[0], - text: escape4(cap[1]) - }; + function stopNudge() { + if (_nudgeInterval) { + window.clearInterval(_nudgeInterval); + _nudgeInterval = null; } } - tag(src) { - const cap = this.rules.inline.tag.exec(src); - if (cap) { - if (!this.lexer.state.inLink && /^/i.test(cap[0])) { - this.lexer.state.inLink = false; - } - if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - this.lexer.state.inRawBlock = true; - } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - this.lexer.state.inRawBlock = false; + function move() { + doMove(); + var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions()); + if (nudge) { + startNudge(nudge); + } else { + stopNudge(); + } + } + function finish(d3_event) { + d3_event.stopPropagation(); + context.replace(actionNoop(), annotation); + context.enter(modeSelect(context, entityIDs)); + stopNudge(); + } + function cancel() { + if (baseGraph) { + while (context.graph() !== baseGraph) + context.pop(); + context.enter(modeBrowse(context)); + } else { + if (_prevGraph) + context.pop(); + context.enter(modeSelect(context, entityIDs)); + } + stopNudge(); + } + function undone() { + context.enter(modeBrowse(context)); + } + mode.enter = function() { + _origin = context.map().mouseCoordinates(); + _prevGraph = null; + _cache4 = {}; + context.features().forceVisible(entityIDs); + behaviors.forEach(context.install); + var downEvent; + context.surface().on(_pointerPrefix + "down.modeMove", function(d3_event) { + downEvent = d3_event; + }); + select_default2(window).on(_pointerPrefix + "move.modeMove", move, true).on(_pointerPrefix + "up.modeMove", function(d3_event) { + if (!downEvent) + return; + var mapNode = context.container().select(".main-map").node(); + var pointGetter = utilFastMouse(mapNode); + var p1 = pointGetter(downEvent); + var p2 = pointGetter(d3_event); + var dist = geoVecLength(p1, p2); + if (dist <= _tolerancePx) + finish(d3_event); + downEvent = null; + }, true); + context.history().on("undone.modeMove", undone); + keybinding.on("\u238B", cancel).on("\u21A9", finish); + select_default2(document).call(keybinding); + }; + mode.exit = function() { + stopNudge(); + behaviors.forEach(function(behavior) { + context.uninstall(behavior); + }); + context.surface().on(_pointerPrefix + "down.modeMove", null); + select_default2(window).on(_pointerPrefix + "move.modeMove", null, true).on(_pointerPrefix + "up.modeMove", null, true); + context.history().on("undone.modeMove", null); + select_default2(document).call(keybinding.unbind); + context.features().forceVisible([]); + }; + mode.selectedIDs = function() { + if (!arguments.length) + return entityIDs; + return mode; + }; + return mode; + } + + // modules/behavior/paste.js + function behaviorPaste(context) { + function doPaste(d3_event) { + if (!context.map().withinEditableZoom()) + return; + d3_event.preventDefault(); + var baseGraph = context.graph(); + var mouse = context.map().mouse(); + var projection2 = context.projection; + var viewport = geoExtent(projection2.clipExtent()).polygon(); + if (!geoPointInPolygon(mouse, viewport)) + return; + var oldIDs = context.copyIDs(); + if (!oldIDs.length) + return; + var extent = geoExtent(); + var oldGraph = context.copyGraph(); + var newIDs = []; + var action = actionCopyEntities(oldIDs, oldGraph); + context.perform(action); + var copies = action.copies(); + var originals = /* @__PURE__ */ new Set(); + Object.values(copies).forEach(function(entity) { + originals.add(entity.id); + }); + for (var id2 in copies) { + var oldEntity = oldGraph.entity(id2); + var newEntity = copies[id2]; + extent._extend(oldEntity.extent(oldGraph)); + var parents = context.graph().parentWays(newEntity); + var parentCopied = parents.some(function(parent) { + return originals.has(parent.id); + }); + if (!parentCopied) { + newIDs.push(newEntity.id); } - return { - type: this.options.sanitize ? "text" : "html", - raw: cap[0], - inLink: this.lexer.state.inLink, - inRawBlock: this.lexer.state.inRawBlock, - text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0] - }; } + var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center()); + var delta = geoVecSubtract(mouse, copyPoint); + context.perform(actionMove(newIDs, delta, projection2)); + context.enter(modeMove(context, newIDs, baseGraph)); } - link(src) { - const cap = this.rules.inline.link.exec(src); - if (cap) { - const trimmedUrl = cap[2].trim(); - if (!this.options.pedantic && /^$/.test(trimmedUrl)) { - return; - } - const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\"); - if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + function behavior() { + context.keybinding().on(uiCmd("\u2318V"), doPaste); + return behavior; + } + behavior.off = function() { + context.keybinding().off(uiCmd("\u2318V")); + }; + return behavior; + } + + // modules/behavior/drag.js + function behaviorDrag() { + var dispatch14 = dispatch_default("start", "move", "end"); + var _tolerancePx = 1; + var _penTolerancePx = 4; + var _origin = null; + var _selector = ""; + var _targetNode; + var _targetEntity; + var _surface; + var _pointerId; + var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; + var d3_event_userSelectProperty = utilPrefixCSSProperty("UserSelect"); + var d3_event_userSelectSuppress = function() { + var selection2 = selection_default(); + var select = selection2.style(d3_event_userSelectProperty); + selection2.style(d3_event_userSelectProperty, "none"); + return function() { + selection2.style(d3_event_userSelectProperty, select); + }; + }; + function pointerdown(d3_event) { + if (_pointerId) + return; + _pointerId = d3_event.pointerId || "mouse"; + _targetNode = this; + var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode); + var offset; + var startOrigin = pointerLocGetter(d3_event); + var started = false; + var selectEnable = d3_event_userSelectSuppress(); + select_default2(window).on(_pointerPrefix + "move.drag", pointermove).on(_pointerPrefix + "up.drag pointercancel.drag", pointerup, true); + if (_origin) { + offset = _origin.call(_targetNode, _targetEntity); + offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]]; + } else { + offset = [0, 0]; + } + d3_event.stopPropagation(); + function pointermove(d3_event2) { + if (_pointerId !== (d3_event2.pointerId || "mouse")) + return; + var p2 = pointerLocGetter(d3_event2); + if (!started) { + var dist = geoVecLength(startOrigin, p2); + var tolerance = d3_event2.pointerType === "pen" ? _penTolerancePx : _tolerancePx; + if (dist < tolerance) return; - } - } else { - const lastParenIndex = findClosingBracket(cap[2], "()"); - if (lastParenIndex > -1) { - const start2 = cap[0].indexOf("!") === 0 ? 5 : 4; - const linkLen = start2 + cap[1].length + lastParenIndex; - cap[2] = cap[2].substring(0, lastParenIndex); - cap[0] = cap[0].substring(0, linkLen).trim(); - cap[3] = ""; - } - } - let href = cap[2]; - let title = ""; - if (this.options.pedantic) { - const link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); - if (link2) { - href = link2[1]; - title = link2[3]; - } + started = true; + dispatch14.call("start", this, d3_event2, _targetEntity); } else { - title = cap[3] ? cap[3].slice(1, -1) : ""; - } - href = href.trim(); - if (/^$/.test(trimmedUrl)) { - href = href.slice(1); - } else { - href = href.slice(1, -1); - } + startOrigin = p2; + d3_event2.stopPropagation(); + d3_event2.preventDefault(); + var dx = p2[0] - startOrigin[0]; + var dy = p2[1] - startOrigin[1]; + dispatch14.call("move", this, d3_event2, _targetEntity, [p2[0] + offset[0], p2[1] + offset[1]], [dx, dy]); } - return outputLink(cap, { - href: href ? href.replace(this.rules.inline._escapes, "$1") : href, - title: title ? title.replace(this.rules.inline._escapes, "$1") : title - }, cap[0], this.lexer); } - } - reflink(src, links) { - let cap; - if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { - let link2 = (cap[2] || cap[1]).replace(/\s+/g, " "); - link2 = links[link2.toLowerCase()]; - if (!link2 || !link2.href) { - const text2 = cap[0].charAt(0); - return { - type: "text", - raw: text2, - text: text2 - }; + function pointerup(d3_event2) { + if (_pointerId !== (d3_event2.pointerId || "mouse")) + return; + _pointerId = null; + if (started) { + dispatch14.call("end", this, d3_event2, _targetEntity); + d3_event2.preventDefault(); } - return outputLink(cap, link2, cap[0], this.lexer); + select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null); + selectEnable(); } } - emStrong(src, maskedSrc, prevChar = "") { - let match = this.rules.inline.emStrong.lDelim.exec(src); - if (!match) - return; - if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) - return; - const nextChar = match[1] || match[2] || ""; - if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) { - const lLength = match[0].length - 1; - let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; - const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; - endReg.lastIndex = 0; - maskedSrc = maskedSrc.slice(-1 * src.length + lLength); - while ((match = endReg.exec(maskedSrc)) != null) { - rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; - if (!rDelim) - continue; - rLength = rDelim.length; - if (match[3] || match[4]) { - delimTotal += rLength; - continue; - } else if (match[5] || match[6]) { - if (lLength % 3 && !((lLength + rLength) % 3)) { - midDelimTotal += rLength; - continue; + function behavior(selection2) { + var matchesSelector = utilPrefixDOMProperty("matchesSelector"); + var delegate = pointerdown; + if (_selector) { + delegate = function(d3_event) { + var root3 = this; + var target = d3_event.target; + for (; target && target !== root3; target = target.parentNode) { + var datum2 = target.__data__; + _targetEntity = datum2 instanceof osmNote ? datum2 : datum2 && datum2.properties && datum2.properties.entity; + if (_targetEntity && target[matchesSelector](_selector)) { + return pointerdown.call(target, d3_event); } } - delimTotal -= rLength; - if (delimTotal > 0) - continue; - rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); - if (Math.min(lLength, rLength) % 2) { - const text3 = src.slice(1, lLength + match.index + rLength); - return { - type: "em", - raw: src.slice(0, lLength + match.index + rLength + 1), - text: text3, - tokens: this.lexer.inlineTokens(text3) - }; - } - const text2 = src.slice(2, lLength + match.index + rLength - 1); - return { - type: "strong", - raw: src.slice(0, lLength + match.index + rLength + 1), - text: text2, - tokens: this.lexer.inlineTokens(text2) - }; - } - } - } - codespan(src) { - const cap = this.rules.inline.code.exec(src); - if (cap) { - let text2 = cap[2].replace(/\n/g, " "); - const hasNonSpaceChars = /[^ ]/.test(text2); - const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2); - if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { - text2 = text2.substring(1, text2.length - 1); - } - text2 = escape4(text2, true); - return { - type: "codespan", - raw: cap[0], - text: text2 }; } + selection2.on(_pointerPrefix + "down.drag" + _selector, delegate); } - br(src) { - const cap = this.rules.inline.br.exec(src); - if (cap) { - return { - type: "br", - raw: cap[0] - }; + behavior.off = function(selection2) { + selection2.on(_pointerPrefix + "down.drag" + _selector, null); + }; + behavior.selector = function(_2) { + if (!arguments.length) + return _selector; + _selector = _2; + return behavior; + }; + behavior.origin = function(_2) { + if (!arguments.length) + return _origin; + _origin = _2; + return behavior; + }; + behavior.cancel = function() { + select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null); + return behavior; + }; + behavior.targetNode = function(_2) { + if (!arguments.length) + return _targetNode; + _targetNode = _2; + return behavior; + }; + behavior.targetEntity = function(_2) { + if (!arguments.length) + return _targetEntity; + _targetEntity = _2; + return behavior; + }; + behavior.surface = function(_2) { + if (!arguments.length) + return _surface; + _surface = _2; + return behavior; + }; + return utilRebind(behavior, dispatch14, "on"); + } + + // modules/modes/drag_node.js + function modeDragNode(context) { + var mode = { + id: "drag-node", + button: "browse" + }; + var hover = behaviorHover(context).altDisables(true).on("hover", context.ui().sidebar.hover); + var edit2 = behaviorEdit(context); + var _nudgeInterval; + var _restoreSelectedIDs = []; + var _wasMidpoint = false; + var _isCancelled = false; + var _activeEntity; + var _startLoc; + var _lastLoc; + function startNudge(d3_event, entity, nudge) { + if (_nudgeInterval) + window.clearInterval(_nudgeInterval); + _nudgeInterval = window.setInterval(function() { + context.map().pan(nudge); + doMove(d3_event, entity, nudge); + }, 50); + } + function stopNudge() { + if (_nudgeInterval) { + window.clearInterval(_nudgeInterval); + _nudgeInterval = null; } } - del(src) { - const cap = this.rules.inline.del.exec(src); - if (cap) { - return { - type: "del", - raw: cap[0], - text: cap[2], - tokens: this.lexer.inlineTokens(cap[2]) - }; + function moveAnnotation(entity) { + return _t("operations.move.annotation." + entity.geometry(context.graph())); + } + function connectAnnotation(nodeEntity, targetEntity) { + var nodeGeometry = nodeEntity.geometry(context.graph()); + var targetGeometry = targetEntity.geometry(context.graph()); + if (nodeGeometry === "vertex" && targetGeometry === "vertex") { + var nodeParentWayIDs = context.graph().parentWays(nodeEntity); + var targetParentWayIDs = context.graph().parentWays(targetEntity); + var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs); + if (sharedParentWays.length !== 0) { + if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) { + return _t("operations.connect.annotation.from_vertex.to_adjacent_vertex"); + } + return _t("operations.connect.annotation.from_vertex.to_sibling_vertex"); + } } + return _t("operations.connect.annotation.from_" + nodeGeometry + ".to_" + targetGeometry); } - autolink(src, mangle2) { - const cap = this.rules.inline.autolink.exec(src); - if (cap) { - let text2, href; - if (cap[2] === "@") { - text2 = escape4(this.options.mangle ? mangle2(cap[1]) : cap[1]); - href = "mailto:" + text2; - } else { - text2 = escape4(cap[1]); - href = text2; + function shouldSnapToNode(target) { + if (!_activeEntity) + return false; + return _activeEntity.geometry(context.graph()) !== "vertex" || (target.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(target, context.graph())); + } + function origin(entity) { + return context.projection(entity.loc); + } + function keydown(d3_event) { + if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) { + if (context.surface().classed("nope")) { + context.surface().classed("nope-suppressed", true); } - return { - type: "link", - raw: cap[0], - text: text2, - href, - tokens: [ - { - type: "text", - raw: text2, - text: text2 - } - ] - }; + context.surface().classed("nope", false).classed("nope-disabled", true); } } - url(src, mangle2) { - let cap; - if (cap = this.rules.inline.url.exec(src)) { - let text2, href; - if (cap[2] === "@") { - text2 = escape4(this.options.mangle ? mangle2(cap[0]) : cap[0]); - href = "mailto:" + text2; - } else { - let prevCapZero; - do { - prevCapZero = cap[0]; - cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; - } while (prevCapZero !== cap[0]); - text2 = escape4(cap[0]); - if (cap[1] === "www.") { - href = "http://" + text2; - } else { - href = text2; - } + function keyup(d3_event) { + if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) { + if (context.surface().classed("nope-suppressed")) { + context.surface().classed("nope", true); } - return { - type: "link", - raw: cap[0], - text: text2, - href, - tokens: [ - { - type: "text", - raw: text2, - text: text2 - } - ] - }; + context.surface().classed("nope-suppressed", false).classed("nope-disabled", false); } } - inlineText(src, smartypants2) { - const cap = this.rules.inline.text.exec(src); - if (cap) { - let text2; - if (this.lexer.state.inRawBlock) { - text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0]; - } else { - text2 = escape4(this.options.smartypants ? smartypants2(cap[0]) : cap[0]); + function start2(d3_event, entity) { + _wasMidpoint = entity.type === "midpoint"; + var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); + _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden; + if (_isCancelled) { + if (hasHidden) { + context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("modes.drag_node.connected_to_hidden"))(); } - return { - type: "text", - raw: cap[0], - text: text2 - }; + return drag.cancel(); } + if (_wasMidpoint) { + var midpoint = entity; + entity = osmNode(); + context.perform(actionAddMidpoint(midpoint, entity)); + entity = context.entity(entity.id); + var vertex = context.surface().selectAll("." + entity.id); + drag.targetNode(vertex.node()).targetEntity(entity); + } else { + context.perform(actionNoop()); + } + _activeEntity = entity; + _startLoc = entity.loc; + hover.ignoreVertex(entity.geometry(context.graph()) === "vertex"); + context.surface().selectAll("." + _activeEntity.id).classed("active", true); + context.enter(mode); } - }; - var block = { - newline: /^(?: *(?:\n|$))+/, - code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, - fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, - hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, - heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, - blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, - list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/, - html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", - def: /^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, - table: noopTest, - lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, - _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, - text: /^[^\n]+/ - }; - block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; - block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; - block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex(); - block.bullet = /(?:[*+-]|\d{1,9}[.)])/; - block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex(); - block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex(); - block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; - block._comment = /|$)/; - block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); - block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); - block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex(); - block.normal = merge2({}, block); - block.gfm = merge2({}, block.normal, { - table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" - }); - block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); - block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); - block.pedantic = merge2({}, block.normal, { - html: edit( - `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))` - ).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), - def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, - heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: noopTest, - paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex() - }); - var inline = { - escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, - autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, - url: noopTest, - tag: "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^", - link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, - reflink: /^!?\[(label)\]\[(ref)\]/, - nolink: /^!?\[(ref)\](?:\[\])?/, - reflinkSearch: "reflink|nolink(?!\\()", - emStrong: { - lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, - rDelimAst: /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, - rDelimUnd: /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ - }, - code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, - br: /^( {2,}|\\)\n(?!\s*$)/, - del: noopTest, - text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"; - inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); - inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; - inline.escapedEmSt = /\\\*|\\_/g; - inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex(); - inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex(); - inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex(); - inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex(); - inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; - inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; - 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])?)+(?![-_])/; - inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex(); - inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; - inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex(); - inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; - inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; - inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; - inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex(); - inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex(); - inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex(); - inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex(); - inline.normal = merge2({}, inline); - inline.pedantic = merge2({}, inline.normal, { - strong: { - start: /^__|\*\*/, - middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - endAst: /\*\*(?!\*)/g, - endUnd: /__(?!_)/g - }, - em: { - start: /^_|\*/, - middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, - endAst: /\*(?!\*)/g, - endUnd: /_(?!_)/g - }, - link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(), - reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex() - }); - inline.gfm = merge2({}, inline.normal, { - escape: edit(inline.escape).replace("])", "~|])").getRegex(), - _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, - url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, - _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, - del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, - text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5) { - ch = "x" + ch.toString(16); + function datum2(d3_event) { + if (!d3_event || d3_event.altKey) { + return {}; + } else { + var d2 = d3_event.target.__data__; + return d2 && d2.properties && d2.properties.target ? d2 : {}; } - out += "&#" + ch + ";"; } - return out; - } - var Lexer = class { - constructor(options2) { - this.tokens = []; - this.tokens.links = /* @__PURE__ */ Object.create(null); - this.options = options2 || defaults; - this.options.tokenizer = this.options.tokenizer || new Tokenizer(); - this.tokenizer = this.options.tokenizer; - this.tokenizer.options = this.options; - this.tokenizer.lexer = this; - this.inlineQueue = []; - this.state = { - inLink: false, - inRawBlock: false, - top: true - }; - const rules = { - block: block.normal, - inline: inline.normal - }; - if (this.options.pedantic) { - rules.block = block.pedantic; - rules.inline = inline.pedantic; - } else if (this.options.gfm) { - rules.block = block.gfm; - if (this.options.breaks) { - rules.inline = inline.breaks; - } else { - rules.inline = inline.gfm; + function doMove(d3_event, entity, nudge) { + nudge = nudge || [0, 0]; + var currPoint = d3_event && d3_event.point || context.projection(_lastLoc); + var currMouse = geoVecSubtract(currPoint, nudge); + var loc = context.projection.invert(currMouse); + var target, edge; + if (!_nudgeInterval) { + var d2 = datum2(d3_event); + target = d2 && d2.properties && d2.properties.entity; + var targetLoc = target && target.loc; + var targetNodes = d2 && d2.properties && d2.properties.nodes; + if (targetLoc) { + if (shouldSnapToNode(target)) { + loc = targetLoc; + } + } else if (targetNodes) { + edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id); + if (edge) { + loc = edge.loc; + } } } - this.tokenizer.rules = rules; - } - static get rules() { - return { - block, - inline - }; - } - static lex(src, options2) { - const lexer2 = new Lexer(options2); - return lexer2.lex(src); - } - static lexInline(src, options2) { - const lexer2 = new Lexer(options2); - return lexer2.inlineTokens(src); - } - lex(src) { - src = src.replace(/\r\n|\r/g, "\n"); - this.blockTokens(src, this.tokens); - let next; - while (next = this.inlineQueue.shift()) { - this.inlineTokens(next.src, next.tokens); + context.replace( + actionMoveNode(entity.id, loc) + ); + var isInvalid = false; + if (target) { + isInvalid = hasRelationConflict(entity, target, edge, context.graph()); } - return this.tokens; - } - blockTokens(src, tokens = []) { - if (this.options.pedantic) { - src = src.replace(/\t/g, " ").replace(/^ +$/gm, ""); - } else { - src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => { - return leading + " ".repeat(tabs.length); - }); + if (!isInvalid) { + isInvalid = hasInvalidGeometry(entity, context.graph()); } - let token, lastToken, cutSrc, lastParagraphClipped; - while (src) { - if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => { - if (token = extTokenizer.call({ lexer: this }, src, tokens)) { - src = src.substring(token.raw.length); - tokens.push(token); - return true; - } - return false; - })) { - continue; - } - if (token = this.tokenizer.space(src)) { - src = src.substring(token.raw.length); - if (token.raw.length === 1 && tokens.length > 0) { - tokens[tokens.length - 1].raw += "\n"; - } else { - tokens.push(token); - } - continue; - } - if (token = this.tokenizer.code(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { - lastToken.raw += "\n" + token.raw; - lastToken.text += "\n" + token.text; - this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - continue; - } - if (token = this.tokenizer.fences(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.heading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.hr(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.blockquote(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.list(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.html(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.def(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { - lastToken.raw += "\n" + token.raw; - lastToken.text += "\n" + token.raw; - this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; - } else if (!this.tokens.links[token.tag]) { - this.tokens.links[token.tag] = { - href: token.href, - title: token.title - }; - } - continue; - } - if (token = this.tokenizer.table(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.lheading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - cutSrc = src; - if (this.options.extensions && this.options.extensions.startBlock) { - let startIndex = Infinity; - const tempSrc = src.slice(1); - let tempStart; - this.options.extensions.startBlock.forEach(function(getStartIndex) { - tempStart = getStartIndex.call({ lexer: this }, tempSrc); - if (typeof tempStart === "number" && tempStart >= 0) { - startIndex = Math.min(startIndex, tempStart); - } - }); - if (startIndex < Infinity && startIndex >= 0) { - cutSrc = src.substring(0, startIndex + 1); - } - } - if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { - lastToken = tokens[tokens.length - 1]; - if (lastParagraphClipped && lastToken.type === "paragraph") { - lastToken.raw += "\n" + token.raw; - lastToken.text += "\n" + token.text; - this.inlineQueue.pop(); - this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - lastParagraphClipped = cutSrc.length !== src.length; - src = src.substring(token.raw.length); - continue; - } - if (token = this.tokenizer.text(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === "text") { - lastToken.raw += "\n" + token.raw; - lastToken.text += "\n" + token.text; - this.inlineQueue.pop(); - this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - continue; + var nope = context.surface().classed("nope"); + if (isInvalid === "relation" || isInvalid === "restriction") { + if (!nope) { + context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append( + "operations.connect." + isInvalid, + { relation: _mainPresetIndex.item("type/restriction").name() } + ))(); } - if (src) { - const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); - if (this.options.silent) { - console.error(errMsg); - break; - } else { - throw new Error(errMsg); - } + } else if (isInvalid) { + var errorID = isInvalid === "line" ? "lines" : "areas"; + context.ui().flash.duration(3e3).iconName("#iD-icon-no").label(_t.append("self_intersection.error." + errorID))(); + } else { + if (nope) { + context.ui().flash.duration(1).label("")(); } } - this.state.top = true; - return tokens; + var nopeDisabled = context.surface().classed("nope-disabled"); + if (nopeDisabled) { + context.surface().classed("nope", false).classed("nope-suppressed", isInvalid); + } else { + context.surface().classed("nope", isInvalid).classed("nope-suppressed", false); + } + _lastLoc = loc; } - inline(src, tokens = []) { - this.inlineQueue.push({ src, tokens }); - return tokens; + function hasRelationConflict(entity, target, edge, graph) { + var testGraph = graph.update(); + if (edge) { + var midpoint = osmNode(); + var action = actionAddMidpoint({ + loc: edge.loc, + edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] + }, midpoint); + testGraph = action(testGraph); + target = midpoint; + } + var ids = [entity.id, target.id]; + return actionConnect(ids).disabled(testGraph); } - inlineTokens(src, tokens = []) { - let token, lastToken, cutSrc; - let maskedSrc = src; - let match; - let keepPrevChar, prevChar; - if (this.tokens.links) { - const links = Object.keys(this.tokens.links); - if (links.length > 0) { - while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { - if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) { - maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + function hasInvalidGeometry(entity, graph) { + var parents = graph.parentWays(entity); + var i3, j3, k2; + for (i3 = 0; i3 < parents.length; i3++) { + var parent = parents[i3]; + var nodes = []; + var activeIndex = null; + var relations = graph.parentRelations(parent); + for (j3 = 0; j3 < relations.length; j3++) { + if (!relations[j3].isMultipolygon()) + continue; + var rings = osmJoinWays(relations[j3].members, graph); + for (k2 = 0; k2 < rings.length; k2++) { + nodes = rings[k2].nodes; + if (nodes.find(function(n3) { + return n3.id === entity.id; + })) { + activeIndex = k2; + if (geoHasSelfIntersections(nodes, entity.id)) { + return "multipolygonMember"; + } } + rings[k2].coords = nodes.map(function(n3) { + return n3.loc; + }); } - } - } - while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { - maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); - } - while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) { - maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex); - } - while (src) { - if (!keepPrevChar) { - prevChar = ""; - } - keepPrevChar = false; - if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => { - if (token = extTokenizer.call({ lexer: this }, src, tokens)) { - src = src.substring(token.raw.length); - tokens.push(token); - return true; - } - return false; - })) { - continue; - } - if (token = this.tokenizer.escape(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.tag(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && token.type === "text" && lastToken.type === "text") { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); - } - continue; - } - if (token = this.tokenizer.link(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.reflink(src, this.tokens.links)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && token.type === "text" && lastToken.type === "text") { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); - } - continue; - } - if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.codespan(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.br(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.del(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (token = this.tokenizer.autolink(src, mangle)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } - cutSrc = src; - if (this.options.extensions && this.options.extensions.startInline) { - let startIndex = Infinity; - const tempSrc = src.slice(1); - let tempStart; - this.options.extensions.startInline.forEach(function(getStartIndex) { - tempStart = getStartIndex.call({ lexer: this }, tempSrc); - if (typeof tempStart === "number" && tempStart >= 0) { - startIndex = Math.min(startIndex, tempStart); + for (k2 = 0; k2 < rings.length; k2++) { + if (k2 === activeIndex) + continue; + if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k2].nodes, entity.id)) { + return "multipolygonRing"; } - }); - if (startIndex < Infinity && startIndex >= 0) { - cutSrc = src.substring(0, startIndex + 1); - } - } - if (token = this.tokenizer.inlineText(cutSrc, smartypants)) { - src = src.substring(token.raw.length); - if (token.raw.slice(-1) !== "_") { - prevChar = token.raw.slice(-1); - } - keepPrevChar = true; - lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === "text") { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); } - continue; } - if (src) { - const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); - if (this.options.silent) { - console.error(errMsg); - break; - } else { - throw new Error(errMsg); + if (activeIndex === null) { + nodes = parent.nodes.map(function(nodeID) { + return graph.entity(nodeID); + }); + if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { + return parent.geometry(graph); } } } - return tokens; + return false; } - }; - var Renderer = class { - constructor(options2) { - this.options = options2 || defaults; + function move(d3_event, entity, point2) { + if (_isCancelled) + return; + d3_event.stopPropagation(); + context.surface().classed("nope-disabled", d3_event.altKey); + _lastLoc = context.projection.invert(point2); + doMove(d3_event, entity); + var nudge = geoViewportEdge(point2, context.map().dimensions()); + if (nudge) { + startNudge(d3_event, entity, nudge); + } else { + stopNudge(); + } } - code(code, infostring, escaped) { - const lang = (infostring || "").match(/\S*/)[0]; - if (this.options.highlight) { - const out = this.options.highlight(code, lang); - if (out != null && out !== code) { - escaped = true; - code = out; - } - } - code = code.replace(/\n$/, "") + "\n"; - if (!lang) { - return "
" + (escaped ? code : escape4(code, true)) + "
\n"; + function end(d3_event, entity) { + if (_isCancelled) + return; + var wasPoint = entity.geometry(context.graph()) === "point"; + var d2 = datum2(d3_event); + var nope = d2 && d2.properties && d2.properties.nope || context.surface().classed("nope"); + var target = d2 && d2.properties && d2.properties.entity; + if (nope) { + context.perform( + _actionBounceBack(entity.id, _startLoc) + ); + } else if (target && target.type === "way") { + var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id); + context.replace( + actionAddMidpoint({ + loc: choice.loc, + edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] + }, entity), + connectAnnotation(entity, target) + ); + } else if (target && target.type === "node" && shouldSnapToNode(target)) { + context.replace( + actionConnect([target.id, entity.id]), + connectAnnotation(entity, target) + ); + } else if (_wasMidpoint) { + context.replace( + actionNoop(), + _t("operations.add.annotation.vertex") + ); + } else { + context.replace( + actionNoop(), + moveAnnotation(entity) + ); } - return '
' + (escaped ? code : escape4(code, true)) + "
\n"; - } - blockquote(quote2) { - return `
-${quote2}
-`; - } - html(html2) { - return html2; - } - heading(text2, level, raw, slugger) { - if (this.options.headerIds) { - const id2 = this.options.headerPrefix + slugger.slug(raw); - return `${text2} -`; + if (wasPoint) { + context.enter(modeSelect(context, [entity.id])); + } else { + var reselection = _restoreSelectedIDs.filter(function(id2) { + return context.graph().hasEntity(id2); + }); + if (reselection.length) { + context.enter(modeSelect(context, reselection)); + } else { + context.enter(modeBrowse(context)); + } } - return `${text2} -`; - } - hr() { - return this.options.xhtml ? "
\n" : "
\n"; - } - list(body, ordered, start2) { - const type3 = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : ""; - return "<" + type3 + startatt + ">\n" + body + "\n"; - } - listitem(text2) { - return `
  • ${text2}
  • -`; - } - checkbox(checked) { - return " "; - } - paragraph(text2) { - return `

    ${text2}

    -`; - } - table(header, body) { - if (body) - body = `${body}`; - return "\n\n" + header + "\n" + body + "
    \n"; - } - tablerow(content) { - return ` -${content} -`; } - tablecell(content, flags) { - const type3 = flags.header ? "th" : "td"; - const tag = flags.align ? `<${type3} align="${flags.align}">` : `<${type3}>`; - return tag + content + ` -`; - } - strong(text2) { - return `${text2}`; + function _actionBounceBack(nodeID, toLoc) { + var moveNode = actionMoveNode(nodeID, toLoc); + var action = function(graph, t2) { + if (t2 === 1) + context.pop(); + return moveNode(graph, t2); + }; + action.transitionable = true; + return action; } - em(text2) { - return `${text2}`; + function cancel() { + drag.cancel(); + context.enter(modeBrowse(context)); } - codespan(text2) { - return `${text2}`; + var drag = behaviorDrag().selector(".layer-touch.points .target").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end); + mode.enter = function() { + context.install(hover); + context.install(edit2); + select_default2(window).on("keydown.dragNode", keydown).on("keyup.dragNode", keyup); + context.history().on("undone.drag-node", cancel); + }; + mode.exit = function() { + context.ui().sidebar.hover.cancel(); + context.uninstall(hover); + context.uninstall(edit2); + select_default2(window).on("keydown.dragNode", null).on("keyup.dragNode", null); + context.history().on("undone.drag-node", null); + _activeEntity = null; + context.surface().classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false).selectAll(".active").classed("active", false); + stopNudge(); + }; + mode.selectedIDs = function() { + if (!arguments.length) + return _activeEntity ? [_activeEntity.id] : []; + return mode; + }; + mode.activeID = function() { + if (!arguments.length) + return _activeEntity && _activeEntity.id; + return mode; + }; + mode.restoreSelectedIDs = function(_2) { + if (!arguments.length) + return _restoreSelectedIDs; + _restoreSelectedIDs = _2; + return mode; + }; + mode.behavior = drag; + return mode; + } + + // modules/services/keepRight.js + var import_rbush = __toESM(require_rbush_min()); + + // node_modules/d3-fetch/src/text.js + function responseText(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + return response.text(); + } + function text_default3(input, init2) { + return fetch(input, init2).then(responseText); + } + + // node_modules/d3-fetch/src/json.js + function responseJson(response) { + if (!response.ok) + throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) + return; + return response.json(); + } + function json_default(input, init2) { + return fetch(input, init2).then(responseJson); + } + + // node_modules/d3-fetch/src/xml.js + function parser(type2) { + return (input, init2) => text_default3(input, init2).then((text2) => new DOMParser().parseFromString(text2, type2)); + } + var xml_default = parser("application/xml"); + var html = parser("text/html"); + var svg = parser("image/svg+xml"); + + // modules/services/keepRight.js + var tiler = utilTiler(); + var dispatch2 = dispatch_default("loaded"); + var _tileZoom = 14; + var _krUrlRoot = "https://www.keepright.at"; + var _krData = { errorTypes: {}, localizeStrings: {} }; + var _cache; + var _krRuleset = [ + // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads + 30, + 40, + 50, + 60, + 70, + 90, + 100, + 110, + 120, + 130, + 150, + 160, + 170, + 180, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 210, + 220, + 230, + 231, + 232, + 270, + 280, + 281, + 282, + 283, + 284, + 285, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 300, + 310, + 311, + 312, + 313, + 320, + 350, + 360, + 370, + 380, + 390, + 400, + 401, + 402, + 410, + 411, + 412, + 413 + ]; + function abortRequest(controller) { + if (controller) { + controller.abort(); } - br() { - return this.options.xhtml ? "
    " : "
    "; + } + function abortUnwantedRequests(cache, tiles) { + Object.keys(cache.inflightTile).forEach((k2) => { + const wanted = tiles.find((tile) => k2 === tile.id); + if (!wanted) { + abortRequest(cache.inflightTile[k2]); + delete cache.inflightTile[k2]; + } + }); + } + function encodeIssueRtree(d2) { + return { minX: d2.loc[0], minY: d2.loc[1], maxX: d2.loc[0], maxY: d2.loc[1], data: d2 }; + } + function updateRtree(item, replace) { + _cache.rtree.remove(item, (a2, b2) => a2.data.id === b2.data.id); + if (replace) { + _cache.rtree.insert(item); } - del(text2) { - return `${text2}`; + } + function tokenReplacements(d2) { + if (!(d2 instanceof QAItem)) + return; + const replacements = {}; + const issueTemplate = _krData.errorTypes[d2.whichType]; + if (!issueTemplate) { + console.log("No Template: ", d2.whichType); + console.log(" ", d2.description); + return; } - link(href, title, text2) { - href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text2; - } - let out = '
    "; - return out; + if (!issueTemplate.regex) + return; + const errorRegex = new RegExp(issueTemplate.regex, "i"); + const errorMatch = errorRegex.exec(d2.description); + if (!errorMatch) { + console.log("Unmatched: ", d2.whichType); + console.log(" ", d2.description); + console.log(" ", errorRegex); + return; } - image(href, title, text2) { - href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text2; - } - let out = `${text2}" : ">"; - return out; - } - text(text2) { - return text2; + replacements["var" + i3] = capture; } - }; - var TextRenderer = class { - strong(text2) { - return text2; + return replacements; + } + function parseError(capture, idType) { + const compare = capture.toLowerCase(); + if (_krData.localizeStrings[compare]) { + capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]); } - em(text2) { - return text2; + switch (idType) { + case "this": + capture = linkErrorObject2(capture); + break; + case "url": + capture = linkURL(capture); + break; + case "n": + case "w": + case "r": + capture = linkEntity2(idType + capture); + break; + case "20": + capture = parse20(capture); + break; + case "211": + capture = parse211(capture); + break; + case "231": + capture = parse231(capture); + break; + case "294": + capture = parse294(capture); + break; + case "370": + capture = parse370(capture); + break; } - codespan(text2) { - return text2; + return capture; + function linkErrorObject2(d2) { + return { html: `${d2}` }; } - del(text2) { - return text2; + function linkEntity2(d2) { + return { html: `${d2}` }; } - html(text2) { - return text2; + function linkURL(d2) { + return { html: `${d2}` }; } - text(text2) { - return text2; + function parse211(capture2) { + let newList = []; + const items = capture2.split(", "); + items.forEach((item) => { + let id2 = linkEntity2("n" + item.slice(1)); + newList.push(id2); + }); + return newList.join(", "); } - link(href, title, text2) { - return "" + text2; + function parse231(capture2) { + let newList = []; + const items = capture2.split("),"); + items.forEach((item) => { + const match = item.match(/\#(\d+)\((.+)\)?/); + if (match !== null && match.length > 2) { + newList.push( + linkEntity2("w" + match[1]) + " " + _t("QA.keepRight.errorTypes.231.layer", { layer: match[2] }) + ); + } + }); + return newList.join(", "); } - image(href, title, text2) { - return "" + text2; + function parse294(capture2) { + let newList = []; + const items = capture2.split(","); + items.forEach((item) => { + item = item.split(" "); + const role = `"${item[0]}"`; + const idType2 = item[1].slice(0, 1); + let id2 = item[2].slice(1); + id2 = linkEntity2(idType2 + id2); + newList.push(`${role} ${item[1]} ${id2}`); + }); + return newList.join(", "); } - br() { + function parse370(capture2) { + if (!capture2) + return ""; + const match = capture2.match(/\(including the name (\'.+\')\)/); + if (match && match.length) { + return _t("QA.keepRight.errorTypes.370.including_the_name", { name: match[1] }); + } return ""; } - }; - var Slugger = class { - constructor() { - this.seen = {}; - } - serialize(value) { - return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-"); + function parse20(capture2) { + let newList = []; + const items = capture2.split(","); + items.forEach((item) => { + const id2 = linkEntity2("n" + item.slice(1)); + newList.push(id2); + }); + return newList.join(", "); } - getNextSafeSlug(originalSlug, isDryRun) { - let slug = originalSlug; - let occurenceAccumulator = 0; - if (this.seen.hasOwnProperty(slug)) { - occurenceAccumulator = this.seen[originalSlug]; - do { - occurenceAccumulator++; - slug = originalSlug + "-" + occurenceAccumulator; - } while (this.seen.hasOwnProperty(slug)); + } + var keepRight_default = { + title: "keepRight", + init() { + _mainFileFetcher.get("keepRight").then((d2) => _krData = d2); + if (!_cache) { + this.reset(); } - if (!isDryRun) { - this.seen[originalSlug] = occurenceAccumulator; - this.seen[slug] = 0; + this.event = utilRebind(this, dispatch2, "on"); + }, + reset() { + if (_cache) { + Object.values(_cache.inflightTile).forEach(abortRequest); } - return slug; - } - slug(value, options2 = {}) { - const slug = this.serialize(value); - return this.getNextSafeSlug(slug, options2.dryrun); - } - }; - var Parser = class { - constructor(options2) { - this.options = options2 || defaults; - this.options.renderer = this.options.renderer || new Renderer(); - this.renderer = this.options.renderer; - this.renderer.options = this.options; - this.textRenderer = new TextRenderer(); - this.slugger = new Slugger(); - } - static parse(tokens, options2) { - const parser3 = new Parser(options2); - return parser3.parse(tokens); - } - static parseInline(tokens, options2) { - const parser3 = new Parser(options2); - return parser3.parseInline(tokens); - } - parse(tokens, top = true) { - let out = "", i2, j2, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret; - const l = tokens.length; - for (i2 = 0; i2 < l; i2++) { - token = tokens[i2]; - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { - ret = this.options.extensions.renderers[token.type].call({ parser: this }, token); - if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) { - out += ret || ""; - continue; - } - } - switch (token.type) { - case "space": { - continue; - } - case "hr": { - out += this.renderer.hr(); - continue; - } - case "heading": { - out += this.renderer.heading( - this.parseInline(token.tokens), - token.depth, - unescape3(this.parseInline(token.tokens, this.textRenderer)), - this.slugger - ); - continue; + _cache = { + data: {}, + loadedTile: {}, + inflightTile: {}, + inflightPost: {}, + closed: {}, + rtree: new import_rbush.default() + }; + }, + // KeepRight API: http://osm.mueschelsoft.de/keepright/interfacing.php + loadIssues(projection2) { + const options2 = { + format: "geojson", + ch: _krRuleset + }; + const tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection2); + abortUnwantedRequests(_cache, tiles); + tiles.forEach((tile) => { + if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) + return; + const [left, top, right, bottom] = tile.extent.rectangle(); + const params = Object.assign({}, options2, { left, bottom, right, top }); + const url = `${_krUrlRoot}/export.php?` + utilQsString(params); + const controller = new AbortController(); + _cache.inflightTile[tile.id] = controller; + json_default(url, { signal: controller.signal }).then((data) => { + delete _cache.inflightTile[tile.id]; + _cache.loadedTile[tile.id] = true; + if (!data || !data.features || !data.features.length) { + throw new Error("No Data"); } - case "code": { - out += this.renderer.code( - token.text, - token.lang, - token.escaped - ); - continue; - } - case "table": { - header = ""; - cell = ""; - l2 = token.header.length; - for (j2 = 0; j2 < l2; j2++) { - cell += this.renderer.tablecell( - this.parseInline(token.header[j2].tokens), - { header: true, align: token.align[j2] } - ); - } - header += this.renderer.tablerow(cell); - body = ""; - l2 = token.rows.length; - for (j2 = 0; j2 < l2; j2++) { - row = token.rows[j2]; - cell = ""; - l3 = row.length; - for (k = 0; k < l3; k++) { - cell += this.renderer.tablecell( - this.parseInline(row[k].tokens), - { header: false, align: token.align[k] } - ); - } - body += this.renderer.tablerow(cell); - } - out += this.renderer.table(header, body); - continue; - } - case "blockquote": { - body = this.parse(token.tokens); - out += this.renderer.blockquote(body); - continue; - } - case "list": { - ordered = token.ordered; - start2 = token.start; - loose = token.loose; - l2 = token.items.length; - body = ""; - for (j2 = 0; j2 < l2; j2++) { - item = token.items[j2]; - checked = item.checked; - task = item.task; - itemBody = ""; - if (item.task) { - checkbox = this.renderer.checkbox(checked); - if (loose) { - if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") { - item.tokens[0].text = checkbox + " " + item.tokens[0].text; - if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") { - item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text; - } - } else { - item.tokens.unshift({ - type: "text", - text: checkbox - }); - } - } else { - itemBody += checkbox; - } + data.features.forEach((feature3) => { + const { + properties: { + error_type: itemType, + error_id: id2, + comment = null, + object_id: objectId, + object_type: objectType, + schema, + title } - itemBody += this.parse(item.tokens, loose); - body += this.renderer.listitem(itemBody, task, checked); - } - out += this.renderer.list(body, ordered, start2); - continue; - } - case "html": { - out += this.renderer.html(token.text); - continue; - } - case "paragraph": { - out += this.renderer.paragraph(this.parseInline(token.tokens)); - continue; - } - case "text": { - body = token.tokens ? this.parseInline(token.tokens) : token.text; - while (i2 + 1 < l && tokens[i2 + 1].type === "text") { - token = tokens[++i2]; - body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text); - } - out += top ? this.renderer.paragraph(body) : body; - continue; - } - default: { - const errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } - } - } - } - return out; - } - parseInline(tokens, renderer) { - renderer = renderer || this.renderer; - let out = "", i2, token, ret; - const l = tokens.length; - for (i2 = 0; i2 < l; i2++) { - token = tokens[i2]; - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { - ret = this.options.extensions.renderers[token.type].call({ parser: this }, token); - if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) { - out += ret || ""; - continue; - } - } - switch (token.type) { - case "escape": { - out += renderer.text(token.text); - break; - } - case "html": { - out += renderer.html(token.text); - break; - } - case "link": { - out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); - break; - } - case "image": { - out += renderer.image(token.href, token.title, token.text); - break; - } - case "strong": { - out += renderer.strong(this.parseInline(token.tokens, renderer)); - break; - } - case "em": { - out += renderer.em(this.parseInline(token.tokens, renderer)); - break; - } - case "codespan": { - out += renderer.codespan(token.text); - break; - } - case "br": { - out += renderer.br(); - break; - } - case "del": { - out += renderer.del(this.parseInline(token.tokens, renderer)); - break; - } - case "text": { - out += renderer.text(token.text); - break; - } - default: { - const errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } - } - } - } - return out; - } - }; - function marked(src, opt, callback) { - if (typeof src === "undefined" || src === null) { - throw new Error("marked(): input parameter is undefined or null"); - } - if (typeof src !== "string") { - throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); - } - if (typeof opt === "function") { - callback = opt; - opt = null; - } - opt = merge2({}, marked.defaults, opt || {}); - checkSanitizeDeprecation(opt); - if (callback) { - const highlight = opt.highlight; - let tokens; - try { - tokens = Lexer.lex(src, opt); - } catch (e) { - return callback(e); - } - const done = function(err) { - let out; - if (!err) { - try { - if (opt.walkTokens) { - marked.walkTokens(tokens, opt.walkTokens); + } = feature3; + let { + geometry: { coordinates: loc }, + properties: { description = "" } + } = feature3; + const issueTemplate = _krData.errorTypes[itemType]; + const parentIssueType = (Math.floor(itemType / 10) * 10).toString(); + const whichType = issueTemplate ? itemType : parentIssueType; + const whichTemplate = _krData.errorTypes[whichType]; + switch (whichType) { + case "170": + description = `This feature has a FIXME tag: ${description}`; + break; + case "292": + case "293": + description = description.replace("A turn-", "This turn-"); + break; + case "294": + case "295": + case "296": + case "297": + case "298": + description = `This turn-restriction~${description}`; + break; + case "300": + description = "This highway is missing a maxspeed tag"; + break; + case "411": + case "412": + case "413": + description = `This feature~${description}`; + break; } - out = Parser.parse(tokens, opt); - } catch (e) { - err = e; - } - } - opt.highlight = highlight; - return err ? callback(err) : callback(null, out); - }; - if (!highlight || highlight.length < 3) { - return done(); - } - delete opt.highlight; - if (!tokens.length) - return done(); - let pending = 0; - marked.walkTokens(tokens, function(token) { - if (token.type === "code") { - pending++; - setTimeout(() => { - highlight(token.text, token.lang, function(err, code) { - if (err) { - return done(err); - } - if (code != null && code !== token.text) { - token.text = code; - token.escaped = true; - } - pending--; - if (pending === 0) { - done(); - } + let coincident = false; + do { + let delta = coincident ? [1e-5, 0] : [0, 1e-5]; + loc = geoVecAdd(loc, delta); + let bbox2 = geoExtent(loc).bbox(); + coincident = _cache.rtree.search(bbox2).length; + } while (coincident); + let d2 = new QAItem(loc, this, itemType, id2, { + comment, + description, + whichType, + parentIssueType, + severity: whichTemplate.severity || "error", + objectId, + objectType, + schema, + title }); - }, 0); - } - }); - if (pending === 0) { - done(); - } - return; - } - function onError(e) { - e.message += "\nPlease report this to https://github.com/markedjs/marked."; - if (opt.silent) { - return "

    An error occurred:

    " + escape4(e.message + "", true) + "
    "; - } - throw e; - } - try { - const tokens = Lexer.lex(src, opt); - if (opt.walkTokens) { - if (opt.async) { - return Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => { - return Parser.parse(tokens, opt); - }).catch(onError); - } - marked.walkTokens(tokens, opt.walkTokens); - } - return Parser.parse(tokens, opt); - } catch (e) { - onError(e); - } - } - marked.options = marked.setOptions = function(opt) { - merge2(marked.defaults, opt); - changeDefaults(marked.defaults); - return marked; - }; - marked.getDefaults = getDefaults; - marked.defaults = defaults; - marked.use = function(...args) { - const opts = merge2({}, ...args); - const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} }; - let hasExtensions; - args.forEach((pack) => { - if (pack.extensions) { - hasExtensions = true; - pack.extensions.forEach((ext) => { - if (!ext.name) { - throw new Error("extension name required"); - } - if (ext.renderer) { - const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null; - if (prevRenderer) { - extensions.renderers[ext.name] = function(...args2) { - let ret = ext.renderer.apply(this, args2); - if (ret === false) { - ret = prevRenderer.apply(this, args2); - } - return ret; - }; - } else { - extensions.renderers[ext.name] = ext.renderer; - } - } - if (ext.tokenizer) { - if (!ext.level || ext.level !== "block" && ext.level !== "inline") { - throw new Error("extension level must be 'block' or 'inline'"); - } - if (extensions[ext.level]) { - extensions[ext.level].unshift(ext.tokenizer); - } else { - extensions[ext.level] = [ext.tokenizer]; - } - if (ext.start) { - if (ext.level === "block") { - if (extensions.startBlock) { - extensions.startBlock.push(ext.start); - } else { - extensions.startBlock = [ext.start]; - } - } else if (ext.level === "inline") { - if (extensions.startInline) { - extensions.startInline.push(ext.start); - } else { - extensions.startInline = [ext.start]; - } - } - } - } - if (ext.childTokens) { - extensions.childTokens[ext.name] = ext.childTokens; - } + d2.replacements = tokenReplacements(d2); + _cache.data[id2] = d2; + _cache.rtree.insert(encodeIssueRtree(d2)); + }); + dispatch2.call("loaded"); + }).catch(() => { + delete _cache.inflightTile[tile.id]; + _cache.loadedTile[tile.id] = true; }); + }); + }, + postUpdate(d2, callback) { + if (_cache.inflightPost[d2.id]) { + return callback({ message: "Error update already inflight", status: -2 }, d2); } - if (pack.renderer) { - const renderer = marked.defaults.renderer || new Renderer(); - for (const prop in pack.renderer) { - const prevRenderer = renderer[prop]; - renderer[prop] = (...args2) => { - let ret = pack.renderer[prop].apply(renderer, args2); - if (ret === false) { - ret = prevRenderer.apply(renderer, args2); - } - return ret; - }; - } - opts.renderer = renderer; - } - if (pack.tokenizer) { - const tokenizer = marked.defaults.tokenizer || new Tokenizer(); - for (const prop in pack.tokenizer) { - const prevTokenizer = tokenizer[prop]; - tokenizer[prop] = (...args2) => { - let ret = pack.tokenizer[prop].apply(tokenizer, args2); - if (ret === false) { - ret = prevTokenizer.apply(tokenizer, args2); - } - return ret; - }; - } - opts.tokenizer = tokenizer; - } - if (pack.walkTokens) { - const walkTokens2 = marked.defaults.walkTokens; - opts.walkTokens = function(token) { - let values = []; - values.push(pack.walkTokens.call(this, token)); - if (walkTokens2) { - values = values.concat(walkTokens2.call(this, token)); - } - return values; - }; + const params = { schema: d2.schema, id: d2.id }; + if (d2.newStatus) { + params.st = d2.newStatus; } - if (hasExtensions) { - opts.extensions = extensions; + if (d2.newComment !== void 0) { + params.co = d2.newComment; } - marked.setOptions(opts); - }); - }; - marked.walkTokens = function(tokens, callback) { - let values = []; - for (const token of tokens) { - values = values.concat(callback.call(marked, token)); - switch (token.type) { - case "table": { - for (const cell of token.header) { - values = values.concat(marked.walkTokens(cell.tokens, callback)); - } - for (const row of token.rows) { - for (const cell of row) { - values = values.concat(marked.walkTokens(cell.tokens, callback)); - } - } - break; - } - case "list": { - values = values.concat(marked.walkTokens(token.items, callback)); - break; - } - default: { - if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { - marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) { - values = values.concat(marked.walkTokens(token[childTokens], callback)); - }); - } else if (token.tokens) { - values = values.concat(marked.walkTokens(token.tokens, callback)); - } + const url = `${_krUrlRoot}/comment.php?` + utilQsString(params); + const controller = new AbortController(); + _cache.inflightPost[d2.id] = controller; + json_default(url, { signal: controller.signal }).finally(() => { + delete _cache.inflightPost[d2.id]; + if (d2.newStatus === "ignore") { + this.removeItem(d2); + } else if (d2.newStatus === "ignore_t") { + this.removeItem(d2); + _cache.closed[`${d2.schema}:${d2.id}`] = true; + } else { + d2 = this.replaceItem(d2.update({ + comment: d2.newComment, + newComment: void 0, + newState: void 0 + })); } - } - } - return values; - }; - marked.parseInline = function(src, opt) { - if (typeof src === "undefined" || src === null) { - throw new Error("marked.parseInline(): input parameter is undefined or null"); - } - if (typeof src !== "string") { - throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); - } - opt = merge2({}, marked.defaults, opt || {}); - checkSanitizeDeprecation(opt); - try { - const tokens = Lexer.lexInline(src, opt); - if (opt.walkTokens) { - marked.walkTokens(tokens, opt.walkTokens); - } - return Parser.parseInline(tokens, opt); - } catch (e) { - e.message += "\nPlease report this to https://github.com/markedjs/marked."; - if (opt.silent) { - return "

    An error occurred:

    " + escape4(e.message + "", true) + "
    "; - } - throw e; + if (callback) + callback(null, d2); + }); + }, + // Get all cached QAItems covering the viewport + getItems(projection2) { + const viewport = projection2.clipExtent(); + const min3 = [viewport[0][0], viewport[1][1]]; + const max3 = [viewport[1][0], viewport[0][1]]; + const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); + return _cache.rtree.search(bbox2).map((d2) => d2.data); + }, + // Get a QAItem from cache + // NOTE: Don't change method name until UI v3 is merged + getError(id2) { + return _cache.data[id2]; + }, + // Replace a single QAItem in the cache + replaceItem(item) { + if (!(item instanceof QAItem) || !item.id) + return; + _cache.data[item.id] = item; + updateRtree(encodeIssueRtree(item), true); + return item; + }, + // Remove a single QAItem from the cache + removeItem(item) { + if (!(item instanceof QAItem) || !item.id) + return; + delete _cache.data[item.id]; + updateRtree(encodeIssueRtree(item), false); + }, + issueURL(item) { + return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`; + }, + // Get an array of issues closed during this session. + // Used to populate `closed:keepright` changeset tag + getClosedIDs() { + return Object.keys(_cache.closed).sort(); } }; - marked.Parser = Parser; - marked.parser = Parser.parse; - marked.Renderer = Renderer; - marked.TextRenderer = TextRenderer; - marked.Lexer = Lexer; - marked.lexer = Lexer.lex; - marked.Tokenizer = Tokenizer; - marked.Slugger = Slugger; - marked.parse = marked; - var options = marked.options; - var setOptions = marked.setOptions; - var use = marked.use; - var walkTokens = marked.walkTokens; - var parseInline = marked.parseInline; - var parser2 = Parser.parse; - var lexer = Lexer.lex; - // modules/services/osmose.js - var tiler3 = utilTiler(); - var dispatch4 = dispatch_default("loaded"); - var _tileZoom3 = 14; - var _osmoseUrlRoot = "https://osmose.openstreetmap.fr/api/0.3"; - var _osmoseData = { icons: {}, items: [] }; - var _cache3; - function abortRequest3(controller) { - if (controller) { - controller.abort(); - } + // modules/services/improveOSM.js + var import_rbush2 = __toESM(require_rbush_min()); + var tiler2 = utilTiler(); + var dispatch3 = dispatch_default("loaded"); + var _tileZoom2 = 14; + var _impOsmUrls = { + ow: "https://grab.community.improve-osm.org/directionOfFlowService", + mr: "https://grab.community.improve-osm.org/missingGeoService", + tr: "https://grab.community.improve-osm.org/turnRestrictionService" + }; + var _impOsmData = { icons: {} }; + var _cache2; + function abortRequest2(i3) { + Object.values(i3).forEach((controller) => { + if (controller) { + controller.abort(); + } + }); } - function abortUnwantedRequests3(cache, tiles) { - Object.keys(cache.inflightTile).forEach((k) => { - let wanted = tiles.find((tile) => k === tile.id); + function abortUnwantedRequests2(cache, tiles) { + Object.keys(cache.inflightTile).forEach((k2) => { + const wanted = tiles.find((tile) => k2 === tile.id); if (!wanted) { - abortRequest3(cache.inflightTile[k]); - delete cache.inflightTile[k]; + abortRequest2(cache.inflightTile[k2]); + delete cache.inflightTile[k2]; } }); } - function encodeIssueRtree3(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; + function encodeIssueRtree2(d2) { + return { minX: d2.loc[0], minY: d2.loc[1], maxX: d2.loc[0], maxY: d2.loc[1], data: d2 }; } - function updateRtree3(item, replace) { - _cache3.rtree.remove(item, (a, b) => a.data.id === b.data.id); + function updateRtree2(item, replace) { + _cache2.rtree.remove(item, (a2, b2) => a2.data.id === b2.data.id); if (replace) { - _cache3.rtree.insert(item); + _cache2.rtree.insert(item); } } - function preventCoincident2(loc) { + function linkErrorObject(d2) { + return { html: `${d2}` }; + } + function linkEntity(d2) { + return { html: `${d2}` }; + } + function pointAverage(points) { + if (points.length) { + const sum = points.reduce( + (acc, point2) => geoVecAdd(acc, [point2.lon, point2.lat]), + [0, 0] + ); + return geoVecScale(sum, 1 / points.length); + } else { + return [0, 0]; + } + } + function relativeBearing(p1, p2) { + let angle2 = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat); + if (angle2 < 0) { + angle2 += 2 * Math.PI; + } + return angle2 * 180 / Math.PI; + } + function cardinalDirection(bearing) { + const dir = 45 * Math.round(bearing / 45); + const compass = { + 0: "north", + 45: "northeast", + 90: "east", + 135: "southeast", + 180: "south", + 225: "southwest", + 270: "west", + 315: "northwest", + 360: "north" + }; + return _t(`QA.improveOSM.directions.${compass[dir]}`); + } + function preventCoincident(loc, bumpUp) { let coincident = false; do { - let delta = coincident ? [1e-5, 0] : [0, 1e-5]; + let delta = coincident ? [1e-5, 0] : bumpUp ? [0, 1e-5] : [0, 0]; loc = geoVecAdd(loc, delta); - let bbox = geoExtent(loc).bbox(); - coincident = _cache3.rtree.search(bbox).length; + let bbox2 = geoExtent(loc).bbox(); + coincident = _cache2.rtree.search(bbox2).length; } while (coincident); return loc; } - var osmose_default = { - title: "osmose", + var improveOSM_default = { + title: "improveOSM", init() { - _mainFileFetcher.get("qa_data").then((d) => { - _osmoseData = d.osmose; - _osmoseData.items = Object.keys(d.osmose.icons).map((s) => s.split("-")[0]).reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []); - }); - if (!_cache3) { + _mainFileFetcher.get("qa_data").then((d2) => _impOsmData = d2.improveOSM); + if (!_cache2) { this.reset(); } - this.event = utilRebind(this, dispatch4, "on"); + this.event = utilRebind(this, dispatch3, "on"); }, reset() { - let _strings = {}; - let _colors = {}; - if (_cache3) { - Object.values(_cache3.inflightTile).forEach(abortRequest3); - _strings = _cache3.strings; - _colors = _cache3.colors; + if (_cache2) { + Object.values(_cache2.inflightTile).forEach(abortRequest2); } - _cache3 = { + _cache2 = { data: {}, loadedTile: {}, inflightTile: {}, inflightPost: {}, closed: {}, - rtree: new import_rbush3.default(), - strings: _strings, - colors: _colors + rtree: new import_rbush2.default() }; }, loadIssues(projection2) { - let params = { - item: _osmoseData.items + const options2 = { + client: "iD", + status: "OPEN", + zoom: "19" + // Use a high zoom so that clusters aren't returned }; - let tiles = tiler3.zoomExtent([_tileZoom3, _tileZoom3]).getTiles(projection2); - abortUnwantedRequests3(_cache3, tiles); + const tiles = tiler2.zoomExtent([_tileZoom2, _tileZoom2]).getTiles(projection2); + abortUnwantedRequests2(_cache2, tiles); tiles.forEach((tile) => { - if (_cache3.loadedTile[tile.id] || _cache3.inflightTile[tile.id]) + if (_cache2.loadedTile[tile.id] || _cache2.inflightTile[tile.id]) return; - let [x, y, z] = tile.xyz; - let url = `${_osmoseUrlRoot}/issues/${z}/${x}/${y}.geojson?` + utilQsString(params); - let controller = new AbortController(); - _cache3.inflightTile[tile.id] = controller; - json_default(url, { signal: controller.signal }).then((data) => { - delete _cache3.inflightTile[tile.id]; - _cache3.loadedTile[tile.id] = true; - if (data.features) { - data.features.forEach((issue) => { - const { item, class: cl, uuid: id2 } = issue.properties; - const itemType = `${item}-${cl}`; - if (itemType in _osmoseData.icons) { - let loc = issue.geometry.coordinates; - loc = preventCoincident2(loc); - let d = new QAItem(loc, this, itemType, id2, { item }); - if (item === 8300 || item === 8360) { - d.elems = []; + const [east, north, west, south] = tile.extent.rectangle(); + const params = Object.assign({}, options2, { east, south, west, north }); + const requests = {}; + Object.keys(_impOsmUrls).forEach((k2) => { + const kParams = Object.assign( + {}, + params, + k2 === "mr" ? { type: "PARKING,ROAD,BOTH,PATH" } : { confidenceLevel: "C1" } + ); + const url = `${_impOsmUrls[k2]}/search?` + utilQsString(kParams); + const controller = new AbortController(); + requests[k2] = controller; + json_default(url, { signal: controller.signal }).then((data) => { + delete _cache2.inflightTile[tile.id][k2]; + if (!Object.keys(_cache2.inflightTile[tile.id]).length) { + delete _cache2.inflightTile[tile.id]; + _cache2.loadedTile[tile.id] = true; + } + if (data.roadSegments) { + data.roadSegments.forEach((feature3) => { + const { points, wayId, fromNodeId, toNodeId } = feature3; + const itemId = `${wayId}${fromNodeId}${toNodeId}`; + let mid = points.length / 2; + let loc; + if (mid % 1 === 0) { + loc = pointAverage([points[mid - 1], points[mid]]); + } else { + mid = points[Math.floor(mid)]; + loc = [mid.lon, mid.lat]; } - _cache3.data[d.id] = d; - _cache3.rtree.insert(encodeIssueRtree3(d)); - } - }); - } - dispatch4.call("loaded"); - }).catch(() => { - delete _cache3.inflightTile[tile.id]; - _cache3.loadedTile[tile.id] = true; - }); - }); - }, - loadIssueDetail(issue) { - if (issue.elems !== void 0) { - return Promise.resolve(issue); - } - const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`; - const cacheDetails = (data) => { - issue.elems = data.elems.map((e) => e.type.substring(0, 1) + e.id); - issue.detail = data.subtitle ? marked(data.subtitle.auto) : ""; - this.replaceItem(issue); - }; - return json_default(url).then(cacheDetails).then(() => issue); - }, - loadStrings(locale2 = _mainLocalizer.localeCode()) { - const items = Object.keys(_osmoseData.icons); - if (locale2 in _cache3.strings && Object.keys(_cache3.strings[locale2]).length === items.length) { - return Promise.resolve(_cache3.strings[locale2]); - } - if (!(locale2 in _cache3.strings)) { - _cache3.strings[locale2] = {}; - } - const allRequests = items.map((itemType) => { - if (itemType in _cache3.strings[locale2]) - return null; - const cacheData = (data) => { - const [cat = { items: [] }] = data.categories; - const [item2 = { class: [] }] = cat.items; - const [cl2 = null] = item2.class; - if (!cl2) { - console.log(`Osmose strings request (${itemType}) had unexpected data`); - return; - } - const { item: itemInt, color: color2 } = item2; - if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color2)) { - _cache3.colors[itemInt] = color2; - } - const { title, detail, fix, trap } = cl2; - let issueStrings = {}; - if (title) - issueStrings.title = title.auto; - if (detail) - issueStrings.detail = marked(detail.auto); - if (trap) - issueStrings.trap = marked(trap.auto); - if (fix) - issueStrings.fix = marked(fix.auto); - _cache3.strings[locale2][itemType] = issueStrings; - }; - const [item, cl] = itemType.split("-"); - const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale2}`; - return json_default(url).then(cacheData); - }).filter(Boolean); - return Promise.all(allRequests).then(() => _cache3.strings[locale2]); - }, - getStrings(itemType, locale2 = _mainLocalizer.localeCode()) { - return locale2 in _cache3.strings ? _cache3.strings[locale2][itemType] : {}; + loc = preventCoincident(loc, false); + let d2 = new QAItem(loc, this, k2, itemId, { + issueKey: k2, + // used as a category + identifier: { + // used to post changes + wayId, + fromNodeId, + toNodeId + }, + objectId: wayId, + objectType: "way" + }); + d2.replacements = { + percentage: feature3.percentOfTrips, + num_trips: feature3.numberOfTrips, + highway: linkErrorObject(_t("QA.keepRight.error_parts.highway")), + from_node: linkEntity("n" + feature3.fromNodeId), + to_node: linkEntity("n" + feature3.toNodeId) + }; + _cache2.data[d2.id] = d2; + _cache2.rtree.insert(encodeIssueRtree2(d2)); + }); + } + if (data.tiles) { + data.tiles.forEach((feature3) => { + const { type: type2, x: x2, y: y2, numberOfTrips } = feature3; + const geoType = type2.toLowerCase(); + const itemId = `${geoType}${x2}${y2}${numberOfTrips}`; + let loc = pointAverage(feature3.points); + loc = preventCoincident(loc, false); + let d2 = new QAItem(loc, this, `${k2}-${geoType}`, itemId, { + issueKey: k2, + identifier: { x: x2, y: y2 } + }); + d2.replacements = { + num_trips: numberOfTrips, + geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`) + }; + if (numberOfTrips === -1) { + d2.desc = _t("QA.improveOSM.error_types.mr.description_alt", d2.replacements); + } + _cache2.data[d2.id] = d2; + _cache2.rtree.insert(encodeIssueRtree2(d2)); + }); + } + if (data.entities) { + data.entities.forEach((feature3) => { + const { point: point2, id: id2, segments, numberOfPasses, turnType } = feature3; + const itemId = `${id2.replace(/[,:+#]/g, "_")}`; + const loc = preventCoincident([point2.lon, point2.lat], true); + const ids = id2.split(","); + const from_way = ids[0]; + const via_node = ids[3]; + const to_way = ids[2].split(":")[1]; + let d2 = new QAItem(loc, this, k2, itemId, { + issueKey: k2, + identifier: id2, + objectId: via_node, + objectType: "node" + }); + const [p1, p2] = segments[0].points; + const dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); + d2.replacements = { + num_passed: numberOfPasses, + num_trips: segments[0].numberOfTrips, + turn_restriction: turnType.toLowerCase(), + from_way: linkEntity("w" + from_way), + to_way: linkEntity("w" + to_way), + travel_direction: dir_of_travel, + junction: linkErrorObject(_t("QA.keepRight.error_parts.this_node")) + }; + _cache2.data[d2.id] = d2; + _cache2.rtree.insert(encodeIssueRtree2(d2)); + dispatch3.call("loaded"); + }); + } + }).catch(() => { + delete _cache2.inflightTile[tile.id][k2]; + if (!Object.keys(_cache2.inflightTile[tile.id]).length) { + delete _cache2.inflightTile[tile.id]; + _cache2.loadedTile[tile.id] = true; + } + }); + }); + _cache2.inflightTile[tile.id] = requests; + }); }, - getColor(itemType) { - return itemType in _cache3.colors ? _cache3.colors[itemType] : "#FFFFFF"; + getComments(item) { + if (item.comments) { + return Promise.resolve(item); + } + const key = item.issueKey; + let qParams = {}; + if (key === "ow") { + qParams = item.identifier; + } else if (key === "mr") { + qParams.tileX = item.identifier.x; + qParams.tileY = item.identifier.y; + } else if (key === "tr") { + qParams.targetId = item.identifier; + } + const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams); + const cacheComments = (data) => { + item.comments = data.comments ? data.comments.reverse() : []; + this.replaceItem(item); + }; + return json_default(url).then(cacheComments).then(() => item); }, - postUpdate(issue, callback) { - if (_cache3.inflightPost[issue.id]) { - return callback({ message: "Issue update already inflight", status: -2 }, issue); + postUpdate(d2, callback) { + if (!osm_default.authenticated()) { + return callback({ message: "Not Authenticated", status: -3 }, d2); } - const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`; - const controller = new AbortController(); - const after = () => { - delete _cache3.inflightPost[issue.id]; - this.removeItem(issue); - if (issue.newStatus === "done") { - if (!(issue.item in _cache3.closed)) { - _cache3.closed[issue.item] = 0; - } - _cache3.closed[issue.item] += 1; + if (_cache2.inflightPost[d2.id]) { + return callback({ message: "Error update already inflight", status: -2 }, d2); + } + osm_default.userDetails(sendPayload.bind(this)); + function sendPayload(err, user) { + if (err) { + return callback(err, d2); } - if (callback) - callback(null, issue); - }; - _cache3.inflightPost[issue.id] = controller; - fetch(url, { signal: controller.signal }).then(after).catch((err) => { - delete _cache3.inflightPost[issue.id]; - if (callback) - callback(err.message); - }); + const key = d2.issueKey; + const url = `${_impOsmUrls[key]}/comment`; + const payload = { + username: user.display_name, + targetIds: [d2.identifier] + }; + if (d2.newStatus) { + payload.status = d2.newStatus; + payload.text = "status changed"; + } + if (d2.newComment) { + payload.text = d2.newComment; + } + const controller = new AbortController(); + _cache2.inflightPost[d2.id] = controller; + const options2 = { + method: "POST", + signal: controller.signal, + body: JSON.stringify(payload) + }; + json_default(url, options2).then(() => { + delete _cache2.inflightPost[d2.id]; + if (!d2.newStatus) { + const now3 = /* @__PURE__ */ new Date(); + let comments = d2.comments ? d2.comments : []; + comments.push({ + username: payload.username, + text: payload.text, + timestamp: now3.getTime() / 1e3 + }); + this.replaceItem(d2.update({ + comments, + newComment: void 0 + })); + } else { + this.removeItem(d2); + if (d2.newStatus === "SOLVED") { + if (!(d2.issueKey in _cache2.closed)) { + _cache2.closed[d2.issueKey] = 0; + } + _cache2.closed[d2.issueKey] += 1; + } + } + if (callback) + callback(null, d2); + }).catch((err2) => { + delete _cache2.inflightPost[d2.id]; + if (callback) + callback(err2.message); + }); + } }, + // Get all cached QAItems covering the viewport getItems(projection2) { const viewport = projection2.clipExtent(); const min3 = [viewport[0][0], viewport[1][1]]; const max3 = [viewport[1][0], viewport[0][1]]; - const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); - return _cache3.rtree.search(bbox).map((d) => d.data); + const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); + return _cache2.rtree.search(bbox2).map((d2) => d2.data); }, + // Get a QAItem from cache + // NOTE: Don't change method name until UI v3 is merged getError(id2) { - return _cache3.data[id2]; + return _cache2.data[id2]; }, + // get the name of the icon to display for this item getIcon(itemType) { - return _osmoseData.icons[itemType]; + return _impOsmData.icons[itemType]; }, - replaceItem(item) { - if (!(item instanceof QAItem) || !item.id) + // Replace a single QAItem in the cache + replaceItem(issue) { + if (!(issue instanceof QAItem) || !issue.id) return; - _cache3.data[item.id] = item; - updateRtree3(encodeIssueRtree3(item), true); - return item; + _cache2.data[issue.id] = issue; + updateRtree2(encodeIssueRtree2(issue), true); + return issue; }, - removeItem(item) { - if (!(item instanceof QAItem) || !item.id) + // Remove a single QAItem from the cache + removeItem(issue) { + if (!(issue instanceof QAItem) || !issue.id) return; - delete _cache3.data[item.id]; - updateRtree3(encodeIssueRtree3(item), false); + delete _cache2.data[issue.id]; + updateRtree2(encodeIssueRtree2(issue), false); }, + // Used to populate `closed:improveosm:*` changeset tags getClosedCounts() { - return _cache3.closed; - }, - itemURL(item) { - return `https://osmose.openstreetmap.fr/en/error/${item.id}`; + return _cache2.closed; } }; - // modules/services/mapillary.js - var import_pbf = __toESM(require_pbf()); - var import_rbush4 = __toESM(require_rbush_min()); - var import_vector_tile = __toESM(require_vector_tile()); - var accessToken = "MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf"; - var apiUrl = "https://graph.mapillary.com/"; - var baseTileUrl = "https://tiles.mapillary.com/maps/vtp"; - var mapFeatureTileUrl = `${baseTileUrl}/mly_map_feature_point/2/{z}/{x}/{y}?access_token=${accessToken}`; - var tileUrl = `${baseTileUrl}/mly1_public/2/{z}/{x}/{y}?access_token=${accessToken}`; - var trafficSignTileUrl = `${baseTileUrl}/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=${accessToken}`; - var viewercss = "mapillary-js/mapillary.css"; - var viewerjs = "mapillary-js/mapillary.js"; - var minZoom = 14; - var dispatch5 = dispatch_default("change", "loadedImages", "loadedSigns", "loadedMapFeatures", "bearingChanged", "imageChanged"); - var _loadViewerPromise; - var _mlyActiveImage; - var _mlyCache; - var _mlyFallback = false; - var _mlyHighlightedDetection; - var _mlyShowFeatureDetections = false; - var _mlyShowSignDetections = false; - var _mlyViewer; - var _mlyViewerFilter = ["all"]; - function loadTiles(which, url, maxZoom2, projection2) { - const tiler8 = utilTiler().zoomExtent([minZoom, maxZoom2]).skipNullIsland(true); - const tiles = tiler8.getTiles(projection2); - tiles.forEach(function(tile) { - loadTile(which, url, tile); - }); + // modules/services/osmose.js + var import_rbush3 = __toESM(require_rbush_min()); + + // node_modules/marked/lib/marked.esm.js + function _getDefaults() { + return { + async: false, + baseUrl: null, + breaks: false, + extensions: null, + gfm: true, + headerIds: false, + headerPrefix: "", + highlight: null, + hooks: null, + langPrefix: "language-", + mangle: false, + pedantic: false, + renderer: null, + sanitize: false, + sanitizer: null, + silent: false, + smartypants: false, + tokenizer: null, + walkTokens: null, + xhtml: false + }; } - function loadTile(which, url, tile) { - const cache = _mlyCache.requests; - const tileId = `${tile.id}-${which}`; - if (cache.loaded[tileId] || cache.inflight[tileId]) - return; - const controller = new AbortController(); - cache.inflight[tileId] = controller; - const requestUrl = url.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace("{z}", tile.xyz[2]); - fetch(requestUrl, { signal: controller.signal }).then(function(response) { - if (!response.ok) { - throw new Error(response.status + " " + response.statusText); + var _defaults = _getDefaults(); + function changeDefaults(newDefaults) { + _defaults = newDefaults; + } + var escapeTest = /[&<>"']/; + var escapeReplace = new RegExp(escapeTest.source, "g"); + var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/; + var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g"); + var escapeReplacements = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + var getEscapeReplacement = (ch) => escapeReplacements[ch]; + function escape4(html2, encode) { + if (encode) { + if (escapeTest.test(html2)) { + return html2.replace(escapeReplace, getEscapeReplacement); } - cache.loaded[tileId] = true; - delete cache.inflight[tileId]; - return response.arrayBuffer(); - }).then(function(data) { - if (!data) { - throw new Error("No Data"); + } else { + if (escapeTestNoEncode.test(html2)) { + return html2.replace(escapeReplaceNoEncode, getEscapeReplacement); } - loadTileDataToCache(data, tile, which); - if (which === "images") { - dispatch5.call("loadedImages"); - } else if (which === "signs") { - dispatch5.call("loadedSigns"); - } else if (which === "points") { - dispatch5.call("loadedMapFeatures"); + } + return html2; + } + var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; + function unescape3(html2) { + return html2.replace(unescapeTest, (_2, n3) => { + n3 = n3.toLowerCase(); + if (n3 === "colon") + return ":"; + if (n3.charAt(0) === "#") { + return n3.charAt(1) === "x" ? String.fromCharCode(parseInt(n3.substring(2), 16)) : String.fromCharCode(+n3.substring(1)); } - }).catch(function() { - cache.loaded[tileId] = true; - delete cache.inflight[tileId]; + return ""; }); } - function loadTileDataToCache(data, tile, which) { - const vectorTile = new import_vector_tile.VectorTile(new import_pbf.default(data)); - let features2, cache, layer, i2, feature3, loc, d; - if (vectorTile.layers.hasOwnProperty("image")) { - features2 = []; - cache = _mlyCache.images; - layer = vectorTile.layers.image; - for (i2 = 0; i2 < layer.length; i2++) { - feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); - loc = feature3.geometry.coordinates; - d = { - loc, - captured_at: feature3.properties.captured_at, - ca: feature3.properties.compass_angle, - id: feature3.properties.id, - is_pano: feature3.properties.is_pano, - sequence_id: feature3.properties.sequence_id - }; - cache.forImageId[d.id] = d; - features2.push({ - minX: loc[0], - minY: loc[1], - maxX: loc[0], - maxY: loc[1], - data: d - }); + var caret = /(^|[^\[])\^/g; + function edit(regex, opt) { + regex = typeof regex === "string" ? regex : regex.source; + opt = opt || ""; + const obj = { + replace: (name, val) => { + val = typeof val === "object" && "source" in val ? val.source : val; + val = val.replace(caret, "$1"); + regex = regex.replace(name, val); + return obj; + }, + getRegex: () => { + return new RegExp(regex, opt); } - if (cache.rtree) { - cache.rtree.load(features2); + }; + return obj; + } + var nonWordAndColonTest = /[^\w:]/g; + var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; + function cleanUrl(sanitize, base, href) { + if (sanitize) { + let prot; + try { + prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase(); + } catch (e3) { + return null; + } + if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) { + return null; } } - if (vectorTile.layers.hasOwnProperty("sequence")) { - features2 = []; - cache = _mlyCache.sequences; - layer = vectorTile.layers.sequence; - for (i2 = 0; i2 < layer.length; i2++) { - feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); - if (cache.lineString[feature3.properties.id]) { - cache.lineString[feature3.properties.id].push(feature3); - } else { - cache.lineString[feature3.properties.id] = [feature3]; - } + if (base && !originIndependentUrl.test(href)) { + href = resolveUrl(base, href); + } + try { + href = encodeURI(href).replace(/%25/g, "%"); + } catch (e3) { + return null; + } + return href; + } + var baseUrls = {}; + var justDomain = /^[^:]+:\/*[^/]*$/; + var protocol = /^([^:]+:)[\s\S]*$/; + var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; + function resolveUrl(base, href) { + if (!baseUrls[" " + base]) { + if (justDomain.test(base)) { + baseUrls[" " + base] = base + "/"; + } else { + baseUrls[" " + base] = rtrim(base, "/", true); } } - if (vectorTile.layers.hasOwnProperty("point")) { - features2 = []; - cache = _mlyCache[which]; - layer = vectorTile.layers.point; - for (i2 = 0; i2 < layer.length; i2++) { - feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); - loc = feature3.geometry.coordinates; - d = { - loc, - id: feature3.properties.id, - first_seen_at: feature3.properties.first_seen_at, - last_seen_at: feature3.properties.last_seen_at, - value: feature3.properties.value - }; - features2.push({ - minX: loc[0], - minY: loc[1], - maxX: loc[0], - maxY: loc[1], - data: d - }); + base = baseUrls[" " + base]; + const relativeBase = base.indexOf(":") === -1; + if (href.substring(0, 2) === "//") { + if (relativeBase) { + return href; } - if (cache.rtree) { - cache.rtree.load(features2); + return base.replace(protocol, "$1") + href; + } else if (href.charAt(0) === "/") { + if (relativeBase) { + return href; } + return base.replace(domain, "$1") + href; + } else { + return base + href; } - if (vectorTile.layers.hasOwnProperty("traffic_sign")) { - features2 = []; - cache = _mlyCache[which]; - layer = vectorTile.layers.traffic_sign; - for (i2 = 0; i2 < layer.length; i2++) { - feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); - loc = feature3.geometry.coordinates; - d = { - loc, - id: feature3.properties.id, - first_seen_at: feature3.properties.first_seen_at, - last_seen_at: feature3.properties.last_seen_at, - value: feature3.properties.value - }; - features2.push({ - minX: loc[0], - minY: loc[1], - maxX: loc[0], - maxY: loc[1], - data: d - }); + } + var noopTest = { exec: () => null }; + function splitCells(tableRow, count) { + const row = tableRow.replace(/\|/g, (match, offset, str2) => { + let escaped = false, curr = offset; + while (--curr >= 0 && str2[curr] === "\\") + escaped = !escaped; + if (escaped) { + return "|"; + } else { + return " |"; } - if (cache.rtree) { - cache.rtree.load(features2); + }), cells = row.split(/ \|/); + let i3 = 0; + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells[cells.length - 1].trim()) { + cells.pop(); + } + if (count) { + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) + cells.push(""); } } + for (; i3 < cells.length; i3++) { + cells[i3] = cells[i3].trim().replace(/\\\|/g, "|"); + } + return cells; } - function loadData(url) { - return fetch(url).then(function(response) { - if (!response.ok) { - throw new Error(response.status + " " + response.statusText); + function rtrim(str2, c2, invert) { + const l2 = str2.length; + if (l2 === 0) { + return ""; + } + let suffLen = 0; + while (suffLen < l2) { + const currChar = str2.charAt(l2 - suffLen - 1); + if (currChar === c2 && !invert) { + suffLen++; + } else if (currChar !== c2 && invert) { + suffLen++; + } else { + break; } - return response.json(); - }).then(function(result) { - if (!result) { - return []; + } + return str2.slice(0, l2 - suffLen); + } + function findClosingBracket(str2, b2) { + if (str2.indexOf(b2[1]) === -1) { + return -1; + } + const l2 = str2.length; + let level = 0, i3 = 0; + for (; i3 < l2; i3++) { + if (str2[i3] === "\\") { + i3++; + } else if (str2[i3] === b2[0]) { + level++; + } else if (str2[i3] === b2[1]) { + level--; + if (level < 0) { + return i3; + } } - return result.data || []; - }); + } + return -1; } - function partitionViewport(projection2) { - const z = geoScaleToZoom(projection2.scale()); - const z2 = Math.ceil(z * 2) / 2 + 2.5; - const tiler8 = utilTiler().zoomExtent([z2, z2]); - return tiler8.getTiles(projection2).map(function(tile) { - return tile.extent; - }); + function checkDeprecations(opt, callback) { + if (!opt || opt.silent) { + return; + } + if (callback) { + console.warn("marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async"); + } + if (opt.sanitize || opt.sanitizer) { + console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options"); + } + if (opt.highlight || opt.langPrefix !== "language-") { + console.warn("marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight."); + } + if (opt.mangle) { + console.warn("marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`."); + } + if (opt.baseUrl) { + console.warn("marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url."); + } + if (opt.smartypants) { + console.warn("marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants."); + } + if (opt.xhtml) { + console.warn("marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml."); + } + if (opt.headerIds || opt.headerPrefix) { + console.warn("marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`."); + } } - function searchLimited(limit, projection2, rtree) { - limit = limit || 5; - return partitionViewport(projection2).reduce(function(result, extent) { - const found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) { - return d.data; - }); - return found.length ? result.concat(found) : result; - }, []); + function outputLink(cap, link2, raw, lexer2) { + const href = link2.href; + const title = link2.title ? escape4(link2.title) : null; + const text2 = cap[1].replace(/\\([\[\]])/g, "$1"); + if (cap[0].charAt(0) !== "!") { + lexer2.state.inLink = true; + const token = { + type: "link", + raw, + href, + title, + text: text2, + tokens: lexer2.inlineTokens(text2) + }; + lexer2.state.inLink = false; + return token; + } + return { + type: "image", + raw, + href, + title, + text: escape4(text2) + }; } - var mapillary_default = { - init: function() { - if (!_mlyCache) { - this.reset(); - } - this.event = utilRebind(this, dispatch5, "on"); - }, - reset: function() { - if (_mlyCache) { - Object.values(_mlyCache.requests.inflight).forEach(function(request3) { - request3.abort(); - }); - } - _mlyCache = { - images: { rtree: new import_rbush4.default(), forImageId: {} }, - image_detections: { forImageId: {} }, - signs: { rtree: new import_rbush4.default() }, - points: { rtree: new import_rbush4.default() }, - sequences: { rtree: new import_rbush4.default(), lineString: {} }, - requests: { loaded: {}, inflight: {} } - }; - _mlyActiveImage = null; - }, - images: function(projection2) { - const limit = 5; - return searchLimited(limit, projection2, _mlyCache.images.rtree); - }, - signs: function(projection2) { - const limit = 5; - return searchLimited(limit, projection2, _mlyCache.signs.rtree); - }, - mapFeatures: function(projection2) { - const limit = 5; - return searchLimited(limit, projection2, _mlyCache.points.rtree); - }, - cachedImage: function(imageId) { - return _mlyCache.images.forImageId[imageId]; - }, - sequences: function(projection2) { - const viewport = projection2.clipExtent(); - const min3 = [viewport[0][0], viewport[1][1]]; - const max3 = [viewport[1][0], viewport[0][1]]; - const bbox = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); - const sequenceIds = {}; - let lineStrings = []; - _mlyCache.images.rtree.search(bbox).forEach(function(d) { - if (d.data.sequence_id) { - sequenceIds[d.data.sequence_id] = true; - } - }); - Object.keys(sequenceIds).forEach(function(sequenceId) { - if (_mlyCache.sequences.lineString[sequenceId]) { - lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]); - } - }); - return lineStrings; - }, - loadImages: function(projection2) { - loadTiles("images", tileUrl, 14, projection2); - }, - loadSigns: function(projection2) { - loadTiles("signs", trafficSignTileUrl, 14, projection2); - }, - loadMapFeatures: function(projection2) { - loadTiles("points", mapFeatureTileUrl, 14, projection2); - }, - ensureViewerLoaded: function(context) { - if (_loadViewerPromise) - return _loadViewerPromise; - const wrap2 = context.container().select(".photoviewer").selectAll(".mly-wrapper").data([0]); - wrap2.enter().append("div").attr("id", "ideditor-mly").attr("class", "photo-wrapper mly-wrapper").classed("hide", true); - const that = this; - _loadViewerPromise = new Promise((resolve, reject) => { - let loadedCount = 0; - function loaded() { - loadedCount += 1; - if (loadedCount === 2) - resolve(); - } - const head = select_default2("head"); - head.selectAll("#ideditor-mapillary-viewercss").data([0]).enter().append("link").attr("id", "ideditor-mapillary-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(viewercss)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() { - reject(); - }); - head.selectAll("#ideditor-mapillary-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-mapillary-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(viewerjs)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() { - reject(); - }); - }).catch(function() { - _loadViewerPromise = null; - }).then(function() { - that.initViewer(context); - }); - return _loadViewerPromise; - }, - loadSignResources: function(context) { - context.ui().svgDefs.addSprites(["mapillary-sprite"], false); - return this; - }, - loadObjectResources: function(context) { - context.ui().svgDefs.addSprites(["mapillary-object-sprite"], false); - return this; - }, - resetTags: function() { - if (_mlyViewer && !_mlyFallback) { - _mlyViewer.getComponent("tag").removeAll(); - } - }, - showFeatureDetections: function(value) { - _mlyShowFeatureDetections = value; - if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) { - this.resetTags(); - } - }, - showSignDetections: function(value) { - _mlyShowSignDetections = value; - if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) { - this.resetTags(); - } - }, - filterViewer: function(context) { - const showsPano = context.photos().showsPanoramic(); - const showsFlat = context.photos().showsFlat(); - const fromDate = context.photos().fromDate(); - const toDate = context.photos().toDate(); - const filter2 = ["all"]; - if (!showsPano) - filter2.push(["!=", "cameraType", "spherical"]); - if (!showsFlat && showsPano) - filter2.push(["==", "pano", true]); - if (fromDate) { - filter2.push([">=", "capturedAt", new Date(fromDate).getTime()]); - } - if (toDate) { - filter2.push([">=", "capturedAt", new Date(toDate).getTime()]); - } - if (_mlyViewer) { - _mlyViewer.setFilter(filter2); - } - _mlyViewerFilter = filter2; - return filter2; - }, - showViewer: function(context) { - const wrap2 = context.container().select(".photoviewer").classed("hide", false); - const isHidden = wrap2.selectAll(".photo-wrapper.mly-wrapper.hide").size(); - if (isHidden && _mlyViewer) { - wrap2.selectAll(".photo-wrapper:not(.mly-wrapper)").classed("hide", true); - wrap2.selectAll(".photo-wrapper.mly-wrapper").classed("hide", false); - _mlyViewer.resize(); - } - return this; - }, - hideViewer: function(context) { - _mlyActiveImage = null; - if (!_mlyFallback && _mlyViewer) { - _mlyViewer.getComponent("sequence").stop(); + function indentCodeCompensation(raw, text2) { + const matchIndentToCode = raw.match(/^(\s+)(?:```)/); + if (matchIndentToCode === null) { + return text2; + } + const indentToCode = matchIndentToCode[1]; + return text2.split("\n").map((node) => { + const matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; } - const viewer = context.container().select(".photoviewer"); - if (!viewer.empty()) - viewer.datum(null); - viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true); - this.updateUrlImage(null); - dispatch5.call("imageChanged"); - dispatch5.call("loadedMapFeatures"); - dispatch5.call("loadedSigns"); - return this.setStyles(context, null); - }, - updateUrlImage: function(imageId) { - if (!window.mocha) { - const hash = utilStringQs(window.location.hash); - if (imageId) { - hash.photo = "mapillary/" + imageId; - } else { - delete hash.photo; - } - window.location.replace("#" + utilQsString(hash, true)); + const [indentInNode] = matchIndentInNode; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); } - }, - highlightDetection: function(detection) { - if (detection) { - _mlyHighlightedDetection = detection.id; + return node; + }).join("\n"); + } + var _Tokenizer = class { + options; + rules; + lexer; + constructor(options2) { + this.options = options2 || _defaults; + } + space(src) { + const cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: "space", + raw: cap[0] + }; } - return this; - }, - initViewer: function(context) { - const that = this; - if (!window.mapillary) - return; - const opts = { - accessToken, - component: { - cover: false, - keyboard: false, - tag: true - }, - container: "ideditor-mly" - }; - if (!mapillary.isSupported() && mapillary.isFallbackSupported()) { - _mlyFallback = true; - opts.component = { - cover: false, - direction: false, - imagePlane: false, - keyboard: false, - mouse: false, - sequence: false, - tag: false, - image: true, - navigation: true + } + code(src) { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text2 = cap[0].replace(/^ {1,4}/gm, ""); + return { + type: "code", + raw: cap[0], + codeBlockStyle: "indented", + text: !this.options.pedantic ? rtrim(text2, "\n") : text2 }; } - _mlyViewer = new mapillary.Viewer(opts); - _mlyViewer.on("image", imageChanged); - _mlyViewer.on("bearing", bearingChanged); - if (_mlyViewerFilter) { - _mlyViewer.setFilter(_mlyViewerFilter); + } + fences(src) { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text2 = indentCodeCompensation(raw, cap[3] || ""); + return { + type: "code", + raw, + lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2], + text: text2 + }; } - context.ui().photoviewer.on("resize.mapillary", function() { - if (_mlyViewer) - _mlyViewer.resize(); - }); - function imageChanged(node) { - that.resetTags(); - const image = node.image; - that.setActiveImage(image); - that.setStyles(context, null); - const loc = [image.originalLngLat.lng, image.originalLngLat.lat]; - context.map().centerEase(loc); - that.updateUrlImage(image.id); - if (_mlyShowFeatureDetections || _mlyShowSignDetections) { - that.updateDetections(image.id, `${apiUrl}/${image.id}/detections?access_token=${accessToken}&fields=id,image,geometry,value`); + } + heading(src) { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text2 = cap[2].trim(); + if (/#$/.test(text2)) { + const trimmed = rtrim(text2, "#"); + if (this.options.pedantic) { + text2 = trimmed.trim(); + } else if (!trimmed || / $/.test(trimmed)) { + text2 = trimmed.trim(); + } } - dispatch5.call("imageChanged"); - } - function bearingChanged(e) { - dispatch5.call("bearingChanged", void 0, e); + return { + type: "heading", + raw: cap[0], + depth: cap[1].length, + text: text2, + tokens: this.lexer.inline(text2) + }; } - }, - selectImage: function(context, imageId) { - if (_mlyViewer && imageId) { - _mlyViewer.moveTo(imageId).catch(function(e) { - console.error("mly3", e); - }); + } + hr(src) { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: "hr", + raw: cap[0] + }; } - return this; - }, - getActiveImage: function() { - return _mlyActiveImage; - }, - getDetections: function(id2) { - return loadData(`${apiUrl}/${id2}/detections?access_token=${accessToken}&fields=id,value,image`); - }, - setActiveImage: function(image) { - if (image) { - _mlyActiveImage = { - ca: image.originalCompassAngle, - id: image.id, - loc: [image.originalLngLat.lng, image.originalLngLat.lat], - is_pano: image.cameraType === "spherical", - sequence_id: image.sequenceId + } + blockquote(src) { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + const text2 = cap[0].replace(/^ *>[ \t]?/gm, ""); + const top = this.lexer.state.top; + this.lexer.state.top = true; + const tokens = this.lexer.blockTokens(text2); + this.lexer.state.top = top; + return { + type: "blockquote", + raw: cap[0], + tokens, + text: text2 }; - } else { - _mlyActiveImage = null; } - }, - setStyles: function(context, hovered) { - const hoveredImageId = hovered && hovered.id; - const hoveredSequenceId = hovered && hovered.sequence_id; - const selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id; - context.container().selectAll(".layer-mapillary .viewfield-group").classed("highlighted", function(d) { - return d.sequence_id === selectedSequenceId || d.id === hoveredImageId; - }).classed("hovered", function(d) { - return d.id === hoveredImageId; - }); - context.container().selectAll(".layer-mapillary .sequence").classed("highlighted", function(d) { - return d.properties.id === hoveredSequenceId; - }).classed("currentView", function(d) { - return d.properties.id === selectedSequenceId; - }); - return this; - }, - updateDetections: function(imageId, url) { - if (!_mlyViewer || _mlyFallback) - return; - if (!imageId) - return; - const cache = _mlyCache.image_detections; - if (cache.forImageId[imageId]) { - showDetections(_mlyCache.image_detections.forImageId[imageId]); - } else { - loadData(url).then((detections) => { - detections.forEach(function(detection) { - if (!cache.forImageId[imageId]) { - cache.forImageId[imageId] = []; + } + list(src) { + let cap = this.rules.block.list.exec(src); + if (cap) { + let raw, istask, ischecked, indent2, i3, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly; + let bull = cap[1].trim(); + const isordered = bull.length > 1; + const list = { + type: "list", + raw: "", + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : "", + loose: false, + items: [] + }; + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; + if (this.options.pedantic) { + bull = isordered ? bull : "[*+-]"; + } + const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`); + while (src) { + endEarly = false; + if (!(cap = itemRegex.exec(src))) { + break; + } + if (this.rules.block.hr.test(src)) { + break; + } + raw = cap[0]; + src = src.substring(raw.length); + line = cap[2].split("\n", 1)[0].replace(/^\t+/, (t2) => " ".repeat(3 * t2.length)); + nextLine = src.split("\n", 1)[0]; + if (this.options.pedantic) { + indent2 = 2; + itemContents = line.trimLeft(); + } else { + indent2 = cap[2].search(/[^ ]/); + indent2 = indent2 > 4 ? 1 : indent2; + itemContents = line.slice(indent2); + indent2 += cap[1].length; + } + blankLine = false; + if (!line && /^ *$/.test(nextLine)) { + raw += nextLine + "\n"; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + if (!endEarly) { + const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`); + const hrRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`); + const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:\`\`\`|~~~)`); + const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}#`); + while (src) { + rawLine = src.split("\n", 1)[0]; + nextLine = rawLine; + if (this.options.pedantic) { + nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, " "); + } + if (fencesBeginRegex.test(nextLine)) { + break; + } + if (headingBeginRegex.test(nextLine)) { + break; + } + if (nextBulletRegex.test(nextLine)) { + break; + } + if (hrRegex.test(src)) { + break; + } + if (nextLine.search(/[^ ]/) >= indent2 || !nextLine.trim()) { + itemContents += "\n" + nextLine.slice(indent2); + } else { + if (blankLine) { + break; + } + if (line.search(/[^ ]/) >= 4) { + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + itemContents += "\n" + nextLine; + } + if (!blankLine && !nextLine.trim()) { + blankLine = true; + } + raw += rawLine + "\n"; + src = src.substring(rawLine.length + 1); + line = nextLine.slice(indent2); } - cache.forImageId[imageId].push({ - geometry: detection.geometry, - id: detection.id, - image_id: imageId, - value: detection.value - }); - }); - showDetections(_mlyCache.image_detections.forImageId[imageId] || []); - }); - } - function showDetections(detections) { - const tagComponent = _mlyViewer.getComponent("tag"); - detections.forEach(function(data) { - const tag = makeTag(data); - if (tag) { - tagComponent.add([tag]); } - }); - } - function makeTag(data) { - const valueParts = data.value.split("--"); - if (!valueParts.length) - return; - let tag; - let text2; - let color2 = 16777215; - if (_mlyHighlightedDetection === data.id) { - color2 = 16776960; - text2 = valueParts[1]; - if (text2 === "flat" || text2 === "discrete" || text2 === "sign") { - text2 = valueParts[2]; + if (!list.loose) { + if (endsWithBlankLine) { + list.loose = true; + } else if (/\n *\n *$/.test(raw)) { + endsWithBlankLine = true; + } } - text2 = text2.replace(/-/g, " "); - text2 = text2.charAt(0).toUpperCase() + text2.slice(1); - _mlyHighlightedDetection = null; + if (this.options.gfm) { + istask = /^\[[ xX]\] /.exec(itemContents); + if (istask) { + ischecked = istask[0] !== "[ ] "; + itemContents = itemContents.replace(/^\[[ xX]\] +/, ""); + } + } + list.items.push({ + type: "list_item", + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents + }); + list.raw += raw; } - var decodedGeometry = window.atob(data.geometry); - var uintArray = new Uint8Array(decodedGeometry.length); - for (var i2 = 0; i2 < decodedGeometry.length; i2++) { - uintArray[i2] = decodedGeometry.charCodeAt(i2); + list.items[list.items.length - 1].raw = raw.trimRight(); + list.items[list.items.length - 1].text = itemContents.trimRight(); + list.raw = list.raw.trimRight(); + const l2 = list.items.length; + for (i3 = 0; i3 < l2; i3++) { + this.lexer.state.top = false; + list.items[i3].tokens = this.lexer.blockTokens(list.items[i3].text, []); + if (!list.loose) { + const spacers = list.items[i3].tokens.filter((t2) => t2.type === "space"); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t2) => /\n.*\n/.test(t2.raw)); + list.loose = hasMultipleLineBreaks; + } } - const tile = new import_vector_tile.VectorTile(new import_pbf.default(uintArray.buffer)); - const layer = tile.layers["mpy-or"]; - const geometries = layer.feature(0).loadGeometry(); - const polygon2 = geometries.map((ring) => ring.map((point) => [point.x / layer.extent, point.y / layer.extent])); - tag = new mapillary.OutlineTag( - data.id, - new mapillary.PolygonGeometry(polygon2[0]), - { - text: text2, - textColor: color2, - lineColor: color2, - lineWidth: 2, - fillColor: color2, - fillOpacity: 0.3 + if (list.loose) { + for (i3 = 0; i3 < l2; i3++) { + list.items[i3].loose = true; } - ); - return tag; + } + return list; } - }, - cache: function() { - return _mlyCache; } - }; - - // modules/core/validation/models.js - function validationIssue(attrs) { - this.type = attrs.type; - this.subtype = attrs.subtype; - this.severity = attrs.severity; - this.message = attrs.message; - this.reference = attrs.reference; - this.entityIds = attrs.entityIds; - this.loc = attrs.loc; - this.data = attrs.data; - this.dynamicFixes = attrs.dynamicFixes; - this.hash = attrs.hash; - this.id = generateID.apply(this); - this.key = generateKey.apply(this); - this.autoFix = null; - function generateID() { - var parts = [this.type]; - if (this.hash) { - parts.push(this.hash); - } - if (this.subtype) { - parts.push(this.subtype); - } - if (this.entityIds) { - var entityKeys = this.entityIds.slice().sort(); - parts.push.apply(parts, entityKeys); + html(src) { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token = { + type: "html", + block: true, + raw: cap[0], + pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"), + text: cap[0] + }; + if (this.options.sanitize) { + const text2 = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]); + const paragraph = token; + paragraph.type = "paragraph"; + paragraph.text = text2; + paragraph.tokens = this.lexer.inline(text2); + } + return token; } - return parts.join(":"); } - function generateKey() { - return this.id + ":" + Date.now().toString(); - } - this.extent = function(resolver) { - if (this.loc) { - return geoExtent(this.loc); - } - if (this.entityIds && this.entityIds.length) { - return this.entityIds.reduce(function(extent, entityId) { - return extent.extend(resolver.entity(entityId).extent(resolver)); - }, geoExtent()); + def(src) { + const cap = this.rules.block.def.exec(src); + if (cap) { + const tag = cap[1].toLowerCase().replace(/\s+/g, " "); + const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline._escapes, "$1") : ""; + const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, "$1") : cap[3]; + return { + type: "def", + tag, + raw: cap[0], + href, + title + }; } - return null; - }; - this.fixes = function(context) { - var fixes = this.dynamicFixes ? this.dynamicFixes(context) : []; - var issue = this; - if (issue.severity === "warning") { - fixes.push(new validationIssueFix({ - title: _t.append("issues.fix.ignore_issue.title"), - icon: "iD-icon-close", - onClick: function() { - context.validator().ignoreIssue(this.issue.id); + } + table(src) { + const cap = this.rules.block.table.exec(src); + if (cap) { + const item = { + type: "table", + raw: cap[0], + header: splitCells(cap[1]).map((c2) => { + return { text: c2 }; + }), + align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */), + rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : [] + }; + if (item.header.length === item.align.length) { + let l2 = item.align.length; + let i3, j3, k2, row; + for (i3 = 0; i3 < l2; i3++) { + if (/^ *-+: *$/.test(item.align[i3])) { + item.align[i3] = "right"; + } else if (/^ *:-+: *$/.test(item.align[i3])) { + item.align[i3] = "center"; + } else if (/^ *:-+ *$/.test(item.align[i3])) { + item.align[i3] = "left"; + } else { + item.align[i3] = null; + } } - })); - } - fixes.forEach(function(fix) { - fix.id = fix.title.stringId; - fix.issue = issue; - if (fix.autoArgs) { - issue.autoFix = fix; + l2 = item.rows.length; + for (i3 = 0; i3 < l2; i3++) { + item.rows[i3] = splitCells(item.rows[i3], item.header.length).map((c2) => { + return { text: c2 }; + }); + } + l2 = item.header.length; + for (j3 = 0; j3 < l2; j3++) { + item.header[j3].tokens = this.lexer.inline(item.header[j3].text); + } + l2 = item.rows.length; + for (j3 = 0; j3 < l2; j3++) { + row = item.rows[j3]; + for (k2 = 0; k2 < row.length; k2++) { + row[k2].tokens = this.lexer.inline(row[k2].text); + } + } + return item; } - }); - return fixes; - }; - } - function validationIssueFix(attrs) { - this.title = attrs.title; - this.onClick = attrs.onClick; - this.disabledReason = attrs.disabledReason; - this.icon = attrs.icon; - this.entityIds = attrs.entityIds || []; - this.autoArgs = attrs.autoArgs; - this.issue = null; - } - - // modules/services/maprules.js - var buildRuleChecks = function() { - return { - equals: function(equals) { - return function(tags) { - return Object.keys(equals).every(function(k) { - return equals[k] === tags[k]; - }); - }; - }, - notEquals: function(notEquals) { - return function(tags) { - return Object.keys(notEquals).some(function(k) { - return notEquals[k] !== tags[k]; - }); - }; - }, - absence: function(absence) { - return function(tags) { - return Object.keys(tags).indexOf(absence) === -1; - }; - }, - presence: function(presence) { - return function(tags) { - return Object.keys(tags).indexOf(presence) > -1; - }; - }, - greaterThan: function(greaterThan) { - var key = Object.keys(greaterThan)[0]; - var value = greaterThan[key]; - return function(tags) { - return tags[key] > value; - }; - }, - greaterThanEqual: function(greaterThanEqual) { - var key = Object.keys(greaterThanEqual)[0]; - var value = greaterThanEqual[key]; - return function(tags) { - return tags[key] >= value; - }; - }, - lessThan: function(lessThan) { - var key = Object.keys(lessThan)[0]; - var value = lessThan[key]; - return function(tags) { - return tags[key] < value; - }; - }, - lessThanEqual: function(lessThanEqual) { - var key = Object.keys(lessThanEqual)[0]; - var value = lessThanEqual[key]; - return function(tags) { - return tags[key] <= value; + } + } + lheading(src) { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: "heading", + raw: cap[0], + depth: cap[2].charAt(0) === "=" ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]) }; - }, - positiveRegex: function(positiveRegex) { - var tagKey = Object.keys(positiveRegex)[0]; - var expression = positiveRegex[tagKey].join("|"); - var regex = new RegExp(expression); - return function(tags) { - return regex.test(tags[tagKey]); + } + } + paragraph(src) { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const text2 = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1]; + return { + type: "paragraph", + raw: cap[0], + text: text2, + tokens: this.lexer.inline(text2) }; - }, - negativeRegex: function(negativeRegex) { - var tagKey = Object.keys(negativeRegex)[0]; - var expression = negativeRegex[tagKey].join("|"); - var regex = new RegExp(expression); - return function(tags) { - return !regex.test(tags[tagKey]); + } + } + text(src) { + const cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: "text", + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]) }; } - }; - }; - var buildLineKeys = function() { - return { - highway: { - rest_area: true, - services: true - }, - railway: { - roundhouse: true, - station: true, - traverser: true, - turntable: true, - wash: true + } + escape(src) { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: "escape", + raw: cap[0], + text: escape4(cap[1]) + }; } - }; - }; - var maprules_default = { - init: function() { - this._ruleChecks = buildRuleChecks(); - this._validationRules = []; - this._areaKeys = osmAreaKeys; - this._lineKeys = buildLineKeys(); - }, - filterRuleChecks: function(selector) { - var _ruleChecks = this._ruleChecks; - return Object.keys(selector).reduce(function(rules, key) { - if (["geometry", "error", "warning"].indexOf(key) === -1) { - rules.push(_ruleChecks[key](selector[key])); + } + tag(src) { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && /^/i.test(cap[0])) { + this.lexer.state.inLink = false; } - return rules; - }, []); - }, - buildTagMap: function(selector) { - var getRegexValues = function(regexes) { - return regexes.map(function(regex) { - return regex.replace(/\$|\^/g, ""); - }); - }; - var tagMap = Object.keys(selector).reduce(function(expectedTags, key) { - var values; - var isRegex = /regex/gi.test(key); - var isEqual = /equals/gi.test(key); - if (isRegex || isEqual) { - Object.keys(selector[key]).forEach(function(selectorKey) { - values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]); - if (expectedTags.hasOwnProperty(selectorKey)) { - values = values.concat(expectedTags[selectorKey]); - } - expectedTags[selectorKey] = values; - }); - } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) { - var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0]; - values = [selector[key][tagKey]]; - if (expectedTags.hasOwnProperty(tagKey)) { - values = values.concat(expectedTags[tagKey]); + if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: this.options.sanitize ? "text" : "html", + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: false, + text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0] + }; + } + } + link(src) { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl)) { + return; + } + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\"); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + const lastParenIndex = findClosingBracket(cap[2], "()"); + if (lastParenIndex > -1) { + const start2 = cap[0].indexOf("!") === 0 ? 5 : 4; + const linkLen = start2 + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ""; } - expectedTags[tagKey] = values; } - return expectedTags; - }, {}); - return tagMap; - }, - inferGeometry: function(tagMap) { - var _lineKeys = this._lineKeys; - var _areaKeys = this._areaKeys; - var keyValueDoesNotImplyArea = function(key2) { - return utilArrayIntersection(tagMap[key2], Object.keys(_areaKeys[key2])).length > 0; - }; - var keyValueImpliesLine = function(key2) { - return utilArrayIntersection(tagMap[key2], Object.keys(_lineKeys[key2])).length > 0; - }; - if (tagMap.hasOwnProperty("area")) { - if (tagMap.area.indexOf("yes") > -1) { - return "area"; + let href = cap[2]; + let title = ""; + if (this.options.pedantic) { + const link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + if (link2) { + href = link2[1]; + title = link2[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ""; } - if (tagMap.area.indexOf("no") > -1) { - return "line"; + href = href.trim(); + if (/^$/.test(trimmedUrl)) { + href = href.slice(1); + } else { + href = href.slice(1, -1); + } } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline._escapes, "$1") : href, + title: title ? title.replace(this.rules.inline._escapes, "$1") : title + }, cap[0], this.lexer); } - for (var key in tagMap) { - if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) { - return "area"; - } - if (key in _lineKeys && keyValueImpliesLine(key)) { - return "area"; + } + reflink(src, links) { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { + let link2 = (cap[2] || cap[1]).replace(/\s+/g, " "); + link2 = links[link2.toLowerCase()]; + if (!link2) { + const text2 = cap[0].charAt(0); + return { + type: "text", + raw: text2, + text: text2 + }; } + return outputLink(cap, link2, cap[0], this.lexer); } - return "line"; - }, - addRule: function(selector) { - var rule = { - checks: this.filterRuleChecks(selector), - matches: function(entity) { - return this.checks.every(function(check) { - return check(entity.tags); - }); - }, - inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys), - geometryMatches: function(entity, graph) { - if (entity.type === "node" || entity.type === "relation") { - return selector.geometry === entity.type; - } else if (entity.type === "way") { - return this.inferredGeometry === entity.geometry(graph); + } + emStrong(src, maskedSrc, prevChar = "") { + let match = this.rules.inline.emStrong.lDelim.exec(src); + if (!match) + return; + if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) + return; + const nextChar = match[1] || match[2] || ""; + if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) { + const lLength = [...match[0]].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; + endReg.lastIndex = 0; + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + if (!rDelim) + continue; + rLength = [...rDelim].length; + if (match[3] || match[4]) { + delimTotal += rLength; + continue; + } else if (match[5] || match[6]) { + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; + } } - }, - findIssues: function(entity, graph, issues) { - if (this.geometryMatches(entity, graph) && this.matches(entity)) { - var severity = Object.keys(selector).indexOf("error") > -1 ? "error" : "warning"; - var message = selector[severity]; - issues.push(new validationIssue({ - type: "maprules", - severity, - message: function() { - return message; - }, - entityIds: [entity.id] - })); + delimTotal -= rLength; + if (delimTotal > 0) + continue; + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + const raw = [...src].slice(0, lLength + match.index + rLength + 1).join(""); + if (Math.min(lLength, rLength) % 2) { + const text3 = raw.slice(1, -1); + return { + type: "em", + raw, + text: text3, + tokens: this.lexer.inlineTokens(text3) + }; } + const text2 = raw.slice(2, -2); + return { + type: "strong", + raw, + text: text2, + tokens: this.lexer.inlineTokens(text2) + }; } - }; - this._validationRules.push(rule); - }, - clearRules: function() { - this._validationRules = []; - }, - validationRules: function() { - return this._validationRules; - }, - ruleChecks: function() { - return this._ruleChecks; + } } - }; - - // modules/services/nominatim.js - var import_rbush5 = __toESM(require_rbush_min()); - var apibase = "https://nominatim.openstreetmap.org/"; - var _inflight = {}; - var _nominatimCache; - var nominatim_default = { - init: function() { - _inflight = {}; - _nominatimCache = new import_rbush5.default(); - }, - reset: function() { - Object.values(_inflight).forEach(function(controller) { - controller.abort(); - }); - _inflight = {}; - _nominatimCache = new import_rbush5.default(); - }, - countryCode: function(location, callback) { - this.reverse(location, function(err, result) { - if (err) { - return callback(err); - } else if (result.address) { - return callback(null, result.address.country_code); - } else { - return callback("Unable to geocode", null); + codespan(src) { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text2 = cap[2].replace(/\n/g, " "); + const hasNonSpaceChars = /[^ ]/.test(text2); + const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text2 = text2.substring(1, text2.length - 1); } - }); - }, - reverse: function(loc, callback) { - var cached = _nominatimCache.search( - { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] } - ); - if (cached.length > 0) { - if (callback) - callback(null, cached[0].data); - return; + text2 = escape4(text2, true); + return { + type: "codespan", + raw: cap[0], + text: text2 + }; } - var params = { zoom: 13, format: "json", addressdetails: 1, lat: loc[1], lon: loc[0] }; - var url = apibase + "reverse?" + utilQsString(params); - if (_inflight[url]) - return; - var controller = new AbortController(); - _inflight[url] = controller; - json_default(url, { signal: controller.signal }).then(function(result) { - delete _inflight[url]; - if (result && result.error) { - throw new Error(result.error); - } - var extent = geoExtent(loc).padByMeters(200); - _nominatimCache.insert(Object.assign(extent.bbox(), { data: result })); - if (callback) - callback(null, result); - }).catch(function(err) { - delete _inflight[url]; - if (err.name === "AbortError") - return; - if (callback) - callback(err.message); + } + br(src) { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: "br", + raw: cap[0] + }; + } + } + del(src) { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: "del", + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]) + }; + } + } + autolink(src, mangle2) { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text2, href; + if (cap[2] === "@") { + text2 = escape4(this.options.mangle ? mangle2(cap[1]) : cap[1]); + href = "mailto:" + text2; + } else { + text2 = escape4(cap[1]); + href = text2; + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [ + { + type: "text", + raw: text2, + text: text2 + } + ] + }; + } + } + url(src, mangle2) { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text2, href; + if (cap[2] === "@") { + text2 = escape4(this.options.mangle ? mangle2(cap[0]) : cap[0]); + href = "mailto:" + text2; + } else { + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; + } while (prevCapZero !== cap[0]); + text2 = escape4(cap[0]); + if (cap[1] === "www.") { + href = "http://" + cap[0]; + } else { + href = cap[0]; + } + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [ + { + type: "text", + raw: text2, + text: text2 + } + ] + }; + } + } + inlineText(src, smartypants2) { + const cap = this.rules.inline.text.exec(src); + if (cap) { + let text2; + if (this.lexer.state.inRawBlock) { + text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0]; + } else { + text2 = escape4(this.options.smartypants ? smartypants2(cap[0]) : cap[0]); + } + return { + type: "text", + raw: cap[0], + text: text2 + }; + } + } + }; + var block = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, + hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/, + html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", + def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, + table: noopTest, + lheading: /^((?:(?!^bull ).|\n(?!\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + // regex template, placeholders will be replaced according to different paragraph + // interruption rules of commonmark and the original markdown spec: + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, + text: /^[^\n]+/ + }; + block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; + block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; + block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex(); + block.bullet = /(?:[*+-]|\d{1,9}[.)])/; + block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex(); + block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex(); + block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; + block._comment = /|$)/; + block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); + block.lheading = edit(block.lheading).replace(/bull/g, block.bullet).getRegex(); + block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex(); + block.normal = { ...block }; + block.gfm = { + ...block.normal, + table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" + // Cells + }; + block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex(); + block.pedantic = { + ...block.normal, + html: edit(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex() + }; + var inline = { + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: noopTest, + tag: "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^", + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(ref)\]/, + nolink: /^!?\[(ref)\](?:\[\])?/, + reflinkSearch: "reflink|nolink(?!\\()", + emStrong: { + lDelim: /^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, + // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. + // | Skip orphan inside strong | Consume to delim | (1) #*** | (2) a***#, a*** | (3) #***a, ***a | (4) ***# | (5) #***# | (6) a***a + rDelimAst: /^[^_*]*?__[^_*]*?\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\*)[punct](\*+)(?=[\s]|$)|[^punct\s](\*+)(?!\*)(?=[punct\s]|$)|(?!\*)[punct\s](\*+)(?=[^punct\s])|[\s](\*+)(?!\*)(?=[punct])|(?!\*)[punct](\*+)(?!\*)(?=[punct])|[^punct\s](\*+)(?=[^punct\s])/, + rDelimUnd: /^[^_*]*?\*\*[^_*]*?_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\s]|$)|[^punct\s](_+)(?!_)(?=[punct\s]|$)|(?!_)[punct\s](_+)(?=[^punct\s])|[\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ + // ^- Not allowed for _ + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: noopTest, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`^|~"; + inline.punctuation = edit(inline.punctuation, "u").replace(/punctuation/g, inline._punctuation).getRegex(); + inline.blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g; + inline.anyPunctuation = /\\[punct]/g; + inline._escapes = /\\([punct])/g; + inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex(); + inline.emStrong.lDelim = edit(inline.emStrong.lDelim, "u").replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "gu").replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "gu").replace(/punct/g, inline._punctuation).getRegex(); + inline.anyPunctuation = edit(inline.anyPunctuation, "gu").replace(/punct/g, inline._punctuation).getRegex(); + inline._escapes = edit(inline._escapes, "gu").replace(/punct/g, inline._punctuation).getRegex(); + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; + 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])?)+(?![-_])/; + inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex(); + inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex(); + inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; + inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; + inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex(); + inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex(); + inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex(); + inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex(); + inline.normal = { ...inline }; + inline.pedantic = { + ...inline.normal, + strong: { + start: /^__|\*\*/, + middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g + }, + em: { + start: /^_|\*/, + middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g + }, + link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex() + }; + inline.gfm = { + ...inline.normal, + escape: edit(inline.escape).replace("])", "~|])").getRegex(), + _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5) { + ch = "x" + ch.toString(16); + } + out += "&#" + ch + ";"; + } + return out; + } + var _Lexer = class __Lexer { + tokens; + options; + state; + tokenizer; + inlineQueue; + constructor(options2) { + this.tokens = []; + this.tokens.links = /* @__PURE__ */ Object.create(null); + this.options = options2 || _defaults; + this.options.tokenizer = this.options.tokenizer || new _Tokenizer(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true + }; + const rules = { + block: block.normal, + inline: inline.normal + }; + if (this.options.pedantic) { + rules.block = block.pedantic; + rules.inline = inline.pedantic; + } else if (this.options.gfm) { + rules.block = block.gfm; + if (this.options.breaks) { + rules.inline = inline.breaks; + } else { + rules.inline = inline.gfm; + } + } + this.tokenizer.rules = rules; + } + /** + * Expose Rules + */ + static get rules() { + return { + block, + inline + }; + } + /** + * Static Lex Method + */ + static lex(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.lex(src); + } + /** + * Static Lex Inline Method + */ + static lexInline(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.inlineTokens(src); + } + /** + * Preprocessing + */ + lex(src) { + src = src.replace(/\r\n|\r/g, "\n"); + this.blockTokens(src, this.tokens); + let next; + while (next = this.inlineQueue.shift()) { + this.inlineTokens(next.src, next.tokens); + } + return this.tokens; + } + blockTokens(src, tokens = []) { + if (this.options.pedantic) { + src = src.replace(/\t/g, " ").replace(/^ +$/gm, ""); + } else { + src = src.replace(/^( *)(\t+)/gm, (_2, leading, tabs) => { + return leading + " ".repeat(tabs.length); + }); + } + let token; + let lastToken; + let cutSrc; + let lastParagraphClipped; + while (src) { + if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + if (token.raw.length === 1 && tokens.length > 0) { + tokens[tokens.length - 1].raw += "\n"; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.raw; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startBlock) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startBlock.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + lastToken = tokens[tokens.length - 1]; + if (lastParagraphClipped && lastToken.type === "paragraph") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + lastParagraphClipped = cutSrc.length !== src.length; + src = src.substring(token.raw.length); + continue; + } + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + } + inline(src, tokens = []) { + this.inlineQueue.push({ src, tokens }); + return tokens; + } + /** + * Lexing/Compiling + */ + inlineTokens(src, tokens = []) { + let token, lastToken, cutSrc; + let maskedSrc = src; + let match; + let keepPrevChar, prevChar; + if (this.tokens.links) { + const links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + } + while (src) { + if (!keepPrevChar) { + prevChar = ""; + } + keepPrevChar = false; + if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.autolink(src, mangle)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startInline) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startInline.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (token = this.tokenizer.inlineText(cutSrc, smartypants)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== "_") { + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + return tokens; + } + }; + var _Renderer = class { + options; + constructor(options2) { + this.options = options2 || _defaults; + } + code(code, infostring, escaped) { + const lang = (infostring || "").match(/\S*/)[0]; + if (this.options.highlight) { + const out = this.options.highlight(code, lang); + if (out != null && out !== code) { + escaped = true; + code = out; + } + } + code = code.replace(/\n$/, "") + "\n"; + if (!lang) { + return "
    " + (escaped ? code : escape4(code, true)) + "
    \n"; + } + return '
    ' + (escaped ? code : escape4(code, true)) + "
    \n"; + } + blockquote(quote2) { + return `
    +${quote2}
    +`; + } + html(html2, block2) { + return html2; + } + heading(text2, level, raw, slugger) { + if (this.options.headerIds) { + const id2 = this.options.headerPrefix + slugger.slug(raw); + return `${text2} +`; + } + return `${text2} +`; + } + hr() { + return this.options.xhtml ? "
    \n" : "
    \n"; + } + list(body, ordered, start2) { + const type2 = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : ""; + return "<" + type2 + startatt + ">\n" + body + "\n"; + } + listitem(text2, task, checked) { + return `
  • ${text2}
  • +`; + } + checkbox(checked) { + return " "; + } + paragraph(text2) { + return `

    ${text2}

    +`; + } + table(header, body) { + if (body) + body = `${body}`; + return "\n\n" + header + "\n" + body + "
    \n"; + } + tablerow(content) { + return ` +${content} +`; + } + tablecell(content, flags) { + const type2 = flags.header ? "th" : "td"; + const tag = flags.align ? `<${type2} align="${flags.align}">` : `<${type2}>`; + return tag + content + ` +`; + } + /** + * span level renderer + */ + strong(text2) { + return `${text2}`; + } + em(text2) { + return `${text2}`; + } + codespan(text2) { + return `${text2}`; + } + br() { + return this.options.xhtml ? "
    " : "
    "; + } + del(text2) { + return `${text2}`; + } + link(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + let out = '
    "; + return out; + } + image(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + let out = `${text2}" : ">"; + return out; + } + text(text2) { + return text2; + } + }; + var _TextRenderer = class { + // no need for block level renderers + strong(text2) { + return text2; + } + em(text2) { + return text2; + } + codespan(text2) { + return text2; + } + del(text2) { + return text2; + } + html(text2) { + return text2; + } + text(text2) { + return text2; + } + link(href, title, text2) { + return "" + text2; + } + image(href, title, text2) { + return "" + text2; + } + br() { + return ""; + } + }; + var _Slugger = class { + seen; + constructor() { + this.seen = {}; + } + serialize(value) { + return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-"); + } + /** + * Finds the next safe (unique) slug to use + */ + getNextSafeSlug(originalSlug, isDryRun) { + let slug = originalSlug; + let occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + "-" + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + } + /** + * Convert string to unique id + */ + slug(value, options2 = {}) { + const slug = this.serialize(value); + return this.getNextSafeSlug(slug, options2.dryrun); + } + }; + var _Parser = class __Parser { + options; + renderer; + textRenderer; + slugger; + constructor(options2) { + this.options = options2 || _defaults; + this.options.renderer = this.options.renderer || new _Renderer(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.textRenderer = new _TextRenderer(); + this.slugger = new _Slugger(); + } + /** + * Static Parse Method + */ + static parse(tokens, options2) { + const parser3 = new __Parser(options2); + return parser3.parse(tokens); + } + /** + * Static Parse Inline Method + */ + static parseInline(tokens, options2) { + const parser3 = new __Parser(options2); + return parser3.parseInline(tokens); + } + /** + * Parse Loop + */ + parse(tokens, top = true) { + let out = "", i3, j3, k2, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret; + const l4 = tokens.length; + for (i3 = 0; i3 < l4; i3++) { + token = tokens[i3]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({ parser: this }, token); + if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "space": { + continue; + } + case "hr": { + out += this.renderer.hr(); + continue; + } + case "heading": { + out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape3(this.parseInline(token.tokens, this.textRenderer)), this.slugger); + continue; + } + case "code": { + out += this.renderer.code(token.text, token.lang, !!token.escaped); + continue; + } + case "table": { + header = ""; + cell = ""; + l2 = token.header.length; + for (j3 = 0; j3 < l2; j3++) { + cell += this.renderer.tablecell(this.parseInline(token.header[j3].tokens), { header: true, align: token.align[j3] }); + } + header += this.renderer.tablerow(cell); + body = ""; + l2 = token.rows.length; + for (j3 = 0; j3 < l2; j3++) { + row = token.rows[j3]; + cell = ""; + l3 = row.length; + for (k2 = 0; k2 < l3; k2++) { + cell += this.renderer.tablecell(this.parseInline(row[k2].tokens), { header: false, align: token.align[k2] }); + } + body += this.renderer.tablerow(cell); + } + out += this.renderer.table(header, body); + continue; + } + case "blockquote": { + body = this.parse(token.tokens); + out += this.renderer.blockquote(body); + continue; + } + case "list": { + ordered = token.ordered; + start2 = token.start; + loose = token.loose; + l2 = token.items.length; + body = ""; + for (j3 = 0; j3 < l2; j3++) { + item = token.items[j3]; + checked = item.checked; + task = item.task; + itemBody = ""; + if (item.task) { + checkbox = this.renderer.checkbox(!!checked); + if (loose) { + if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") { + item.tokens[0].text = checkbox + " " + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") { + item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text; + } + } else { + item.tokens.unshift({ + type: "text", + text: checkbox + }); + } + } else { + itemBody += checkbox; + } + } + itemBody += this.parse(item.tokens, loose); + body += this.renderer.listitem(itemBody, task, !!checked); + } + out += this.renderer.list(body, ordered, start2); + continue; + } + case "html": { + out += this.renderer.html(token.text, token.block); + continue; + } + case "paragraph": { + out += this.renderer.paragraph(this.parseInline(token.tokens)); + continue; + } + case "text": { + body = token.tokens ? this.parseInline(token.tokens) : token.text; + while (i3 + 1 < l4 && tokens[i3 + 1].type === "text") { + token = tokens[++i3]; + body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text); + } + out += top ? this.renderer.paragraph(body) : body; + continue; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ""; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + } + /** + * Parse Inline Tokens + */ + parseInline(tokens, renderer) { + renderer = renderer || this.renderer; + let out = "", i3, token, ret; + const l2 = tokens.length; + for (i3 = 0; i3 < l2; i3++) { + token = tokens[i3]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({ parser: this }, token); + if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "escape": { + out += renderer.text(token.text); + break; + } + case "html": { + out += renderer.html(token.text); + break; + } + case "link": { + out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); + break; + } + case "image": { + out += renderer.image(token.href, token.title, token.text); + break; + } + case "strong": { + out += renderer.strong(this.parseInline(token.tokens, renderer)); + break; + } + case "em": { + out += renderer.em(this.parseInline(token.tokens, renderer)); + break; + } + case "codespan": { + out += renderer.codespan(token.text); + break; + } + case "br": { + out += renderer.br(); + break; + } + case "del": { + out += renderer.del(this.parseInline(token.tokens, renderer)); + break; + } + case "text": { + out += renderer.text(token.text); + break; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ""; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + } + }; + var _Hooks = class { + options; + constructor(options2) { + this.options = options2 || _defaults; + } + static passThroughHooks = /* @__PURE__ */ new Set([ + "preprocess", + "postprocess" + ]); + /** + * Process markdown before marked + */ + preprocess(markdown) { + return markdown; + } + /** + * Process HTML after marked is finished + */ + postprocess(html2) { + return html2; + } + }; + var Marked = class { + defaults = _getDefaults(); + options = this.setOptions; + parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse); + parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline); + Parser = _Parser; + parser = _Parser.parse; + Renderer = _Renderer; + TextRenderer = _TextRenderer; + Lexer = _Lexer; + lexer = _Lexer.lex; + Tokenizer = _Tokenizer; + Slugger = _Slugger; + Hooks = _Hooks; + constructor(...args) { + this.use(...args); + } + /** + * Run callback for every token + */ + walkTokens(tokens, callback) { + let values = []; + for (const token of tokens) { + values = values.concat(callback.call(this, token)); + switch (token.type) { + case "table": { + for (const cell of token.header) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + for (const row of token.rows) { + for (const cell of row) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + } + break; + } + case "list": { + values = values.concat(this.walkTokens(token.items, callback)); + break; + } + default: { + if (this.defaults.extensions && this.defaults.extensions.childTokens && this.defaults.extensions.childTokens[token.type]) { + this.defaults.extensions.childTokens[token.type].forEach((childTokens) => { + values = values.concat(this.walkTokens(token[childTokens], callback)); + }); + } else if (token.tokens) { + values = values.concat(this.walkTokens(token.tokens, callback)); + } + } + } + } + return values; + } + use(...args) { + const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} }; + args.forEach((pack) => { + const opts = { ...pack }; + opts.async = this.defaults.async || opts.async || false; + if (pack.extensions) { + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error("extension name required"); + } + if ("renderer" in ext) { + const prevRenderer = extensions.renderers[ext.name]; + if (prevRenderer) { + extensions.renderers[ext.name] = function(...args2) { + let ret = ext.renderer.apply(this, args2); + if (ret === false) { + ret = prevRenderer.apply(this, args2); + } + return ret; + }; + } else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if ("tokenizer" in ext) { + if (!ext.level || ext.level !== "block" && ext.level !== "inline") { + throw new Error("extension level must be 'block' or 'inline'"); + } + if (extensions[ext.level]) { + extensions[ext.level].unshift(ext.tokenizer); + } else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { + if (ext.level === "block") { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } else { + extensions.startBlock = [ext.start]; + } + } else if (ext.level === "inline") { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } else { + extensions.startInline = [ext.start]; + } + } + } + } + if ("childTokens" in ext && ext.childTokens) { + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + opts.extensions = extensions; + } + if (pack.renderer) { + const renderer = this.defaults.renderer || new _Renderer(this.defaults); + for (const prop in pack.renderer) { + const rendererFunc = pack.renderer[prop]; + const rendererKey = prop; + const prevRenderer = renderer[rendererKey]; + renderer[rendererKey] = (...args2) => { + let ret = rendererFunc.apply(renderer, args2); + if (ret === false) { + ret = prevRenderer.apply(renderer, args2); + } + return ret || ""; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults); + for (const prop in pack.tokenizer) { + const tokenizerFunc = pack.tokenizer[prop]; + const tokenizerKey = prop; + const prevTokenizer = tokenizer[tokenizerKey]; + tokenizer[tokenizerKey] = (...args2) => { + let ret = tokenizerFunc.apply(tokenizer, args2); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args2); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + if (pack.hooks) { + const hooks = this.defaults.hooks || new _Hooks(); + for (const prop in pack.hooks) { + const hooksFunc = pack.hooks[prop]; + const hooksKey = prop; + const prevHook = hooks[hooksKey]; + if (_Hooks.passThroughHooks.has(prop)) { + hooks[hooksKey] = (arg) => { + if (this.defaults.async) { + return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => { + return prevHook.call(hooks, ret2); + }); + } + const ret = hooksFunc.call(hooks, arg); + return prevHook.call(hooks, ret); + }; + } else { + hooks[hooksKey] = (...args2) => { + let ret = hooksFunc.apply(hooks, args2); + if (ret === false) { + ret = prevHook.apply(hooks, args2); + } + return ret; + }; + } + } + opts.hooks = hooks; + } + if (pack.walkTokens) { + const walkTokens2 = this.defaults.walkTokens; + opts.walkTokens = function(token) { + let values = []; + values.push(pack.walkTokens.call(this, token)); + if (walkTokens2) { + values = values.concat(walkTokens2.call(this, token)); + } + return values; + }; + } + this.defaults = { ...this.defaults, ...opts }; + }); + return this; + } + setOptions(opt) { + this.defaults = { ...this.defaults, ...opt }; + return this; + } + #parseMarkdown(lexer2, parser3) { + return (src, optOrCallback, callback) => { + if (typeof optOrCallback === "function") { + callback = optOrCallback; + optOrCallback = null; + } + const origOpt = { ...optOrCallback }; + const opt = { ...this.defaults, ...origOpt }; + const throwError = this.#onError(!!opt.silent, !!opt.async, callback); + if (typeof src === "undefined" || src === null) { + return throwError(new Error("marked(): input parameter is undefined or null")); + } + if (typeof src !== "string") { + return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected")); + } + checkDeprecations(opt, callback); + if (opt.hooks) { + opt.hooks.options = opt; + } + if (callback) { + const highlight = opt.highlight; + let tokens; + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + tokens = lexer2(src, opt); + } catch (e3) { + return throwError(e3); + } + const done = (err) => { + let out; + if (!err) { + try { + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + out = parser3(tokens, opt); + if (opt.hooks) { + out = opt.hooks.postprocess(out); + } + } catch (e3) { + err = e3; + } + } + opt.highlight = highlight; + return err ? throwError(err) : callback(null, out); + }; + if (!highlight || highlight.length < 3) { + return done(); + } + delete opt.highlight; + if (!tokens.length) + return done(); + let pending = 0; + this.walkTokens(tokens, (token) => { + if (token.type === "code") { + pending++; + setTimeout(() => { + highlight(token.text, token.lang, (err, code) => { + if (err) { + return done(err); + } + if (code != null && code !== token.text) { + token.text = code; + token.escaped = true; + } + pending--; + if (pending === 0) { + done(); + } + }); + }, 0); + } + }); + if (pending === 0) { + done(); + } + return; + } + if (opt.async) { + return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser3(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError); + } + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + const tokens = lexer2(src, opt); + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + let html2 = parser3(tokens, opt); + if (opt.hooks) { + html2 = opt.hooks.postprocess(html2); + } + return html2; + } catch (e3) { + return throwError(e3); + } + }; + } + #onError(silent, async, callback) { + return (e3) => { + e3.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (silent) { + const msg = "

    An error occurred:

    " + escape4(e3.message + "", true) + "
    "; + if (async) { + return Promise.resolve(msg); + } + if (callback) { + callback(null, msg); + return; + } + return msg; + } + if (async) { + return Promise.reject(e3); + } + if (callback) { + callback(e3); + return; + } + throw e3; + }; + } + }; + var markedInstance = new Marked(); + function marked(src, opt, callback) { + return markedInstance.parse(src, opt, callback); + } + marked.options = marked.setOptions = function(options2) { + markedInstance.setOptions(options2); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; + }; + marked.getDefaults = _getDefaults; + marked.defaults = _defaults; + marked.use = function(...args) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; + }; + marked.walkTokens = function(tokens, callback) { + return markedInstance.walkTokens(tokens, callback); + }; + marked.parseInline = markedInstance.parseInline; + marked.Parser = _Parser; + marked.parser = _Parser.parse; + marked.Renderer = _Renderer; + marked.TextRenderer = _TextRenderer; + marked.Lexer = _Lexer; + marked.lexer = _Lexer.lex; + marked.Tokenizer = _Tokenizer; + marked.Slugger = _Slugger; + marked.Hooks = _Hooks; + marked.parse = marked; + var options = marked.options; + var setOptions = marked.setOptions; + var use = marked.use; + var walkTokens = marked.walkTokens; + var parseInline = marked.parseInline; + var parser2 = _Parser.parse; + var lexer = _Lexer.lex; + + // modules/services/osmose.js + var tiler3 = utilTiler(); + var dispatch4 = dispatch_default("loaded"); + var _tileZoom3 = 14; + var _osmoseUrlRoot = "https://osmose.openstreetmap.fr/api/0.3"; + var _osmoseData = { icons: {}, items: [] }; + var _cache3; + function abortRequest3(controller) { + if (controller) { + controller.abort(); + } + } + function abortUnwantedRequests3(cache, tiles) { + Object.keys(cache.inflightTile).forEach((k2) => { + let wanted = tiles.find((tile) => k2 === tile.id); + if (!wanted) { + abortRequest3(cache.inflightTile[k2]); + delete cache.inflightTile[k2]; + } + }); + } + function encodeIssueRtree3(d2) { + return { minX: d2.loc[0], minY: d2.loc[1], maxX: d2.loc[0], maxY: d2.loc[1], data: d2 }; + } + function updateRtree3(item, replace) { + _cache3.rtree.remove(item, (a2, b2) => a2.data.id === b2.data.id); + if (replace) { + _cache3.rtree.insert(item); + } + } + function preventCoincident2(loc) { + let coincident = false; + do { + let delta = coincident ? [1e-5, 0] : [0, 1e-5]; + loc = geoVecAdd(loc, delta); + let bbox2 = geoExtent(loc).bbox(); + coincident = _cache3.rtree.search(bbox2).length; + } while (coincident); + return loc; + } + var osmose_default = { + title: "osmose", + init() { + _mainFileFetcher.get("qa_data").then((d2) => { + _osmoseData = d2.osmose; + _osmoseData.items = Object.keys(d2.osmose.icons).map((s2) => s2.split("-")[0]).reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []); }); + if (!_cache3) { + this.reset(); + } + this.event = utilRebind(this, dispatch4, "on"); }, - search: function(val, callback) { - var searchVal = encodeURIComponent(val); - var url = apibase + "search/" + searchVal + "?limit=10&format=json"; - if (_inflight[url]) - return; - var controller = new AbortController(); - _inflight[url] = controller; - json_default(url, { signal: controller.signal }).then(function(result) { - delete _inflight[url]; - if (result && result.error) { - throw new Error(result.error); + reset() { + let _strings = {}; + let _colors = {}; + if (_cache3) { + Object.values(_cache3.inflightTile).forEach(abortRequest3); + _strings = _cache3.strings; + _colors = _cache3.colors; + } + _cache3 = { + data: {}, + loadedTile: {}, + inflightTile: {}, + inflightPost: {}, + closed: {}, + rtree: new import_rbush3.default(), + strings: _strings, + colors: _colors + }; + }, + loadIssues(projection2) { + let params = { + // Tiles return a maximum # of issues + // So we want to filter our request for only types iD supports + item: _osmoseData.items + }; + let tiles = tiler3.zoomExtent([_tileZoom3, _tileZoom3]).getTiles(projection2); + abortUnwantedRequests3(_cache3, tiles); + tiles.forEach((tile) => { + if (_cache3.loadedTile[tile.id] || _cache3.inflightTile[tile.id]) + return; + let [x2, y2, z2] = tile.xyz; + let url = `${_osmoseUrlRoot}/issues/${z2}/${x2}/${y2}.geojson?` + utilQsString(params); + let controller = new AbortController(); + _cache3.inflightTile[tile.id] = controller; + json_default(url, { signal: controller.signal }).then((data) => { + delete _cache3.inflightTile[tile.id]; + _cache3.loadedTile[tile.id] = true; + if (data.features) { + data.features.forEach((issue) => { + const { item, class: cl, uuid: id2 } = issue.properties; + const itemType = `${item}-${cl}`; + if (itemType in _osmoseData.icons) { + let loc = issue.geometry.coordinates; + loc = preventCoincident2(loc); + let d2 = new QAItem(loc, this, itemType, id2, { item }); + if (item === 8300 || item === 8360) { + d2.elems = []; + } + _cache3.data[d2.id] = d2; + _cache3.rtree.insert(encodeIssueRtree3(d2)); + } + }); + } + dispatch4.call("loaded"); + }).catch(() => { + delete _cache3.inflightTile[tile.id]; + _cache3.loadedTile[tile.id] = true; + }); + }); + }, + loadIssueDetail(issue) { + if (issue.elems !== void 0) { + return Promise.resolve(issue); + } + const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`; + const cacheDetails = (data) => { + issue.elems = data.elems.map((e3) => e3.type.substring(0, 1) + e3.id); + issue.detail = data.subtitle ? marked(data.subtitle.auto) : ""; + this.replaceItem(issue); + }; + return json_default(url).then(cacheDetails).then(() => issue); + }, + loadStrings(locale2 = _mainLocalizer.localeCode()) { + const items = Object.keys(_osmoseData.icons); + if (locale2 in _cache3.strings && Object.keys(_cache3.strings[locale2]).length === items.length) { + return Promise.resolve(_cache3.strings[locale2]); + } + if (!(locale2 in _cache3.strings)) { + _cache3.strings[locale2] = {}; + } + const allRequests = items.map((itemType) => { + if (itemType in _cache3.strings[locale2]) + return null; + const cacheData = (data) => { + const [cat = { items: [] }] = data.categories; + const [item2 = { class: [] }] = cat.items; + const [cl2 = null] = item2.class; + if (!cl2) { + console.log(`Osmose strings request (${itemType}) had unexpected data`); + return; + } + const { item: itemInt, color: color2 } = item2; + if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color2)) { + _cache3.colors[itemInt] = color2; + } + const { title, detail, fix, trap } = cl2; + let issueStrings = {}; + if (title) + issueStrings.title = title.auto; + if (detail) + issueStrings.detail = marked(detail.auto); + if (trap) + issueStrings.trap = marked(trap.auto); + if (fix) + issueStrings.fix = marked(fix.auto); + _cache3.strings[locale2][itemType] = issueStrings; + }; + const [item, cl] = itemType.split("-"); + const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale2}`; + return json_default(url).then(cacheData); + }).filter(Boolean); + return Promise.all(allRequests).then(() => _cache3.strings[locale2]); + }, + getStrings(itemType, locale2 = _mainLocalizer.localeCode()) { + return locale2 in _cache3.strings ? _cache3.strings[locale2][itemType] : {}; + }, + getColor(itemType) { + return itemType in _cache3.colors ? _cache3.colors[itemType] : "#FFFFFF"; + }, + postUpdate(issue, callback) { + if (_cache3.inflightPost[issue.id]) { + return callback({ message: "Issue update already inflight", status: -2 }, issue); + } + const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`; + const controller = new AbortController(); + const after = () => { + delete _cache3.inflightPost[issue.id]; + this.removeItem(issue); + if (issue.newStatus === "done") { + if (!(issue.item in _cache3.closed)) { + _cache3.closed[issue.item] = 0; + } + _cache3.closed[issue.item] += 1; } if (callback) - callback(null, result); - }).catch(function(err) { - delete _inflight[url]; - if (err.name === "AbortError") - return; + callback(null, issue); + }; + _cache3.inflightPost[issue.id] = controller; + fetch(url, { signal: controller.signal }).then(after).catch((err) => { + delete _cache3.inflightPost[issue.id]; if (callback) callback(err.message); }); + }, + // Get all cached QAItems covering the viewport + getItems(projection2) { + const viewport = projection2.clipExtent(); + const min3 = [viewport[0][0], viewport[1][1]]; + const max3 = [viewport[1][0], viewport[0][1]]; + const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); + return _cache3.rtree.search(bbox2).map((d2) => d2.data); + }, + // Get a QAItem from cache + // NOTE: Don't change method name until UI v3 is merged + getError(id2) { + return _cache3.data[id2]; + }, + // get the name of the icon to display for this item + getIcon(itemType) { + return _osmoseData.icons[itemType]; + }, + // Replace a single QAItem in the cache + replaceItem(item) { + if (!(item instanceof QAItem) || !item.id) + return; + _cache3.data[item.id] = item; + updateRtree3(encodeIssueRtree3(item), true); + return item; + }, + // Remove a single QAItem from the cache + removeItem(item) { + if (!(item instanceof QAItem) || !item.id) + return; + delete _cache3.data[item.id]; + updateRtree3(encodeIssueRtree3(item), false); + }, + // Used to populate `closed:osmose:*` changeset tags + getClosedCounts() { + return _cache3.closed; + }, + itemURL(item) { + return `https://osmose.openstreetmap.fr/en/error/${item.id}`; } }; - // node_modules/name-suggestion-index/lib/matcher.js - var import_which_polygon3 = __toESM(require_which_polygon(), 1); - - // node_modules/name-suggestion-index/lib/simplify.js - var import_diacritics2 = __toESM(require_diacritics(), 1); - function simplify(str2) { - if (typeof str2 !== "string") - return ""; - return import_diacritics2.default.remove( - str2.replace(/&/g, "and").replace(/İ/ig, "i").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\u2000-\u206f\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e7f\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\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase() - ); + // modules/services/mapillary.js + var import_pbf = __toESM(require_pbf()); + var import_rbush4 = __toESM(require_rbush_min()); + var import_vector_tile = __toESM(require_vector_tile()); + var accessToken = "MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf"; + var apiUrl = "https://graph.mapillary.com/"; + var baseTileUrl = "https://tiles.mapillary.com/maps/vtp"; + var mapFeatureTileUrl = `${baseTileUrl}/mly_map_feature_point/2/{z}/{x}/{y}?access_token=${accessToken}`; + var tileUrl = `${baseTileUrl}/mly1_public/2/{z}/{x}/{y}?access_token=${accessToken}`; + var trafficSignTileUrl = `${baseTileUrl}/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=${accessToken}`; + var viewercss = "mapillary-js/mapillary.css"; + var viewerjs = "mapillary-js/mapillary.js"; + var minZoom = 14; + var dispatch5 = dispatch_default("change", "loadedImages", "loadedSigns", "loadedMapFeatures", "bearingChanged", "imageChanged"); + var _loadViewerPromise; + var _mlyActiveImage; + var _mlyCache; + var _mlyFallback = false; + var _mlyHighlightedDetection; + var _mlyShowFeatureDetections = false; + var _mlyShowSignDetections = false; + var _mlyViewer; + var _mlyViewerFilter = ["all"]; + function loadTiles(which, url, maxZoom2, projection2) { + const tiler9 = utilTiler().zoomExtent([minZoom, maxZoom2]).skipNullIsland(true); + const tiles = tiler9.getTiles(projection2); + tiles.forEach(function(tile) { + loadTile(which, url, tile); + }); } - - // node_modules/name-suggestion-index/config/matchGroups.json - var matchGroups_default = { - matchGroups: { - adult_gaming_centre: [ - "amenity/casino", - "amenity/gambling", - "leisure/adult_gaming_centre" - ], - beauty: [ - "shop/beauty", - "shop/hairdresser_supply" - ], - bed: [ - "shop/bed", - "shop/furniture" - ], - beverages: [ - "shop/alcohol", - "shop/beer", - "shop/beverages", - "shop/kiosk", - "shop/wine" - ], - camping: [ - "tourism/camp_site", - "tourism/caravan_site" - ], - car_parts: [ - "shop/car_parts", - "shop/car_repair", - "shop/tires", - "shop/tyres" - ], - clinic: [ - "amenity/clinic", - "amenity/doctors", - "healthcare/clinic", - "healthcare/laboratory", - "healthcare/physiotherapist", - "healthcare/sample_collection", - "healthcare/dialysis" - ], - convenience: [ - "shop/beauty", - "shop/chemist", - "shop/convenience", - "shop/cosmetics", - "shop/grocery", - "shop/kiosk", - "shop/newsagent", - "shop/perfumery" - ], - coworking: [ - "amenity/coworking_space", - "office/coworking", - "office/coworking_space" - ], - dentist: [ - "amenity/dentist", - "amenity/doctors", - "healthcare/dentist" - ], - electronics: [ - "office/telecommunication", - "shop/computer", - "shop/electronics", - "shop/hifi", - "shop/kiosk", - "shop/mobile", - "shop/mobile_phone", - "shop/telecommunication" - ], - fabric: [ - "shop/fabric", - "shop/haberdashery", - "shop/sewing" - ], - fashion: [ - "shop/accessories", - "shop/bag", - "shop/boutique", - "shop/clothes", - "shop/department_store", - "shop/fashion", - "shop/fashion_accessories", - "shop/sports", - "shop/shoes" - ], - financial: [ - "amenity/bank", - "office/accountant", - "office/financial", - "office/financial_advisor", - "office/tax_advisor", - "shop/tax" - ], - fitness: [ - "leisure/fitness_centre", - "leisure/fitness_center", - "leisure/sports_centre", - "leisure/sports_center" - ], - food: [ - "amenity/bar", - "amenity/cafe", - "amenity/fast_food", - "amenity/ice_cream", - "amenity/pub", - "amenity/restaurant", - "shop/bakery", - "shop/candy", - "shop/chocolate", - "shop/coffee", - "shop/confectionary", - "shop/confectionery", - "shop/food", - "shop/kiosk", - "shop/ice_cream", - "shop/pastry", - "shop/tea" - ], - fuel: [ - "amenity/fuel", - "shop/gas", - "shop/convenience;gas", - "shop/gas;convenience" - ], - gift: [ - "shop/gift", - "shop/card", - "shop/cards", - "shop/kiosk", - "shop/stationery" - ], - hardware: [ - "shop/bathroom_furnishing", - "shop/carpet", - "shop/diy", - "shop/doityourself", - "shop/doors", - "shop/electrical", - "shop/flooring", - "shop/hardware", - "shop/hardware_store", - "shop/power_tools", - "shop/tool_hire", - "shop/tools", - "shop/trade" - ], - health_food: [ - "shop/health", - "shop/health_food", - "shop/herbalist", - "shop/nutrition_supplements" - ], - hobby: [ - "shop/electronics", - "shop/hobby", - "shop/books", - "shop/games", - "shop/collector", - "shop/toys", - "shop/model", - "shop/video_games", - "shop/anime" - ], - hospital: [ - "amenity/doctors", - "amenity/hospital", - "healthcare/hospital" - ], - houseware: [ - "shop/houseware", - "shop/interior_decoration" - ], - lifeboat_station: [ - "amenity/lifeboat_station", - "emergency/lifeboat_station", - "emergency/marine_rescue" - ], - lodging: [ - "tourism/hotel", - "tourism/motel" - ], - money_transfer: [ - "amenity/money_transfer", - "shop/money_transfer" - ], - office_supplies: [ - "shop/office_supplies", - "shop/stationary", - "shop/stationery" - ], - outdoor: [ - "shop/clothes", - "shop/outdoor", - "shop/sports" - ], - parcel_locker: [ - "amenity/parcel_locker", - "amenity/vending_machine" - ], - pharmacy: [ - "amenity/doctors", - "amenity/pharmacy", - "healthcare/pharmacy" - ], - playground: [ - "amenity/theme_park", - "leisure/amusement_arcade", - "leisure/playground" - ], - rental: [ - "amenity/bicycle_rental", - "amenity/boat_rental", - "amenity/car_rental", - "amenity/truck_rental", - "amenity/vehicle_rental", - "shop/kiosk", - "shop/rental" - ], - school: [ - "amenity/childcare", - "amenity/college", - "amenity/kindergarten", - "amenity/language_school", - "amenity/prep_school", - "amenity/school", - "amenity/university" - ], - storage: [ - "shop/storage_units", - "shop/storage_rental" - ], - substation: [ - "power/station", - "power/substation", - "power/sub_station" - ], - supermarket: [ - "shop/food", - "shop/frozen_food", - "shop/greengrocer", - "shop/grocery", - "shop/supermarket", - "shop/wholesale" - ], - variety_store: [ - "shop/variety_store", - "shop/discount", - "shop/convenience" - ], - vending: [ - "amenity/vending_machine", - "shop/kiosk", - "shop/vending_machine" - ], - weight_loss: [ - "amenity/clinic", - "amenity/doctors", - "amenity/weight_clinic", - "healthcare/counselling", - "leisure/fitness_centre", - "office/therapist", - "shop/beauty", - "shop/diet", - "shop/food", - "shop/health_food", - "shop/herbalist", - "shop/nutrition", - "shop/nutrition_supplements", - "shop/weight_loss" - ], - wholesale: [ - "shop/wholesale", - "shop/supermarket", - "shop/department_store" - ] + function loadTile(which, url, tile) { + const cache = _mlyCache.requests; + const tileId = `${tile.id}-${which}`; + if (cache.loaded[tileId] || cache.inflight[tileId]) + return; + const controller = new AbortController(); + cache.inflight[tileId] = controller; + const requestUrl = url.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace("{z}", tile.xyz[2]); + fetch(requestUrl, { signal: controller.signal }).then(function(response) { + if (!response.ok) { + throw new Error(response.status + " " + response.statusText); + } + cache.loaded[tileId] = true; + delete cache.inflight[tileId]; + return response.arrayBuffer(); + }).then(function(data) { + if (!data) { + throw new Error("No Data"); + } + loadTileDataToCache(data, tile, which); + if (which === "images") { + dispatch5.call("loadedImages"); + } else if (which === "signs") { + dispatch5.call("loadedSigns"); + } else if (which === "points") { + dispatch5.call("loadedMapFeatures"); + } + }).catch(function() { + cache.loaded[tileId] = true; + delete cache.inflight[tileId]; + }); + } + function loadTileDataToCache(data, tile, which) { + const vectorTile = new import_vector_tile.VectorTile(new import_pbf.default(data)); + let features, cache, layer, i3, feature3, loc, d2; + if (vectorTile.layers.hasOwnProperty("image")) { + features = []; + cache = _mlyCache.images; + layer = vectorTile.layers.image; + for (i3 = 0; i3 < layer.length; i3++) { + feature3 = layer.feature(i3).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + loc = feature3.geometry.coordinates; + d2 = { + loc, + captured_at: feature3.properties.captured_at, + ca: feature3.properties.compass_angle, + id: feature3.properties.id, + is_pano: feature3.properties.is_pano, + sequence_id: feature3.properties.sequence_id + }; + cache.forImageId[d2.id] = d2; + features.push({ + minX: loc[0], + minY: loc[1], + maxX: loc[0], + maxY: loc[1], + data: d2 + }); + } + if (cache.rtree) { + cache.rtree.load(features); + } } - }; - - // node_modules/name-suggestion-index/config/genericWords.json - var genericWords_default = { - genericWords: [ - "^(barn|bazaa?r|bench|bou?tique|building|casa|church)$", - "^(baseball|basketball|football|soccer|softball|tennis(halle)?)\\s?(field|court)?$", - "^(club|green|out|ware)\\s?house$", - "^(driveway|el \xE1rbol|fountain|generic|golf|government|graveyard)$", - "^(fixme|n\\s?\\/?\\s?a|name|no\\s?name|none|null|temporary|test|unknown)$", - "^(hofladen|librairie|magazine?|maison)$", - "^(mobile home|skate)?\\s?park$", - "^(obuwie|pond|pool|sale|shops?|sklep|stores?)$", - "^\\?+$", - "^private$", - "^tattoo( studio)?$", - "^windmill$", - "^\u0446\u0435\u0440\u043A\u043E\u0432\u043D\u0430\u044F( \u043B\u0430\u0432\u043A\u0430)?$" - ] - }; - - // node_modules/name-suggestion-index/config/trees.json - var trees_default = { - trees: { - brands: { - emoji: "\u{1F354}", - mainTag: "brand:wikidata", - sourceTags: ["brand", "name"], - nameTags: { - primary: "^(name|name:\\w+)$", - alternate: "^(brand|brand:\\w+|operator|operator:\\w+|\\w+_name|\\w+_name:\\w+)$" + if (vectorTile.layers.hasOwnProperty("sequence")) { + features = []; + cache = _mlyCache.sequences; + layer = vectorTile.layers.sequence; + for (i3 = 0; i3 < layer.length; i3++) { + feature3 = layer.feature(i3).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + if (cache.lineString[feature3.properties.id]) { + cache.lineString[feature3.properties.id].push(feature3); + } else { + cache.lineString[feature3.properties.id] = [feature3]; } - }, - flags: { - emoji: "\u{1F6A9}", - mainTag: "flag:wikidata", - nameTags: { - primary: "^(flag:name|flag:name:\\w+)$", - alternate: "^(country|country:\\w+|flag|flag:\\w+|subject|subject:\\w+)$" + } + } + if (vectorTile.layers.hasOwnProperty("point")) { + features = []; + cache = _mlyCache[which]; + layer = vectorTile.layers.point; + for (i3 = 0; i3 < layer.length; i3++) { + feature3 = layer.feature(i3).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + loc = feature3.geometry.coordinates; + d2 = { + loc, + id: feature3.properties.id, + first_seen_at: feature3.properties.first_seen_at, + last_seen_at: feature3.properties.last_seen_at, + value: feature3.properties.value + }; + features.push({ + minX: loc[0], + minY: loc[1], + maxX: loc[0], + maxY: loc[1], + data: d2 + }); + } + if (cache.rtree) { + cache.rtree.load(features); + } + } + if (vectorTile.layers.hasOwnProperty("traffic_sign")) { + features = []; + cache = _mlyCache[which]; + layer = vectorTile.layers.traffic_sign; + for (i3 = 0; i3 < layer.length; i3++) { + feature3 = layer.feature(i3).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + loc = feature3.geometry.coordinates; + d2 = { + loc, + id: feature3.properties.id, + first_seen_at: feature3.properties.first_seen_at, + last_seen_at: feature3.properties.last_seen_at, + value: feature3.properties.value + }; + features.push({ + minX: loc[0], + minY: loc[1], + maxX: loc[0], + maxY: loc[1], + data: d2 + }); + } + if (cache.rtree) { + cache.rtree.load(features); + } + } + } + function loadData(url) { + return fetch(url).then(function(response) { + if (!response.ok) { + throw new Error(response.status + " " + response.statusText); + } + return response.json(); + }).then(function(result) { + if (!result) { + return []; + } + return result.data || []; + }); + } + function partitionViewport(projection2) { + const z2 = geoScaleToZoom(projection2.scale()); + const z22 = Math.ceil(z2 * 2) / 2 + 2.5; + const tiler9 = utilTiler().zoomExtent([z22, z22]); + return tiler9.getTiles(projection2).map(function(tile) { + return tile.extent; + }); + } + function searchLimited(limit, projection2, rtree) { + limit = limit || 5; + return partitionViewport(projection2).reduce(function(result, extent) { + const found = rtree.search(extent.bbox()).slice(0, limit).map(function(d2) { + return d2.data; + }); + return found.length ? result.concat(found) : result; + }, []); + } + var mapillary_default = { + // Initialize Mapillary + init: function() { + if (!_mlyCache) { + this.reset(); + } + this.event = utilRebind(this, dispatch5, "on"); + }, + // Reset cache and state + reset: function() { + if (_mlyCache) { + Object.values(_mlyCache.requests.inflight).forEach(function(request3) { + request3.abort(); + }); + } + _mlyCache = { + images: { rtree: new import_rbush4.default(), forImageId: {} }, + image_detections: { forImageId: {} }, + signs: { rtree: new import_rbush4.default() }, + points: { rtree: new import_rbush4.default() }, + sequences: { rtree: new import_rbush4.default(), lineString: {} }, + requests: { loaded: {}, inflight: {} } + }; + _mlyActiveImage = null; + }, + // Get visible images + images: function(projection2) { + const limit = 5; + return searchLimited(limit, projection2, _mlyCache.images.rtree); + }, + // Get visible traffic signs + signs: function(projection2) { + const limit = 5; + return searchLimited(limit, projection2, _mlyCache.signs.rtree); + }, + // Get visible map (point) features + mapFeatures: function(projection2) { + const limit = 5; + return searchLimited(limit, projection2, _mlyCache.points.rtree); + }, + // Get cached image by id + cachedImage: function(imageId) { + return _mlyCache.images.forImageId[imageId]; + }, + // Get visible sequences + sequences: function(projection2) { + const viewport = projection2.clipExtent(); + const min3 = [viewport[0][0], viewport[1][1]]; + const max3 = [viewport[1][0], viewport[0][1]]; + const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox(); + const sequenceIds = {}; + let lineStrings = []; + _mlyCache.images.rtree.search(bbox2).forEach(function(d2) { + if (d2.data.sequence_id) { + sequenceIds[d2.data.sequence_id] = true; } - }, - operators: { - emoji: "\u{1F4BC}", - mainTag: "operator:wikidata", - sourceTags: ["operator"], - nameTags: { - primary: "^(name|name:\\w+|operator|operator:\\w+)$", - alternate: "^(brand|brand:\\w+|\\w+_name|\\w+_name:\\w+)$" + }); + Object.keys(sequenceIds).forEach(function(sequenceId) { + if (_mlyCache.sequences.lineString[sequenceId]) { + lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]); } - }, - transit: { - emoji: "\u{1F687}", - mainTag: "network:wikidata", - sourceTags: ["network"], - nameTags: { - primary: "^network$", - alternate: "^(operator|operator:\\w+|network:\\w+|\\w+_name|\\w+_name:\\w+)$" + }); + return lineStrings; + }, + // Load images in the visible area + loadImages: function(projection2) { + loadTiles("images", tileUrl, 14, projection2); + }, + // Load traffic signs in the visible area + loadSigns: function(projection2) { + loadTiles("signs", trafficSignTileUrl, 14, projection2); + }, + // Load map (point) features in the visible area + loadMapFeatures: function(projection2) { + loadTiles("points", mapFeatureTileUrl, 14, projection2); + }, + // Return a promise that resolves when the image viewer (Mapillary JS) library has finished loading + ensureViewerLoaded: function(context) { + if (_loadViewerPromise) + return _loadViewerPromise; + const wrap2 = context.container().select(".photoviewer").selectAll(".mly-wrapper").data([0]); + wrap2.enter().append("div").attr("id", "ideditor-mly").attr("class", "photo-wrapper mly-wrapper").classed("hide", true); + const that = this; + _loadViewerPromise = new Promise((resolve, reject) => { + let loadedCount = 0; + function loaded() { + loadedCount += 1; + if (loadedCount === 2) + resolve(); + } + const head = select_default2("head"); + head.selectAll("#ideditor-mapillary-viewercss").data([0]).enter().append("link").attr("id", "ideditor-mapillary-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(viewercss)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() { + reject(); + }); + head.selectAll("#ideditor-mapillary-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-mapillary-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(viewerjs)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() { + reject(); + }); + }).catch(function() { + _loadViewerPromise = null; + }).then(function() { + that.initViewer(context); + }); + return _loadViewerPromise; + }, + // Load traffic sign image sprites + loadSignResources: function(context) { + context.ui().svgDefs.addSprites( + ["mapillary-sprite"], + false + /* don't override colors */ + ); + return this; + }, + // Load map (point) feature image sprites + loadObjectResources: function(context) { + context.ui().svgDefs.addSprites( + ["mapillary-object-sprite"], + false + /* don't override colors */ + ); + return this; + }, + // Remove previous detections in image viewer + resetTags: function() { + if (_mlyViewer && !_mlyFallback) { + _mlyViewer.getComponent("tag").removeAll(); + } + }, + // Show map feature detections in image viewer + showFeatureDetections: function(value) { + _mlyShowFeatureDetections = value; + if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) { + this.resetTags(); + } + }, + // Show traffic sign detections in image viewer + showSignDetections: function(value) { + _mlyShowSignDetections = value; + if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) { + this.resetTags(); + } + }, + // Apply filter to image viewer + filterViewer: function(context) { + const showsPano = context.photos().showsPanoramic(); + const showsFlat = context.photos().showsFlat(); + const fromDate = context.photos().fromDate(); + const toDate = context.photos().toDate(); + const filter2 = ["all"]; + if (!showsPano) + filter2.push(["!=", "cameraType", "spherical"]); + if (!showsFlat && showsPano) + filter2.push(["==", "pano", true]); + if (fromDate) { + filter2.push([">=", "capturedAt", new Date(fromDate).getTime()]); + } + if (toDate) { + filter2.push([">=", "capturedAt", new Date(toDate).getTime()]); + } + if (_mlyViewer) { + _mlyViewer.setFilter(filter2); + } + _mlyViewerFilter = filter2; + return filter2; + }, + // Make the image viewer visible + showViewer: function(context) { + const wrap2 = context.container().select(".photoviewer").classed("hide", false); + const isHidden = wrap2.selectAll(".photo-wrapper.mly-wrapper.hide").size(); + if (isHidden && _mlyViewer) { + wrap2.selectAll(".photo-wrapper:not(.mly-wrapper)").classed("hide", true); + wrap2.selectAll(".photo-wrapper.mly-wrapper").classed("hide", false); + _mlyViewer.resize(); + } + return this; + }, + // Hide the image viewer and resets map markers + hideViewer: function(context) { + _mlyActiveImage = null; + if (!_mlyFallback && _mlyViewer) { + _mlyViewer.getComponent("sequence").stop(); + } + const viewer = context.container().select(".photoviewer"); + if (!viewer.empty()) + viewer.datum(null); + viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true); + this.updateUrlImage(null); + dispatch5.call("imageChanged"); + dispatch5.call("loadedMapFeatures"); + dispatch5.call("loadedSigns"); + return this.setStyles(context, null); + }, + // Update the URL with current image id + updateUrlImage: function(imageId) { + if (!window.mocha) { + const hash = utilStringQs(window.location.hash); + if (imageId) { + hash.photo = "mapillary/" + imageId; + } else { + delete hash.photo; } + window.location.replace("#" + utilQsString(hash, true)); } - } - }; - - // node_modules/name-suggestion-index/lib/matcher.js - var matchGroups = matchGroups_default.matchGroups; - var trees = trees_default.trees; - var Matcher = class { - constructor() { - this.matchIndex = void 0; - this.genericWords = /* @__PURE__ */ new Map(); - (genericWords_default.genericWords || []).forEach((s) => this.genericWords.set(s, new RegExp(s, "i"))); - this.itemLocation = void 0; - this.locationSets = void 0; - this.locationIndex = void 0; - this.warnings = []; - } - buildMatchIndex(data) { + }, + // Highlight the detection in the viewer that is related to the clicked map feature + highlightDetection: function(detection) { + if (detection) { + _mlyHighlightedDetection = detection.id; + } + return this; + }, + // Initialize image viewer (Mapillar JS) + initViewer: function(context) { const that = this; - if (that.matchIndex) + if (!window.mapillary) return; - that.matchIndex = /* @__PURE__ */ new Map(); - const seenTree = /* @__PURE__ */ new Map(); - Object.keys(data).forEach((tkv) => { - const category = data[tkv]; - const parts = tkv.split("/", 3); - const t = parts[0]; - const k = parts[1]; - const v = parts[2]; - const thiskv = `${k}/${v}`; - const tree = trees[t]; - let branch = that.matchIndex.get(thiskv); - if (!branch) { - branch = { - primary: /* @__PURE__ */ new Map(), - alternate: /* @__PURE__ */ new Map(), - excludeGeneric: /* @__PURE__ */ new Map(), - excludeNamed: /* @__PURE__ */ new Map() - }; - that.matchIndex.set(thiskv, branch); + const opts = { + accessToken, + component: { + cover: false, + keyboard: false, + tag: true + }, + container: "ideditor-mly" + }; + if (!mapillary.isSupported() && mapillary.isFallbackSupported()) { + _mlyFallback = true; + opts.component = { + cover: false, + direction: false, + imagePlane: false, + keyboard: false, + mouse: false, + sequence: false, + tag: false, + image: true, + // fallback + navigation: true + // fallback + }; + } + _mlyViewer = new mapillary.Viewer(opts); + _mlyViewer.on("image", imageChanged); + _mlyViewer.on("bearing", bearingChanged); + if (_mlyViewerFilter) { + _mlyViewer.setFilter(_mlyViewerFilter); + } + context.ui().photoviewer.on("resize.mapillary", function() { + if (_mlyViewer) + _mlyViewer.resize(); + }); + function imageChanged(node) { + that.resetTags(); + const image = node.image; + that.setActiveImage(image); + that.setStyles(context, null); + const loc = [image.originalLngLat.lng, image.originalLngLat.lat]; + context.map().centerEase(loc); + that.updateUrlImage(image.id); + if (_mlyShowFeatureDetections || _mlyShowSignDetections) { + that.updateDetections(image.id, `${apiUrl}/${image.id}/detections?access_token=${accessToken}&fields=id,image,geometry,value`); } - const properties = category.properties || {}; - const exclude = properties.exclude || {}; - (exclude.generic || []).forEach((s) => branch.excludeGeneric.set(s, new RegExp(s, "i"))); - (exclude.named || []).forEach((s) => branch.excludeNamed.set(s, new RegExp(s, "i"))); - const excludeRegexes = [...branch.excludeGeneric.values(), ...branch.excludeNamed.values()]; - let items = category.items; - if (!Array.isArray(items) || !items.length) - return; - const primaryName = new RegExp(tree.nameTags.primary, "i"); - const alternateName = new RegExp(tree.nameTags.alternate, "i"); - const notName = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i; - const skipGenericKV = skipGenericKVMatches(t, k, v); - const genericKV = /* @__PURE__ */ new Set([`${k}/yes`, `building/yes`]); - const matchGroupKV = /* @__PURE__ */ new Set(); - Object.values(matchGroups).forEach((matchGroup) => { - const inGroup = matchGroup.some((otherkv) => otherkv === thiskv); - if (!inGroup) - return; - matchGroup.forEach((otherkv) => { - if (otherkv === thiskv) - return; - matchGroupKV.add(otherkv); - const otherk = otherkv.split("/", 2)[0]; - genericKV.add(`${otherk}/yes`); - }); + dispatch5.call("imageChanged"); + } + function bearingChanged(e3) { + dispatch5.call("bearingChanged", void 0, e3); + } + }, + // Move to an image + selectImage: function(context, imageId) { + if (_mlyViewer && imageId) { + _mlyViewer.moveTo(imageId).catch(function(e3) { + console.error("mly3", e3); }); - items.forEach((item) => { - if (!item.id) - return; - if (Array.isArray(item.matchTags) && item.matchTags.length) { - item.matchTags = item.matchTags.filter((matchTag) => !matchGroupKV.has(matchTag) && !genericKV.has(matchTag)); - if (!item.matchTags.length) - delete item.matchTags; - } - let kvTags = [`${thiskv}`].concat(item.matchTags || []); - if (!skipGenericKV) { - kvTags = kvTags.concat(Array.from(genericKV)); - } - Object.keys(item.tags).forEach((osmkey) => { - if (notName.test(osmkey)) - return; - const osmvalue = item.tags[osmkey]; - if (!osmvalue || excludeRegexes.some((regex) => regex.test(osmvalue))) - return; - if (primaryName.test(osmkey)) { - kvTags.forEach((kv) => insertName("primary", t, kv, simplify(osmvalue), item.id)); - } else if (alternateName.test(osmkey)) { - kvTags.forEach((kv) => insertName("alternate", t, kv, simplify(osmvalue), item.id)); - } - }); - let keepMatchNames = /* @__PURE__ */ new Set(); - (item.matchNames || []).forEach((matchName) => { - const nsimple = simplify(matchName); - kvTags.forEach((kv) => { - const branch2 = that.matchIndex.get(kv); - const primaryLeaf = branch2 && branch2.primary.get(nsimple); - const alternateLeaf = branch2 && branch2.alternate.get(nsimple); - const inPrimary = primaryLeaf && primaryLeaf.has(item.id); - const inAlternate = alternateLeaf && alternateLeaf.has(item.id); - if (!inPrimary && !inAlternate) { - insertName("alternate", t, kv, nsimple, item.id); - keepMatchNames.add(matchName); - } + } + return this; + }, + // Return the currently displayed image + getActiveImage: function() { + return _mlyActiveImage; + }, + // Return a list of detection objects for the given id + getDetections: function(id2) { + return loadData(`${apiUrl}/${id2}/detections?access_token=${accessToken}&fields=id,value,image`); + }, + // Set the currently visible image + setActiveImage: function(image) { + if (image) { + _mlyActiveImage = { + ca: image.originalCompassAngle, + id: image.id, + loc: [image.originalLngLat.lng, image.originalLngLat.lat], + is_pano: image.cameraType === "spherical", + sequence_id: image.sequenceId + }; + } else { + _mlyActiveImage = null; + } + }, + // Update the currently highlighted sequence and selected bubble. + setStyles: function(context, hovered) { + const hoveredImageId = hovered && hovered.id; + const hoveredSequenceId = hovered && hovered.sequence_id; + const selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id; + context.container().selectAll(".layer-mapillary .viewfield-group").classed("highlighted", function(d2) { + return d2.sequence_id === selectedSequenceId || d2.id === hoveredImageId; + }).classed("hovered", function(d2) { + return d2.id === hoveredImageId; + }); + context.container().selectAll(".layer-mapillary .sequence").classed("highlighted", function(d2) { + return d2.properties.id === hoveredSequenceId; + }).classed("currentView", function(d2) { + return d2.properties.id === selectedSequenceId; + }); + return this; + }, + // Get detections for the current image and shows them in the image viewer + updateDetections: function(imageId, url) { + if (!_mlyViewer || _mlyFallback) + return; + if (!imageId) + return; + const cache = _mlyCache.image_detections; + if (cache.forImageId[imageId]) { + showDetections(_mlyCache.image_detections.forImageId[imageId]); + } else { + loadData(url).then((detections) => { + detections.forEach(function(detection) { + if (!cache.forImageId[imageId]) { + cache.forImageId[imageId] = []; + } + cache.forImageId[imageId].push({ + geometry: detection.geometry, + id: detection.id, + image_id: imageId, + value: detection.value }); }); - if (keepMatchNames.size) { - item.matchNames = Array.from(keepMatchNames); - } else { - delete item.matchNames; + showDetections(_mlyCache.image_detections.forImageId[imageId] || []); + }); + } + function showDetections(detections) { + const tagComponent = _mlyViewer.getComponent("tag"); + detections.forEach(function(data) { + const tag = makeTag(data); + if (tag) { + tagComponent.add([tag]); } }); - }); - function insertName(which, t, kv, nsimple, itemID) { - if (!nsimple) { - that.warnings.push(`Warning: skipping empty ${which} name for item ${t}/${kv}: ${itemID}`); + } + function makeTag(data) { + const valueParts = data.value.split("--"); + if (!valueParts.length) return; + let tag; + let text2; + let color2 = 16777215; + if (_mlyHighlightedDetection === data.id) { + color2 = 16776960; + text2 = valueParts[1]; + if (text2 === "flat" || text2 === "discrete" || text2 === "sign") { + text2 = valueParts[2]; + } + text2 = text2.replace(/-/g, " "); + text2 = text2.charAt(0).toUpperCase() + text2.slice(1); + _mlyHighlightedDetection = null; } - let branch = that.matchIndex.get(kv); - if (!branch) { - branch = { - primary: /* @__PURE__ */ new Map(), - alternate: /* @__PURE__ */ new Map(), - excludeGeneric: /* @__PURE__ */ new Map(), - excludeNamed: /* @__PURE__ */ new Map() - }; - that.matchIndex.set(kv, branch); - } - let leaf = branch[which].get(nsimple); - if (!leaf) { - leaf = /* @__PURE__ */ new Set(); - branch[which].set(nsimple, leaf); + var decodedGeometry = window.atob(data.geometry); + var uintArray = new Uint8Array(decodedGeometry.length); + for (var i3 = 0; i3 < decodedGeometry.length; i3++) { + uintArray[i3] = decodedGeometry.charCodeAt(i3); } - leaf.add(itemID); - if (!/yes$/.test(kv)) { - const kvnsimple = `${kv}/${nsimple}`; - const existing = seenTree.get(kvnsimple); - if (existing && existing !== t) { - const items = Array.from(leaf); - that.warnings.push(`Duplicate cache key "${kvnsimple}" in trees "${t}" and "${existing}", check items: ${items}`); - return; + const tile = new import_vector_tile.VectorTile(new import_pbf.default(uintArray.buffer)); + const layer = tile.layers["mpy-or"]; + const geometries = layer.feature(0).loadGeometry(); + const polygon2 = geometries.map((ring) => ring.map((point2) => [point2.x / layer.extent, point2.y / layer.extent])); + tag = new mapillary.OutlineTag( + data.id, + new mapillary.PolygonGeometry(polygon2[0]), + { + text: text2, + textColor: color2, + lineColor: color2, + lineWidth: 2, + fillColor: color2, + fillOpacity: 0.3 } - seenTree.set(kvnsimple, t); - } - } - function skipGenericKVMatches(t, k, v) { - return t === "flags" || t === "transit" || k === "landuse" || v === "atm" || v === "bicycle_parking" || v === "car_sharing" || v === "caravan_site" || v === "charging_station" || v === "dog_park" || v === "parking" || v === "phone" || v === "playground" || v === "post_box" || v === "public_bookcase" || v === "recycling" || v === "vending_machine"; + ); + return tag; } + }, + // Return the current cache + cache: function() { + return _mlyCache; } - buildLocationIndex(data, loco) { - const that = this; - if (that.locationIndex) - return; - that.itemLocation = /* @__PURE__ */ new Map(); - that.locationSets = /* @__PURE__ */ new Map(); - Object.keys(data).forEach((tkv) => { - const items = data[tkv].items; - if (!Array.isArray(items) || !items.length) - return; - items.forEach((item) => { - if (that.itemLocation.has(item.id)) - return; - let resolved; - try { - resolved = loco.resolveLocationSet(item.locationSet); - } catch (err) { - console.warn(`buildLocationIndex: ${err.message}`); - } - if (!resolved || !resolved.id) - return; - that.itemLocation.set(item.id, resolved.id); - if (that.locationSets.has(resolved.id)) - return; - let feature3 = _cloneDeep2(resolved.feature); - feature3.id = resolved.id; - feature3.properties.id = resolved.id; - if (!feature3.geometry.coordinates.length || !feature3.properties.area) { - console.warn(`buildLocationIndex: locationSet ${resolved.id} for ${item.id} resolves to an empty feature:`); - console.warn(JSON.stringify(feature3)); - return; - } - that.locationSets.set(resolved.id, feature3); - }); - }); - that.locationIndex = (0, import_which_polygon3.default)({ type: "FeatureCollection", features: [...that.locationSets.values()] }); - function _cloneDeep2(obj) { - return JSON.parse(JSON.stringify(obj)); + }; + + // modules/core/validation/models.js + function validationIssue(attrs) { + this.type = attrs.type; + this.subtype = attrs.subtype; + this.severity = attrs.severity; + this.message = attrs.message; + this.reference = attrs.reference; + this.entityIds = attrs.entityIds; + this.loc = attrs.loc; + this.data = attrs.data; + this.dynamicFixes = attrs.dynamicFixes; + this.hash = attrs.hash; + this.id = generateID.apply(this); + this.key = generateKey.apply(this); + this.autoFix = null; + function generateID() { + var parts = [this.type]; + if (this.hash) { + parts.push(this.hash); + } + if (this.subtype) { + parts.push(this.subtype); } + if (this.entityIds) { + var entityKeys = this.entityIds.slice().sort(); + parts.push.apply(parts, entityKeys); + } + return parts.join(":"); } - match(k, v, n2, loc) { - const that = this; - if (!that.matchIndex) { - throw new Error("match: matchIndex not built."); + function generateKey() { + return this.id + ":" + Date.now().toString(); + } + this.extent = function(resolver) { + if (this.loc) { + return geoExtent(this.loc); } - let matchLocations; - if (Array.isArray(loc) && that.locationIndex) { - matchLocations = that.locationIndex([loc[0], loc[1], loc[0], loc[1]], true); + if (this.entityIds && this.entityIds.length) { + return this.entityIds.reduce(function(extent, entityId) { + return extent.extend(resolver.entity(entityId).extent(resolver)); + }, geoExtent()); } - const nsimple = simplify(n2); - let seen = /* @__PURE__ */ new Set(); - let results = []; - gatherResults("primary"); - gatherResults("alternate"); - if (results.length) - return results; - gatherResults("exclude"); - return results.length ? results : null; - function gatherResults(which) { - const kv = `${k}/${v}`; - let didMatch = tryMatch(which, kv); - if (didMatch) - return; - for (let mg in matchGroups) { - const matchGroup = matchGroups[mg]; - const inGroup = matchGroup.some((otherkv) => otherkv === kv); - if (!inGroup) - continue; - for (let i2 = 0; i2 < matchGroup.length; i2++) { - const otherkv = matchGroup[i2]; - if (otherkv === kv) - continue; - didMatch = tryMatch(which, otherkv); - if (didMatch) - return; - } - } - if (which === "exclude") { - const regex = [...that.genericWords.values()].find((regex2) => regex2.test(n2)); - if (regex) { - results.push({ match: "excludeGeneric", pattern: String(regex) }); - return; + return null; + }; + this.fixes = function(context) { + var fixes = this.dynamicFixes ? this.dynamicFixes(context) : []; + var issue = this; + if (issue.severity === "warning") { + fixes.push(new validationIssueFix({ + title: _t.append("issues.fix.ignore_issue.title"), + icon: "iD-icon-close", + onClick: function() { + context.validator().ignoreIssue(this.issue.id); } + })); + } + fixes.forEach(function(fix) { + fix.id = fix.title.stringId; + fix.issue = issue; + if (fix.autoArgs) { + issue.autoFix = fix; } + }); + return fixes; + }; + } + function validationIssueFix(attrs) { + this.title = attrs.title; + this.onClick = attrs.onClick; + this.disabledReason = attrs.disabledReason; + this.icon = attrs.icon; + this.entityIds = attrs.entityIds || []; + this.autoArgs = attrs.autoArgs; + this.issue = null; + } + + // modules/services/maprules.js + var buildRuleChecks = function() { + return { + equals: function(equals) { + return function(tags) { + return Object.keys(equals).every(function(k2) { + return equals[k2] === tags[k2]; + }); + }; + }, + notEquals: function(notEquals) { + return function(tags) { + return Object.keys(notEquals).some(function(k2) { + return notEquals[k2] !== tags[k2]; + }); + }; + }, + absence: function(absence) { + return function(tags) { + return Object.keys(tags).indexOf(absence) === -1; + }; + }, + presence: function(presence) { + return function(tags) { + return Object.keys(tags).indexOf(presence) > -1; + }; + }, + greaterThan: function(greaterThan) { + var key = Object.keys(greaterThan)[0]; + var value = greaterThan[key]; + return function(tags) { + return tags[key] > value; + }; + }, + greaterThanEqual: function(greaterThanEqual) { + var key = Object.keys(greaterThanEqual)[0]; + var value = greaterThanEqual[key]; + return function(tags) { + return tags[key] >= value; + }; + }, + lessThan: function(lessThan) { + var key = Object.keys(lessThan)[0]; + var value = lessThan[key]; + return function(tags) { + return tags[key] < value; + }; + }, + lessThanEqual: function(lessThanEqual) { + var key = Object.keys(lessThanEqual)[0]; + var value = lessThanEqual[key]; + return function(tags) { + return tags[key] <= value; + }; + }, + positiveRegex: function(positiveRegex) { + var tagKey = Object.keys(positiveRegex)[0]; + var expression = positiveRegex[tagKey].join("|"); + var regex = new RegExp(expression); + return function(tags) { + return regex.test(tags[tagKey]); + }; + }, + negativeRegex: function(negativeRegex) { + var tagKey = Object.keys(negativeRegex)[0]; + var expression = negativeRegex[tagKey].join("|"); + var regex = new RegExp(expression); + return function(tags) { + return !regex.test(tags[tagKey]); + }; } - function tryMatch(which, kv) { - const branch = that.matchIndex.get(kv); - if (!branch) - return; - if (which === "exclude") { - let regex = [...branch.excludeNamed.values()].find((regex2) => regex2.test(n2)); - if (regex) { - results.push({ match: "excludeNamed", pattern: String(regex), kv }); - return; - } - regex = [...branch.excludeGeneric.values()].find((regex2) => regex2.test(n2)); - if (regex) { - results.push({ match: "excludeGeneric", pattern: String(regex), kv }); - return; - } - return; + }; + }; + var buildLineKeys = function() { + return { + highway: { + rest_area: true, + services: true + }, + railway: { + roundhouse: true, + station: true, + traverser: true, + turntable: true, + wash: true + } + }; + }; + var maprules_default = { + init: function() { + this._ruleChecks = buildRuleChecks(); + this._validationRules = []; + this._areaKeys = osmAreaKeys; + this._lineKeys = buildLineKeys(); + }, + // list of rules only relevant to tag checks... + filterRuleChecks: function(selector) { + var _ruleChecks = this._ruleChecks; + return Object.keys(selector).reduce(function(rules, key) { + if (["geometry", "error", "warning"].indexOf(key) === -1) { + rules.push(_ruleChecks[key](selector[key])); } - const leaf = branch[which].get(nsimple); - if (!leaf || !leaf.size) - return; - let hits = Array.from(leaf).map((itemID) => { - let area = Infinity; - if (that.itemLocation && that.locationSets) { - const location = that.locationSets.get(that.itemLocation.get(itemID)); - area = location && location.properties.area || Infinity; - } - return { match: which, itemID, area, kv, nsimple }; + return rules; + }, []); + }, + // builds tagMap from mapcss-parse selector object... + buildTagMap: function(selector) { + var getRegexValues = function(regexes) { + return regexes.map(function(regex) { + return regex.replace(/\$|\^/g, ""); }); - let sortFn = byAreaDescending; - if (matchLocations) { - hits = hits.filter(isValidLocation); - sortFn = byAreaAscending; + }; + var tagMap = Object.keys(selector).reduce(function(expectedTags, key) { + var values; + var isRegex = /regex/gi.test(key); + var isEqual4 = /equals/gi.test(key); + if (isRegex || isEqual4) { + Object.keys(selector[key]).forEach(function(selectorKey) { + values = isEqual4 ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]); + if (expectedTags.hasOwnProperty(selectorKey)) { + values = values.concat(expectedTags[selectorKey]); + } + expectedTags[selectorKey] = values; + }); + } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) { + var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0]; + values = [selector[key][tagKey]]; + if (expectedTags.hasOwnProperty(tagKey)) { + values = values.concat(expectedTags[tagKey]); + } + expectedTags[tagKey] = values; } - if (!hits.length) - return; - hits.sort(sortFn).forEach((hit) => { - if (seen.has(hit.itemID)) - return; - seen.add(hit.itemID); - results.push(hit); - }); - return true; - function isValidLocation(hit) { - if (!that.itemLocation) - return true; - return matchLocations.find((props) => props.id === that.itemLocation.get(hit.itemID)); + return expectedTags; + }, {}); + return tagMap; + }, + // inspired by osmWay#isArea() + inferGeometry: function(tagMap) { + var _lineKeys = this._lineKeys; + var _areaKeys = this._areaKeys; + var keyValueDoesNotImplyArea = function(key2) { + return utilArrayIntersection(tagMap[key2], Object.keys(_areaKeys[key2])).length > 0; + }; + var keyValueImpliesLine = function(key2) { + return utilArrayIntersection(tagMap[key2], Object.keys(_lineKeys[key2])).length > 0; + }; + if (tagMap.hasOwnProperty("area")) { + if (tagMap.area.indexOf("yes") > -1) { + return "area"; } - function byAreaAscending(hitA, hitB) { - return hitA.area - hitB.area; + if (tagMap.area.indexOf("no") > -1) { + return "line"; } - function byAreaDescending(hitA, hitB) { - return hitB.area - hitA.area; + } + for (var key in tagMap) { + if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) { + return "area"; + } + if (key in _lineKeys && keyValueImpliesLine(key)) { + return "area"; } } - } - getWarnings() { - return this.warnings; + return "line"; + }, + // adds from mapcss-parse selector check... + addRule: function(selector) { + var rule = { + // checks relevant to mapcss-selector + checks: this.filterRuleChecks(selector), + // true if all conditions for a tag error are true.. + matches: function(entity) { + return this.checks.every(function(check) { + return check(entity.tags); + }); + }, + // borrowed from Way#isArea() + inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys), + geometryMatches: function(entity, graph) { + if (entity.type === "node" || entity.type === "relation") { + return selector.geometry === entity.type; + } else if (entity.type === "way") { + return this.inferredGeometry === entity.geometry(graph); + } + }, + // when geometries match and tag matches are present, return a warning... + findIssues: function(entity, graph, issues) { + if (this.geometryMatches(entity, graph) && this.matches(entity)) { + var severity = Object.keys(selector).indexOf("error") > -1 ? "error" : "warning"; + var message = selector[severity]; + issues.push(new validationIssue({ + type: "maprules", + severity, + message: function() { + return message; + }, + entityIds: [entity.id] + })); + } + } + }; + this._validationRules.push(rule); + }, + clearRules: function() { + this._validationRules = []; + }, + // returns validationRules... + validationRules: function() { + return this._validationRules; + }, + // returns ruleChecks + ruleChecks: function() { + return this._ruleChecks; } }; - // modules/services/nsi.js - var import_vparse2 = __toESM(require_vparse()); + // modules/services/nominatim.js + var import_rbush7 = __toESM(require_rbush_min()); // modules/core/difference.js var import_fast_deep_equal3 = __toESM(require_fast_deep_equal()); @@ -38652,47 +40199,47 @@ ${content} var _didChange = {}; var _diff = {}; function checkEntityID(id2) { - var h = head.entities[id2]; - var b = base.entities[id2]; - if (h === b) + var h2 = head.entities[id2]; + var b2 = base.entities[id2]; + if (h2 === b2) return; if (_changes[id2]) return; - if (!h && b) { - _changes[id2] = { base: b, head: h }; + if (!h2 && b2) { + _changes[id2] = { base: b2, head: h2 }; _didChange.deletion = true; return; } - if (h && !b) { - _changes[id2] = { base: b, head: h }; + if (h2 && !b2) { + _changes[id2] = { base: b2, head: h2 }; _didChange.addition = true; return; } - if (h && b) { - if (h.members && b.members && !(0, import_fast_deep_equal3.default)(h.members, b.members)) { - _changes[id2] = { base: b, head: h }; + if (h2 && b2) { + if (h2.members && b2.members && !(0, import_fast_deep_equal3.default)(h2.members, b2.members)) { + _changes[id2] = { base: b2, head: h2 }; _didChange.geometry = true; _didChange.properties = true; return; } - if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) { - _changes[id2] = { base: b, head: h }; + if (h2.loc && b2.loc && !geoVecEqual(h2.loc, b2.loc)) { + _changes[id2] = { base: b2, head: h2 }; _didChange.geometry = true; } - if (h.nodes && b.nodes && !(0, import_fast_deep_equal3.default)(h.nodes, b.nodes)) { - _changes[id2] = { base: b, head: h }; + if (h2.nodes && b2.nodes && !(0, import_fast_deep_equal3.default)(h2.nodes, b2.nodes)) { + _changes[id2] = { base: b2, head: h2 }; _didChange.geometry = true; } - if (h.tags && b.tags && !(0, import_fast_deep_equal3.default)(h.tags, b.tags)) { - _changes[id2] = { base: b, head: h }; + if (h2.tags && b2.tags && !(0, import_fast_deep_equal3.default)(h2.tags, b2.tags)) { + _changes[id2] = { base: b2, head: h2 }; _didChange.properties = true; } } } function load() { var ids = utilArrayUniq(Object.keys(head.entities).concat(Object.keys(base.entities))); - for (var i2 = 0; i2 < ids.length; i2++) { - checkEntityID(ids[i2]); + for (var i3 = 0; i3 < ids.length; i3++) { + checkEntityID(ids[i3]); } } load(); @@ -38709,15 +40256,15 @@ ${content} if (_changes[id2].head) { result.add(id2); } - var h = _changes[id2].head; - var b = _changes[id2].base; - var entity = h || b; + var h2 = _changes[id2].head; + var b2 = _changes[id2].base; + var entity = h2 || b2; if (includeRelMembers && entity.type === "relation") { - var mh = h ? h.members.map(function(m) { - return m.id; + var mh = h2 ? h2.members.map(function(m2) { + return m2.id; }) : []; - var mb = b ? b.members.map(function(m) { - return m.id; + var mb = b2 ? b2.members.map(function(m2) { + return m2.id; }) : []; utilArrayUnion(mh, mb).forEach(function(memberID) { if (head.hasEntity(memberID)) { @@ -38757,9 +40304,9 @@ ${content} }; _diff.summary = function summary() { var relevant = {}; - var keys = Object.keys(_changes); - for (var i2 = 0; i2 < keys.length; i2++) { - var change = _changes[keys[i2]]; + var keys2 = Object.keys(_changes); + for (var i3 = 0; i3 < keys2.length; i3++) { + var change = _changes[keys2[i3]]; if (change.head && change.head.geometry(head) !== "vertex") { addEntity(change.head, head, change.base ? "modified" : "created"); } else if (change.base && change.base.geometry(base) !== "vertex") { @@ -38789,8 +40336,8 @@ ${content} } function addParents(entity) { var parents = head.parentWays(entity); - for (var j2 = parents.length - 1; j2 >= 0; j2--) { - var parent = parents[j2]; + for (var j3 = parents.length - 1; j3 >= 0; j3--) { + var parent = parents[j3]; if (!(parent.id in relevant)) { addEntity(parent, head, "modified"); } @@ -38802,42 +40349,42 @@ ${content} var id2, change; for (id2 in _changes) { change = _changes[id2]; - var h = change.head; - var b = change.base; - var entity = h || b; - var i2; - if (extent && (!h || !h.intersects(extent, head)) && (!b || !b.intersects(extent, base))) { + var h2 = change.head; + var b2 = change.base; + var entity = h2 || b2; + var i3; + if (extent && (!h2 || !h2.intersects(extent, head)) && (!b2 || !b2.intersects(extent, base))) { continue; } - result[id2] = h; + result[id2] = h2; if (entity.type === "way") { - var nh = h ? h.nodes : []; - var nb = b ? b.nodes : []; + var nh = h2 ? h2.nodes : []; + var nb = b2 ? b2.nodes : []; var diff; diff = utilArrayDifference(nh, nb); - for (i2 = 0; i2 < diff.length; i2++) { - result[diff[i2]] = head.hasEntity(diff[i2]); + for (i3 = 0; i3 < diff.length; i3++) { + result[diff[i3]] = head.hasEntity(diff[i3]); } diff = utilArrayDifference(nb, nh); - for (i2 = 0; i2 < diff.length; i2++) { - result[diff[i2]] = head.hasEntity(diff[i2]); + for (i3 = 0; i3 < diff.length; i3++) { + result[diff[i3]] = head.hasEntity(diff[i3]); } } if (entity.type === "relation" && entity.isMultipolygon()) { - var mh = h ? h.members.map(function(m) { - return m.id; + var mh = h2 ? h2.members.map(function(m2) { + return m2.id; }) : []; - var mb = b ? b.members.map(function(m) { - return m.id; + var mb = b2 ? b2.members.map(function(m2) { + return m2.id; }) : []; var ids = utilArrayUnion(mh, mb); - for (i2 = 0; i2 < ids.length; i2++) { - var member = head.hasEntity(ids[i2]); + for (i3 = 0; i3 < ids.length; i3++) { + var member = head.hasEntity(ids[i3]); if (!member) continue; if (extent && !member.intersects(extent, head)) continue; - result[ids[i2]] = member; + result[ids[i3]] = member; } } addParents(head.parentWays(entity), result); @@ -38845,8 +40392,8 @@ ${content} } return result; function addParents(parents, result2) { - for (var i3 = 0; i3 < parents.length; i3++) { - var parent = parents[i3]; + for (var i4 = 0; i4 < parents.length; i4++) { + var parent = parents[i4]; if (parent.id in result2) continue; result2[parent.id] = parent; @@ -38858,28 +40405,28 @@ ${content} } // modules/core/tree.js - var import_rbush6 = __toESM(require_rbush_min()); + var import_rbush5 = __toESM(require_rbush_min()); function coreTree(head) { - var _rtree = new import_rbush6.default(); + var _rtree = new import_rbush5.default(); var _bboxes = {}; - var _segmentsRTree = new import_rbush6.default(); + var _segmentsRTree = new import_rbush5.default(); var _segmentsBBoxes = {}; var _segmentsByWayId = {}; var tree = {}; function entityBBox(entity) { - var bbox = entity.extent(head).bbox(); - bbox.id = entity.id; - _bboxes[entity.id] = bbox; - return bbox; + var bbox2 = entity.extent(head).bbox(); + bbox2.id = entity.id; + _bboxes[entity.id] = bbox2; + return bbox2; } function segmentBBox(segment) { var extent = segment.extent(head); if (!extent) return null; - var bbox = extent.bbox(); - bbox.segment = segment; - _segmentsBBoxes[segment.id] = bbox; - return bbox; + var bbox2 = extent.bbox(); + bbox2.segment = segment; + _segmentsBBoxes[segment.id] = bbox2; + return bbox2; } function removeEntity(entity) { _rtree.remove(_bboxes[entity.id]); @@ -38926,8 +40473,8 @@ ${content} } tree.rebase = function(entities, force) { var insertions = {}; - for (var i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; + for (var i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; if (!entity.visible) continue; if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) { @@ -38973,14 +40520,14 @@ ${content} } tree.intersects = function(extent, graph) { updateToGraph(graph); - return _rtree.search(extent.bbox()).map(function(bbox) { - return graph.entity(bbox.id); + return _rtree.search(extent.bbox()).map(function(bbox2) { + return graph.entity(bbox2.id); }); }; tree.waySegments = function(extent, graph) { updateToGraph(graph); - return _segmentsRTree.search(extent.bbox()).map(function(bbox) { - return bbox.segment; + return _segmentsRTree.search(extent.bbox()).map(function(bbox2) { + return bbox2.segment; }); }; return tree; @@ -39079,7 +40626,7 @@ ${content} // modules/core/history.js function coreHistory(context) { - var dispatch10 = dispatch_default("reset", "change", "merge", "restore", "undone", "redone", "storage_error"); + var dispatch14 = dispatch_default("reset", "change", "merge", "restore", "undone", "redone", "storage_error"); var lock = utilSessionMutex("lock"); var _hasUnresolvedRestorableChanges = lock.lock() && !!corePreferences(getKey("saved_history")); var duration = 150; @@ -39090,15 +40637,15 @@ ${content} var _stack; var _index; var _tree; - function _act(actions, t) { + function _act(actions, t2) { actions = Array.prototype.slice.call(actions); var annotation; if (typeof actions[actions.length - 1] !== "function") { annotation = actions.pop(); } var graph = _stack[_index].graph; - for (var i2 = 0; i2 < actions.length; i2++) { - graph = actions[i2](graph, t); + for (var i3 = 0; i3 < actions.length; i3++) { + graph = actions[i3](graph, t2); } return { graph, @@ -39109,28 +40656,28 @@ ${content} selectedIDs: context.selectedIDs() }; } - function _perform(args, t) { + function _perform(args, t2) { var previous = _stack[_index].graph; _stack = _stack.slice(0, _index + 1); - var actionResult = _act(args, t); + var actionResult = _act(args, t2); _stack.push(actionResult); _index++; return change(previous); } - function _replace(args, t) { + function _replace(args, t2) { var previous = _stack[_index].graph; - var actionResult = _act(args, t); + var actionResult = _act(args, t2); _stack[_index] = actionResult; return change(previous); } - function _overwrite(args, t) { + function _overwrite(args, t2) { var previous = _stack[_index].graph; if (_index > 0) { _index--; _stack.pop(); } _stack = _stack.slice(0, _index + 1); - var actionResult = _act(args, t); + var actionResult = _act(args, t2); _stack.push(actionResult); _index++; return change(previous); @@ -39138,12 +40685,12 @@ ${content} function change(previous) { var difference = coreDifference(previous, history.graph()); if (!_pausedGraph) { - dispatch10.call("change", this, difference); + dispatch14.call("change", this, difference); } return difference; } - function getKey(n2) { - return "iD_" + window.location.origin + "_" + n2; + function getKey(n3) { + return "iD_" + window.location.origin + "_" + n3; } var history = { graph: function() { @@ -39161,7 +40708,7 @@ ${content} }); _stack[0].graph.rebase(entities, stack, false); _tree.rebase(entities, false); - dispatch10.call("merge", this, entities); + dispatch14.call("merge", this, entities); }, perform: function() { select_default2(document).interrupt("history.perform"); @@ -39173,9 +40720,9 @@ ${content} if (transitionable) { var origArguments = arguments; select_default2(document).transition("history.perform").duration(duration).ease(linear2).tween("history.tween", function() { - return function(t) { - if (t < 1) - _overwrite([action0], t); + return function(t2) { + if (t2 < 1) + _overwrite([action0], t2); }; }).on("start", function() { _perform([action0], 0); @@ -39190,22 +40737,24 @@ ${content} select_default2(document).interrupt("history.perform"); return _replace(arguments, 1); }, + // Same as calling pop and then perform overwrite: function() { select_default2(document).interrupt("history.perform"); return _overwrite(arguments, 1); }, - pop: function(n2) { + pop: function(n3) { select_default2(document).interrupt("history.perform"); var previous = _stack[_index].graph; - if (isNaN(+n2) || +n2 < 0) { - n2 = 1; + if (isNaN(+n3) || +n3 < 0) { + n3 = 1; } - while (n2-- > 0 && _index > 0) { + while (n3-- > 0 && _index > 0) { _index--; _stack.pop(); } return change(previous); }, + // Back to the previous annotated state or _index = 0. undo: function() { select_default2(document).interrupt("history.perform"); var previousStack = _stack[_index]; @@ -39215,9 +40764,10 @@ ${content} if (_stack[_index].annotation) break; } - dispatch10.call("undone", this, _stack[_index], previousStack); + dispatch14.call("undone", this, _stack[_index], previousStack); return change(previous); }, + // Forward to the next annotated state. redo: function() { select_default2(document).interrupt("history.perform"); var previousStack = _stack[_index]; @@ -39227,7 +40777,7 @@ ${content} tryIndex++; if (_stack[tryIndex].annotation) { _index = tryIndex; - dispatch10.call("redone", this, _stack[_index], previousStack); + dispatch14.call("redone", this, _stack[_index], previousStack); break; } } @@ -39246,21 +40796,23 @@ ${content} } }, undoAnnotation: function() { - var i2 = _index; - while (i2 >= 0) { - if (_stack[i2].annotation) - return _stack[i2].annotation; - i2--; + var i3 = _index; + while (i3 >= 0) { + if (_stack[i3].annotation) + return _stack[i3].annotation; + i3--; } }, redoAnnotation: function() { - var i2 = _index + 1; - while (i2 <= _stack.length - 1) { - if (_stack[i2].annotation) - return _stack[i2].annotation; - i2++; + var i3 = _index + 1; + while (i3 <= _stack.length - 1) { + if (_stack[i3].annotation) + return _stack[i3].annotation; + i3++; } }, + // Returns the entities from the active graph with bounding boxes + // overlapping the given `extent`. intersects: function(extent) { return _tree.intersects(extent, _stack[_index].graph); }, @@ -39290,15 +40842,15 @@ ${content} _imageryUsed = sources; return history; } else { - var s = /* @__PURE__ */ new Set(); + var s2 = /* @__PURE__ */ new Set(); _stack.slice(1, _index + 1).forEach(function(state) { state.imageryUsed.forEach(function(source) { if (source !== "Custom") { - s.add(source); + s2.add(source); } }); }); - return Array.from(s); + return Array.from(s2); } }, photoOverlaysUsed: function(sources) { @@ -39306,17 +40858,18 @@ ${content} _photoOverlaysUsed = sources; return history; } else { - var s = /* @__PURE__ */ new Set(); + var s2 = /* @__PURE__ */ new Set(); _stack.slice(1, _index + 1).forEach(function(state) { if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) { state.photoOverlaysUsed.forEach(function(photoOverlay) { - s.add(photoOverlay); + s2.add(photoOverlay); }); } }); - return Array.from(s); + return Array.from(s2); } }, + // save the current history state checkpoint: function(key) { _checkpoints[key] = { stack: _stack, @@ -39324,6 +40877,7 @@ ${content} }; return history; }, + // restore history state to a given checkpoint or reset completely reset: function(key) { if (key !== void 0 && _checkpoints.hasOwnProperty(key)) { _stack = _checkpoints[key].stack; @@ -39334,10 +40888,20 @@ ${content} _tree = coreTree(_stack[0].graph); _checkpoints = {}; } - dispatch10.call("reset"); - dispatch10.call("change"); + dispatch14.call("reset"); + dispatch14.call("change"); return history; }, + // `toIntroGraph()` is used to export the intro graph used by the walkthrough. + // + // To use it: + // 1. Start the walkthrough. + // 2. Get to a "free editing" tutorial step + // 3. Make your edits to the walkthrough map + // 4. In your browser dev console run: + // `id.history().toIntroGraph()` + // 5. This outputs stringified JSON to the browser console + // 6. Copy it to `data/intro_graph.json` and prettify it in your code editor toIntroGraph: function() { var nextID = { n: 0, r: 0, w: 0 }; var permIDs = {}; @@ -39397,11 +40961,11 @@ ${content} var allEntities = {}; var baseEntities = {}; var base = _stack[0]; - var s = _stack.map(function(i2) { + var s2 = _stack.map(function(i3) { var modified = []; var deleted = []; - Object.keys(i2.graph.entities).forEach(function(id2) { - var entity = i2.graph.entities[id2]; + Object.keys(i3.graph.entities).forEach(function(id2) { + var entity = i3.graph.entities[id2]; if (entity) { var key = osmEntity.key(entity); allEntities[key] = entity; @@ -39428,46 +40992,47 @@ ${content} }); } }); - var x = {}; + var x2 = {}; if (modified.length) - x.modified = modified; + x2.modified = modified; if (deleted.length) - x.deleted = deleted; - if (i2.imageryUsed) - x.imageryUsed = i2.imageryUsed; - if (i2.photoOverlaysUsed) - x.photoOverlaysUsed = i2.photoOverlaysUsed; - if (i2.annotation) - x.annotation = i2.annotation; - if (i2.transform) - x.transform = i2.transform; - if (i2.selectedIDs) - x.selectedIDs = i2.selectedIDs; - return x; + x2.deleted = deleted; + if (i3.imageryUsed) + x2.imageryUsed = i3.imageryUsed; + if (i3.photoOverlaysUsed) + x2.photoOverlaysUsed = i3.photoOverlaysUsed; + if (i3.annotation) + x2.annotation = i3.annotation; + if (i3.transform) + x2.transform = i3.transform; + if (i3.selectedIDs) + x2.selectedIDs = i3.selectedIDs; + return x2; }); return JSON.stringify({ version: 3, entities: Object.values(allEntities), baseEntities: Object.values(baseEntities), - stack: s, + stack: s2, nextIDs: osmEntity.id.next, index: _index, - timestamp: new Date().getTime() + // note the time the changes were saved + timestamp: (/* @__PURE__ */ new Date()).getTime() }); }, fromJSON: function(json, loadChildNodes) { - var h = JSON.parse(json); + var h2 = JSON.parse(json); var loadComplete = true; - osmEntity.id.next = h.nextIDs; - _index = h.index; - if (h.version === 2 || h.version === 3) { + osmEntity.id.next = h2.nextIDs; + _index = h2.index; + if (h2.version === 2 || h2.version === 3) { var allEntities = {}; - h.entities.forEach(function(entity) { + h2.entities.forEach(function(entity) { allEntities[osmEntity.key(entity)] = osmEntity(entity); }); - if (h.version === 3) { - var baseEntities = h.baseEntities.map(function(d) { - return osmEntity(d); + if (h2.version === 3) { + var baseEntities = h2.baseEntities.map(function(d2) { + return osmEntity(d2); }); var stack = _stack.map(function(state) { return state.graph; @@ -39476,14 +41041,14 @@ ${content} _tree.rebase(baseEntities, true); if (loadChildNodes) { var osm = context.connection(); - var baseWays = baseEntities.filter(function(e) { - return e.type === "way"; + var baseWays = baseEntities.filter(function(e3) { + return e3.type === "way"; }); var nodeIDs = baseWays.reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []); - var missing = nodeIDs.filter(function(n2) { - return !_stack[0].graph.hasEntity(n2); + var missing = nodeIDs.filter(function(n3) { + return !_stack[0].graph.hasEntity(n3); }); if (missing.length && osm) { loadComplete = false; @@ -39513,45 +41078,45 @@ ${content} if (err || !missing.length) { loading.close(); context.map().redrawEnable(true); - dispatch10.call("change"); - dispatch10.call("restore", this); + dispatch14.call("change"); + dispatch14.call("restore", this); } }; osm.loadMultiple(missing, childNodesLoaded); } } } - _stack = h.stack.map(function(d) { + _stack = h2.stack.map(function(d2) { var entities = {}, entity; - if (d.modified) { - d.modified.forEach(function(key) { + if (d2.modified) { + d2.modified.forEach(function(key) { entity = allEntities[key]; entities[entity.id] = entity; }); } - if (d.deleted) { - d.deleted.forEach(function(id2) { + if (d2.deleted) { + d2.deleted.forEach(function(id2) { entities[id2] = void 0; }); } return { graph: coreGraph(_stack[0].graph).load(entities), - annotation: d.annotation, - imageryUsed: d.imageryUsed, - photoOverlaysUsed: d.photoOverlaysUsed, - transform: d.transform, - selectedIDs: d.selectedIDs + annotation: d2.annotation, + imageryUsed: d2.imageryUsed, + photoOverlaysUsed: d2.photoOverlaysUsed, + transform: d2.transform, + selectedIDs: d2.selectedIDs }; }); } else { - _stack = h.stack.map(function(d) { + _stack = h2.stack.map(function(d2) { var entities = {}; - for (var i2 in d.entities) { - var entity = d.entities[i2]; - entities[i2] = entity === "undefined" ? void 0 : osmEntity(entity); + for (var i3 in d2.entities) { + var entity = d2.entities[i3]; + entities[i3] = entity === "undefined" ? void 0 : osmEntity(entity); } - d.graph = coreGraph(_stack[0].graph).load(entities); - return d; + d2.graph = coreGraph(_stack[0].graph).load(entities); + return d2; }); } var transform2 = _stack[_index].transform; @@ -39559,8 +41124,8 @@ ${content} context.map().transformEase(transform2, 0); } if (loadComplete) { - dispatch10.call("change"); - dispatch10.call("restore", this); + dispatch14.call("change"); + dispatch14.call("restore", this); } return history; }, @@ -39571,13 +41136,15 @@ ${content} lock.unlock(); }, save: function() { - if (lock.locked() && !_hasUnresolvedRestorableChanges) { + if (lock.locked() && // don't overwrite existing, unresolved changes + !_hasUnresolvedRestorableChanges) { const success = corePreferences(getKey("saved_history"), history.toJSON() || null); if (!success) - dispatch10.call("storage_error"); + dispatch14.call("storage_error"); } return history; }, + // delete the history version saved in localStorage clearSaved: function() { context.debouncedSave.cancel(); if (lock.locked()) { @@ -39595,6 +41162,7 @@ ${content} hasRestorableChanges: function() { return _hasUnresolvedRestorableChanges; }, + // load history from a version stored in localStorage restore: function() { if (lock.locked()) { _hasUnresolvedRestorableChanges = false; @@ -39606,7 +41174,7 @@ ${content} _getKey: getKey }; history.reset(); - return utilRebind(history, dispatch10, "on"); + return utilRebind(history, dispatch14, "on"); } // modules/validations/index.js @@ -39632,7 +41200,7 @@ ${content} // modules/validations/almost_junction.js function validationAlmostJunction(context) { - const type3 = "almost_junction"; + const type2 = "almost_junction"; const EXTEND_TH_METERS = 5; const WELD_TH_METERS = 0.75; const CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS; @@ -39653,7 +41221,7 @@ ${content} let issues = []; extendableNodeInfos.forEach((extendableNodeInfo) => { issues.push(new validationIssue({ - type: type3, + type: type2, subtype: "highway-highway", severity: "warning", message: function(context2) { @@ -39791,8 +41359,8 @@ ${content} return [ way.nodes[0], way.nodes[way.nodes.length - 1] - ].map((d) => graph.entity(d)).filter((d) => { - return d.id !== node.id && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH; + ].map((d2) => graph.entity(d2)).filter((d2) => { + return d2.id !== node.id && geoSphericalDistance(node.loc, d2.loc) <= CLOSE_NODE_TH; }); } function findSmallJoinAngle(midNode, tipNode, endNodes) { @@ -39843,11 +41411,11 @@ ${content} [lon + lon_range, lat + lat_range] ]); const edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc); - const t = EXTEND_TH_METERS / edgeLen + 1; - const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t); + const t2 = EXTEND_TH_METERS / edgeLen + 1; + const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t2); const segmentInfos = tree.waySegments(queryExtent, graph); - for (let i2 = 0; i2 < segmentInfos.length; i2++) { - let segmentInfo = segmentInfos[i2]; + for (let i3 = 0; i3 < segmentInfos.length; i3++) { + let segmentInfo = segmentInfos[i3]; let way2 = graph.entity(segmentInfo.wayId); if (!isHighway(way2)) continue; @@ -39871,13 +41439,13 @@ ${content} return null; } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/close_nodes.js function validationCloseNodes(context) { - var type3 = "close_nodes"; + var type2 = "close_nodes"; var pointThresholdMeters = 0.2; var validation = function(entity, graph) { if (entity.type === "node") { @@ -39904,8 +41472,8 @@ ${content} if (osmPathHighwayTagValues[way.tags.highway]) return "path"; var parentRelations = graph.parentRelations(way); - for (var i2 in parentRelations) { - var relation = parentRelations[i2]; + for (var i3 in parentRelations) { + var relation = parentRelations[i3]; if (relation.tags.type === "boundary") return "boundary"; if (relation.isMultipolygon()) { @@ -39920,8 +41488,8 @@ ${content} function shouldCheckWay(way) { if (way.nodes.length <= 2 || way.isClosed() && way.nodes.length <= 4) return false; - var bbox = way.extent(graph).bbox(); - var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]); + var bbox2 = way.extent(graph).bbox(); + var hypotenuseMeters = geoSphericalDistance([bbox2.minX, bbox2.minY], [bbox2.maxX, bbox2.maxY]); if (hypotenuseMeters < 1.5) return false; return true; @@ -39930,9 +41498,9 @@ ${content} if (!shouldCheckWay(way)) return []; var issues = [], nodes = graph.childNodes(way); - for (var i2 = 0; i2 < nodes.length - 1; i2++) { - var node1 = nodes[i2]; - var node2 = nodes[i2 + 1]; + for (var i3 = 0; i3 < nodes.length - 1; i3++) { + var node1 = nodes[i3]; + var node2 = nodes[i3 + 1]; var issue = getWayIssueIfAny(node1, node2, way); if (issue) issues.push(issue); @@ -39946,20 +41514,20 @@ ${content} if (issue) issues.push(issue); } - for (var i2 = 0; i2 < parentWays.length; i2++) { - var parentWay = parentWays[i2]; + for (var i3 = 0; i3 < parentWays.length; i3++) { + var parentWay = parentWays[i3]; if (!shouldCheckWay(parentWay)) continue; var lastIndex = parentWay.nodes.length - 1; - for (var j2 = 0; j2 < parentWay.nodes.length; j2++) { - if (j2 !== 0) { - if (parentWay.nodes[j2 - 1] === node.id) { - checkForCloseness(node, graph.entity(parentWay.nodes[j2]), parentWay); + for (var j3 = 0; j3 < parentWay.nodes.length; j3++) { + if (j3 !== 0) { + if (parentWay.nodes[j3 - 1] === node.id) { + checkForCloseness(node, graph.entity(parentWay.nodes[j3]), parentWay); } } - if (j2 !== lastIndex) { - if (parentWay.nodes[j2 + 1] === node.id) { - checkForCloseness(graph.entity(parentWay.nodes[j2]), node, parentWay); + if (j3 !== lastIndex) { + if (parentWay.nodes[j3 + 1] === node.id) { + checkForCloseness(graph.entity(parentWay.nodes[j3]), node, parentWay); } } } @@ -39991,8 +41559,8 @@ ${content} [lon + lon_range, lat + lat_range] ]); var intersected = context.history().tree().intersects(queryExtent, graph); - for (var j2 = 0; j2 < intersected.length; j2++) { - var nearby = intersected[j2]; + for (var j3 = 0; j3 < intersected.length; j3++) { + var nearby = intersected[j3]; if (nearby.id === node.id) continue; if (nearby.type !== "node" || nearby.geometry(graph) !== "point") @@ -40015,7 +41583,7 @@ ${content} if (zAxisDifferentiates) continue; issues.push(new validationIssue({ - type: type3, + type: type2, subtype: "detached", severity: "warning", message: function(context2) { @@ -40067,7 +41635,7 @@ ${content} return null; } return new validationIssue({ - type: type3, + type: type2, subtype: "vertices", severity: "warning", message: function(context2) { @@ -40101,18 +41669,19 @@ ${content} } } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/crossing_ways.js + var import_lodash3 = __toESM(require_lodash()); function validationCrossingWays(context) { - var type3 = "crossing_ways"; + var type2 = "crossing_ways"; function getFeatureWithFeatureTypeTagsForWay(way, graph) { if (getFeatureType(way, graph) === null) { var parentRels = graph.parentRelations(way); - for (var i2 = 0; i2 < parentRels.length; i2++) { - var rel = parentRels[i2]; + for (var i3 = 0; i3 < parentRels.length; i3++) { + var rel = parentRels[i3]; if (getFeatureType(rel, graph) !== null) { return rel; } @@ -40205,8 +41774,7 @@ ${content} secondary: true, secondary_link: true }; - var nonCrossingHighways = { track: true }; - function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) { + function tagsForConnectionNodeIfAllowed(entity1, entity2, graph, lessLikelyTags) { var featureType1 = getFeatureType(entity1, graph); var featureType2 = getFeatureType(entity2, graph); var geometry1 = entity1.geometry(graph); @@ -40218,11 +41786,14 @@ ${content} var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway]; if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) { var roadFeature = entity1IsPath ? entity2 : entity1; - if (nonCrossingHighways[roadFeature.tags.highway]) { + var pathFeature = entity1IsPath ? entity1 : entity2; + if (roadFeature.tags.highway === "track") { return {}; } - var pathFeature = entity1IsPath ? entity1 : entity2; - if (["marked", "unmarked", "traffic_signals"].indexOf(pathFeature.tags.crossing) !== -1) { + if (!lessLikelyTags && roadFeature.tags.highway === "service" && pathFeature.tags.highway === "footway" && pathFeature.tags.footway === "sidewalk") { + return {}; + } + if (["marked", "unmarked", "traffic_signals", "uncontrolled"].indexOf(pathFeature.tags.crossing) !== -1) { return bothLines ? { highway: "crossing", crossing: pathFeature.tags.crossing } : {}; } return bothLines ? { highway: "crossing" } : {}; @@ -40273,30 +41844,30 @@ ${content} if (way1FeatureType === null) return edgeCrossInfos; var checkedSingleCrossingWays = {}; - var i2, j2; + var i3, j3; var extent; - var n1, n2, nA, nB, nAId, nBId; + var n1, n22, nA, nB, nAId, nBId; var segment1, segment2; var oneOnly; var segmentInfos, segment2Info, way2, taggedFeature2, way2FeatureType; var way1Nodes = graph.childNodes(way1); var comparedWays = {}; - for (i2 = 0; i2 < way1Nodes.length - 1; i2++) { - n1 = way1Nodes[i2]; - n2 = way1Nodes[i2 + 1]; + for (i3 = 0; i3 < way1Nodes.length - 1; i3++) { + n1 = way1Nodes[i3]; + n22 = way1Nodes[i3 + 1]; extent = geoExtent([ [ - Math.min(n1.loc[0], n2.loc[0]), - Math.min(n1.loc[1], n2.loc[1]) + Math.min(n1.loc[0], n22.loc[0]), + Math.min(n1.loc[1], n22.loc[1]) ], [ - Math.max(n1.loc[0], n2.loc[0]), - Math.max(n1.loc[1], n2.loc[1]) + Math.max(n1.loc[0], n22.loc[0]), + Math.max(n1.loc[1], n22.loc[1]) ] ]); segmentInfos = tree.waySegments(extent, graph); - for (j2 = 0; j2 < segmentInfos.length; j2++) { - segment2Info = segmentInfos[j2]; + for (j3 = 0; j3 < segmentInfos.length; j3++) { + segment2Info = segmentInfos[j3]; if (segment2Info.wayId === way1.id) continue; if (checkedSingleCrossingWays[segment2Info.wayId]) @@ -40313,7 +41884,7 @@ ${content} oneOnly = way1FeatureType === "building" || way2FeatureType === "building"; nAId = segment2Info.nodes[0]; nBId = segment2Info.nodes[1]; - if (nAId === n1.id || nAId === n2.id || nBId === n1.id || nBId === n2.id) { + if (nAId === n1.id || nAId === n22.id || nBId === n1.id || nBId === n22.id) { continue; } nA = graph.hasEntity(nAId); @@ -40322,16 +41893,16 @@ ${content} nB = graph.hasEntity(nBId); if (!nB) continue; - segment1 = [n1.loc, n2.loc]; + segment1 = [n1.loc, n22.loc]; segment2 = [nA.loc, nB.loc]; - var point = geoLineIntersection(segment1, segment2); - if (point) { + var point2 = geoLineIntersection(segment1, segment2); + if (point2) { edgeCrossInfos.push({ wayInfos: [ { way: way1, featureType: way1FeatureType, - edge: [n1.id, n2.id] + edge: [n1.id, n22.id] }, { way: way2, @@ -40339,7 +41910,7 @@ ${content} edge: [nA.id, nB.id] } ], - crossPoint: point + crossPoint: point2 }); if (oneOnly) { checkedSingleCrossingWays[way2.id] = true; @@ -40358,7 +41929,8 @@ ${content} return [entity]; } else if (entity.type === "relation") { return entity.members.reduce(function(array2, member) { - if (member.type === "way" && (!member.role || member.role === "outer" || member.role === "inner")) { + if (member.type === "way" && // only look at geometry ways + (!member.role || member.role === "outer" || member.role === "inner")) { var entity2 = graph.hasEntity(member.id); if (entity2 && array2.indexOf(entity2) === -1) { array2.push(entity2); @@ -40420,7 +41992,7 @@ ${content} } var uniqueID = crossing.crossPoint[0].toFixed(4) + "," + crossing.crossPoint[1].toFixed(4); return new validationIssue({ - type: type3, + type: type2, subtype, severity: "warning", message: function(context2) { @@ -40452,6 +42024,10 @@ ${content} var fixes = []; if (connectionTags) { fixes.push(makeConnectWaysFix(this.data.connectionTags)); + let lessLikelyConnectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph, true); + if (lessLikelyConnectionTags && !(0, import_lodash3.isEqual)(connectionTags, lessLikelyConnectionTags)) { + fixes.push(makeConnectWaysFix(lessLikelyConnectionTags)); + } } if (isCrossingIndoors) { fixes.push(new validationIssueFix({ @@ -40511,7 +42087,7 @@ ${content} var action = function actionAddStructure(graph) { var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])]; var crossedWay = graph.hasEntity(crossedWayID); - var structLengthMeters = crossedWay && crossedWay.tags.width && parseFloat(crossedWay.tags.width); + var structLengthMeters = crossedWay && isFinite(crossedWay.tags.width) && Number(crossedWay.tags.width); if (!structLengthMeters) { structLengthMeters = crossedWay && crossedWay.impliedLineWidthMeters(); } @@ -40630,19 +42206,24 @@ ${content} } function makeConnectWaysFix(connectionTags) { var fixTitleID = "connect_features"; + var fixIcon = "iD-icon-crossing"; + if (connectionTags.highway === "crossing") { + fixTitleID = "connect_using_crossing"; + fixIcon = "temaki-pedestrian"; + } if (connectionTags.ford) { fixTitleID = "connect_using_ford"; + fixIcon = "roentgen-ford"; } - return new validationIssueFix({ - icon: "iD-icon-crossing", + const fix = new validationIssueFix({ + icon: fixIcon, title: _t.append("issues.fix." + fixTitleID + ".title"), onClick: function(context2) { var loc = this.issue.loc; - var connectionTags2 = this.issue.data.connectionTags; var edges = this.issue.data.edges; context2.perform( function actionConnectCrossingWays(graph) { - var node = osmNode({ loc, tags: connectionTags2 }); + var node = osmNode({ loc, tags: connectionTags }); graph = graph.replace(node); var nodesToMerge = [node.id]; var mergeThresholdInMeters = 0.75; @@ -40664,6 +42245,8 @@ ${content} ); } }); + fix._connectionTags = connectionTags; + return fix; } function makeChangeLayerFix(higherOrLower) { return new validationIssueFix({ @@ -40707,14 +42290,14 @@ ${content} } }); } - validation.type = type3; + validation.type = type2; return validation; } // modules/behavior/draw_way.js function behaviorDrawWay(context, wayID, mode, startGraph) { const keybinding = utilKeybinding("drawWay"); - var dispatch10 = dispatch_default("rejectedSelfIntersection"); + var dispatch14 = dispatch_default("rejectedSelfIntersection"); var behavior = behaviorDraw(context); var _nodeIndex; var _origWay; @@ -40762,8 +42345,8 @@ ${content} context.surface().classed("nope-suppressed", false).classed("nope-disabled", false); } } - function allowsVertex(d) { - return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph()); + function allowsVertex(d2) { + return d2.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d2, context.graph()); } function move(d3_event, datum2) { var loc = context.map().mouseCoordinates(); @@ -40782,7 +42365,10 @@ ${content} } context.replace(actionMoveNode(_drawNode.id, loc), _annotation); _drawNode = context.entity(_drawNode.id); - checkGeometry(true); + checkGeometry( + true + /* includeDrawNode */ + ); } function checkGeometry(includeDrawNode) { var nopeDisabled = context.surface().classed("nope-disabled"); @@ -40888,19 +42474,22 @@ ${content} select_default2(window).on("keydown.drawWay", null).on("keyup.drawWay", null); context.history().on("undone.draw", null); }; - function attemptAdd(d, loc, doAdd) { + function attemptAdd(d2, loc, doAdd) { if (_drawNode) { context.replace(actionMoveNode(_drawNode.id, loc), _annotation); _drawNode = context.entity(_drawNode.id); } else { createDrawNode(loc); } - checkGeometry(true); - if (d && d.properties && d.properties.nope || context.surface().classed("nope")) { + checkGeometry( + true + /* includeDrawNode */ + ); + if (d2 && d2.properties && d2.properties.nope || context.surface().classed("nope")) { if (!_pointerHasMoved) { removeDrawNode(); } - dispatch10.call("rejectedSelfIntersection", this); + dispatch14.call("rejectedSelfIntersection", this); return; } context.pauseChangeDispatch(); @@ -40909,24 +42498,25 @@ ${content} context.resumeChangeDispatch(); context.enter(mode); } - drawWay.add = function(loc, d) { - attemptAdd(d, loc, function() { + drawWay.add = function(loc, d2) { + attemptAdd(d2, loc, function() { }); }; - drawWay.addWay = function(loc, edge, d) { - attemptAdd(d, loc, function() { + drawWay.addWay = function(loc, edge, d2) { + attemptAdd(d2, loc, function() { context.replace( actionAddMidpoint({ loc, edge }, _drawNode), _annotation ); }); }; - drawWay.addNode = function(node, d) { - if (node.id === _headNodeID || _origWay.isClosed() && node.id === _origWay.first()) { + drawWay.addNode = function(node, d2) { + if (node.id === _headNodeID || // or the first node when drawing an area + _origWay.isClosed() && node.id === _origWay.first()) { drawWay.finish(); return; } - attemptAdd(d, node.loc, function() { + attemptAdd(d2, node.loc, function() { context.replace( function actionReplaceDrawNode(graph) { graph = graph.replace(graph.entity(wayID).removeNode(_drawNode.id)).remove(_drawNode); @@ -40954,14 +42544,14 @@ ${content} context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("operations.follow.error.needs_more_initial_nodes"))(); return; } - const lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter((w) => w.id !== wayID); - const secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter((w) => w.id !== wayID); + const lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter((w2) => w2.id !== wayID); + const secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter((w2) => w2.id !== wayID); const featureType = getFeatureType(lastNodesParents); if (lastNodesParents.length !== 1 || secondLastNodesParents.length === 0) { context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_multiple_ways.${featureType}`))(); return; } - if (!secondLastNodesParents.some((n2) => n2.id === lastNodesParents[0].id)) { + if (!secondLastNodesParents.some((n3) => n3.id === lastNodesParents[0].id)) { context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_different_ways.${featureType}`))(); return; } @@ -40985,9 +42575,12 @@ ${content} keybinding.on(_t("operations.follow.key"), followMode); select_default2(document).call(keybinding); drawWay.finish = function() { - checkGeometry(false); + checkGeometry( + false + /* includeDrawNode */ + ); if (context.surface().classed("nope")) { - dispatch10.call("rejectedSelfIntersection", this); + dispatch14.call("rejectedSelfIntersection", this); return; } context.pauseChangeDispatch(); @@ -41026,7 +42619,7 @@ ${content} return _drawNode && _drawNode.id; return drawWay; }; - return utilRebind(drawWay, dispatch10, "on"); + return utilRebind(drawWay, dispatch14, "on"); } // modules/modes/draw_line.js @@ -41058,7 +42651,7 @@ ${content} // modules/validations/disconnected_way.js function validationDisconnectedWay() { - var type3 = "disconnected_way"; + var type2 = "disconnected_way"; function isTaggedAsHighway(entity) { return osmRoutableHighwayTagValues[entity.tags.highway]; } @@ -41067,7 +42660,7 @@ ${content} if (!routingIslandWays) return []; return [new validationIssue({ - type: type3, + type: type2, subtype: "highway", severity: "warning", message: function(context) { @@ -41126,7 +42719,8 @@ ${content} var waysToCheck = []; function queueParentWays(node) { graph.parentWays(node).forEach(function(parentWay) { - if (!routingIsland.has(parentWay) && isRoutableWay(parentWay, false)) { + if (!routingIsland.has(parentWay) && // only check each feature once + isRoutableWay(parentWay, false)) { routingIsland.add(parentWay); waysToCheck.push(parentWay); } @@ -41144,8 +42738,8 @@ ${content} while (waysToCheck.length) { var wayToCheck = waysToCheck.pop(); var childNodes = graph.childNodes(wayToCheck); - for (var i2 in childNodes) { - var vertex = childNodes[i2]; + for (var i3 in childNodes) { + var vertex = childNodes[i3]; if (isConnectedVertex(vertex)) { return null; } @@ -41210,13 +42804,13 @@ ${content} }); } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/invalid_format.js function validationFormatting() { - var type3 = "invalid_format"; + var type2 = "invalid_format"; var validation = function(entity) { var issues = []; function isValidEmail(email) { @@ -41227,14 +42821,14 @@ ${content} selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.invalid_format.email.reference")); } if (entity.tags.email) { - var emails = entity.tags.email.split(";").map(function(s) { - return s.trim(); - }).filter(function(x) { - return !isValidEmail(x); + var emails = entity.tags.email.split(";").map(function(s2) { + return s2.trim(); + }).filter(function(x2) { + return !isValidEmail(x2); }); if (emails.length) { issues.push(new validationIssue({ - type: type3, + type: type2, subtype: "email", severity: "warning", message: function(context) { @@ -41253,13 +42847,13 @@ ${content} } return issues; }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/help_request.js function validationHelpRequest(context) { - var type3 = "help_request"; + var type2 = "help_request"; var validation = function checkFixmeTag(entity) { if (!entity.tags.fixme) return []; @@ -41271,13 +42865,18 @@ ${content} return []; } return [new validationIssue({ - type: type3, + type: type2, subtype: "fixme_tag", severity: "warning", message: function(context2) { var entity2 = context2.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues.fixme_tag.message", { - feature: utilDisplayLabel(entity2, context2.graph(), true) + feature: utilDisplayLabel( + entity2, + context2.graph(), + true + /* verbose */ + ) }) : ""; }, dynamicFixes: function() { @@ -41294,13 +42893,13 @@ ${content} selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.fixme_tag.reference")); } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/impossible_oneway.js function validationImpossibleOneway() { - var type3 = "impossible_oneway"; + var type2 = "impossible_oneway"; var validation = function checkImpossibleOneway(entity, graph) { if (entity.type !== "way" || entity.geometry(graph) !== "line") return []; @@ -41426,7 +43025,7 @@ ${content} referenceID += placement; } return [new validationIssue({ - type: type3, + type: type2, subtype: wayType, severity: "warning", message: function(context) { @@ -41485,13 +43084,13 @@ ${content} modeDrawLine(context, way.id, context.graph(), "line", way.affix(vertex.id), true) ); } - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/incompatible_source.js function validationIncompatibleSource() { - const type3 = "incompatible_source"; + const type2 = "incompatible_source"; const incompatibleRules = [ { id: "amap", @@ -41523,12 +43122,17 @@ ${content} if (!matchRule) return null; return new validationIssue({ - type: type3, + type: type2, severity: "warning", message: (context) => { const entity2 = context.hasEntity(entityID); return entity2 ? _t.append("issues.incompatible_source.feature.message", { - feature: utilDisplayLabel(entity2, context.graph(), true), + feature: utilDisplayLabel( + entity2, + context.graph(), + true + /* verbose */ + ), value: source }) : ""; }, @@ -41548,32 +43152,32 @@ ${content} }; } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/maprules.js function validationMaprules() { - var type3 = "maprules"; + var type2 = "maprules"; var validation = function checkMaprules(entity, graph) { if (!services.maprules) return []; var rules = services.maprules.validationRules(); var issues = []; - for (var i2 = 0; i2 < rules.length; i2++) { - var rule = rules[i2]; + for (var i3 = 0; i3 < rules.length; i3++) { + var rule = rules[i3]; rule.findIssues(entity, graph, issues); } return issues; }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/mismatched_geometry.js var import_fast_deep_equal4 = __toESM(require_fast_deep_equal()); function validationMismatchedGeometry() { - var type3 = "mismatched_geometry"; + var type2 = "mismatched_geometry"; function tagSuggestingLineIsArea(entity) { if (entity.type !== "way" || entity.isClosed()) return null; @@ -41583,7 +43187,7 @@ ${content} } var asLine = _mainPresetIndex.matchTags(tagSuggestingArea, "line"); var asArea = _mainPresetIndex.matchTags(tagSuggestingArea, "area"); - if (asLine && asArea && asLine === asArea) { + if (asLine && asArea && (0, import_fast_deep_equal4.default)(asLine.tags, asArea.tags)) { return null; } return tagSuggestingArea; @@ -41626,14 +43230,31 @@ ${content} var tagSuggestingArea = tagSuggestingLineIsArea(entity); if (!tagSuggestingArea) return null; + var validAsLine = false; + var presetAsLine = _mainPresetIndex.matchTags(entity.tags, "line"); + if (presetAsLine) { + validAsLine = true; + var key = Object.keys(tagSuggestingArea)[0]; + if (presetAsLine.tags[key] && presetAsLine.tags[key] === "*") { + validAsLine = false; + } + if (Object.keys(presetAsLine.tags).length === 0) { + validAsLine = false; + } + } return new validationIssue({ - type: type3, + type: type2, subtype: "area_as_line", severity: "warning", message: function(context) { var entity2 = context.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues.tag_suggests_area.message", { - feature: utilDisplayLabel(entity2, "area", true), + feature: utilDisplayLabel( + entity2, + "area", + true + /* verbose */ + ), tag: utilTagText({ tags: tagSuggestingArea }) }) : ""; }, @@ -41644,10 +43265,12 @@ ${content} var fixes = []; var entity2 = context.entity(this.entityIds[0]); var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity2, context.graph()); - fixes.push(new validationIssueFix({ - title: _t.append("issues.fix.connect_endpoints.title"), - onClick: connectEndsOnClick - })); + if (!validAsLine) { + fixes.push(new validationIssueFix({ + title: _t.append("issues.fix.connect_endpoints.title"), + onClick: connectEndsOnClick + })); + } fixes.push(new validationIssueFix({ icon: "iD-operation-delete", title: _t.append("issues.fix.remove_tag.title"), @@ -41655,8 +43278,8 @@ ${content} var entityId = this.issue.entityIds[0]; var entity3 = context2.entity(entityId); var tags = Object.assign({}, entity3.tags); - for (var key in tagSuggestingArea) { - delete tags[key]; + for (var key2 in tagSuggestingArea) { + delete tags[key2]; } context2.perform( actionChangeTags(entityId, tags), @@ -41682,13 +43305,18 @@ ${content} var allowedGeometries = osmNodeGeometriesForTags(entity.tags); if (geometry === "point" && !allowedGeometries.point && allowedGeometries.vertex) { return new validationIssue({ - type: type3, + type: type2, subtype: "vertex_as_point", severity: "warning", message: function(context) { var entity2 = context.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues.vertex_as_point.message", { - feature: utilDisplayLabel(entity2, "vertex", true) + feature: utilDisplayLabel( + entity2, + "vertex", + true + /* verbose */ + ) }) : ""; }, reference: function showReference(selection2) { @@ -41698,13 +43326,18 @@ ${content} }); } else if (geometry === "vertex" && !allowedGeometries.vertex && allowedGeometries.point) { return new validationIssue({ - type: type3, + type: type2, subtype: "point_as_vertex", severity: "warning", message: function(context) { var entity2 = context.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues.point_as_vertex.message", { - feature: utilDisplayLabel(entity2, "point", true) + feature: utilDisplayLabel( + entity2, + "point", + true + /* verbose */ + ) }) : ""; }, reference: function showReference(selection2) { @@ -41730,7 +43363,8 @@ ${content} var asSource = _mainPresetIndex.match(entity, graph); var targetGeom = targetGeoms.find((nodeGeom) => { var asTarget = _mainPresetIndex.matchTags(entity.tags, nodeGeom); - if (!asSource || !asTarget || asSource === asTarget || (0, import_fast_deep_equal4.default)(asSource.tags, asTarget.tags)) + if (!asSource || !asTarget || asSource === asTarget || // sometimes there are two presets with the same tags for different geometries + (0, import_fast_deep_equal4.default)(asSource.tags, asTarget.tags)) return false; if (asTarget.isFallback()) return false; @@ -41756,13 +43390,18 @@ ${content} dynamicFixes = lineToAreaDynamicFixes; } return new validationIssue({ - type: type3, + type: type2, subtype, severity: "warning", message: function(context) { var entity2 = context.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues." + referenceId + ".message", { - feature: utilDisplayLabel(entity2, targetGeom, true) + feature: utilDisplayLabel( + entity2, + targetGeom, + true + /* verbose */ + ) }) : ""; }, reference: function showReference(selection2) { @@ -41823,12 +43462,13 @@ ${content} ]; } function unclosedMultipolygonPartIssues(entity, graph) { - if (entity.type !== "relation" || !entity.isMultipolygon() || entity.isDegenerate() || !entity.isComplete(graph)) + if (entity.type !== "relation" || !entity.isMultipolygon() || entity.isDegenerate() || // cannot determine issues for incompletely-downloaded relations + !entity.isComplete(graph)) return []; var sequences = osmJoinWays(entity.members, graph); var issues = []; - for (var i2 in sequences) { - var sequence = sequences[i2]; + for (var i3 in sequences) { + var sequence = sequences[i3]; if (!sequence.nodes) continue; var firstNode = sequence.nodes[0]; @@ -41836,13 +43476,18 @@ ${content} if (firstNode === lastNode) continue; var issue = new validationIssue({ - type: type3, + type: type2, subtype: "unclosed_multipolygon_part", severity: "warning", message: function(context) { var entity2 = context.hasEntity(this.entityIds[0]); return entity2 ? _t.append("issues.unclosed_multipolygon_part.message", { - feature: utilDisplayLabel(entity2, context.graph(), true) + feature: utilDisplayLabel( + entity2, + context.graph(), + true + /* verbose */ + ) }) : ""; }, reference: showReference, @@ -41871,13 +43516,13 @@ ${content} return [mismatch]; return unclosedMultipolygonPartIssues(entity, graph); }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/missing_role.js function validationMissingRole() { - var type3 = "missing_role"; + var type2 = "missing_role"; var validation = function checkMissingRole(entity, graph) { var issues = []; if (entity.type === "way") { @@ -41904,7 +43549,7 @@ ${content} } function makeIssue(way, relation, member) { return new validationIssue({ - type: type3, + type: type2, severity: "warning", message: function(context) { var member2 = context.hasEntity(this.entityIds[1]), relation2 = context.hasEntity(this.entityIds[0]); @@ -41957,20 +43602,20 @@ ${content} } }); } - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/missing_tag.js function validationMissingTag(context) { - var type3 = "missing_tag"; + var type2 = "missing_tag"; function hasDescriptiveTags(entity, graph) { var onlyAttributeKeys = ["description", "name", "note", "start_date"]; - var entityDescriptiveKeys = Object.keys(entity.tags).filter(function(k) { - if (k === "area" || !osmIsInterestingTag(k)) + var entityDescriptiveKeys = Object.keys(entity.tags).filter(function(k2) { + if (k2 === "area" || !osmIsInterestingTag(k2)) return false; return !onlyAttributeKeys.some(function(attributeKey) { - return k === attributeKey || k.indexOf(attributeKey + ":") === 0; + return k2 === attributeKey || k2.indexOf(attributeKey + ":") === 0; }); }); if (entity.type === "relation" && entityDescriptiveKeys.length === 1 && entity.tags.type === "multipolygon") { @@ -41988,7 +43633,9 @@ ${content} var subtype; var osm = context.connection(); var isUnloadedNode = entity.type === "node" && osm && !osm.isDataLoaded(entity.loc); - if (!isUnloadedNode && entity.geometry(graph) !== "vertex" && !entity.hasParentRelations(graph)) { + if (!isUnloadedNode && // allow untagged nodes that are part of ways + entity.geometry(graph) !== "vertex" && // allow untagged entities that are part of relations + !entity.hasParentRelations(graph)) { if (Object.keys(entity.tags).length === 0) { subtype = "any"; } else if (!hasDescriptiveTags(entity, graph)) { @@ -42007,7 +43654,7 @@ ${content} var canDelete = entity.version === void 0 || entity.v !== void 0; var severity = canDelete && subtype !== "highway_classification" ? "error" : "warning"; return [new validationIssue({ - type: type3, + type: type2, subtype, severity, message: function(context2) { @@ -42056,28 +43703,34 @@ ${content} selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues." + referenceID + ".reference")); } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/outdated_tags.js function validationOutdatedTags() { - const type3 = "outdated_tags"; + const type2 = "outdated_tags"; let _waitingForDeprecated = true; let _dataDeprecated; - _mainFileFetcher.get("deprecated").then((d) => _dataDeprecated = d).catch(() => { + _mainFileFetcher.get("deprecated").then((d2) => _dataDeprecated = d2).catch(() => { }).finally(() => _waitingForDeprecated = false); function oldTagIssues(entity, graph) { - const oldTags = Object.assign({}, entity.tags); + if (!entity.hasInterestingTags()) + return []; let preset = _mainPresetIndex.match(entity, graph); - let subtype = "deprecated_tags"; if (!preset) return []; - if (!entity.hasInterestingTags()) - return []; + const oldTags = Object.assign({}, entity.tags); + let subtype = "deprecated_tags"; if (preset.replacement) { const newPreset = _mainPresetIndex.item(preset.replacement); - graph = actionChangePreset(entity.id, preset, newPreset, true)(graph); + graph = actionChangePreset( + entity.id, + preset, + newPreset, + true + /* skip field defaults */ + )(graph); entity = graph.entity(entity.id); preset = newPreset; } @@ -42092,12 +43745,12 @@ ${content} } let newTags = Object.assign({}, entity.tags); if (preset.tags !== preset.addTags) { - Object.keys(preset.addTags).forEach((k) => { - if (!newTags[k]) { - if (preset.addTags[k] === "*") { - newTags[k] = "yes"; + Object.keys(preset.addTags).forEach((k2) => { + if (!newTags[k2]) { + if (preset.addTags[k2] === "*") { + newTags[k2] = "yes"; } else { - newTags[k] = preset.addTags[k]; + newTags[k2] = preset.addTags[k2]; } } }); @@ -42121,7 +43774,7 @@ ${content} const tagDiff = utilTagDiff(oldTags, newTags); if (!tagDiff.length) return issues; - const isOnlyAddingTags = tagDiff.every((d) => d.type === "+"); + const isOnlyAddingTags = tagDiff.every((d2) => d2.type === "+"); let prefix = ""; if (nsiResult) { prefix = "noncanonical_brand."; @@ -42131,7 +43784,7 @@ ${content} } let autoArgs = subtype !== "noncanonical_brand" ? [doUpgrade, _t("issues.fix.upgrade_tags.annotation")] : null; issues.push(new validationIssue({ - type: type3, + type: type2, subtype, severity: "warning", message: showMessage, @@ -42205,17 +43858,22 @@ ${content} messageID += "_incomplete"; } return _t.append(messageID, { - feature: utilDisplayLabel(currEntity, context.graph(), true) + feature: utilDisplayLabel( + currEntity, + context.graph(), + true + /* verbose */ + ) }); } function showReference(selection2) { let enter = selection2.selectAll(".issue-reference").data([0]).enter(); enter.append("div").attr("class", "issue-reference").call(_t.append(`issues.outdated_tags.${prefix}reference`)); enter.append("strong").call(_t.append("issues.suggested")); - enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", (d) => { - let klass = d.type === "+" ? "add" : "remove"; + enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", (d2) => { + let klass = d2.type === "+" ? "add" : "remove"; return `tagDiff-cell tagDiff-cell-${klass}`; - }).html((d) => d.display); + }).html((d2) => d2.display); } } function oldMultipolygonIssues(entity, graph) { @@ -42232,7 +43890,7 @@ ${content} if (!multipolygon || !outerWay) return []; return [new validationIssue({ - type: type3, + type: type2, subtype: "old_multipolygon", severity: "warning", message: showMessage, @@ -42265,7 +43923,12 @@ ${content} return ""; return _t.append( "issues.old_multipolygon.message", - { multipolygon: utilDisplayLabel(currMultipolygon, context.graph(), true) } + { multipolygon: utilDisplayLabel( + currMultipolygon, + context.graph(), + true + /* verbose */ + ) } ); } function showReference(selection2) { @@ -42278,13 +43941,13 @@ ${content} issues = oldTagIssues(entity, graph); return issues; }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/private_data.js function validationPrivateData() { - var type3 = "private_data"; + var type2 = "private_data"; var privateBuildingValues = { detached: true, farm: true, @@ -42316,11 +43979,11 @@ ${content} if (!tags.building || !privateBuildingValues[tags.building]) return []; var keepTags = {}; - for (var k in tags) { - if (publicKeys[k]) + for (var k2 in tags) { + if (publicKeys[k2]) return []; - if (!personalTags[k]) { - keepTags[k] = tags[k]; + if (!personalTags[k2]) { + keepTags[k2] = tags[k2]; } } var tagDiff = utilTagDiff(tags, keepTags); @@ -42328,7 +43991,7 @@ ${content} return []; var fixID = tagDiff.length === 1 ? "remove_tag" : "remove_tags"; return [new validationIssue({ - type: type3, + type: type2, severity: "warning", message: showMessage, reference: showReference, @@ -42372,21 +44035,21 @@ ${content} var enter = selection2.selectAll(".issue-reference").data([0]).enter(); enter.append("div").attr("class", "issue-reference").call(_t.append("issues.private_data.reference")); enter.append("strong").call(_t.append("issues.suggested")); - enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", function(d) { - var klass = d.type === "+" ? "add" : "remove"; + enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", function(d2) { + var klass = d2.type === "+" ? "add" : "remove"; return "tagDiff-cell tagDiff-cell-" + klass; - }).html(function(d) { - return d.display; + }).html(function(d2) { + return d2.display; }); } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/suspicious_name.js function validationSuspiciousName() { - const type3 = "suspicious_name"; + const type2 = "suspicious_name"; const keysToTestForGenericValues = [ "aerialway", "aeroway", @@ -42414,8 +44077,8 @@ ${content} return false; } function nameMatchesRawTag(lowercaseName, tags) { - for (let i2 = 0; i2 < keysToTestForGenericValues.length; i2++) { - let key = keysToTestForGenericValues[i2]; + for (let i3 = 0; i3 < keysToTestForGenericValues.length; i3++) { + let key = keysToTestForGenericValues[i3]; let val = tags[key]; if (val) { val = val.toLowerCase(); @@ -42432,7 +44095,7 @@ ${content} } function makeGenericNameIssue(entityId, nameKey, genericName, langCode) { return new validationIssue({ - type: type3, + type: type2, subtype: "generic_name", severity: "warning", message: function(context) { @@ -42474,7 +44137,7 @@ ${content} } function makeIncorrectNameIssue(entityId, nameKey, incorrectName, langCode) { return new validationIssue({ - type: type3, + type: type2, subtype: "not_name", severity: "warning", message: function(context) { @@ -42522,14 +44185,14 @@ ${content} let issues = []; const notNames2 = (tags["not:name"] || "").split(";"); for (let key in tags) { - const m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/); - if (!m) + const m2 = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/); + if (!m2) continue; - const langCode = m.length >= 2 ? m[1] : null; + const langCode = m2.length >= 2 ? m2[1] : null; const value = tags[key]; if (notNames2.length) { - for (let i2 in notNames2) { - const notName = notNames2[i2]; + for (let i3 in notNames2) { + const notName = notNames2[i3]; if (notName && value === notName) { issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode)); continue; @@ -42543,13 +44206,13 @@ ${content} } return issues; }; - validation.type = type3; + validation.type = type2; return validation; } // modules/validations/unsquare_way.js function validationUnsquareWay(context) { - var type3 = "unsquare_way"; + var type2 = "unsquare_way"; var DEFAULT_DEG_THRESHOLD = 5; var epsilon3 = 0.05; var nodeThreshold = 10; @@ -42588,7 +44251,7 @@ ${content} if (hasConnectedSquarableWays) return []; var storedDegreeThreshold = corePreferences("validate-square-degrees"); - var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold); + var degreeThreshold = isFinite(storedDegreeThreshold) ? Number(storedDegreeThreshold) : DEFAULT_DEG_THRESHOLD; var points = nodes.map(function(node) { return context.projection(node.loc); }); @@ -42601,7 +44264,7 @@ ${content} autoArgs = [autoAction, _t("operations.orthogonalize.annotation.feature", { n: 1 })]; } return [new validationIssue({ - type: type3, + type: type2, subtype: "building", severity: "warning", message: function(context2) { @@ -42630,6 +44293,21 @@ ${content} }, 175); } }) + /* + new validationIssueFix({ + title: t.append('issues.fix.tag_as_unsquare.title'), + onClick: function(context) { + var entityId = this.issue.entityIds[0]; + var entity = context.entity(entityId); + var tags = Object.assign({}, entity.tags); // shallow copy + tags.nonsquare = 'yes'; + context.perform( + actionChangeTags(entityId, tags), + t('issues.fix.tag_as_unsquare.annotation') + ); + } + }) + */ ]; } })]; @@ -42637,14 +44315,14 @@ ${content} selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unsquare_way.buildings.reference")); } }; - validation.type = type3; + validation.type = type2; return validation; } // modules/core/validator.js function coreValidator(context) { - let dispatch10 = dispatch_default("validated", "focusedIssue"); - let validator = utilRebind({}, dispatch10, "on"); + let dispatch14 = dispatch_default("validated", "focusedIssue"); + let validator = utilRebind({}, dispatch14, "on"); let _rules = {}; let _disabledRules = {}; let _ignoredIssueIDs = /* @__PURE__ */ new Set(); @@ -42666,11 +44344,11 @@ ${content} rules.forEach((rule) => { rule = rule.trim(); const parts = rule.split("/", 2); - const type3 = parts[0]; + const type2 = parts[0]; const subtype = parts[1] || "*"; - if (!type3 || !subtype) + if (!type2 || !subtype) return; - result.push({ type: makeRegExp(type3), subtype: makeRegExp(subtype) }); + result.push({ type: makeRegExp(type2), subtype: makeRegExp(subtype) }); }); return result; function makeRegExp(str2) { @@ -42688,7 +44366,7 @@ ${content} }); let disabledRules = corePreferences("validate-disabledRules"); if (disabledRules) { - disabledRules.split(",").forEach((k) => _disabledRules[k] = true); + disabledRules.split(",").forEach((k2) => _disabledRules[k2] = true); } }; function reset(resetIgnored) { @@ -42714,12 +44392,12 @@ ${content} }; validator.resetIgnoredIssues = () => { _ignoredIssueIDs.clear(); - dispatch10.call("validated"); + dispatch14.call("validated"); }; validator.revalidateUnsquare = () => { revalidateUnsquare(_headCache); revalidateUnsquare(_baseCache); - dispatch10.call("validated"); + dispatch14.call("validated"); }; function revalidateUnsquare(cache) { const checkUnsquareWay = _rules.unsquare_way; @@ -42818,7 +44496,7 @@ ${content} if (selectID) { window.setTimeout(() => { context.enter(modeSelect(context, [selectID])); - dispatch10.call("focusedIssue", this, issue); + dispatch14.call("focusedIssue", this, issue); }, 250); } }; @@ -42830,14 +44508,19 @@ ${content} }; validator.getSharedEntityIssues = (entityIDs, options2) => { const orderedIssueTypes = [ + // Show some issue types in a particular order: "missing_tag", "missing_role", + // - missing data first "outdated_tags", "mismatched_geometry", + // - identity issues "crossing_ways", "almost_junction", + // - geometry issues where fixing them might solve connectivity issues "disconnected_way", "impossible_oneway" + // - finally connectivity issues ]; const allIssues = validator.getIssues(options2); const forEntityIDs = new Set(entityIDs); @@ -42874,9 +44557,9 @@ ${content} corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(",")); validator.validate(); }; - validator.disableRules = (keys) => { + validator.disableRules = (keys2) => { _disabledRules = {}; - keys.forEach((k) => _disabledRules[k] = true); + keys2.forEach((k2) => _disabledRules[k2] = true); corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(",")); validator.validate(); }; @@ -42893,7 +44576,7 @@ ${content} const currGraph = context.graph(); if (currGraph === prevGraph) { _headIsCurrent = true; - dispatch10.call("validated"); + dispatch14.call("validated"); return Promise.resolve(); } if (_headPromise) { @@ -42906,10 +44589,10 @@ ${content} let entityIDs = Object.keys(incrementalDiff.complete()); entityIDs = _headCache.withAllRelatedEntities(entityIDs); if (!entityIDs.size) { - dispatch10.call("validated"); + dispatch14.call("validated"); return Promise.resolve(); } - _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(() => updateResolvedIssues(entityIDs)).then(() => dispatch10.call("validated")).catch(() => { + _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(() => updateResolvedIssues(entityIDs)).then(() => dispatch14.call("validated")).catch(() => { }).then(() => { _headPromise = null; if (!_headIsCurrent) { @@ -42952,23 +44635,23 @@ ${content} detected = detected.filter(applySeverityOverrides); result.issues = result.issues.concat(detected); function applySeverityOverrides(issue) { - const type3 = issue.type; + const type2 = issue.type; const subtype = issue.subtype || ""; - let i2; - for (i2 = 0; i2 < _errorOverrides.length; i2++) { - if (_errorOverrides[i2].type.test(type3) && _errorOverrides[i2].subtype.test(subtype)) { + let i3; + for (i3 = 0; i3 < _errorOverrides.length; i3++) { + if (_errorOverrides[i3].type.test(type2) && _errorOverrides[i3].subtype.test(subtype)) { issue.severity = "error"; return true; } } - for (i2 = 0; i2 < _warningOverrides.length; i2++) { - if (_warningOverrides[i2].type.test(type3) && _warningOverrides[i2].subtype.test(subtype)) { + for (i3 = 0; i3 < _warningOverrides.length; i3++) { + if (_warningOverrides[i3].type.test(type2) && _warningOverrides[i3].subtype.test(subtype)) { issue.severity = "warning"; return true; } } - for (i2 = 0; i2 < _disableOverrides.length; i2++) { - if (_disableOverrides[i2].type.test(type3) && _disableOverrides[i2].subtype.test(subtype)) { + for (i3 = 0; i3 < _disableOverrides.length; i3++) { + if (_disableOverrides[i3].type.test(type2) && _disableOverrides[i3].subtype.test(subtype)) { return false; } } @@ -43044,7 +44727,7 @@ ${content} _deferredRIC[handle] = rejectPromise; }).then(() => { if (cache.queue.length % 25 === 0) - dispatch10.call("validated"); + dispatch14.call("validated"); }).then(() => processQueue(cache)); } return validator; @@ -43058,7 +44741,9 @@ ${content} queuedEntityIDs: /* @__PURE__ */ new Set(), provisionalEntityIDs: /* @__PURE__ */ new Set(), issuesByIssueID: {}, + // issue.id -> issue issuesByEntityID: {} + // entity.id -> Set(issue.id) }; cache.cacheIssue = (issue) => { (issue.entityIds || []).forEach((entityID) => { @@ -43083,8 +44768,8 @@ ${content} cache.uncacheIssues = (issues) => { issues.forEach(cache.uncacheIssue); }; - cache.uncacheIssuesOfType = (type3) => { - const issuesOfType = Object.values(cache.issuesByIssueID).filter((issue) => issue.type === type3); + cache.uncacheIssuesOfType = (type2) => { + const issuesOfType = Object.values(cache.issuesByIssueID).filter((issue) => issue.type === type2); cache.uncacheIssues(issuesOfType); }; cache.uncacheEntityID = (entityID) => { @@ -43125,26 +44810,35 @@ ${content} // modules/core/uploader.js function coreUploader(context) { - var dispatch10 = dispatch_default( + var dispatch14 = dispatch_default( + // Start and end events are dispatched exactly once each per legitimate outside call to `save` "saveStarted", + // dispatched as soon as a call to `save` has been deemed legitimate "saveEnded", + // dispatched after the result event has been dispatched "willAttemptUpload", + // dispatched before the actual upload call occurs, if it will "progressChanged", + // Each save results in one of these outcomes: "resultNoChanges", + // upload wasn't attempted since there were no edits "resultErrors", + // upload failed due to errors "resultConflicts", + // upload failed due to data conflicts "resultSuccess" + // upload completed without errors ); var _isSaving = false; var _conflicts = []; var _errors = []; var _origChanges; var _discardTags = {}; - _mainFileFetcher.get("discarded").then(function(d) { - _discardTags = d; + _mainFileFetcher.get("discarded").then(function(d2) { + _discardTags = d2; }).catch(function() { }); - var uploader = utilRebind({}, dispatch10, "on"); + var uploader = utilRebind({}, dispatch14, "on"); uploader.isSaving = function() { return _isSaving; }; @@ -43165,7 +44859,7 @@ ${content} } if (!_isSaving) { _isSaving = true; - dispatch10.call("saveStarted", this); + dispatch14.call("saveStarted", this); } var history = context.history(); _conflicts = []; @@ -43189,8 +44883,8 @@ ${content} var remoteGraph = coreGraph(history.base(), true); var summary = history.difference().summary(); var _toCheck = []; - for (var i2 = 0; i2 < summary.length; i2++) { - var item = summary[i2]; + for (var i3 = 0; i3 < summary.length; i3++) { + var item = summary[i3]; if (item.changeType === "modified") { _toCheck.push(item.entity.id); } @@ -43200,7 +44894,7 @@ ${content} var _toLoadCount = 0; var _toLoadTotal = _toLoad.length; if (_toCheck.length) { - dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal); + dispatch14.call("progressChanged", this, _toLoadCount, _toLoadTotal); _toLoad.forEach(function(id2) { _loaded[id2] = false; }); @@ -43210,18 +44904,18 @@ ${content} } return; function withChildNodes(ids, graph) { - var s = new Set(ids); + var s2 = new Set(ids); ids.forEach(function(id2) { var entity = graph.entity(id2); if (entity.type !== "way") return; graph.childNodes(entity).forEach(function(child) { if (child.version !== void 0) { - s.add(child.id); + s2.add(child.id); } }); }); - return Array.from(s); + return Array.from(s2); } function loaded(err, result) { if (_errors.length) @@ -43242,18 +44936,18 @@ ${content} }); if (!entity.visible) return; - var i3, id2; + var i4, id2; if (entity.type === "way") { - for (i3 = 0; i3 < entity.nodes.length; i3++) { - id2 = entity.nodes[i3]; + for (i4 = 0; i4 < entity.nodes.length; i4++) { + id2 = entity.nodes[i4]; if (_loaded[id2] === void 0) { _loaded[id2] = false; loadMore.push(id2); } } } else if (entity.type === "relation" && entity.isMultipolygon()) { - for (i3 = 0; i3 < entity.members.length; i3++) { - id2 = entity.members[i3].id; + for (i4 = 0; i4 < entity.members.length; i4++) { + id2 = entity.members[i4].id; if (_loaded[id2] === void 0) { _loaded[id2] = false; loadMore.push(id2); @@ -43263,7 +44957,7 @@ ${content} }); _toLoadCount += result.data.length; _toLoadTotal += loadMore.length; - dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal); + dispatch14.call("progressChanged", this, _toLoadCount, _toLoadTotal); if (loadMore.length) { _toLoad.push.apply(_toLoad, loadMore); osm.loadMultiple(loadMore, loaded); @@ -43284,8 +44978,8 @@ ${content} } }; } - function formatUser(d) { - return '
    ' + escape_default(d) + ""; + function formatUser(d2) { + return '' + escape_default(d2) + ""; } function entityName(entity) { return utilDisplayName(entity) || utilDisplayType(entity.id) + " " + entity.id; @@ -43295,10 +44989,10 @@ ${content} return false; if (local.type === "way") { var children2 = utilArrayUnion(local.nodes, remote.nodes); - for (var i3 = 0; i3 < children2.length; i3++) { - var a = localGraph.hasEntity(children2[i3]); - var b = remoteGraph.hasEntity(children2[i3]); - if (a && b && a.version !== b.version) + for (var i4 = 0; i4 < children2.length; i4++) { + var a2 = localGraph.hasEntity(children2[i4]); + var b2 = remoteGraph.hasEntity(children2[i4]); + if (a2 && b2 && a2.version !== b2.version) return false; } } @@ -43309,9 +45003,9 @@ ${content} var remote = remoteGraph.entity(id2); if (sameVersions(local, remote)) return; - var merge3 = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags, formatUser); - history.replace(merge3); - var mergeConflicts = merge3.conflicts(); + var merge2 = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags, formatUser); + history.replace(merge2); + var mergeConflicts = merge2.conflicts(); if (!mergeConflicts.length) return; var forceLocal = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_local"); @@ -43344,7 +45038,7 @@ ${content} var history = context.history(); var changes = history.changes(actionDiscardTags(history.difference(), _discardTags)); if (changes.modified.length || changes.created.length || changes.deleted.length) { - dispatch10.call("willAttemptUpload", this); + dispatch14.call("willAttemptUpload", this); osm.putChangeset(changeset, changes, uploadCallback); } else { didResultInNoChanges(); @@ -43367,25 +45061,25 @@ ${content} } } function didResultInNoChanges() { - dispatch10.call("resultNoChanges", this); + dispatch14.call("resultNoChanges", this); endSave(); context.flush(); } function didResultInErrors() { context.history().pop(); - dispatch10.call("resultErrors", this, _errors); + dispatch14.call("resultErrors", this, _errors); endSave(); } function didResultInConflicts(changeset) { - _conflicts.sort(function(a, b) { - return b.id.localeCompare(a.id); + _conflicts.sort(function(a2, b2) { + return b2.id.localeCompare(a2.id); }); - dispatch10.call("resultConflicts", this, changeset, _conflicts, _origChanges); + dispatch14.call("resultConflicts", this, changeset, _conflicts, _origChanges); endSave(); } function didResultInSuccess(changeset) { context.history().clearSaved(); - dispatch10.call("resultSuccess", this, changeset); + dispatch14.call("resultSuccess", this, changeset); window.setTimeout(function() { endSave(); context.flush(); @@ -43393,23 +45087,23 @@ ${content} } function endSave() { _isSaving = false; - dispatch10.call("saveEnded", this); + dispatch14.call("saveEnded", this); } uploader.cancelConflictResolution = function() { context.history().pop(); }; uploader.processResolvedConflicts = function(changeset) { var history = context.history(); - for (var i2 = 0; i2 < _conflicts.length; i2++) { - if (_conflicts[i2].chosen === 1) { - var entity = context.hasEntity(_conflicts[i2].id); + for (var i3 = 0; i3 < _conflicts.length; i3++) { + if (_conflicts[i3].chosen === 1) { + var entity = context.hasEntity(_conflicts[i3].id); if (entity && entity.type === "way") { var children2 = utilArrayUniq(entity.nodes); - for (var j2 = 0; j2 < children2.length; j2++) { - history.replace(actionRevert(children2[j2])); + for (var j3 = 0; j3 < children2.length; j3++) { + history.replace(actionRevert(children2[j3])); } } - history.replace(actionRevert(_conflicts[i2].id)); + history.replace(actionRevert(_conflicts[i3].id)); } } uploader.save(changeset, true, false); @@ -43420,10 +45114,16 @@ ${content} } // modules/renderer/background_source.js - var import_lodash2 = __toESM(require_lodash()); + var import_lodash4 = __toESM(require_lodash()); // modules/util/IntervalTasksQueue.js var IntervalTasksQueue = class { + /** + * Interval in milliseconds inside which only 1 task can execute. + * e.g. if interval is 200ms, and 5 async tasks are unqueued, + * they will complete in ~1s if not cleared + * @param {number} intervalInMs + */ constructor(intervalInMs) { this.intervalInMs = intervalInMs; this.pendingHandles = []; @@ -43455,24 +45155,24 @@ ${content} `).addListener(function() { isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2; }); - function localeDateString(s) { - if (!s) + function localeDateString(s2) { + if (!s2) return null; var options2 = { day: "numeric", month: "short", year: "numeric" }; - var d = new Date(s); - if (isNaN(d.getTime())) + var d2 = new Date(s2); + if (isNaN(d2.getTime())) return null; - return d.toLocaleDateString(_mainLocalizer.localeCode(), options2); + return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2); } function vintageRange(vintage) { - var s; + var s2; if (vintage.start || vintage.end) { - s = vintage.start || "?"; + s2 = vintage.start || "?"; if (vintage.start !== vintage.end) { - s += " - " + (vintage.end || "?"); + s2 += " - " + (vintage.end || "?"); } } - return s; + return s2; } function rendererBackgroundSource(data) { var source = Object.assign({}, data); @@ -43497,15 +45197,20 @@ ${content} }; source.name = function() { var id_safe = source.id.replace(/\./g, ""); - return _t("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) }); + return _t("imagery." + id_safe + ".name", { default: (0, import_lodash4.escape)(_name) }); }; source.label = function() { var id_safe = source.id.replace(/\./g, ""); - return _t.append("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) }); + return _t.append("imagery." + id_safe + ".name", { default: (0, import_lodash4.escape)(_name) }); + }; + source.hasDescription = function() { + var id_safe = source.id.replace(/\./g, ""); + var descriptionText = _mainLocalizer.tInfo("imagery." + id_safe + ".description", { default: (0, import_lodash4.escape)(_description) }).text; + return descriptionText !== ""; }; source.description = function() { var id_safe = source.id.replace(/\./g, ""); - return _t.append("imagery." + id_safe + ".description", { default: (0, import_lodash2.escape)(_description) }); + return _t.append("imagery." + id_safe + ".description", { default: (0, import_lodash4.escape)(_description) }); }; source.best = function() { return _best; @@ -43542,10 +45247,10 @@ ${content} } } if (source.type === "wms") { - var tileToProjectedCoords = function(x, y, z) { - var zoomSize = Math.pow(2, z); - var lon = x / zoomSize * Math.PI * 2 - Math.PI; - var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / zoomSize))); + var tileToProjectedCoords = function(x2, y2, z2) { + var zoomSize = Math.pow(2, z2); + var lon = x2 / zoomSize * Math.PI * 2 - Math.PI; + var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y2 / zoomSize))); switch (source.projection) { case "EPSG:4326": return { @@ -43574,7 +45279,8 @@ ${content} case "wkid": return projection2.replace(/^EPSG:/, ""); case "bbox": - if (projection2 === "EPSG:4326" && /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) { + if (projection2 === "EPSG:4326" && // The CRS parameter implies version 1.3 (prior versions use SRS) + /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) { return maxXminY.y + "," + minXmaxY.x + "," + minXmaxY.y + "," + maxXminY.x; } else { return minXmaxY.x + "," + maxXminY.y + "," + maxXminY.x + "," + minXmaxY.y; @@ -43595,27 +45301,27 @@ ${content} result = result.replace("{x}", coord2[0]).replace("{y}", coord2[1]).replace(/\{[t-]y\}/, Math.pow(2, coord2[2]) - coord2[1] - 1).replace(/\{z(oom)?\}/, coord2[2]).replace(/\{@2x\}|\{r\}/, isRetina ? "@2x" : ""); } else if (source.type === "bing") { result = result.replace("{u}", function() { - var u = ""; + var u2 = ""; for (var zoom = coord2[2]; zoom > 0; zoom--) { - var b = 0; + var b2 = 0; var mask = 1 << zoom - 1; if ((coord2[0] & mask) !== 0) - b++; + b2++; if ((coord2[1] & mask) !== 0) - b += 2; - u += b.toString(); + b2 += 2; + u2 += b2.toString(); } - return u; + return u2; }); } - result = result.replace(/\{switch:([^}]+)\}/, function(s, r) { - var subdomains = r.split(","); + result = result.replace(/\{switch:([^}]+)\}/, function(s2, r2) { + var subdomains = r2.split(","); return subdomains[(coord2[0] + coord2[1]) % subdomains.length]; }); return result; }; - source.validZoom = function(z) { - return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z); + source.validZoom = function(z2) { + return source.zoomExtent[0] <= z2 && (source.overzoom || source.zoomExtent[1] > z2); }; source.isLocatorOverlay = function() { return source.id === "mapbox_locator_overlay"; @@ -43636,7 +45342,7 @@ ${content} }; return source; } - rendererBackgroundSource.Bing = function(data, dispatch10) { + rendererBackgroundSource.Bing = function(data, dispatch14) { data.template = "https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=1&pr=odbl&n=z"; var bing = rendererBackgroundSource(data); var key = utilAesDecrypt("5c875730b09c6b422433e807e1ff060b6536c791dbfffcffc4c6b18a1bdba1f14593d151adb50e19e1be1ab19aef813bf135d0f103475e5c724dec94389e45d0"); @@ -43670,7 +45376,7 @@ ${content} }) }; }); - dispatch10.call("change"); + dispatch14.call("change"); }).catch(function() { }); bing.copyrightNotices = function(zoom, extent) { @@ -43738,18 +45444,18 @@ ${content} if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5e3) return; _prevCenter = center; - var z = 20; + var z2 = 20; var dummyUrl = esri.url([1, 2, 3]); - var x = Math.floor((center[0] + 180) / 360 * Math.pow(2, z)); - 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)); - var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, "tilemap") + "/" + z + "/" + y + "/" + x + "/8/8"; + var x2 = Math.floor((center[0] + 180) / 360 * Math.pow(2, z2)); + var y2 = 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, z2)); + var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, "tilemap") + "/" + z2 + "/" + y2 + "/" + x2 + "/8/8"; json_default(tilemapUrl).then(function(tilemap) { if (!tilemap) { throw new Error("Unknown Error"); } var hasTiles = true; - for (var i2 = 0; i2 < tilemap.data.length; i2++) { - if (!tilemap.data[i2]) { + for (var i3 = 0; i3 < tilemap.data.length; i3++) { + if (!tilemap.data[i3]) { hasTiles = false; break; } @@ -43781,7 +45487,7 @@ ${content} inflight[tileID] = true; json_default(url).then(function(result) { delete inflight[tileID]; - result = result.features.map((f2) => f2.attributes).filter((a) => a.MinMapLevel <= zoom && a.MaxMapLevel >= zoom)[0]; + result = result.features.map((f3) => f3.attributes).filter((a2) => a2.MinMapLevel <= zoom && a2.MaxMapLevel >= zoom)[0]; if (!result) { throw new Error("Unknown Error"); } else if (result.features && result.features.length < 1) { @@ -43799,8 +45505,8 @@ ${content} vintage, source: clean2(result.NICE_NAME), description: clean2(result.NICE_DESC), - resolution: clean2(+parseFloat(result.SRC_RES).toFixed(4)), - accuracy: clean2(+parseFloat(result.SRC_ACC).toFixed(4)) + resolution: clean2(+Number(result.SRC_RES).toFixed(4)), + accuracy: clean2(+Number(result.SRC_ACC).toFixed(4)) }; if (isFinite(metadata.resolution)) { metadata.resolution += " m"; @@ -43867,53 +45573,420 @@ ${content} return source; }; + // node_modules/@turf/helpers/dist/es/index.js + var earthRadius = 63710088e-1; + var factors = { + centimeters: earthRadius * 100, + centimetres: earthRadius * 100, + degrees: earthRadius / 111325, + feet: earthRadius * 3.28084, + inches: earthRadius * 39.37, + kilometers: earthRadius / 1e3, + kilometres: earthRadius / 1e3, + meters: earthRadius, + metres: earthRadius, + miles: earthRadius / 1609.344, + millimeters: earthRadius * 1e3, + millimetres: earthRadius * 1e3, + nauticalmiles: earthRadius / 1852, + radians: 1, + yards: earthRadius * 1.0936 + }; + var unitsFactors = { + centimeters: 100, + centimetres: 100, + degrees: 1 / 111325, + feet: 3.28084, + inches: 39.37, + kilometers: 1 / 1e3, + kilometres: 1 / 1e3, + meters: 1, + metres: 1, + miles: 1 / 1609.344, + millimeters: 1e3, + millimetres: 1e3, + nauticalmiles: 1 / 1852, + radians: 1 / earthRadius, + yards: 1.0936133 + }; + function feature2(geom, properties, options2) { + if (options2 === void 0) { + options2 = {}; + } + var feat = { type: "Feature" }; + if (options2.id === 0 || options2.id) { + feat.id = options2.id; + } + if (options2.bbox) { + feat.bbox = options2.bbox; + } + feat.properties = properties || {}; + feat.geometry = geom; + return feat; + } + function polygon(coordinates, properties, options2) { + if (options2 === void 0) { + options2 = {}; + } + for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) { + var ring = coordinates_1[_i]; + if (ring.length < 4) { + throw new Error("Each LinearRing of a Polygon must have 4 or more Positions."); + } + for (var j3 = 0; j3 < ring[ring.length - 1].length; j3++) { + if (ring[ring.length - 1][j3] !== ring[0][j3]) { + throw new Error("First and last Position are not equivalent."); + } + } + } + var geom = { + type: "Polygon", + coordinates + }; + return feature2(geom, properties, options2); + } + function lineString(coordinates, properties, options2) { + if (options2 === void 0) { + options2 = {}; + } + if (coordinates.length < 2) { + throw new Error("coordinates must be an array of two or more positions"); + } + var geom = { + type: "LineString", + coordinates + }; + return feature2(geom, properties, options2); + } + function multiLineString(coordinates, properties, options2) { + if (options2 === void 0) { + options2 = {}; + } + var geom = { + type: "MultiLineString", + coordinates + }; + return feature2(geom, properties, options2); + } + function multiPolygon(coordinates, properties, options2) { + if (options2 === void 0) { + options2 = {}; + } + var geom = { + type: "MultiPolygon", + coordinates + }; + return feature2(geom, properties, options2); + } + + // node_modules/@turf/invariant/dist/es/index.js + function getGeom(geojson) { + if (geojson.type === "Feature") { + return geojson.geometry; + } + return geojson; + } + + // node_modules/@turf/bbox-clip/dist/es/lib/lineclip.js + function lineclip(points, bbox2, result) { + var len = points.length, codeA = bitCode(points[0], bbox2), part = [], i3, codeB, lastCode; + var a2; + var b2; + if (!result) + result = []; + for (i3 = 1; i3 < len; i3++) { + a2 = points[i3 - 1]; + b2 = points[i3]; + codeB = lastCode = bitCode(b2, bbox2); + while (true) { + if (!(codeA | codeB)) { + part.push(a2); + if (codeB !== lastCode) { + part.push(b2); + if (i3 < len - 1) { + result.push(part); + part = []; + } + } else if (i3 === len - 1) { + part.push(b2); + } + break; + } else if (codeA & codeB) { + break; + } else if (codeA) { + a2 = intersect(a2, b2, codeA, bbox2); + codeA = bitCode(a2, bbox2); + } else { + b2 = intersect(a2, b2, codeB, bbox2); + codeB = bitCode(b2, bbox2); + } + } + codeA = lastCode; + } + if (part.length) + result.push(part); + return result; + } + function polygonclip(points, bbox2) { + var result, edge, prev, prevInside, i3, p2, inside; + for (edge = 1; edge <= 8; edge *= 2) { + result = []; + prev = points[points.length - 1]; + prevInside = !(bitCode(prev, bbox2) & edge); + for (i3 = 0; i3 < points.length; i3++) { + p2 = points[i3]; + inside = !(bitCode(p2, bbox2) & edge); + if (inside !== prevInside) + result.push(intersect(prev, p2, edge, bbox2)); + if (inside) + result.push(p2); + prev = p2; + prevInside = inside; + } + points = result; + if (!points.length) + break; + } + return result; + } + function intersect(a2, b2, edge, bbox2) { + return edge & 8 ? [a2[0] + (b2[0] - a2[0]) * (bbox2[3] - a2[1]) / (b2[1] - a2[1]), bbox2[3]] : edge & 4 ? [a2[0] + (b2[0] - a2[0]) * (bbox2[1] - a2[1]) / (b2[1] - a2[1]), bbox2[1]] : edge & 2 ? [bbox2[2], a2[1] + (b2[1] - a2[1]) * (bbox2[2] - a2[0]) / (b2[0] - a2[0])] : edge & 1 ? [bbox2[0], a2[1] + (b2[1] - a2[1]) * (bbox2[0] - a2[0]) / (b2[0] - a2[0])] : null; + } + function bitCode(p2, bbox2) { + var code = 0; + if (p2[0] < bbox2[0]) + code |= 1; + else if (p2[0] > bbox2[2]) + code |= 2; + if (p2[1] < bbox2[1]) + code |= 4; + else if (p2[1] > bbox2[3]) + code |= 8; + return code; + } + + // node_modules/@turf/bbox-clip/dist/es/index.js + function bboxClip(feature3, bbox2) { + var geom = getGeom(feature3); + var type2 = geom.type; + var properties = feature3.type === "Feature" ? feature3.properties : {}; + var coords = geom.coordinates; + switch (type2) { + case "LineString": + case "MultiLineString": { + var lines_1 = []; + if (type2 === "LineString") { + coords = [coords]; + } + coords.forEach(function(line) { + lineclip(line, bbox2, lines_1); + }); + if (lines_1.length === 1) { + return lineString(lines_1[0], properties); + } + return multiLineString(lines_1, properties); + } + case "Polygon": + return polygon(clipPolygon(coords, bbox2), properties); + case "MultiPolygon": + return multiPolygon(coords.map(function(poly) { + return clipPolygon(poly, bbox2); + }), properties); + default: + throw new Error("geometry " + type2 + " not supported"); + } + } + function clipPolygon(rings, bbox2) { + var outRings = []; + for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) { + var ring = rings_1[_i]; + var clipped = polygonclip(ring, bbox2); + if (clipped.length > 0) { + if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) { + clipped.push(clipped[0]); + } + if (clipped.length >= 4) { + outRings.push(clipped); + } + } + } + return outRings; + } + + // node_modules/@turf/meta/dist/es/index.js + function coordEach(geojson, callback, excludeWrapCoord) { + if (geojson === null) + return; + var j3, k2, l2, geometry, stopG, coords, geometryMaybeCollection, wrapShrink = 0, coordIndex = 0, isGeometryCollection, type2 = geojson.type, isFeatureCollection = type2 === "FeatureCollection", isFeature = type2 === "Feature", stop = isFeatureCollection ? geojson.features.length : 1; + for (var featureIndex = 0; featureIndex < stop; featureIndex++) { + geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson; + isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === "GeometryCollection" : false; + stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1; + for (var geomIndex = 0; geomIndex < stopG; geomIndex++) { + var multiFeatureIndex = 0; + var geometryIndex = 0; + geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection; + if (geometry === null) + continue; + coords = geometry.coordinates; + var geomType = geometry.type; + wrapShrink = excludeWrapCoord && (geomType === "Polygon" || geomType === "MultiPolygon") ? 1 : 0; + switch (geomType) { + case null: + break; + case "Point": + if (callback( + coords, + coordIndex, + featureIndex, + multiFeatureIndex, + geometryIndex + ) === false) + return false; + coordIndex++; + multiFeatureIndex++; + break; + case "LineString": + case "MultiPoint": + for (j3 = 0; j3 < coords.length; j3++) { + if (callback( + coords[j3], + coordIndex, + featureIndex, + multiFeatureIndex, + geometryIndex + ) === false) + return false; + coordIndex++; + if (geomType === "MultiPoint") + multiFeatureIndex++; + } + if (geomType === "LineString") + multiFeatureIndex++; + break; + case "Polygon": + case "MultiLineString": + for (j3 = 0; j3 < coords.length; j3++) { + for (k2 = 0; k2 < coords[j3].length - wrapShrink; k2++) { + if (callback( + coords[j3][k2], + coordIndex, + featureIndex, + multiFeatureIndex, + geometryIndex + ) === false) + return false; + coordIndex++; + } + if (geomType === "MultiLineString") + multiFeatureIndex++; + if (geomType === "Polygon") + geometryIndex++; + } + if (geomType === "Polygon") + multiFeatureIndex++; + break; + case "MultiPolygon": + for (j3 = 0; j3 < coords.length; j3++) { + geometryIndex = 0; + for (k2 = 0; k2 < coords[j3].length; k2++) { + for (l2 = 0; l2 < coords[j3][k2].length - wrapShrink; l2++) { + if (callback( + coords[j3][k2][l2], + coordIndex, + featureIndex, + multiFeatureIndex, + geometryIndex + ) === false) + return false; + coordIndex++; + } + geometryIndex++; + } + multiFeatureIndex++; + } + break; + case "GeometryCollection": + for (j3 = 0; j3 < geometry.geometries.length; j3++) + if (coordEach(geometry.geometries[j3], callback, excludeWrapCoord) === false) + return false; + break; + default: + throw new Error("Unknown Geometry Type"); + } + } + } + } + + // node_modules/@turf/bbox/dist/es/index.js + function bbox(geojson) { + var result = [Infinity, Infinity, -Infinity, -Infinity]; + coordEach(geojson, function(coord2) { + if (result[0] > coord2[0]) { + result[0] = coord2[0]; + } + if (result[1] > coord2[1]) { + result[1] = coord2[1]; + } + if (result[2] < coord2[0]) { + result[2] = coord2[0]; + } + if (result[3] < coord2[1]) { + result[3] = coord2[1]; + } + }); + return result; + } + bbox["default"] = bbox; + var es_default = bbox; + // modules/renderer/background.js - var import_which_polygon4 = __toESM(require_which_polygon()); + var import_which_polygon3 = __toESM(require_which_polygon()); // modules/renderer/tile_layer.js function rendererTileLayer(context) { var transformProp = utilPrefixCSSProperty("Transform"); - var tiler8 = utilTiler(); + var tiler9 = utilTiler(); var _tileSize = 256; var _projection; var _cache4 = {}; var _tileOrigin; var _zoom; var _source; - function tileSizeAtZoom(d, z) { + function tileSizeAtZoom(d2, z2) { var EPSILON = 2e-3; - return _tileSize * Math.pow(2, z - d[2]) / _tileSize + EPSILON; + return _tileSize * Math.pow(2, z2 - d2[2]) / _tileSize + EPSILON; } - function atZoom(t, distance) { + function atZoom(t2, distance) { var power = Math.pow(2, distance); return [ - Math.floor(t[0] * power), - Math.floor(t[1] * power), - t[2] + distance + Math.floor(t2[0] * power), + Math.floor(t2[1] * power), + t2[2] + distance ]; } - function lookUp(d) { - for (var up = -1; up > -d[2]; up--) { - var tile = atZoom(d, up); + function lookUp(d2) { + for (var up = -1; up > -d2[2]; up--) { + var tile = atZoom(d2, up); if (_cache4[_source.url(tile)] !== false) { return tile; } } } - function uniqueBy(a, n2) { - var o = []; + function uniqueBy(a2, n3) { + var o2 = []; var seen = {}; - for (var i2 = 0; i2 < a.length; i2++) { - if (seen[a[i2][n2]] === void 0) { - o.push(a[i2]); - seen[a[i2][n2]] = true; + for (var i3 = 0; i3 < a2.length; i3++) { + if (seen[a2[i3][n3]] === void 0) { + o2.push(a2[i3]); + seen[a2[i3][n3]] = true; } } - return o; + return o2; } - function addSource(d) { - d.push(_source.url(d)); - return d; + function addSource(d2) { + d2.push(_source.url(d2)); + return d2; } function background(selection2) { _zoom = geoScaleToZoom(_projection.scale(), _tileSize); @@ -43930,7 +46003,7 @@ ${content} _projection.translate()[0] + pixelOffset[0], _projection.translate()[1] + pixelOffset[1] ]; - tiler8.scale(_projection.scale() * 2 * Math.PI).translate(translate); + tiler9.scale(_projection.scale() * 2 * Math.PI).translate(translate); _tileOrigin = [ _projection.scale() * Math.PI - translate[0], _projection.scale() * Math.PI - translate[1] @@ -43943,62 +46016,62 @@ ${content} var requests = []; var showDebug = context.getDebug("tile") && !_source.overlay; if (_source.validZoom(_zoom)) { - tiler8.skipNullIsland(!!_source.overlay); - tiler8().forEach(function(d) { - addSource(d); - if (d[3] === "") + tiler9.skipNullIsland(!!_source.overlay); + tiler9().forEach(function(d2) { + addSource(d2); + if (d2[3] === "") return; - if (typeof d[3] !== "string") + if (typeof d2[3] !== "string") return; - requests.push(d); - if (_cache4[d[3]] === false && lookUp(d)) { - requests.push(addSource(lookUp(d))); + requests.push(d2); + if (_cache4[d2[3]] === false && lookUp(d2)) { + requests.push(addSource(lookUp(d2))); } }); - requests = uniqueBy(requests, 3).filter(function(r) { - return _cache4[r[3]] !== false; + requests = uniqueBy(requests, 3).filter(function(r2) { + return _cache4[r2[3]] !== false; }); } - function load(d3_event, d) { - _cache4[d[3]] = true; + function load(d3_event, d2) { + _cache4[d2[3]] = true; select_default2(this).on("error", null).on("load", null).classed("tile-loaded", true); render(selection2); } - function error(d3_event, d) { - _cache4[d[3]] = false; + function error(d3_event, d2) { + _cache4[d2[3]] = false; select_default2(this).on("error", null).on("load", null).remove(); render(selection2); } - function imageTransform(d) { - var ts = _tileSize * Math.pow(2, _zoom - d[2]); - var scale = tileSizeAtZoom(d, _zoom); - return "translate(" + (d[0] * ts - _tileOrigin[0]) + "px," + (d[1] * ts - _tileOrigin[1]) + "px) scale(" + scale + "," + scale + ")"; + function imageTransform(d2) { + var ts = _tileSize * Math.pow(2, _zoom - d2[2]); + var scale = tileSizeAtZoom(d2, _zoom); + return "translate(" + (d2[0] * ts - _tileOrigin[0]) + "px," + (d2[1] * ts - _tileOrigin[1]) + "px) scale(" + scale + "," + scale + ")"; } - function tileCenter(d) { - var ts = _tileSize * Math.pow(2, _zoom - d[2]); + function tileCenter(d2) { + var ts = _tileSize * Math.pow(2, _zoom - d2[2]); return [ - d[0] * ts - _tileOrigin[0] + ts / 2, - d[1] * ts - _tileOrigin[1] + ts / 2 + d2[0] * ts - _tileOrigin[0] + ts / 2, + d2[1] * ts - _tileOrigin[1] + ts / 2 ]; } - function debugTransform(d) { - var coord2 = tileCenter(d); + function debugTransform(d2) { + var coord2 = tileCenter(d2); return "translate(" + coord2[0] + "px," + coord2[1] + "px)"; } - var dims = tiler8.size(); + var dims = tiler9.size(); var mapCenter = [dims[0] / 2, dims[1] / 2]; var minDist = Math.max(dims[0], dims[1]); var nearCenter; - requests.forEach(function(d) { - var c = tileCenter(d); - var dist = geoVecLength(c, mapCenter); + requests.forEach(function(d2) { + var c2 = tileCenter(d2); + var dist = geoVecLength(c2, mapCenter); if (dist < minDist) { minDist = dist; - nearCenter = d; + nearCenter = d2; } }); - var image = selection2.selectAll("img").data(requests, function(d) { - return d[3]; + var image = selection2.selectAll("img").data(requests, function(d2) { + return d2[3]; }); image.exit().style(transformProp, imageTransform).classed("tile-removing", true).classed("tile-center", false).each(function() { var tile = select_default2(this); @@ -44008,13 +46081,13 @@ ${content} } }, 300); }); - image.enter().append("img").attr("class", "tile").attr("alt", "").attr("draggable", "false").style("width", _tileSize + "px").style("height", _tileSize + "px").attr("src", function(d) { - return d[3]; - }).on("error", error).on("load", load).merge(image).style(transformProp, imageTransform).classed("tile-debug", showDebug).classed("tile-removing", false).classed("tile-center", function(d) { - return d === nearCenter; + image.enter().append("img").attr("class", "tile").attr("alt", "").attr("draggable", "false").style("width", _tileSize + "px").style("height", _tileSize + "px").attr("src", function(d2) { + return d2[3]; + }).on("error", error).on("load", load).merge(image).style(transformProp, imageTransform).classed("tile-debug", showDebug).classed("tile-removing", false).classed("tile-center", function(d2) { + return d2 === nearCenter; }); - var debug2 = selection2.selectAll(".tile-label-debug").data(showDebug ? requests : [], function(d) { - return d[3]; + var debug2 = selection2.selectAll(".tile-label-debug").data(showDebug ? requests : [], function(d2) { + return d2[3]; }); debug2.exit().remove(); if (showDebug) { @@ -44023,16 +46096,17 @@ ${content} debugEnter.append("div").attr("class", "tile-label-debug-vintage"); debug2 = debug2.merge(debugEnter); debug2.style(transformProp, debugTransform); - debug2.selectAll(".tile-label-debug-coord").text(function(d) { - return d[2] + " / " + d[0] + " / " + d[1]; + debug2.selectAll(".tile-label-debug-coord").text(function(d2) { + return d2[2] + " / " + d2[0] + " / " + d2[1]; }); - debug2.selectAll(".tile-label-debug-vintage").each(function(d) { + debug2.selectAll(".tile-label-debug-vintage").each(function(d2) { var span = select_default2(this); - var center = context.projection.invert(tileCenter(d)); - _source.getMetadata(center, d, function(err, result) { + var center = context.projection.invert(tileCenter(d2)); + _source.getMetadata(center, d2, function(err, result) { if (result && result.vintage && result.vintage.range) { span.text(result.vintage.range); } else { + span.text(""); span.call(_t.append("info_panels.background.vintage")); span.append("span").text(": "); span.call(_t.append("info_panels.background.unknown")); @@ -44049,8 +46123,8 @@ ${content} }; background.dimensions = function(val) { if (!arguments.length) - return tiler8.size(); - tiler8.size(val); + return tiler9.size(); + tiler9.size(val); return background; }; background.source = function(val) { @@ -44059,7 +46133,7 @@ ${content} _source = val; _tileSize = _source.tileSize; _cache4 = {}; - tiler8.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); + tiler9.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); return background; }; return background; @@ -44068,7 +46142,7 @@ ${content} // modules/renderer/background.js var _imageryIndex = null; function rendererBackground(context) { - const dispatch10 = dispatch_default("change"); + const dispatch14 = dispatch_default("change"); const baseLayer = rendererTileLayer(context).projection(context.projection); let _checkedBlocklists = []; let _isValid = true; @@ -44085,7 +46159,7 @@ ${content} imagery: sources, features: {} }; - const features2 = sources.map((source) => { + const features = sources.map((source) => { if (!source.polygon) return null; const rings = source.polygon.map((ring) => [ring]); @@ -44097,10 +46171,10 @@ ${content} _imageryIndex.features[source.id] = feature3; return feature3; }).filter(Boolean); - _imageryIndex.query = (0, import_which_polygon4.default)({ type: "FeatureCollection", features: features2 }); + _imageryIndex.query = (0, import_which_polygon3.default)({ type: "FeatureCollection", features }); _imageryIndex.backgrounds = sources.map((source) => { if (source.type === "bing") { - return rendererBackgroundSource.Bing(source, dispatch10); + return rendererBackgroundSource.Bing(source, dispatch14); } else if (/^EsriWorldImagery/.test(source.id)) { return rendererBackgroundSource.Esri(source); } else { @@ -44124,7 +46198,7 @@ ${content} } const sources = background.sources(context.map().extent()); const wasValid = _isValid; - _isValid = !!sources.filter((d) => d === currSource).length; + _isValid = !!sources.filter((d2) => d2 === currSource).length; if (wasValid !== _isValid) { background.updateImagery(); } @@ -44160,19 +46234,19 @@ ${content} let mask = base.selectAll(".layer-unsharp-mask").data(_sharpness > 1 ? [0] : []); mask.exit().remove(); mask.enter().append("div").attr("class", "layer layer-mask layer-unsharp-mask").merge(mask).call(baseLayer).style("filter", maskFilter || null).style("mix-blend-mode", mixBlendMode || null); - let overlays = selection2.selectAll(".layer-overlay").data(_overlayLayers, (d) => d.source().name()); + let overlays = selection2.selectAll(".layer-overlay").data(_overlayLayers, (d2) => d2.source().name()); overlays.exit().remove(); - overlays.enter().insert("div", ".layer-data").attr("class", "layer layer-overlay").merge(overlays).each((layer, i2, nodes) => select_default2(nodes[i2]).call(layer)); + overlays.enter().insert("div", ".layer-data").attr("class", "layer layer-overlay").merge(overlays).each((layer, i3, nodes) => select_default2(nodes[i3]).call(layer)); } background.updateImagery = function() { let currSource = baseLayer.source(); if (context.inIntro() || !currSource) return; - let o = _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).map((d) => d.source().id).join(","); + let o2 = _overlayLayers.filter((d2) => !d2.source().isLocatorOverlay() && !d2.source().isHidden()).map((d2) => d2.source().id).join(","); const meters = geoOffsetToMeters(currSource.offset()); const EPSILON = 0.01; - const x = +meters[0].toFixed(2); - const y = +meters[1].toFixed(2); + const x2 = +meters[0].toFixed(2); + const y2 = +meters[1].toFixed(2); let hash = utilStringQs(window.location.hash); let id2 = currSource.id; if (id2 === "custom") { @@ -44183,13 +46257,13 @@ ${content} } else { delete hash.background; } - if (o) { - hash.overlays = o; + if (o2) { + hash.overlays = o2; } else { delete hash.overlays; } - if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) { - hash.offset = `${x},${y}`; + if (Math.abs(x2) > EPSILON || Math.abs(y2) > EPSILON) { + hash.offset = `${x2},${y2}`; } else { delete hash.offset; } @@ -44202,7 +46276,7 @@ ${content} if (currUsed && _isValid) { imageryUsed.push(currUsed); } - _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).forEach((d) => imageryUsed.push(d.source().imageryUsed())); + _overlayLayers.filter((d2) => !d2.source().isLocatorOverlay() && !d2.source().isHidden()).forEach((d2) => imageryUsed.push(d2.source().imageryUsed())); const dataLayer = context.layers().layer("data"); if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) { imageryUsed.push(dataLayer.getSrc()); @@ -44212,7 +46286,9 @@ ${content} mapillary: "Mapillary Images", "mapillary-map-features": "Mapillary Map Features", "mapillary-signs": "Mapillary Signs", - kartaview: "KartaView Images" + kartaview: "KartaView Images", + vegbilder: "Norwegian Road Administration Images", + mapilio: "Mapilio Images" }; for (let layerID in photoOverlayLayers) { const layer = context.layers().layer(layerID); @@ -44228,7 +46304,7 @@ ${content} if (!_imageryIndex) return []; let visible = {}; - (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach((d) => visible[d.id] = true); + (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach((d2) => visible[d2.id] = true); const currSource = baseLayer.source(); const osm = context.connection(); const blocklists = osm && osm.imageryBlocklists() || []; @@ -44257,19 +46333,19 @@ ${content} baseLayer.dimensions(val); _overlayLayers.forEach((layer) => layer.dimensions(val)); }; - background.baseLayerSource = function(d) { + background.baseLayerSource = function(d2) { if (!arguments.length) return baseLayer.source(); const osm = context.connection(); if (!osm) return background; const blocklists = osm.imageryBlocklists(); - const template = d.template(); + const template = d2.template(); let fail = false; let tested = 0; let regex; - for (let i2 = 0; i2 < blocklists.length; i2++) { - regex = blocklists[i2]; + for (let i3 = 0; i3 < blocklists.length; i3++) { + regex = blocklists[i3]; fail = regex.test(template); tested++; if (fail) @@ -44279,97 +46355,97 @@ ${content} regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/; fail = regex.test(template); } - baseLayer.source(!fail ? d : background.findSource("none")); - dispatch10.call("change"); + baseLayer.source(!fail ? d2 : background.findSource("none")); + dispatch14.call("change"); background.updateImagery(); return background; }; background.findSource = (id2) => { if (!id2 || !_imageryIndex) return null; - return _imageryIndex.backgrounds.find((d) => d.id && d.id === id2); + return _imageryIndex.backgrounds.find((d2) => d2.id && d2.id === id2); }; background.bing = () => { background.baseLayerSource(background.findSource("Bing")); }; - background.showsLayer = (d) => { + background.showsLayer = (d2) => { const currSource = baseLayer.source(); - if (!d || !currSource) + if (!d2 || !currSource) return false; - return d.id === currSource.id || _overlayLayers.some((layer) => d.id === layer.source().id); + return d2.id === currSource.id || _overlayLayers.some((layer) => d2.id === layer.source().id); }; background.overlayLayerSources = () => { return _overlayLayers.map((layer) => layer.source()); }; - background.toggleOverlayLayer = (d) => { + background.toggleOverlayLayer = (d2) => { let layer; - for (let i2 = 0; i2 < _overlayLayers.length; i2++) { - layer = _overlayLayers[i2]; - if (layer.source() === d) { - _overlayLayers.splice(i2, 1); - dispatch10.call("change"); + for (let i3 = 0; i3 < _overlayLayers.length; i3++) { + layer = _overlayLayers[i3]; + if (layer.source() === d2) { + _overlayLayers.splice(i3, 1); + dispatch14.call("change"); background.updateImagery(); return; } } - layer = rendererTileLayer(context).source(d).projection(context.projection).dimensions( + layer = rendererTileLayer(context).source(d2).projection(context.projection).dimensions( baseLayer.dimensions() ); _overlayLayers.push(layer); - dispatch10.call("change"); + dispatch14.call("change"); background.updateImagery(); }; - background.nudge = (d, zoom) => { + background.nudge = (d2, zoom) => { const currSource = baseLayer.source(); if (currSource) { - currSource.nudge(d, zoom); - dispatch10.call("change"); + currSource.nudge(d2, zoom); + dispatch14.call("change"); background.updateImagery(); } return background; }; - background.offset = function(d) { + background.offset = function(d2) { const currSource = baseLayer.source(); if (!arguments.length) { return currSource && currSource.offset() || [0, 0]; } if (currSource) { - currSource.offset(d); - dispatch10.call("change"); + currSource.offset(d2); + dispatch14.call("change"); background.updateImagery(); } return background; }; - background.brightness = function(d) { + background.brightness = function(d2) { if (!arguments.length) return _brightness; - _brightness = d; + _brightness = d2; if (context.mode()) - dispatch10.call("change"); + dispatch14.call("change"); return background; }; - background.contrast = function(d) { + background.contrast = function(d2) { if (!arguments.length) return _contrast; - _contrast = d; + _contrast = d2; if (context.mode()) - dispatch10.call("change"); + dispatch14.call("change"); return background; }; - background.saturation = function(d) { + background.saturation = function(d2) { if (!arguments.length) return _saturation; - _saturation = d; + _saturation = d2; if (context.mode()) - dispatch10.call("change"); + dispatch14.call("change"); return background; }; - background.sharpness = function(d) { + background.sharpness = function(d2) { if (!arguments.length) return _sharpness; - _sharpness = d; + _sharpness = d2; if (context.mode()) - dispatch10.call("change"); + dispatch14.call("change"); return background; }; let _loadPromise; @@ -44385,12 +46461,22 @@ ${content} const lastUsedBackground = corePreferences("background-last-used"); return loadPromise.then((imageryIndex) => { const extent = context.map().extent(); - const validBackgrounds = background.sources(extent).filter((d) => d.id !== "none" && d.id !== "custom"); + const validBackgrounds = background.sources(extent).filter((d2) => d2.id !== "none" && d2.id !== "custom"); const first = validBackgrounds.length && validBackgrounds[0]; - const isLastUsedValid = !!validBackgrounds.find((d) => d.id && d.id === lastUsedBackground); + const isLastUsedValid = !!validBackgrounds.find((d2) => d2.id && d2.id === lastUsedBackground); let best; if (!requestedBackground && extent) { - best = validBackgrounds.find((s) => s.best()); + const viewArea = extent.area(); + best = validBackgrounds.find((s2) => { + if (!s2.best() || s2.overlay) + return false; + let bbox2 = es_default(bboxClip( + { type: "MultiPolygon", coordinates: [s2.polygon || [extent.polygon()]] }, + extent.rectangle() + )); + let area = geoExtent(bbox2.slice(0, 2), bbox2.slice(2, 4)).area(); + return area / viewArea > 0.5; + }); } if (requestedBackground && requestedBackground.indexOf("custom:") === 0) { const template = requestedBackground.replace(/^custom:/, ""); @@ -44402,7 +46488,7 @@ ${content} background.findSource(requestedBackground) || best || isLastUsedValid && background.findSource(lastUsedBackground) || background.findSource("Bing") || first || background.findSource("none") ); } - const locator = imageryIndex.backgrounds.find((d) => d.overlay && d.default); + const locator = imageryIndex.backgrounds.find((d2) => d2.overlay && d2.default); if (locator) { background.toggleOverlayLayer(locator); } @@ -44420,7 +46506,7 @@ ${content} } } if (hash.offset) { - const offset = hash.offset.replace(/;/g, ",").split(",").map((n2) => !isNaN(n2) && n2); + const offset = hash.offset.replace(/;/g, ",").split(",").map((n3) => !isNaN(n3) && n3); if (offset.length === 2) { background.offset(geoMetersToOffset(offset)); } @@ -44429,13 +46515,13 @@ ${content} console.error(err); }); }; - return utilRebind(background, dispatch10, "on"); + return utilRebind(background, dispatch14, "on"); } // modules/renderer/features.js function rendererFeatures(context) { - var dispatch10 = dispatch_default("change", "redraw"); - var features2 = utilRebind({}, dispatch10, "on"); + var dispatch14 = dispatch_default("change", "redraw"); + var features = utilRebind({}, dispatch14, "on"); var _deferred2 = /* @__PURE__ */ new Set(); var traffic_roads = { "motorway": true, @@ -44450,7 +46536,8 @@ ${content} "tertiary_link": true, "residential": true, "unclassified": true, - "living_street": true + "living_street": true, + "busway": true }; var service_roads = { "service": true, @@ -44475,7 +46562,7 @@ ${content} function update() { if (!window.mocha) { var hash = utilStringQs(window.location.hash); - var disabled = features2.disabled(); + var disabled = features.disabled(); if (disabled.length) { hash.disable_features = disabled.join(","); } else { @@ -44484,16 +46571,17 @@ ${content} window.location.replace("#" + utilQsString(hash, true)); corePreferences("disabled-features", disabled.join(",")); } - _hidden = features2.hidden(); - dispatch10.call("change"); - dispatch10.call("redraw"); + _hidden = features.hidden(); + dispatch14.call("change"); + dispatch14.call("redraw"); } - function defineRule(k, filter2, max3) { + function defineRule(k2, filter2, max3) { var isEnabled = true; - _keys.push(k); - _rules[k] = { + _keys.push(k2); + _rules[k2] = { filter: filter2, enabled: isEnabled, + // whether the user wants it enabled.. count: 0, currentMax: max3 || Infinity, defaultMax: max3 || Infinity, @@ -44560,9 +46648,9 @@ ${content} return false; } var strings = Object.keys(tags); - for (var i2 = 0; i2 < strings.length; i2++) { - var s = strings[i2]; - if (osmLifecyclePrefixes[s] || osmLifecyclePrefixes[tags[s]]) + for (var i3 = 0; i3 < strings.length; i3++) { + var s2 = strings[i3]; + if (osmLifecyclePrefixes[s2] || osmLifecyclePrefixes[tags[s2]]) return true; } return false; @@ -44570,131 +46658,131 @@ ${content} defineRule("others", function isOther(tags, geometry) { return geometry === "line" || geometry === "area"; }); - features2.features = function() { + features.features = function() { return _rules; }; - features2.keys = function() { + features.keys = function() { return _keys; }; - features2.enabled = function(k) { + features.enabled = function(k2) { if (!arguments.length) { - return _keys.filter(function(k2) { - return _rules[k2].enabled; + return _keys.filter(function(k3) { + return _rules[k3].enabled; }); } - return _rules[k] && _rules[k].enabled; + return _rules[k2] && _rules[k2].enabled; }; - features2.disabled = function(k) { + features.disabled = function(k2) { if (!arguments.length) { - return _keys.filter(function(k2) { - return !_rules[k2].enabled; + return _keys.filter(function(k3) { + return !_rules[k3].enabled; }); } - return _rules[k] && !_rules[k].enabled; + return _rules[k2] && !_rules[k2].enabled; }; - features2.hidden = function(k) { + features.hidden = function(k2) { if (!arguments.length) { - return _keys.filter(function(k2) { - return _rules[k2].hidden(); + return _keys.filter(function(k3) { + return _rules[k3].hidden(); }); } - return _rules[k] && _rules[k].hidden(); + return _rules[k2] && _rules[k2].hidden(); }; - features2.autoHidden = function(k) { + features.autoHidden = function(k2) { if (!arguments.length) { - return _keys.filter(function(k2) { - return _rules[k2].autoHidden(); + return _keys.filter(function(k3) { + return _rules[k3].autoHidden(); }); } - return _rules[k] && _rules[k].autoHidden(); + return _rules[k2] && _rules[k2].autoHidden(); }; - features2.enable = function(k) { - if (_rules[k] && !_rules[k].enabled) { - _rules[k].enable(); + features.enable = function(k2) { + if (_rules[k2] && !_rules[k2].enabled) { + _rules[k2].enable(); update(); } }; - features2.enableAll = function() { + features.enableAll = function() { var didEnable = false; - for (var k in _rules) { - if (!_rules[k].enabled) { + for (var k2 in _rules) { + if (!_rules[k2].enabled) { didEnable = true; - _rules[k].enable(); + _rules[k2].enable(); } } if (didEnable) update(); }; - features2.disable = function(k) { - if (_rules[k] && _rules[k].enabled) { - _rules[k].disable(); + features.disable = function(k2) { + if (_rules[k2] && _rules[k2].enabled) { + _rules[k2].disable(); update(); } }; - features2.disableAll = function() { + features.disableAll = function() { var didDisable = false; - for (var k in _rules) { - if (_rules[k].enabled) { + for (var k2 in _rules) { + if (_rules[k2].enabled) { didDisable = true; - _rules[k].disable(); + _rules[k2].disable(); } } if (didDisable) update(); }; - features2.toggle = function(k) { - if (_rules[k]) { - (function(f2) { - return f2.enabled ? f2.disable() : f2.enable(); - })(_rules[k]); + features.toggle = function(k2) { + if (_rules[k2]) { + (function(f3) { + return f3.enabled ? f3.disable() : f3.enable(); + })(_rules[k2]); update(); } }; - features2.resetStats = function() { - for (var i2 = 0; i2 < _keys.length; i2++) { - _rules[_keys[i2]].count = 0; + features.resetStats = function() { + for (var i3 = 0; i3 < _keys.length; i3++) { + _rules[_keys[i3]].count = 0; } - dispatch10.call("change"); + dispatch14.call("change"); }; - features2.gatherStats = function(d, resolver, dimensions) { + features.gatherStats = function(d2, resolver, dimensions) { var needsRedraw = false; - var types = utilArrayGroupBy(d, "type"); + var types = utilArrayGroupBy(d2, "type"); var entities = [].concat(types.relation || [], types.way || [], types.node || []); - var currHidden, geometry, matches, i2, j2; - for (i2 = 0; i2 < _keys.length; i2++) { - _rules[_keys[i2]].count = 0; + var currHidden, geometry, matches, i3, j3; + for (i3 = 0; i3 < _keys.length; i3++) { + _rules[_keys[i3]].count = 0; } _cullFactor = dimensions[0] * dimensions[1] / 1e6; - for (i2 = 0; i2 < entities.length; i2++) { - geometry = entities[i2].geometry(resolver); - matches = Object.keys(features2.getMatches(entities[i2], resolver, geometry)); - for (j2 = 0; j2 < matches.length; j2++) { - _rules[matches[j2]].count++; + for (i3 = 0; i3 < entities.length; i3++) { + geometry = entities[i3].geometry(resolver); + matches = Object.keys(features.getMatches(entities[i3], resolver, geometry)); + for (j3 = 0; j3 < matches.length; j3++) { + _rules[matches[j3]].count++; } } - currHidden = features2.hidden(); + currHidden = features.hidden(); if (currHidden !== _hidden) { _hidden = currHidden; needsRedraw = true; - dispatch10.call("change"); + dispatch14.call("change"); } return needsRedraw; }; - features2.stats = function() { - for (var i2 = 0; i2 < _keys.length; i2++) { - _stats[_keys[i2]] = _rules[_keys[i2]].count; + features.stats = function() { + for (var i3 = 0; i3 < _keys.length; i3++) { + _stats[_keys[i3]] = _rules[_keys[i3]].count; } return _stats; }; - features2.clear = function(d) { - for (var i2 = 0; i2 < d.length; i2++) { - features2.clearEntity(d[i2]); + features.clear = function(d2) { + for (var i3 = 0; i3 < d2.length; i3++) { + features.clearEntity(d2[i3]); } }; - features2.clearEntity = function(entity) { + features.clearEntity = function(entity) { delete _cache4[osmEntity.key(entity)]; }; - features2.reset = function() { + features.reset = function() { Array.from(_deferred2).forEach(function(handle) { window.cancelIdleCallback(handle); _deferred2.delete(handle); @@ -44704,7 +46792,7 @@ ${content} function relationShouldBeChecked(relation) { return relation.tags.type === "boundary"; } - features2.getMatches = function(entity, resolver, geometry) { + features.getMatches = function(entity, resolver, geometry) { if (geometry === "vertex" || geometry === "relation" && !relationShouldBeChecked(entity)) return {}; var ent = osmEntity.key(entity); @@ -44714,13 +46802,14 @@ ${content} if (!_cache4[ent].matches) { var matches = {}; var hasMatch = false; - for (var i2 = 0; i2 < _keys.length; i2++) { - if (_keys[i2] === "others") { + for (var i3 = 0; i3 < _keys.length; i3++) { + if (_keys[i3] === "others") { if (hasMatch) continue; if (entity.type === "way") { - var parents = features2.getParents(entity, resolver, geometry); - if (parents.length === 1 && parents[0].isMultipolygon() || parents.length > 0 && parents.every(function(parent) { + var parents = features.getParents(entity, resolver, geometry); + if (parents.length === 1 && parents[0].isMultipolygon() || // 2b. or belongs only to boundary relations + parents.length > 0 && parents.every(function(parent) { return parent.tags.type === "boundary"; })) { var pkey = osmEntity.key(parents[0]); @@ -44731,15 +46820,15 @@ ${content} } } } - if (_rules[_keys[i2]].filter(entity.tags, geometry)) { - matches[_keys[i2]] = hasMatch = true; + if (_rules[_keys[i3]].filter(entity.tags, geometry)) { + matches[_keys[i3]] = hasMatch = true; } } _cache4[ent].matches = matches; } return _cache4[ent].matches; }; - features2.getParents = function(entity, resolver, geometry) { + features.getParents = function(entity, resolver, geometry) { if (geometry === "point") return []; var ent = osmEntity.key(entity); @@ -44757,7 +46846,7 @@ ${content} } return _cache4[ent].parents; }; - features2.isHiddenPreset = function(preset, geometry) { + features.isHiddenPreset = function(preset, geometry) { if (!_hidden.length) return false; if (!preset.tags) @@ -44773,36 +46862,36 @@ ${content} } return false; }; - features2.isHiddenFeature = function(entity, resolver, geometry) { + features.isHiddenFeature = function(entity, resolver, geometry) { if (!_hidden.length) return false; if (!entity.version) return false; if (_forceVisible[entity.id]) return false; - var matches = Object.keys(features2.getMatches(entity, resolver, geometry)); - return matches.length && matches.every(function(k) { - return features2.hidden(k); + var matches = Object.keys(features.getMatches(entity, resolver, geometry)); + return matches.length && matches.every(function(k2) { + return features.hidden(k2); }); }; - features2.isHiddenChild = function(entity, resolver, geometry) { + features.isHiddenChild = function(entity, resolver, geometry) { if (!_hidden.length) return false; if (!entity.version || geometry === "point") return false; if (_forceVisible[entity.id]) return false; - var parents = features2.getParents(entity, resolver, geometry); + var parents = features.getParents(entity, resolver, geometry); if (!parents.length) return false; - for (var i2 = 0; i2 < parents.length; i2++) { - if (!features2.isHidden(parents[i2], resolver, parents[i2].geometry(resolver))) { + for (var i3 = 0; i3 < parents.length; i3++) { + if (!features.isHidden(parents[i3], resolver, parents[i3].geometry(resolver))) { return false; } } return true; }; - features2.hasHiddenConnections = function(entity, resolver) { + features.hasHiddenConnections = function(entity, resolver) { if (!_hidden.length) return false; var childNodes, connections; @@ -44811,60 +46900,60 @@ ${content} connections = []; } else { childNodes = entity.nodes ? resolver.childNodes(entity) : []; - connections = features2.getParents(entity, resolver, entity.geometry(resolver)); + connections = features.getParents(entity, resolver, entity.geometry(resolver)); } - connections = childNodes.reduce(function(result, e) { - return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result; + connections = childNodes.reduce(function(result, e3) { + return resolver.isShared(e3) ? utilArrayUnion(result, resolver.parentWays(e3)) : result; }, connections); - return connections.some(function(e) { - return features2.isHidden(e, resolver, e.geometry(resolver)); + return connections.some(function(e3) { + return features.isHidden(e3, resolver, e3.geometry(resolver)); }); }; - features2.isHidden = function(entity, resolver, geometry) { + features.isHidden = function(entity, resolver, geometry) { if (!_hidden.length) return false; if (!entity.version) return false; - var fn = geometry === "vertex" ? features2.isHiddenChild : features2.isHiddenFeature; + var fn = geometry === "vertex" ? features.isHiddenChild : features.isHiddenFeature; return fn(entity, resolver, geometry); }; - features2.filter = function(d, resolver) { + features.filter = function(d2, resolver) { if (!_hidden.length) - return d; + return d2; var result = []; - for (var i2 = 0; i2 < d.length; i2++) { - var entity = d[i2]; - if (!features2.isHidden(entity, resolver, entity.geometry(resolver))) { + for (var i3 = 0; i3 < d2.length; i3++) { + var entity = d2[i3]; + if (!features.isHidden(entity, resolver, entity.geometry(resolver))) { result.push(entity); } } return result; }; - features2.forceVisible = function(entityIDs) { + features.forceVisible = function(entityIDs) { if (!arguments.length) return Object.keys(_forceVisible); _forceVisible = {}; - for (var i2 = 0; i2 < entityIDs.length; i2++) { - _forceVisible[entityIDs[i2]] = true; - var entity = context.hasEntity(entityIDs[i2]); + for (var i3 = 0; i3 < entityIDs.length; i3++) { + _forceVisible[entityIDs[i3]] = true; + var entity = context.hasEntity(entityIDs[i3]); if (entity && entity.type === "relation") { - for (var j2 in entity.members) { - _forceVisible[entity.members[j2].id] = true; + for (var j3 in entity.members) { + _forceVisible[entity.members[j3].id] = true; } } } - return features2; + return features; }; - features2.init = function() { + features.init = function() { var storage = corePreferences("disabled-features"); if (storage) { var storageDisabled = storage.replace(/;/g, ",").split(","); - storageDisabled.forEach(features2.disable); + storageDisabled.forEach(features.disable); } var hash = utilStringQs(window.location.hash); if (hash.disable_features) { var hashDisabled = hash.disable_features.replace(/;/g, ",").split(","); - hashDisabled.forEach(features2.disable); + hashDisabled.forEach(features.disable); } }; context.history().on("merge.features", function(newEntities) { @@ -44874,14 +46963,14 @@ ${content} var graph = context.graph(); var types = utilArrayGroupBy(newEntities, "type"); var entities = [].concat(types.relation || [], types.way || [], types.node || []); - for (var i2 = 0; i2 < entities.length; i2++) { - var geometry = entities[i2].geometry(graph); - features2.getMatches(entities[i2], graph, geometry); + for (var i3 = 0; i3 < entities.length; i3++) { + var geometry = entities[i3].geometry(graph); + features.getMatches(entities[i3], graph, geometry); } }); _deferred2.add(handle); }); - return features2; + return features; } // modules/svg/areas.js @@ -44894,16 +46983,16 @@ ${content} if (activeID === node.id) return 0; var parents = graph.parentWays(node); - var i2, j2, nodes, isClosed, ix1, ix2, ix3, ix4, max3; - for (i2 = 0; i2 < parents.length; i2++) { - nodes = parents[i2].nodes; - isClosed = parents[i2].isClosed(); - for (j2 = 0; j2 < nodes.length; j2++) { - if (nodes[j2] === node.id) { - ix1 = j2 - 2; - ix2 = j2 - 1; - ix3 = j2 + 1; - ix4 = j2 + 2; + var i3, j3, nodes, isClosed, ix1, ix2, ix3, ix4, max3; + for (i3 = 0; i3 < parents.length; i3++) { + nodes = parents[i3].nodes; + isClosed = parents[i3].isClosed(); + for (j3 = 0; j3 < nodes.length; j3++) { + if (nodes[j3] === node.id) { + ix1 = j3 - 2; + ix2 = j3 - 1; + ix3 = j3 + 1; + ix4 = j3 + 2; if (isClosed) { max3 = nodes.length - 1; if (ix1 < 0) @@ -44930,16 +47019,16 @@ ${content} } return 1; } - function svgMarkerSegments(projection2, graph, dt, shouldReverse, bothDirections) { + function svgMarkerSegments(projection2, graph, dt2, shouldReverse, bothDirections) { return function(entity) { - var i2 = 0; - var offset = dt; + var i3 = 0; + var offset = dt2; var segments = []; var clip = identity_default2().clipExtent(projection2.clipExtent()).stream; - var coordinates = graph.childNodes(entity).map(function(n2) { - return n2.loc; + var coordinates = graph.childNodes(entity).map(function(n3) { + return n3.loc; }); - var a, b; + var a2, b2; if (shouldReverse(entity)) { coordinates.reverse(); } @@ -44950,43 +47039,43 @@ ${content} lineStart: function() { }, lineEnd: function() { - a = null; + a2 = null; }, - point: function(x, y) { - b = [x, y]; - if (a) { - var span = geoVecLength(a, b) - offset; + point: function(x2, y2) { + b2 = [x2, y2]; + if (a2) { + var span = geoVecLength(a2, b2) - offset; if (span >= 0) { - var heading = geoVecAngle(a, b); - var dx = dt * Math.cos(heading); - var dy = dt * Math.sin(heading); - var p = [ - a[0] + offset * Math.cos(heading), - a[1] + offset * Math.sin(heading) + var heading = geoVecAngle(a2, b2); + var dx = dt2 * Math.cos(heading); + var dy = dt2 * Math.sin(heading); + var p2 = [ + a2[0] + offset * Math.cos(heading), + a2[1] + offset * Math.sin(heading) ]; - var coord2 = [a, p]; - for (span -= dt; span >= 0; span -= dt) { - p = geoVecAdd(p, [dx, dy]); - coord2.push(p); + var coord2 = [a2, p2]; + for (span -= dt2; span >= 0; span -= dt2) { + p2 = geoVecAdd(p2, [dx, dy]); + coord2.push(p2); } - coord2.push(b); + coord2.push(b2); var segment = ""; - var j2; - for (j2 = 0; j2 < coord2.length; j2++) { - segment += (j2 === 0 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1]; + var j3; + for (j3 = 0; j3 < coord2.length; j3++) { + segment += (j3 === 0 ? "M" : "L") + coord2[j3][0] + "," + coord2[j3][1]; } - segments.push({ id: entity.id, index: i2++, d: segment }); + segments.push({ id: entity.id, index: i3++, d: segment }); if (bothDirections(entity)) { segment = ""; - for (j2 = coord2.length - 1; j2 >= 0; j2--) { - segment += (j2 === coord2.length - 1 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1]; + for (j3 = coord2.length - 1; j3 >= 0; j3--) { + segment += (j3 === coord2.length - 1 ? "M" : "L") + coord2[j3][0] + "," + coord2[j3][1]; } - segments.push({ id: entity.id, index: i2++, d: segment }); + segments.push({ id: entity.id, index: i3++, d: segment }); } } offset = -span; } - a = b; + a2 = b2; } }))); return segments; @@ -45012,26 +47101,26 @@ ${content} return cache[entity.id] = path(entity.asGeoJSON(graph)); } }; - svgpath.geojson = function(d) { - if (d.__featurehash__ !== void 0) { - if (d.__featurehash__ in cache) { - return cache[d.__featurehash__]; + svgpath.geojson = function(d2) { + if (d2.__featurehash__ !== void 0) { + if (d2.__featurehash__ in cache) { + return cache[d2.__featurehash__]; } else { - return cache[d.__featurehash__] = path(d); + return cache[d2.__featurehash__] = path(d2); } } else { - return path(d); + return path(d2); } }; return svgpath; } function svgPointTransform(projection2) { var svgpoint = function(entity) { - var pt = projection2(entity.loc); - return "translate(" + pt[0] + "," + pt[1] + ")"; + var pt2 = projection2(entity.loc); + return "translate(" + pt2[0] + "," + pt2[1] + ")"; }; - svgpoint.geojson = function(d) { - return svgpoint(d.properties.entity); + svgpoint.geojson = function(d2) { + return svgpoint(d2.properties.entity); }; return svgpoint; } @@ -45040,8 +47129,8 @@ ${content} var tags = entity.tags; var shouldCopyMultipolygonTags = !entity.hasInterestingTags(); graph.parentRelations(entity).forEach(function(relation) { - var type3 = relation.tags.type; - if (type3 === "multipolygon" && shouldCopyMultipolygonTags || type3 === "boundary") { + var type2 = relation.tags.type; + if (type2 === "multipolygon" && shouldCopyMultipolygonTags || type2 === "boundary") { tags = Object.assign({}, relation.tags, tags); } }); @@ -45056,29 +47145,29 @@ ${content} } function getWaySegments() { var isActiveWay = way.nodes.indexOf(activeID) !== -1; - var features2 = { passive: [], active: [] }; + var features = { passive: [], active: [] }; var start2 = {}; var end = {}; - var node, type3; - for (var i2 = 0; i2 < way.nodes.length; i2++) { - node = graph.entity(way.nodes[i2]); - type3 = svgPassiveVertex(node, graph, activeID); - end = { node, type: type3 }; + var node, type2; + for (var i3 = 0; i3 < way.nodes.length; i3++) { + node = graph.entity(way.nodes[i3]); + type2 = svgPassiveVertex(node, graph, activeID); + end = { node, type: type2 }; if (start2.type !== void 0) { if (start2.node.id === activeID || end.node.id === activeID) { } else if (isActiveWay && (start2.type === 2 || end.type === 2)) { - pushActive(start2, end, i2); + pushActive(start2, end, i3); } else if (start2.type === 0 && end.type === 0) { - pushActive(start2, end, i2); + pushActive(start2, end, i3); } else { - pushPassive(start2, end, i2); + pushPassive(start2, end, i3); } } start2 = end; } - return features2; + return features; function pushActive(start3, end2, index) { - features2.active.push({ + features.active.push({ type: "Feature", id: way.id + "-" + index + "-nope", properties: { @@ -45095,7 +47184,7 @@ ${content} }); } function pushPassive(start3, end2, index) { - features2.passive.push({ + features.passive.push({ type: "Feature", id: way.id + "-" + index, properties: { @@ -45171,19 +47260,19 @@ ${content} if (value.baseVal !== void 0) { value = value.baseVal; } - var t = _tags(entity); - var computed = tagClasses.getClassesString(t, value); + var t2 = _tags(entity); + var computed = tagClasses.getClassesString(t2, value); if (computed !== value) { select_default2(this).attr("class", computed); } }); }; - tagClasses.getClassesString = function(t, value) { + tagClasses.getClassesString = function(t2, value) { var primary, status; - var i2, j2, k, v; + var i3, j3, k2, v2; var overrideGeometry; if (/\bstroke\b/.test(value)) { - if (!!t.barrier && t.barrier !== "no") { + if (!!t2.barrier && t2.barrier !== "no") { overrideGeometry = "line"; } } @@ -45192,52 +47281,52 @@ ${content} }).map(function(klass) { return klass === "line" || klass === "area" ? overrideGeometry || klass : klass; }); - for (i2 = 0; i2 < primaries.length; i2++) { - k = primaries[i2]; - v = t[k]; - if (!v || v === "no") + for (i3 = 0; i3 < primaries.length; i3++) { + k2 = primaries[i3]; + v2 = t2[k2]; + if (!v2 || v2 === "no") continue; - if (k === "piste:type") { - k = "piste"; - } else if (k === "building:part") { - k = "building_part"; - } - primary = k; - if (statuses.indexOf(v) !== -1) { - status = v; - classes.push("tag-" + k); + if (k2 === "piste:type") { + k2 = "piste"; + } else if (k2 === "building:part") { + k2 = "building_part"; + } + primary = k2; + if (statuses.indexOf(v2) !== -1) { + status = v2; + classes.push("tag-" + k2); } else { - classes.push("tag-" + k); - classes.push("tag-" + k + "-" + v); + classes.push("tag-" + k2); + classes.push("tag-" + k2 + "-" + v2); } break; } if (!primary) { - for (i2 = 0; i2 < statuses.length; i2++) { - for (j2 = 0; j2 < primaries.length; j2++) { - k = statuses[i2] + ":" + primaries[j2]; - v = t[k]; - if (!v || v === "no") + for (i3 = 0; i3 < statuses.length; i3++) { + for (j3 = 0; j3 < primaries.length; j3++) { + k2 = statuses[i3] + ":" + primaries[j3]; + v2 = t2[k2]; + if (!v2 || v2 === "no") continue; - status = statuses[i2]; + status = statuses[i3]; break; } } } if (!status) { - for (i2 = 0; i2 < statuses.length; i2++) { - k = statuses[i2]; - v = t[k]; - if (!v || v === "no") + for (i3 = 0; i3 < statuses.length; i3++) { + k2 = statuses[i3]; + v2 = t2[k2]; + if (!v2 || v2 === "no") continue; - if (v === "yes") { - status = k; - } else if (primary && primary === v) { - status = k; - } else if (!primary && primaries.indexOf(v) !== -1) { - status = k; - primary = v; - classes.push("tag-" + v); + if (v2 === "yes") { + status = k2; + } else if (primary && primary === v2) { + status = k2; + } else if (!primary && primaries.indexOf(v2) !== -1) { + status = k2; + primary = v2; + classes.push("tag-" + v2); } if (status) break; @@ -45247,32 +47336,32 @@ ${content} classes.push("tag-status"); classes.push("tag-status-" + status); } - for (i2 = 0; i2 < secondaries.length; i2++) { - k = secondaries[i2]; - v = t[k]; - if (!v || v === "no" || k === primary) + for (i3 = 0; i3 < secondaries.length; i3++) { + k2 = secondaries[i3]; + v2 = t2[k2]; + if (!v2 || v2 === "no" || k2 === primary) continue; - classes.push("tag-" + k); - classes.push("tag-" + k + "-" + v); + classes.push("tag-" + k2); + classes.push("tag-" + k2 + "-" + v2); } - if (primary === "highway" && !osmPathHighwayTagValues[t.highway] || primary === "aeroway") { - var surface = t.highway === "track" ? "unpaved" : "paved"; - for (k in t) { - v = t[k]; - if (k in osmPavedTags) { - surface = osmPavedTags[k][v] ? "paved" : "unpaved"; + if (primary === "highway" && !osmPathHighwayTagValues[t2.highway] || primary === "aeroway") { + var surface = t2.highway === "track" ? "unpaved" : "paved"; + for (k2 in t2) { + v2 = t2[k2]; + if (k2 in osmPavedTags) { + surface = osmPavedTags[k2][v2] ? "paved" : "unpaved"; } - if (k in osmSemipavedTags && !!osmSemipavedTags[k][v]) { + if (k2 in osmSemipavedTags && !!osmSemipavedTags[k2][v2]) { surface = "semipaved"; } } classes.push("tag-" + surface); } - var qid = t.wikidata || t["flag:wikidata"] || t["brand:wikidata"] || t["network:wikidata"] || t["operator:wikidata"]; + var qid = t2.wikidata || t2["flag:wikidata"] || t2["brand:wikidata"] || t2["network:wikidata"] || t2["operator:wikidata"]; if (qid) { classes.push("tag-wikidata"); } - return classes.join(" ").trim(); + return classes.filter((klass) => /^[-_a-z0-9]+$/.test(klass)).join(" ").trim(); }; tagClasses.tags = function(val) { if (!arguments.length) @@ -45285,6 +47374,12 @@ ${content} // modules/svg/tag_pattern.js var patterns = { + // tag - pattern name + // -or- + // tag - value - pattern name + // -or- + // tag - value - rules (optional tag-values, pattern name) + // (matches earlier rules first, so fallback should be last entry) amenity: { grave_yard: "cemetery", fountain: "water_standing" @@ -45305,6 +47400,7 @@ ${content} { leaf_type: "needleleaved", pattern: "forest_needleleaved" }, { leaf_type: "leafless", pattern: "forest_leafless" }, { pattern: "forest" } + // same as 'leaf_type:mixed' ], grave_yard: "cemetery", grass: "grass", @@ -45340,6 +47436,7 @@ ${content} { leaf_type: "needleleaved", pattern: "forest_needleleaved" }, { leaf_type: "leafless", pattern: "forest_leafless" }, { pattern: "forest" } + // same as 'leaf_type:mixed' ] }, golf: { @@ -45377,8 +47474,8 @@ ${content} var pass = true; for (var criterion in rule) { if (criterion !== "pattern") { - var v = tags[criterion]; - if (!v || v !== rule[criterion]) { + var v2 = tags[criterion]; + if (!v2 || v2 !== rule[criterion]) { pass = false; break; } @@ -45411,38 +47508,38 @@ ${content} var base = context.history().base(); var data = { targets: [], nopes: [] }; entities.forEach(function(way) { - var features2 = svgSegmentWay(way, graph, activeID); - data.targets.push.apply(data.targets, features2.passive); - data.nopes.push.apply(data.nopes, features2.active); + var features = svgSegmentWay(way, graph, activeID); + data.targets.push.apply(data.targets, features.passive); + data.nopes.push.apply(data.nopes, features.active); }); var targetData = data.targets.filter(getPath); - var targets = selection2.selectAll(".area.target-allowed").filter(function(d) { - return filter2(d.properties.entity); - }).data(targetData, function key(d) { - return d.id; + var targets = selection2.selectAll(".area.target-allowed").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(targetData, function key(d2) { + return d2.id; }); targets.exit().remove(); - var segmentWasEdited = function(d) { - var wayID = d.properties.entity.id; + var segmentWasEdited = function(d2) { + var wayID = d2.properties.entity.id; if (!base.entities[wayID] || !(0, import_fast_deep_equal5.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) { return false; } - return d.properties.nodes.some(function(n2) { - return !base.entities[n2.id] || !(0, import_fast_deep_equal5.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc); + return d2.properties.nodes.some(function(n3) { + return !base.entities[n3.id] || !(0, import_fast_deep_equal5.default)(graph.entities[n3.id].loc, base.entities[n3.id].loc); }); }; - targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) { - return "way area target target-allowed " + targetClass + d.id; + targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d2) { + return "way area target target-allowed " + targetClass + d2.id; }).classed("segment-edited", segmentWasEdited); var nopeData = data.nopes.filter(getPath); - var nopes = selection2.selectAll(".area.target-nope").filter(function(d) { - return filter2(d.properties.entity); - }).data(nopeData, function key(d) { - return d.id; + var nopes = selection2.selectAll(".area.target-nope").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(nopeData, function key(d2) { + return d2.id; }); nopes.exit().remove(); - nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) { - return "way area target target-nope " + nopeClass + d.id; + nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d2) { + return "way area target target-nope " + nopeClass + d2.id; }).classed("segment-edited", segmentWasEdited); } function drawAreas(selection2, graph, entities, filter2) { @@ -45450,8 +47547,8 @@ ${content} var areas = {}; var multipolygon; var base = context.history().base(); - for (var i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; + for (var i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; if (entity.geometry(graph) !== "area") continue; multipolygon = osmIsOldMultipolygonOuterMember(entity, graph); @@ -45467,14 +47564,14 @@ ${content} }; } } - var fills = Object.values(areas).filter(function hasPath(a) { - return path(a.entity); + var fills = Object.values(areas).filter(function hasPath(a2) { + return path(a2.entity); }); - fills.sort(function areaSort(a, b) { - return b.area - a.area; + fills.sort(function areaSort(a2, b2) { + return b2.area - a2.area; }); - fills = fills.map(function(a) { - return a.entity; + fills = fills.map(function(a2) { + return a2.entity; }); var strokes = fills.filter(function(area) { return area.type === "way"; @@ -45495,8 +47592,8 @@ ${content} var drawLayer = selection2.selectAll(".layer-osm.areas"); var touchLayer = selection2.selectAll(".layer-touch.areas"); var areagroup = drawLayer.selectAll("g.areagroup").data(["fill", "shadow", "stroke"]); - areagroup = areagroup.enter().append("g").attr("class", function(d) { - return "areagroup area-" + d; + areagroup = areagroup.enter().append("g").attr("class", function(d2) { + return "areagroup area-" + d2; }).merge(areagroup); var paths = areagroup.selectAll("path").filter(filter2).data(function(layer) { return data[layer]; @@ -45518,12 +47615,12 @@ ${content} this.setAttribute("clip-path", "url(#ideditor-" + entity2.id + "-clippath)"); this.style.fill = this.style.stroke = getPatternStyle(entity2.tags); } - }).classed("added", function(d) { - return !base.entities[d.id]; - }).classed("geometry-edited", function(d) { - return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes); - }).classed("retagged", function(d) { - return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].tags, base.entities[d.id].tags); + }).classed("added", function(d2) { + return !base.entities[d2.id]; + }).classed("geometry-edited", function(d2) { + return graph.entities[d2.id] && base.entities[d2.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d2.id].nodes, base.entities[d2.id].nodes); + }).classed("retagged", function(d2) { + return graph.entities[d2.id] && base.entities[d2.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d2.id].tags, base.entities[d2.id].tags); }).call(svgTagClasses()).attr("d", path); touchLayer.call(drawTargets, graph, data.stroke, filter2); } @@ -45548,8 +47645,8 @@ ${content} return node && node.textContent || ""; } function get1(node, tagName, callback) { - const n2 = node.getElementsByTagName(tagName); - const result = n2.length ? n2[0] : null; + const n3 = node.getElementsByTagName(tagName); + const result = n3.length ? n3[0] : null; if (result && callback) callback(result); return result; @@ -45558,8 +47655,8 @@ ${content} const properties = {}; if (!node) return properties; - const n2 = node.getElementsByTagName(tagName); - const result = n2.length ? n2[0] : null; + const n3 = node.getElementsByTagName(tagName); + const result = n3.length ? n3[0] : null; if (result && callback) { return callback(result, properties); } @@ -45583,7 +47680,7 @@ ${content} const val = parseFloat(nodeVal(get1(node, tagName))); if (isNaN(val)) return void 0; - if (val && callback) + if (callback) callback(val); return val; } @@ -45679,20 +47776,20 @@ ${content} const line = []; const times = []; const extendedValues = {}; - for (let i2 = 0; i2 < pts.length; i2++) { - const c = coordPair$1(pts[i2]); - if (!c) { + for (let i3 = 0; i3 < pts.length; i3++) { + const c2 = coordPair$1(pts[i3]); + if (!c2) { continue; } - line.push(c.coordinates); - if (c.time) - times.push(c.time); - for (const [name, val] of c.extendedValues) { + line.push(c2.coordinates); + if (c2.time) + times.push(c2.time); + for (const [name, val] of c2.extendedValues) { const plural = name === "heart" ? name : name.replace("gpxtpx:", "") + "s"; if (!extendedValues[plural]) { extendedValues[plural] = Array(pts.length).fill(null); } - extendedValues[plural][i2] = val; + extendedValues[plural][i3] = val; } } if (line.length < 2) @@ -45744,13 +47841,13 @@ ${content} } const props = properties.coordinateProperties; const entries = Object.entries(line.extendedValues); - for (let i2 = 0; i2 < entries.length; i2++) { - const [name, val] = entries[i2]; + for (let i3 = 0; i3 < entries.length; i3++) { + const [name, val] = entries[i3]; if (multi) { if (!props[name]) { props[name] = extractedLines.map((line2) => new Array(line2.line.length).fill(null)); } - props[name][i2] = val; + props[name][i3] = val; } else { props[name] = val; } @@ -45770,15 +47867,15 @@ ${content} } function getPoint(node) { const properties = Object.assign(extractProperties(node), getMulti(node, ["sym"])); - const pair2 = coordPair$1(node); - if (!pair2) + const pair3 = coordPair$1(node); + if (!pair3) return null; return { type: "Feature", properties, geometry: { type: "Point", - coordinates: pair2.coordinates + coordinates: pair3.coordinates } }; } @@ -45794,9 +47891,9 @@ ${content} yield feature3; } for (const waypoint of $(node, "wpt")) { - const point = getPoint(waypoint); - if (point) - yield point; + const point2 = getPoint(waypoint); + if (point2) + yield point2; } } function gpx(node) { @@ -45805,17 +47902,17 @@ ${content} features: Array.from(gpxGen(node)) }; } - function fixColor(v, prefix) { + function fixColor(v2, prefix) { const properties = {}; const colorProp = prefix == "stroke" || prefix === "fill" ? prefix : prefix + "-color"; - if (v[0] === "#") { - v = v.substring(1); + if (v2[0] === "#") { + v2 = v2.substring(1); } - if (v.length === 6 || v.length === 3) { - properties[colorProp] = "#" + v; - } else if (v.length === 8) { - properties[prefix + "-opacity"] = parseInt(v.substring(0, 2), 16) / 255; - properties[colorProp] = "#" + v.substring(6, 8) + v.substring(4, 6) + v.substring(2, 4); + if (v2.length === 6 || v2.length === 3) { + properties[colorProp] = "#" + v2; + } else if (v2.length === 8) { + properties[prefix + "-opacity"] = parseInt(v2.substring(0, 2), 16) / 255; + properties[colorProp] = "#" + v2.substring(6, 8) + v2.substring(4, 6) + v2.substring(2, 4); } return properties; } @@ -45829,6 +47926,14 @@ ${content} function getColor(node, output) { return get3(node, "color", (elem) => fixColor(nodeVal(elem), output)); } + function extractIconHref(node) { + return get3(node, "Icon", (icon2, properties) => { + val1(icon2, "href", (href) => { + properties.icon = href; + }); + return properties; + }); + } function extractIcon(node) { return get3(node, "IconStyle", (iconStyle) => { return Object.assign(getColor(iconStyle, "icon"), numericProperty(iconStyle, "scale", "icon-scale"), numericProperty(iconStyle, "heading", "icon-heading"), get3(iconStyle, "hotSpot", (hotspot) => { @@ -45842,12 +47947,7 @@ ${content} "icon-offset-units": [xunits, yunits] }; return {}; - }), get3(iconStyle, "Icon", (icon2, properties) => { - val1(icon2, "href", (href) => { - properties.icon = href; - }); - return properties; - })); + }), extractIconHref(iconStyle)); }); } function extractLabel(node) { @@ -45874,6 +47974,68 @@ ${content} function extractStyle(node) { return Object.assign({}, extractPoly(node), extractLine(node), extractLabel(node), extractIcon(node)); } + var toNumber2 = (x2) => Number(x2); + var typeConverters = { + string: (x2) => x2, + int: toNumber2, + uint: toNumber2, + short: toNumber2, + ushort: toNumber2, + float: toNumber2, + double: toNumber2, + bool: (x2) => Boolean(x2) + }; + function extractExtendedData(node, schema) { + return get3(node, "ExtendedData", (extendedData, properties) => { + for (const data of $(extendedData, "Data")) { + properties[data.getAttribute("name") || ""] = nodeVal(get1(data, "value")); + } + for (const simpleData of $(extendedData, "SimpleData")) { + const name = simpleData.getAttribute("name") || ""; + const typeConverter = schema[name] || typeConverters.string; + properties[name] = typeConverter(nodeVal(simpleData)); + } + return properties; + }); + } + function getMaybeHTMLDescription(node) { + const descriptionNode = get1(node, "description"); + for (const c2 of Array.from(descriptionNode?.childNodes || [])) { + if (c2.nodeType === 4) { + return { + description: { + "@type": "html", + value: nodeVal(c2) + } + }; + } + } + return {}; + } + function extractTimeSpan(node) { + return get3(node, "TimeSpan", (timeSpan) => { + return { + timespan: { + begin: nodeVal(get1(timeSpan, "begin")), + end: nodeVal(get1(timeSpan, "end")) + } + }; + }); + } + function extractTimeStamp(node) { + return get3(node, "TimeStamp", (timeStamp) => { + return { timestamp: nodeVal(get1(timeStamp, "when")) }; + }); + } + function extractCascadedStyle(node, styleMap) { + return val1(node, "styleUrl", (styleUrl) => { + styleUrl = normalizeId(styleUrl); + if (styleMap[styleUrl]) { + return Object.assign({ styleUrl }, styleMap[styleUrl]); + } + return { styleUrl }; + }); + } var removeSpace = /\s*/g; var trimSpace = /^\s*|\s*$/g; var splitSpace = /\s+/; @@ -45913,8 +48075,8 @@ ${content} const first = ring[0]; const last = ring[ring.length - 1]; let equal = true; - for (let i2 = 0; i2 < Math.max(first.length, last.length); i2++) { - if (first[i2] !== last[i2]) { + for (let i3 = 0; i3 < Math.max(first.length, last.length); i3++) { + if (first[i3] !== last[i3]) { equal = false; break; } @@ -45924,30 +48086,26 @@ ${content} } return ring; } - var GEO_TYPES = [ - "Polygon", - "LineString", - "Point", - "Track", - "gx:Track" - ]; function getCoordinates(node) { return nodeVal(get1(node, "coordinates")); } function getGeometry(node) { - const geometries = []; - const coordTimes = []; - for (const t of ["MultiGeometry", "MultiTrack", "gx:MultiTrack"]) { - const elem = get1(node, t); - if (elem) { - return getGeometry(elem); - } - } - for (const geoType of GEO_TYPES) { - for (const geomNode of $(node, geoType)) { - switch (geoType) { + let geometries = []; + let coordTimes = []; + for (let i3 = 0; i3 < node.childNodes.length; i3++) { + const child = node.childNodes.item(i3); + if (isElement(child)) { + switch (child.tagName) { + case "MultiGeometry": + case "MultiTrack": + case "gx:MultiTrack": { + const childGeometries = getGeometry(child); + geometries = geometries.concat(childGeometries.geometries); + coordTimes = coordTimes.concat(childGeometries.coordTimes); + break; + } case "Point": { - const coordinates = coord1(getCoordinates(geomNode)); + const coordinates = coord1(getCoordinates(child)); if (coordinates.length >= 2) { geometries.push({ type: "Point", @@ -45956,8 +48114,9 @@ ${content} } break; } + case "LinearRing": case "LineString": { - const coordinates = coord(getCoordinates(geomNode)); + const coordinates = coord(getCoordinates(child)); if (coordinates.length >= 2) { geometries.push({ type: "LineString", @@ -45968,7 +48127,7 @@ ${content} } case "Polygon": { const coords = []; - for (const linearRing of $(geomNode, "LinearRing")) { + for (const linearRing of $(child, "LinearRing")) { const ring = fixRing(coord(getCoordinates(linearRing))); if (ring.length >= 4) { coords.push(ring); @@ -45984,7 +48143,7 @@ ${content} } case "Track": case "gx:Track": { - const gx = gxCoords(geomNode); + const gx = gxCoords(child); if (!gx) break; const { times, geometry } = gx; @@ -46001,66 +48160,21 @@ ${content} coordTimes }; } - function extractExtendedData(node) { - return get3(node, "ExtendedData", (extendedData, properties) => { - for (const data of $(extendedData, "Data")) { - properties[data.getAttribute("name") || ""] = nodeVal(get1(data, "value")); - } - for (const simpleData of $(extendedData, "SimpleData")) { - properties[simpleData.getAttribute("name") || ""] = nodeVal(simpleData); - } - return properties; - }); - } function geometryListToGeometry(geometries) { return geometries.length === 0 ? null : geometries.length === 1 ? geometries[0] : { type: "GeometryCollection", geometries }; } - function extractTimeSpan(node) { - return get3(node, "TimeSpan", (timeSpan) => { - return { - timespan: { - begin: nodeVal(get1(timeSpan, "begin")), - end: nodeVal(get1(timeSpan, "end")) - } - }; - }); - } - function extractTimeStamp(node) { - return get3(node, "TimeStamp", (timeStamp) => { - return { timestamp: nodeVal(get1(timeStamp, "when")) }; - }); - } - function extractCascadedStyle(node, styleMap) { - return val1(node, "styleUrl", (styleUrl) => { - styleUrl = normalizeId(styleUrl); - if (styleMap[styleUrl]) { - return Object.assign({ styleUrl }, styleMap[styleUrl]); - } - return { styleUrl }; - }); - } - function getMaybeHTMLDescription(node) { - const descriptionNode = get1(node, "description"); - for (const c of Array.from(descriptionNode?.childNodes || [])) { - if (c.nodeType === 4) { - return { - description: { - "@type": "html", - value: nodeVal(c) - } - }; - } - } - return {}; - } - function getPlacemark(node, styleMap) { + function getPlacemark(node, styleMap, schema, options2) { const { coordTimes, geometries } = getGeometry(node); + const geometry = geometryListToGeometry(geometries); + if (!geometry && options2.skipNullGeometry) { + return null; + } const feature3 = { type: "Feature", - geometry: geometryListToGeometry(geometries), + geometry, properties: Object.assign(getMulti(node, [ "name", "address", @@ -46068,7 +48182,7 @@ ${content} "open", "phoneNumber", "description" - ]), getMaybeHTMLDescription(node), extractCascadedStyle(node, styleMap), extractStyle(node), extractExtendedData(node), extractTimeSpan(node), extractTimeStamp(node), coordTimes.length ? { + ]), getMaybeHTMLDescription(node), extractCascadedStyle(node, styleMap), extractStyle(node), extractExtendedData(node, schema), extractTimeSpan(node), extractTimeStamp(node), coordTimes.length ? { coordinateProperties: { times: coordTimes.length === 1 ? coordTimes[0] : coordTimes } @@ -46082,6 +48196,112 @@ ${content} feature3.id = id2; return feature3; } + function getGroundOverlayBox(node) { + const latLonQuad = get1(node, "gx:LatLonQuad"); + if (latLonQuad) { + const ring = fixRing(coord(getCoordinates(node))); + return { + geometry: { + type: "Polygon", + coordinates: [ring] + } + }; + } + return getLatLonBox(node); + } + var DEGREES_TO_RADIANS = Math.PI / 180; + function rotateBox(bbox2, coordinates, rotation) { + const center = [(bbox2[0] + bbox2[2]) / 2, (bbox2[1] + bbox2[3]) / 2]; + return [ + coordinates[0].map((coordinate) => { + const dy = coordinate[1] - center[1]; + const dx = coordinate[0] - center[0]; + const distance = Math.sqrt(Math.pow(dy, 2) + Math.pow(dx, 2)); + const angle2 = Math.atan2(dy, dx) + rotation * DEGREES_TO_RADIANS; + return [ + center[0] + Math.cos(angle2) * distance, + center[1] + Math.sin(angle2) * distance + ]; + }) + ]; + } + function getLatLonBox(node) { + const latLonBox = get1(node, "LatLonBox"); + if (latLonBox) { + const north = num1(latLonBox, "north"); + const west = num1(latLonBox, "west"); + const east = num1(latLonBox, "east"); + const south = num1(latLonBox, "south"); + const rotation = num1(latLonBox, "rotation"); + if (typeof north === "number" && typeof south === "number" && typeof west === "number" && typeof east === "number") { + const bbox2 = [west, south, east, north]; + let coordinates = [ + [ + [west, north], + [east, north], + [east, south], + [west, south], + [west, north] + // top left (again) + ] + ]; + if (typeof rotation === "number") { + coordinates = rotateBox(bbox2, coordinates, rotation); + } + return { + bbox: bbox2, + geometry: { + type: "Polygon", + coordinates + } + }; + } + } + return null; + } + function getGroundOverlay(node, styleMap, schema, options2) { + const box = getGroundOverlayBox(node); + const geometry = box?.geometry || null; + if (!geometry && options2.skipNullGeometry) { + return null; + } + const feature3 = { + type: "Feature", + geometry, + properties: Object.assign( + /** + * Related to + * https://gist.github.com/tmcw/037a1cb6660d74a392e9da7446540f46 + */ + { "@geometry-type": "groundoverlay" }, + getMulti(node, [ + "name", + "address", + "visibility", + "open", + "phoneNumber", + "description" + ]), + getMaybeHTMLDescription(node), + extractCascadedStyle(node, styleMap), + extractStyle(node), + extractIconHref(node), + extractExtendedData(node, schema), + extractTimeSpan(node), + extractTimeStamp(node) + ) + }; + if (box?.bbox) { + feature3.bbox = box.bbox; + } + if (feature3.properties?.visibility !== void 0) { + feature3.properties.visibility = feature3.properties.visibility !== "0"; + } + const id2 = node.getAttribute("id"); + if (id2 !== null && id2 !== "") + feature3.id = id2; + return feature3; + } function getStyleId(style) { let id2 = style.getAttribute("id"); const parentNode = style.parentNode; @@ -46106,18 +48326,35 @@ ${content} } return styleMap; } - function* kmlGen(node) { + function buildSchema(node) { + const schema = {}; + for (const field of $(node, "SimpleField")) { + schema[field.getAttribute("name") || ""] = typeConverters[field.getAttribute("type") || ""] || typeConverters["string"]; + } + return schema; + } + function* kmlGen(node, options2 = { + skipNullGeometry: false + }) { const styleMap = buildStyleMap(node); + const schema = buildSchema(node); for (const placemark of $(node, "Placemark")) { - const feature3 = getPlacemark(placemark, styleMap); + const feature3 = getPlacemark(placemark, styleMap, schema, options2); + if (feature3) + yield feature3; + } + for (const groundOverlay of $(node, "GroundOverlay")) { + const feature3 = getGroundOverlay(groundOverlay, styleMap, schema, options2); if (feature3) yield feature3; } } - function kml(node) { + function kml(node, options2 = { + skipNullGeometry: false + }) { return { type: "FeatureCollection", - features: Array.from(kmlGen(node)) + features: Array.from(kmlGen(node, options2)) }; } @@ -46125,9 +48362,9 @@ ${content} var _initialized = false; var _enabled = false; var _geojson; - function svgData(projection2, context, dispatch10) { + function svgData(projection2, context, dispatch14) { var throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); var _showLabels = true; var detected = utilDetect(); @@ -46136,6 +48373,12 @@ ${content} var _fileList; var _template; var _src; + const supportedFormats = [ + ".gpx", + ".kml", + ".geojson", + ".json" + ]; function init2() { if (_initialized) return; @@ -46151,6 +48394,10 @@ ${content} d3_event.preventDefault(); if (!detected.filedrop) return; + var f3 = d3_event.dataTransfer.files[0]; + var extension = getExtension(f3.name); + if (!supportedFormats.includes(extension)) + return; drawData.fileList(d3_event.dataTransfer.files); }).on("dragenter.svgData", over).on("dragexit.svgData", over).on("dragover.svgData", over); _initialized = true; @@ -46167,7 +48414,7 @@ ${content} function showLayer() { layerOn(); layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function hideLayer() { @@ -46185,8 +48432,8 @@ ${content} if (!gj) return null; if (gj.type === "FeatureCollection") { - for (var i2 = 0; i2 < gj.features.length; i2++) { - ensureFeatureID(gj.features[i2]); + for (var i3 = 0; i3 < gj.features.length; i3++) { + ensureFeatureID(gj.features[i3]); } } else { ensureFeatureID(gj); @@ -46208,21 +48455,21 @@ ${content} return [gj]; } } - function featureKey(d) { - return d.__featurehash__; + function featureKey(d2) { + return d2.__featurehash__; } - function isPolygon(d) { - return d.geometry.type === "Polygon" || d.geometry.type === "MultiPolygon"; + function isPolygon(d2) { + return d2.geometry.type === "Polygon" || d2.geometry.type === "MultiPolygon"; } - function clipPathID(d) { - return "ideditor-data-" + d.__featurehash__ + "-clippath"; + function clipPathID(d2) { + return "ideditor-data-" + d2.__featurehash__ + "-clippath"; } - function featureClasses(d) { + function featureClasses(d2) { return [ - "data" + d.__featurehash__, - d.geometry.type, - isPolygon(d) ? "area" : "", - d.__layerID__ || "" + "data" + d2.__featurehash__, + d2.geometry.type, + isPolygon(d2) ? "area" : "", + d2.__layerID__ || "" ].filter(Boolean).join(" "); } function drawData(selection2) { @@ -46252,8 +48499,8 @@ ${content} clipPathsEnter.append("path"); clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", getAreaPath); var datagroups = layer.selectAll("g.datagroup").data(["fill", "shadow", "stroke"]); - datagroups = datagroups.enter().append("g").attr("class", function(d) { - return "datagroup datagroup-" + d; + datagroups = datagroups.enter().append("g").attr("class", function(d2) { + return "datagroup datagroup-" + d2; }).merge(datagroups); var pathData = { fill: polygonData, @@ -46264,33 +48511,33 @@ ${content} return pathData[layer2]; }, featureKey); paths.exit().remove(); - paths = paths.enter().append("path").attr("class", function(d) { + paths = paths.enter().append("path").attr("class", function(d2) { var datagroup = this.parentNode.__data__; - return "pathdata " + datagroup + " " + featureClasses(d); - }).attr("clip-path", function(d) { + return "pathdata " + datagroup + " " + featureClasses(d2); + }).attr("clip-path", function(d2) { var datagroup = this.parentNode.__data__; - return datagroup === "fill" ? "url(#" + clipPathID(d) + ")" : null; - }).merge(paths).attr("d", function(d) { + return datagroup === "fill" ? "url(#" + clipPathID(d2) + ")" : null; + }).merge(paths).attr("d", function(d2) { var datagroup = this.parentNode.__data__; - return datagroup === "fill" ? getAreaPath(d) : getPath(d); + return datagroup === "fill" ? getAreaPath(d2) : getPath(d2); }); layer.call(drawLabels, "label-halo", geoData).call(drawLabels, "label", geoData); function drawLabels(selection3, textClass, data) { var labelPath = path_default(projection2); - var labelData = data.filter(function(d) { - return _showLabels && d.properties && (d.properties.desc || d.properties.name); + var labelData = data.filter(function(d2) { + return _showLabels && d2.properties && (d2.properties.desc || d2.properties.name); }); var labels = selection3.selectAll("text." + textClass).data(labelData, featureKey); labels.exit().remove(); - labels = labels.enter().append("text").attr("class", function(d) { - return textClass + " " + featureClasses(d); - }).merge(labels).text(function(d) { - return d.properties.desc || d.properties.name; - }).attr("x", function(d) { - var centroid = labelPath.centroid(d); + labels = labels.enter().append("text").attr("class", function(d2) { + return textClass + " " + featureClasses(d2); + }).merge(labels).text(function(d2) { + return d2.properties.desc || d2.properties.name; + }).attr("x", function(d2) { + var centroid = labelPath.centroid(d2); return centroid[0] + 11; - }).attr("y", function(d) { - var centroid = labelPath.centroid(d); + }).attr("y", function(d2) { + var centroid = labelPath.centroid(d2); return centroid[1]; }); } @@ -46298,8 +48545,8 @@ ${content} function getExtension(fileName) { if (!fileName) return; - var re2 = /\.(gpx|kml|(geo)?json)$/i; - var match = fileName.toLowerCase().match(re2); + var re3 = /\.(gpx|kml|(geo)?json|png)$/i; + var match = fileName.toLowerCase().match(re3); return match && match.length && match[0]; } function xmlToDom(textdata) { @@ -46347,7 +48594,7 @@ ${content} _src = extension + " data file"; this.fitZoom(); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawData.showLabels = function(val) { @@ -46365,7 +48612,7 @@ ${content} } else { hideLayer(); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawData.hasData = function() { @@ -46381,8 +48628,8 @@ ${content} var fail = false; var tested = 0; var regex; - for (var i2 = 0; i2 < blocklists.length; i2++) { - regex = blocklists[i2]; + for (var i3 = 0; i3 < blocklists.length; i3++) { + regex = blocklists[i3]; fail = regex.test(val); tested++; if (fail) @@ -46397,7 +48644,7 @@ ${content} _fileList = null; _geojson = null; _src = src || "vectortile:" + val.split(/[?#]/)[0]; - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawData.geojson = function(gj, src) { @@ -46412,27 +48659,27 @@ ${content} _geojson = ensureIDs(gj); _src = src || "unknown.geojson"; } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawData.fileList = function(fileList) { if (!arguments.length) return _fileList; _template = null; - _fileList = fileList; _geojson = null; _src = null; + _fileList = fileList; if (!fileList || !fileList.length) return this; - var f2 = fileList[0]; - var extension = getExtension(f2.name); + var f3 = fileList[0]; + var extension = getExtension(f3.name); var reader = new FileReader(); reader.onload = function() { - return function(e) { - drawData.setFile(extension, e.target.result); + return function(e3) { + drawData.setFile(extension, e3.target.result); }; - }(f2); - reader.readAsText(f2); + }(f3); + reader.readAsText(f3); return this; }; drawData.url = function(url, defaultExtension) { @@ -46457,30 +48704,30 @@ ${content} return _src || ""; }; drawData.fitZoom = function() { - var features2 = getFeatures(_geojson); - if (!features2.length) + var features = getFeatures(_geojson); + if (!features.length) return; var map2 = context.map(); var viewport = map2.trimmedExtent().polygon(); - var coords = features2.reduce(function(coords2, feature3) { + var coords = features.reduce(function(coords2, feature3) { var geom = feature3.geometry; if (!geom) return coords2; - var c = geom.coordinates; + var c2 = geom.coordinates; switch (geom.type) { case "Point": - c = [c]; + c2 = [c2]; case "MultiPoint": case "LineString": break; case "MultiPolygon": - c = utilArrayFlatten(c); + c2 = utilArrayFlatten(c2); case "Polygon": case "MultiLineString": - c = utilArrayFlatten(c); + c2 = utilArrayFlatten(c2); break; } - return utilArrayUnion(coords2, c); + return utilArrayUnion(coords2, c2); }, []); if (!geoPolygonIntersectsPolygon(viewport, coords, true)) { var extent = geoExtent(bounds_default({ type: "LineString", coordinates: coords })); @@ -46519,17 +48766,17 @@ ${content} let legend = context.container().select(".main-content").selectAll(".debug-legend").data(debugData.length ? [0] : []); legend.exit().remove(); legend = legend.enter().append("div").attr("class", "fillD debug-legend").merge(legend); - let legendItems = legend.selectAll(".debug-legend-item").data(debugData, (d) => d.label); + let legendItems = legend.selectAll(".debug-legend-item").data(debugData, (d2) => d2.label); legendItems.exit().remove(); - legendItems.enter().append("span").attr("class", (d) => `debug-legend-item ${d.class}`).text((d) => d.label); + legendItems.enter().append("span").attr("class", (d2) => `debug-legend-item ${d2.class}`).text((d2) => d2.label); let layer = selection2.selectAll(".layer-debug").data(showImagery || showDownloaded ? [0] : []); layer.exit().remove(); layer = layer.enter().append("g").attr("class", "layer-debug").merge(layer); const extent = context.map().extent(); - _mainFileFetcher.get("imagery").then((d) => { - const hits = showImagery && d.query.bbox(extent.rectangle(), true) || []; - const features2 = hits.map((d2) => d2.features[d2.id]); - let imagery = layer.selectAll("path.debug-imagery").data(features2); + _mainFileFetcher.get("imagery").then((d2) => { + const hits = showImagery && d2.query.bbox(extent.rectangle(), true) || []; + const features = hits.map((d4) => d4.features[d4.id]); + let imagery = layer.selectAll("path.debug-imagery").data(features); imagery.exit().remove(); imagery.enter().append("path").attr("class", "debug-imagery debug orange"); }).catch(() => { @@ -46538,18 +48785,18 @@ ${content} let dataDownloaded = []; if (osm && showDownloaded) { const rtree = osm.caches("get").tile.rtree; - dataDownloaded = rtree.all().map((bbox) => { + dataDownloaded = rtree.all().map((bbox2) => { return { type: "Feature", - properties: { id: bbox.id }, + properties: { id: bbox2.id }, geometry: { type: "Polygon", coordinates: [[ - [bbox.minX, bbox.minY], - [bbox.minX, bbox.maxY], - [bbox.maxX, bbox.maxY], - [bbox.maxX, bbox.minY], - [bbox.minX, bbox.minY] + [bbox2.minX, bbox2.minY], + [bbox2.minX, bbox2.maxY], + [bbox2.maxX, bbox2.maxY], + [bbox2.maxX, bbox2.minY], + [bbox2.minX, bbox2.minY] ]] } }; @@ -46578,6 +48825,7 @@ ${content} "maki-sprite", "temaki-sprite", "fa-sprite", + "roentgen-sprite", "community-sprite" ]; function drawDefs(selection2) { @@ -46594,6 +48842,7 @@ ${content} _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "#333").attr("fill-opacity", "0.75").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75"); _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker-wireframe").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "none").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75"); var patterns2 = _defsSelection.selectAll("pattern").data([ + // pattern name, pattern image name ["beach", "dots"], ["construction", "construction"], ["cemetery", "cemetery"], @@ -46623,37 +48872,37 @@ ${content} ["wetland_swamp", "wetland_swamp"], ["wetland_bog", "wetland_bog"], ["wetland_reedbed", "wetland_reedbed"] - ]).enter().append("pattern").attr("id", function(d) { - return "ideditor-pattern-" + d[0]; + ]).enter().append("pattern").attr("id", function(d2) { + return "ideditor-pattern-" + d2[0]; }).attr("width", 32).attr("height", 32).attr("patternUnits", "userSpaceOnUse"); - patterns2.append("rect").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("class", function(d) { - return "pattern-color-" + d[0]; + patterns2.append("rect").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("class", function(d2) { + return "pattern-color-" + d2[0]; }); - patterns2.append("image").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("xlink:href", function(d) { - return context.imagePath("pattern/" + d[1] + ".png"); + patterns2.append("image").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("xlink:href", function(d2) { + return context.imagePath("pattern/" + d2[1] + ".png"); }); - _defsSelection.selectAll("clipPath").data([12, 18, 20, 32, 45]).enter().append("clipPath").attr("id", function(d) { - return "ideditor-clip-square-" + d; - }).append("rect").attr("x", 0).attr("y", 0).attr("width", function(d) { - return d; - }).attr("height", function(d) { - return d; + _defsSelection.selectAll("clipPath").data([12, 18, 20, 32, 45]).enter().append("clipPath").attr("id", function(d2) { + return "ideditor-clip-square-" + d2; + }).append("rect").attr("x", 0).attr("y", 0).attr("width", function(d2) { + return d2; + }).attr("height", function(d2) { + return d2; }); addSprites(_spritesheetIds, true); } function addSprites(ids, overrideColors) { _spritesheetIds = utilArrayUniq(_spritesheetIds.concat(ids)); var spritesheets = _defsSelection.selectAll(".spritesheet").data(_spritesheetIds); - spritesheets.enter().append("g").attr("class", function(d) { - return "spritesheet spritesheet-" + d; - }).each(function(d) { - var url = context.imagePath(d + ".svg"); + spritesheets.enter().append("g").attr("class", function(d2) { + return "spritesheet spritesheet-" + d2; + }).each(function(d2) { + var url = context.imagePath(d2 + ".svg"); var node = select_default2(this).node(); svg(url).then(function(svg2) { node.appendChild( - select_default2(svg2.documentElement).attr("id", "ideditor-" + d).node() + select_default2(svg2.documentElement).attr("id", "ideditor-" + d2).node() ); - if (overrideColors && d !== "iD-sprite") { + if (overrideColors && d2 !== "iD-sprite") { select_default2(node).selectAll("path").attr("fill", "currentColor"); } }).catch(function() { @@ -46668,9 +48917,9 @@ ${content} // modules/svg/keepRight.js var _layerEnabled = false; var _qaService; - function svgKeepRight(projection2, context, dispatch10) { - const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3); - const minZoom3 = 12; + function svgKeepRight(projection2, context, dispatch14) { + const throttledRedraw = throttle_default(() => dispatch14.call("change"), 1e3); + const minZoom4 = 12; let touchLayer = select_default2(null); let drawLayer = select_default2(null); let layerVisible = false; @@ -46702,7 +48951,7 @@ ${content} } function layerOn() { editOn(); - drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change")); + drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch14.call("change")); } function layerOff() { throttledRedraw.cancel(); @@ -46710,7 +48959,7 @@ ${content} touchLayer.selectAll(".qaItem.keepRight").remove(); drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => { editOff(); - dispatch10.call("change"); + dispatch14.call("change"); }); } function updateMarkers() { @@ -46720,21 +48969,21 @@ ${content} const selectedID = context.selectedErrorID(); const data = service ? service.getItems(projection2) : []; const getTransform = svgPointTransform(projection2); - const markers = drawLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id); + const markers = drawLayer.selectAll(".qaItem.keepRight").data(data, (d2) => d2.id); markers.exit().remove(); - const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`); + const markersEnter = markers.enter().append("g").attr("class", (d2) => `qaItem ${d2.service} itemId-${d2.id} itemType-${d2.parentIssueType}`); markersEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke"); markersEnter.append("path").call(markerPath, "shadow"); markersEnter.append("use").attr("class", "qaItem-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-bolt"); - markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform); + markers.merge(markersEnter).sort(sortY).classed("selected", (d2) => d2.id === selectedID).attr("transform", getTransform); if (touchLayer.empty()) return; const fillClass = context.getDebug("target") ? "pink " : "nocolor "; - const targets = touchLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id); + const targets = touchLayer.selectAll(".qaItem.keepRight").data(data, (d2) => d2.id); targets.exit().remove(); - targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform); - function sortY(a, b) { - return a.id === selectedID ? 1 : b.id === selectedID ? -1 : a.severity === "error" && b.severity !== "error" ? 1 : b.severity === "error" && a.severity !== "error" ? -1 : b.loc[1] - a.loc[1]; + targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", (d2) => `qaItem ${d2.service} target ${fillClass} itemId-${d2.id}`).attr("transform", getTransform); + function sortY(a2, b2) { + return a2.id === selectedID ? 1 : b2.id === selectedID ? -1 : a2.severity === "error" && b2.severity !== "error" ? 1 : b2.severity === "error" && a2.severity !== "error" ? -1 : b2.loc[1] - a2.loc[1]; } } function drawKeepRight(selection2) { @@ -46747,7 +48996,7 @@ ${content} drawLayer.exit().remove(); drawLayer = drawLayer.enter().append("g").attr("class", "layer-keepRight").style("display", _layerEnabled ? "block" : "none").merge(drawLayer); if (_layerEnabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); service.loadIssues(projection2); updateMarkers(); @@ -46768,7 +49017,7 @@ ${content} context.enter(modeBrowse(context)); } } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawKeepRight.supported = () => !!getService(); @@ -46797,8 +49046,8 @@ ${content} function layerOff() { layer.style("display", "none"); } - function transform2(d) { - return svgPointTransform(projection2)(d); + function transform2(d2) { + return svgPointTransform(projection2)(d2); } function accuracy(accuracy2, loc) { var degreesRadius = geoMetersToLat(accuracy2), tangentLoc = [loc[0], loc[1] + degreesRadius], projectedTangent = projection2(tangentLoc), projectedLoc = projection2([loc[0], loc[1]]); @@ -46845,13 +49094,13 @@ ${content} } // modules/svg/labels.js - var import_rbush7 = __toESM(require_rbush_min()); + var import_rbush6 = __toESM(require_rbush_min()); function svgLabels(projection2, context) { var path = path_default(projection2); var detected = utilDetect(); var baselineHack = detected.ie || detected.browser.toLowerCase() === "edge" || detected.browser.toLowerCase() === "firefox" && detected.version >= 70; - var _rdrawn = new import_rbush7.default(); - var _rskipped = new import_rbush7.default(); + var _rdrawn = new import_rbush6.default(); + var _rskipped = new import_rbush6.default(); var _textWidthCache = {}; var _entitybboxes = {}; var labelStack = [ @@ -46893,24 +49142,24 @@ ${content} ]; function shouldSkipIcon(preset) { var noIcons = ["building", "landuse", "natural"]; - return noIcons.some(function(s) { - return preset.id.indexOf(s) >= 0; + return noIcons.some(function(s2) { + return preset.id.indexOf(s2) >= 0; }); } function get4(array2, prop) { - return function(d, i2) { - return array2[i2][prop]; + return function(d2, i3) { + return array2[i3][prop]; }; } function textWidth(text2, size, elem) { - var c = _textWidthCache[size]; - if (!c) - c = _textWidthCache[size] = {}; - if (c[text2]) { - return c[text2]; + var c2 = _textWidthCache[size]; + if (!c2) + c2 = _textWidthCache[size] = {}; + if (c2[text2]) { + return c2[text2]; } else if (elem) { - c[text2] = elem.getComputedTextLength(); - return c[text2]; + c2[text2] = elem.getComputedTextLength(); + return c2[text2]; } else { var str2 = encodeURIComponent(text2).match(/%[CDEFcdef]/g); if (str2 === null) { @@ -46923,42 +49172,42 @@ ${content} function drawLinePaths(selection2, entities, filter2, classes, labels) { var paths = selection2.selectAll("path").filter(filter2).data(entities, osmEntity.key); paths.exit().remove(); - paths.enter().append("path").style("stroke-width", get4(labels, "font-size")).attr("id", function(d) { - return "ideditor-labelpath-" + d.id; + paths.enter().append("path").style("stroke-width", get4(labels, "font-size")).attr("id", function(d2) { + return "ideditor-labelpath-" + d2.id; }).attr("class", classes).merge(paths).attr("d", get4(labels, "lineString")); } function drawLineLabels(selection2, entities, filter2, classes, labels) { var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key); texts.exit().remove(); - texts.enter().append("text").attr("class", function(d, i2) { - return classes + " " + labels[i2].classes + " " + d.id; + texts.enter().append("text").attr("class", function(d2, i3) { + return classes + " " + labels[i3].classes + " " + d2.id; }).attr("dy", baselineHack ? "0.35em" : null).append("textPath").attr("class", "textpath"); - selection2.selectAll("text." + classes).selectAll(".textpath").filter(filter2).data(entities, osmEntity.key).attr("startOffset", "50%").attr("xlink:href", function(d) { - return "#ideditor-labelpath-" + d.id; + selection2.selectAll("text." + classes).selectAll(".textpath").filter(filter2).data(entities, osmEntity.key).attr("startOffset", "50%").attr("xlink:href", function(d2) { + return "#ideditor-labelpath-" + d2.id; }).text(utilDisplayNameForPath); } function drawPointLabels(selection2, entities, filter2, classes, labels) { var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key); texts.exit().remove(); - texts.enter().append("text").attr("class", function(d, i2) { - return classes + " " + labels[i2].classes + " " + d.id; - }).merge(texts).attr("x", get4(labels, "x")).attr("y", get4(labels, "y")).style("text-anchor", get4(labels, "textAnchor")).text(utilDisplayName).each(function(d, i2) { - textWidth(utilDisplayName(d), labels[i2].height, this); + texts.enter().append("text").attr("class", function(d2, i3) { + return classes + " " + labels[i3].classes + " " + d2.id; + }).merge(texts).attr("x", get4(labels, "x")).attr("y", get4(labels, "y")).style("text-anchor", get4(labels, "textAnchor")).text(utilDisplayName).each(function(d2, i3) { + textWidth(utilDisplayName(d2), labels[i3].height, this); }); } function drawAreaLabels(selection2, entities, filter2, classes, labels) { entities = entities.filter(hasText); labels = labels.filter(hasText); drawPointLabels(selection2, entities, filter2, classes, labels); - function hasText(d, i2) { - return labels[i2].hasOwnProperty("x") && labels[i2].hasOwnProperty("y"); + function hasText(d2, i3) { + return labels[i3].hasOwnProperty("x") && labels[i3].hasOwnProperty("y"); } } function drawAreaIcons(selection2, entities, filter2, classes, labels) { var icons = selection2.selectAll("use." + classes).filter(filter2).data(entities, osmEntity.key); icons.exit().remove(); - icons.enter().append("use").attr("class", "icon " + classes).attr("width", "17px").attr("height", "17px").merge(icons).attr("transform", get4(labels, "transform")).attr("xlink:href", function(d) { - var preset = _mainPresetIndex.match(d, context.graph()); + icons.enter().append("use").attr("class", "icon " + classes).attr("width", "17px").attr("height", "17px").merge(icons).attr("transform", get4(labels, "transform")).attr("xlink:href", function(d2) { + var preset = _mainPresetIndex.match(d2, context.graph()); var picon = preset && preset.icon; return picon ? "#" + picon : ""; }); @@ -46967,13 +49216,13 @@ ${content} var classes = "debug " + which + " " + (which === "debug-skipped" ? "orange" : "yellow"); var gj = []; if (context.getDebug("collision")) { - gj = rtree.all().map(function(d) { + gj = rtree.all().map(function(d2) { return { type: "Polygon", coordinates: [[ - [d.minX, d.minY], - [d.maxX, d.minY], - [d.maxX, d.maxY], - [d.minX, d.maxY], - [d.minX, d.minY] + [d2.minX, d2.minY], + [d2.maxX, d2.minY], + [d2.maxX, d2.maxY], + [d2.minX, d2.maxY], + [d2.minX, d2.minY] ]] }; }); } @@ -46986,8 +49235,8 @@ ${content} var zoom = geoScaleToZoom(projection2.scale()); var labelable = []; var renderNodeAs = {}; - var i2, j2, k, entity, geometry; - for (i2 = 0; i2 < labelStack.length; i2++) { + var i3, j3, k2, entity, geometry; + for (i3 = 0; i3 < labelStack.length; i3++) { labelable.push([]); } if (fullRedraw) { @@ -46995,17 +49244,17 @@ ${content} _rskipped.clear(); _entitybboxes = {}; } else { - for (i2 = 0; i2 < entities.length; i2++) { - entity = entities[i2]; + for (i3 = 0; i3 < entities.length; i3++) { + entity = entities[i3]; var toRemove = [].concat(_entitybboxes[entity.id] || []).concat(_entitybboxes[entity.id + "I"] || []); - for (j2 = 0; j2 < toRemove.length; j2++) { - _rdrawn.remove(toRemove[j2]); - _rskipped.remove(toRemove[j2]); + for (j3 = 0; j3 < toRemove.length; j3++) { + _rdrawn.remove(toRemove[j3]); + _rskipped.remove(toRemove[j3]); } } } - for (i2 = 0; i2 < entities.length; i2++) { - entity = entities[i2]; + for (i3 = 0; i3 < entities.length; i3++) { + entity = entities[i3]; geometry = entity.geometry(graph); if (geometry === "point" || geometry === "vertex" && isInterestingVertex(entity)) { var hasDirections = entity.directions(graph, projection2).length; @@ -47019,13 +49268,13 @@ ${content} } var coord2 = projection2(entity.loc); var nodePadding = 10; - var bbox = { + var bbox2 = { minX: coord2[0] - nodePadding, minY: coord2[1] - nodePadding - markerPadding, maxX: coord2[0] + nodePadding, maxY: coord2[1] + nodePadding }; - doInsert(bbox, entity.id + "P"); + doInsert(bbox2, entity.id + "P"); } if (geometry === "vertex") { geometry = "point"; @@ -47034,13 +49283,13 @@ ${content} var icon2 = preset && !shouldSkipIcon(preset) && preset.icon; if (!icon2 && !utilDisplayName(entity)) continue; - for (k = 0; k < labelStack.length; k++) { - var matchGeom = labelStack[k][0]; - var matchKey = labelStack[k][1]; - var matchVal = labelStack[k][2]; + for (k2 = 0; k2 < labelStack.length; k2++) { + var matchGeom = labelStack[k2][0]; + var matchKey = labelStack[k2][1]; + var matchVal = labelStack[k2][2]; var hasVal = entity.tags[matchKey]; if (geometry === matchGeom && hasVal && (matchVal === "*" || matchVal === hasVal)) { - labelable[k].push(entity); + labelable[k2].push(entity); break; } } @@ -47055,33 +49304,33 @@ ${content} line: [], area: [] }; - for (k = 0; k < labelable.length; k++) { - var fontSize = labelStack[k][3]; - for (i2 = 0; i2 < labelable[k].length; i2++) { - entity = labelable[k][i2]; + for (k2 = 0; k2 < labelable.length; k2++) { + var fontSize = labelStack[k2][3]; + for (i3 = 0; i3 < labelable[k2].length; i3++) { + entity = labelable[k2][i3]; geometry = entity.geometry(graph); var getName = geometry === "line" ? utilDisplayNameForPath : utilDisplayName; var name = getName(entity); var width = name && textWidth(name, fontSize); - var p = null; + var p2 = null; if (geometry === "point" || geometry === "vertex") { if (wireframe) continue; var renderAs = renderNodeAs[entity.id]; if (renderAs === "vertex" && zoom < 17) continue; - p = getPointLabel(entity, width, fontSize, renderAs); + p2 = getPointLabel(entity, width, fontSize, renderAs); } else if (geometry === "line") { - p = getLineLabel(entity, width, fontSize); + p2 = getLineLabel(entity, width, fontSize); } else if (geometry === "area") { - p = getAreaLabel(entity, width, fontSize); + p2 = getAreaLabel(entity, width, fontSize); } - if (p) { + if (p2) { if (geometry === "vertex") { geometry = "point"; } - p.classes = geometry + " tag-" + labelStack[k][1]; - positions[geometry].push(p); + p2.classes = geometry + " tag-" + labelStack[k2][1]; + positions[geometry].push(p2); labelled[geometry].push(entity); } } @@ -47093,40 +49342,40 @@ ${content} }); } function getPointLabel(entity2, width2, height, geometry2) { - var y = geometry2 === "point" ? -12 : 0; + var y2 = geometry2 === "point" ? -12 : 0; var pointOffsets = { - ltr: [15, y, "start"], - rtl: [-15, y, "end"] + ltr: [15, y2, "start"], + rtl: [-15, y2, "end"] }; var textDirection = _mainLocalizer.textDirection(); var coord3 = projection2(entity2.loc); var textPadding = 2; var offset = pointOffsets[textDirection]; - var p2 = { + var p3 = { height, width: width2, x: coord3[0] + offset[0], y: coord3[1] + offset[1], textAnchor: offset[2] }; - var bbox2; + var bbox3; if (textDirection === "rtl") { - bbox2 = { - minX: p2.x - width2 - textPadding, - minY: p2.y - height / 2 - textPadding, - maxX: p2.x + textPadding, - maxY: p2.y + height / 2 + textPadding + bbox3 = { + minX: p3.x - width2 - textPadding, + minY: p3.y - height / 2 - textPadding, + maxX: p3.x + textPadding, + maxY: p3.y + height / 2 + textPadding }; } else { - bbox2 = { - minX: p2.x - textPadding, - minY: p2.y - height / 2 - textPadding, - maxX: p2.x + width2 + textPadding, - maxY: p2.y + height / 2 + textPadding + bbox3 = { + minX: p3.x - textPadding, + minY: p3.y - height / 2 - textPadding, + maxX: p3.x + width2 + textPadding, + maxY: p3.y + height / 2 + textPadding }; } - if (tryInsert([bbox2], entity2.id, true)) { - return p2; + if (tryInsert([bbox3], entity2.id, true)) { + return p3; } } function getLineLabel(entity2, width2, height) { @@ -47159,8 +49408,8 @@ ${content} 95 ]; var padding = 3; - for (var i3 = 0; i3 < lineOffsets.length; i3++) { - var offset = lineOffsets[i3]; + for (var i4 = 0; i4 < lineOffsets.length; i4++) { + var offset = lineOffsets[i4]; var middle = offset / 100 * length; var start2 = middle - width2 / 2; if (start2 < 0 || start2 + width2 > length) @@ -47175,16 +49424,16 @@ ${content} } var bboxes = []; var boxsize = (height + 2) / 2; - for (var j3 = 0; j3 < sub.length - 1; j3++) { - var a = sub[j3]; - var b = sub[j3 + 1]; - var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2)); + for (var j4 = 0; j4 < sub.length - 1; j4++) { + var a2 = sub[j4]; + var b2 = sub[j4 + 1]; + var num = Math.max(1, Math.floor(geoVecLength(a2, b2) / boxsize / 2)); for (var box = 0; box < num; box++) { - var p2 = geoVecInterp(a, b, box / num); - var x05 = p2[0] - boxsize - padding; - var y05 = p2[1] - boxsize - padding; - var x12 = p2[0] + boxsize + padding; - var y12 = p2[1] + boxsize + padding; + var p3 = geoVecInterp(a2, b2, box / num); + var x05 = p3[0] - boxsize - padding; + var y05 = p3[1] - boxsize - padding; + var x12 = p3[0] + boxsize + padding; + var y12 = p3[1] + boxsize + padding; bboxes.push({ minX: Math.min(x05, x12), minY: Math.min(y05, y12), @@ -47201,9 +49450,9 @@ ${content} }; } } - function reverse(p3) { - var angle2 = Math.atan2(p3[1][1] - p3[0][1], p3[1][0] - p3[0][0]); - return !(p3[0][0] < p3[p3.length - 1][0] && angle2 < Math.PI / 2 && angle2 > -Math.PI / 2); + function reverse(p4) { + var angle2 = Math.atan2(p4[1][1] - p4[0][1], p4[1][0] - p4[0][0]); + return !(p4[0][0] < p4[p4.length - 1][0] && angle2 < Math.PI / 2 && angle2 > -Math.PI / 2); } function lineString2(points2) { return "M" + points2.join("L"); @@ -47211,26 +49460,26 @@ ${content} function subpath(points2, from, to) { var sofar = 0; var start3, end, i0, i1; - for (var i4 = 0; i4 < points2.length - 1; i4++) { - var a2 = points2[i4]; - var b2 = points2[i4 + 1]; - var current = geoVecLength(a2, b2); + for (var i5 = 0; i5 < points2.length - 1; i5++) { + var a3 = points2[i5]; + var b3 = points2[i5 + 1]; + var current = geoVecLength(a3, b3); var portion; if (!start3 && sofar + current >= from) { portion = (from - sofar) / current; start3 = [ - a2[0] + portion * (b2[0] - a2[0]), - a2[1] + portion * (b2[1] - a2[1]) + a3[0] + portion * (b3[0] - a3[0]), + a3[1] + portion * (b3[1] - a3[1]) ]; - i0 = i4 + 1; + i0 = i5 + 1; } if (!end && sofar + current >= to) { portion = (to - sofar) / current; end = [ - a2[0] + portion * (b2[0] - a2[0]), - a2[1] + portion * (b2[1] - a2[1]) + a3[0] + portion * (b3[0] - a3[0]), + a3[1] + portion * (b3[1] - a3[1]) ]; - i1 = i4 + 1; + i1 = i5 + 1; } sofar += current; } @@ -47250,28 +49499,28 @@ ${content} var picon = preset2 && preset2.icon; var iconSize = 17; var padding = 2; - var p2 = {}; + var p3 = {}; if (picon) { if (addIcon()) { addLabel(iconSize + padding); - return p2; + return p3; } } else { if (addLabel(0)) { - return p2; + return p3; } } function addIcon() { var iconX = centroid[0] - iconSize / 2; var iconY = centroid[1] - iconSize / 2; - var bbox2 = { + var bbox3 = { minX: iconX, minY: iconY, maxX: iconX + iconSize, maxY: iconY + iconSize }; - if (tryInsert([bbox2], entity2.id + "I", true)) { - p2.transform = "translate(" + iconX + "," + iconY + ")"; + if (tryInsert([bbox3], entity2.id + "I", true)) { + p3.transform = "translate(" + iconX + "," + iconY + ")"; return true; } return false; @@ -47280,42 +49529,42 @@ ${content} if (width2 && areaWidth >= width2 + 20) { var labelX = centroid[0]; var labelY = centroid[1] + yOffset; - var bbox2 = { + var bbox3 = { minX: labelX - width2 / 2 - padding, minY: labelY - height / 2 - padding, maxX: labelX + width2 / 2 + padding, maxY: labelY + height / 2 + padding }; - if (tryInsert([bbox2], entity2.id, true)) { - p2.x = labelX; - p2.y = labelY; - p2.textAnchor = "middle"; - p2.height = height; + if (tryInsert([bbox3], entity2.id, true)) { + p3.x = labelX; + p3.y = labelY; + p3.textAnchor = "middle"; + p3.height = height; return true; } } return false; } } - function doInsert(bbox2, id2) { - bbox2.id = id2; + function doInsert(bbox3, id2) { + bbox3.id = id2; var oldbox = _entitybboxes[id2]; if (oldbox) { _rdrawn.remove(oldbox); } - _entitybboxes[id2] = bbox2; - _rdrawn.insert(bbox2); + _entitybboxes[id2] = bbox3; + _rdrawn.insert(bbox3); } function tryInsert(bboxes, id2, saveSkipped) { var skipped = false; - for (var i3 = 0; i3 < bboxes.length; i3++) { - var bbox2 = bboxes[i3]; - bbox2.id = id2; - if (bbox2.minX < 0 || bbox2.minY < 0 || bbox2.maxX > dimensions[0] || bbox2.maxY > dimensions[1]) { + for (var i4 = 0; i4 < bboxes.length; i4++) { + var bbox3 = bboxes[i4]; + bbox3.id = id2; + if (bbox3.minX < 0 || bbox3.minY < 0 || bbox3.maxX > dimensions[0] || bbox3.maxY > dimensions[1]) { skipped = true; break; } - if (_rdrawn.collides(bbox2)) { + if (_rdrawn.collides(bbox3)) { skipped = true; break; } @@ -47331,8 +49580,8 @@ ${content} return !skipped; } var layer = selection2.selectAll(".layer-osm.labels"); - layer.selectAll(".labels-group").data(["halo", "label", "debug"]).enter().append("g").attr("class", function(d) { - return "labels-group " + d; + layer.selectAll(".labels-group").data(["halo", "label", "debug"]).enter().append("g").attr("class", function(d2) { + return "labels-group " + d2; }); var halo = layer.selectAll(".labels-group.halo"); var label = layer.selectAll(".labels-group.label"); @@ -47358,33 +49607,33 @@ ${content} var graph = context.graph(); var selectedIDs = context.selectedIDs(); var ids = []; - var pad2, bbox; + var pad2, bbox2; if (mouse) { pad2 = 20; - bbox = { minX: mouse[0] - pad2, minY: mouse[1] - pad2, maxX: mouse[0] + pad2, maxY: mouse[1] + pad2 }; - var nearMouse = _rdrawn.search(bbox).map(function(entity2) { + bbox2 = { minX: mouse[0] - pad2, minY: mouse[1] - pad2, maxX: mouse[0] + pad2, maxY: mouse[1] + pad2 }; + var nearMouse = _rdrawn.search(bbox2).map(function(entity2) { return entity2.id; }); ids.push.apply(ids, nearMouse); } - for (var i2 = 0; i2 < selectedIDs.length; i2++) { - var entity = graph.hasEntity(selectedIDs[i2]); + for (var i3 = 0; i3 < selectedIDs.length; i3++) { + var entity = graph.hasEntity(selectedIDs[i3]); if (entity && entity.type === "node") { - ids.push(selectedIDs[i2]); + ids.push(selectedIDs[i3]); } } layers.selectAll(utilEntitySelector(ids)).classed("nolabel", true); var debug2 = selection2.selectAll(".labels-group.debug"); var gj = []; if (context.getDebug("collision")) { - gj = bbox ? [{ + gj = bbox2 ? [{ type: "Polygon", coordinates: [[ - [bbox.minX, bbox.minY], - [bbox.maxX, bbox.minY], - [bbox.maxX, bbox.maxY], - [bbox.minX, bbox.maxY], - [bbox.minX, bbox.minY] + [bbox2.minX, bbox2.minY], + [bbox2.maxX, bbox2.minY], + [bbox2.maxX, bbox2.maxY], + [bbox2.minX, bbox2.maxY], + [bbox2.minX, bbox2.minY] ]] }] : []; } @@ -47408,12 +49657,1889 @@ ${content} return drawLabels; } + // node_modules/exifr/dist/full.esm.mjs + var e = "undefined" != typeof self ? self : global; + var t = "undefined" != typeof navigator; + var i2 = t && "undefined" == typeof HTMLImageElement; + var n2 = !("undefined" == typeof global || "undefined" == typeof process || !process.versions || !process.versions.node); + var s = e.Buffer; + var r = e.BigInt; + var a = !!s; + var o = (e3) => e3; + function l(e3, t2 = o) { + if (n2) + try { + return "function" == typeof __require ? Promise.resolve(t2(__require(e3))) : import( + /* webpackIgnore: true */ + e3 + ).then(t2); + } catch (t3) { + console.warn(`Couldn't load ${e3}`); + } + } + var h = e.fetch; + var u = (e3) => h = e3; + if (!e.fetch) { + const e3 = l("http", (e4) => e4), t2 = l("https", (e4) => e4), i3 = (n3, { headers: s2 } = {}) => new Promise(async (r2, a2) => { + let { port: o2, hostname: l2, pathname: h2, protocol: u2, search: c2 } = new URL(n3); + const f3 = { method: "GET", hostname: l2, path: encodeURI(h2) + c2, headers: s2 }; + "" !== o2 && (f3.port = Number(o2)); + const d2 = ("https:" === u2 ? await t2 : await e3).request(f3, (e4) => { + if (301 === e4.statusCode || 302 === e4.statusCode) { + let t3 = new URL(e4.headers.location, n3).toString(); + return i3(t3, { headers: s2 }).then(r2).catch(a2); + } + r2({ status: e4.statusCode, arrayBuffer: () => new Promise((t3) => { + let i4 = []; + e4.on("data", (e6) => i4.push(e6)), e4.on("end", () => t3(Buffer.concat(i4))); + }) }); + }); + d2.on("error", a2), d2.end(); + }); + u(i3); + } + function c(e3, t2, i3) { + return t2 in e3 ? Object.defineProperty(e3, t2, { value: i3, enumerable: true, configurable: true, writable: true }) : e3[t2] = i3, e3; + } + var f2 = (e3) => p(e3) ? void 0 : e3; + var d = (e3) => void 0 !== e3; + function p(e3) { + return void 0 === e3 || (e3 instanceof Map ? 0 === e3.size : 0 === Object.values(e3).filter(d).length); + } + function g2(e3) { + let t2 = new Error(e3); + throw delete t2.stack, t2; + } + function m(e3) { + return "" === (e3 = function(e4) { + for (; e4.endsWith("\0"); ) + e4 = e4.slice(0, -1); + return e4; + }(e3).trim()) ? void 0 : e3; + } + function S(e3) { + let t2 = function(e4) { + let t3 = 0; + return e4.ifd0.enabled && (t3 += 1024), e4.exif.enabled && (t3 += 2048), e4.makerNote && (t3 += 2048), e4.userComment && (t3 += 1024), e4.gps.enabled && (t3 += 512), e4.interop.enabled && (t3 += 100), e4.ifd1.enabled && (t3 += 1024), t3 + 2048; + }(e3); + return e3.jfif.enabled && (t2 += 50), e3.xmp.enabled && (t2 += 2e4), e3.iptc.enabled && (t2 += 14e3), e3.icc.enabled && (t2 += 6e3), t2; + } + var C = (e3) => String.fromCharCode.apply(null, e3); + var y = "undefined" != typeof TextDecoder ? new TextDecoder("utf-8") : void 0; + function b(e3) { + return y ? y.decode(e3) : a ? Buffer.from(e3).toString("utf8") : decodeURIComponent(escape(C(e3))); + } + var I = class _I { + static from(e3, t2) { + return e3 instanceof this && e3.le === t2 ? e3 : new _I(e3, void 0, void 0, t2); + } + constructor(e3, t2 = 0, i3, n3) { + if ("boolean" == typeof n3 && (this.le = n3), Array.isArray(e3) && (e3 = new Uint8Array(e3)), 0 === e3) + this.byteOffset = 0, this.byteLength = 0; + else if (e3 instanceof ArrayBuffer) { + void 0 === i3 && (i3 = e3.byteLength - t2); + let n4 = new DataView(e3, t2, i3); + this._swapDataView(n4); + } else if (e3 instanceof Uint8Array || e3 instanceof DataView || e3 instanceof _I) { + void 0 === i3 && (i3 = e3.byteLength - t2), (t2 += e3.byteOffset) + i3 > e3.byteOffset + e3.byteLength && g2("Creating view outside of available memory in ArrayBuffer"); + let n4 = new DataView(e3.buffer, t2, i3); + this._swapDataView(n4); + } else if ("number" == typeof e3) { + let t3 = new DataView(new ArrayBuffer(e3)); + this._swapDataView(t3); + } else + g2("Invalid input argument for BufferView: " + e3); + } + _swapArrayBuffer(e3) { + this._swapDataView(new DataView(e3)); + } + _swapBuffer(e3) { + this._swapDataView(new DataView(e3.buffer, e3.byteOffset, e3.byteLength)); + } + _swapDataView(e3) { + this.dataView = e3, this.buffer = e3.buffer, this.byteOffset = e3.byteOffset, this.byteLength = e3.byteLength; + } + _lengthToEnd(e3) { + return this.byteLength - e3; + } + set(e3, t2, i3 = _I) { + return e3 instanceof DataView || e3 instanceof _I ? e3 = new Uint8Array(e3.buffer, e3.byteOffset, e3.byteLength) : e3 instanceof ArrayBuffer && (e3 = new Uint8Array(e3)), e3 instanceof Uint8Array || g2("BufferView.set(): Invalid data argument."), this.toUint8().set(e3, t2), new i3(this, t2, e3.byteLength); + } + subarray(e3, t2) { + return t2 = t2 || this._lengthToEnd(e3), new _I(this, e3, t2); + } + toUint8() { + return new Uint8Array(this.buffer, this.byteOffset, this.byteLength); + } + getUint8Array(e3, t2) { + return new Uint8Array(this.buffer, this.byteOffset + e3, t2); + } + getString(e3 = 0, t2 = this.byteLength) { + return b(this.getUint8Array(e3, t2)); + } + getLatin1String(e3 = 0, t2 = this.byteLength) { + let i3 = this.getUint8Array(e3, t2); + return C(i3); + } + getUnicodeString(e3 = 0, t2 = this.byteLength) { + const i3 = []; + for (let n3 = 0; n3 < t2 && e3 + n3 < this.byteLength; n3 += 2) + i3.push(this.getUint16(e3 + n3)); + return C(i3); + } + getInt8(e3) { + return this.dataView.getInt8(e3); + } + getUint8(e3) { + return this.dataView.getUint8(e3); + } + getInt16(e3, t2 = this.le) { + return this.dataView.getInt16(e3, t2); + } + getInt32(e3, t2 = this.le) { + return this.dataView.getInt32(e3, t2); + } + getUint16(e3, t2 = this.le) { + return this.dataView.getUint16(e3, t2); + } + getUint32(e3, t2 = this.le) { + return this.dataView.getUint32(e3, t2); + } + getFloat32(e3, t2 = this.le) { + return this.dataView.getFloat32(e3, t2); + } + getFloat64(e3, t2 = this.le) { + return this.dataView.getFloat64(e3, t2); + } + getFloat(e3, t2 = this.le) { + return this.dataView.getFloat32(e3, t2); + } + getDouble(e3, t2 = this.le) { + return this.dataView.getFloat64(e3, t2); + } + getUintBytes(e3, t2, i3) { + switch (t2) { + case 1: + return this.getUint8(e3, i3); + case 2: + return this.getUint16(e3, i3); + case 4: + return this.getUint32(e3, i3); + case 8: + return this.getUint64 && this.getUint64(e3, i3); + } + } + getUint(e3, t2, i3) { + switch (t2) { + case 8: + return this.getUint8(e3, i3); + case 16: + return this.getUint16(e3, i3); + case 32: + return this.getUint32(e3, i3); + case 64: + return this.getUint64 && this.getUint64(e3, i3); + } + } + toString(e3) { + return this.dataView.toString(e3, this.constructor.name); + } + ensureChunk() { + } + }; + function P(e3, t2) { + g2(`${e3} '${t2}' was not loaded, try using full build of exifr.`); + } + var k = class extends Map { + constructor(e3) { + super(), this.kind = e3; + } + get(e3, t2) { + return this.has(e3) || P(this.kind, e3), t2 && (e3 in t2 || function(e4, t3) { + g2(`Unknown ${e4} '${t3}'.`); + }(this.kind, e3), t2[e3].enabled || P(this.kind, e3)), super.get(e3); + } + keyList() { + return Array.from(this.keys()); + } + }; + var w = new k("file parser"); + var T = new k("segment parser"); + var A = new k("file reader"); + function D(e3, n3) { + return "string" == typeof e3 ? O(e3, n3) : t && !i2 && e3 instanceof HTMLImageElement ? O(e3.src, n3) : e3 instanceof Uint8Array || e3 instanceof ArrayBuffer || e3 instanceof DataView ? new I(e3) : t && e3 instanceof Blob ? x(e3, n3, "blob", R) : void g2("Invalid input argument"); + } + function O(e3, i3) { + return (s2 = e3).startsWith("data:") || s2.length > 1e4 ? v(e3, i3, "base64") : n2 && e3.includes("://") ? x(e3, i3, "url", M) : n2 ? v(e3, i3, "fs") : t ? x(e3, i3, "url", M) : void g2("Invalid input argument"); + var s2; + } + async function x(e3, t2, i3, n3) { + return A.has(i3) ? v(e3, t2, i3) : n3 ? async function(e4, t3) { + let i4 = await t3(e4); + return new I(i4); + }(e3, n3) : void g2(`Parser ${i3} is not loaded`); + } + async function v(e3, t2, i3) { + let n3 = new (A.get(i3))(e3, t2); + return await n3.read(), n3; + } + var M = (e3) => h(e3).then((e4) => e4.arrayBuffer()); + var R = (e3) => new Promise((t2, i3) => { + let n3 = new FileReader(); + n3.onloadend = () => t2(n3.result || new ArrayBuffer()), n3.onerror = i3, n3.readAsArrayBuffer(e3); + }); + var L = class extends Map { + get tagKeys() { + return this.allKeys || (this.allKeys = Array.from(this.keys())), this.allKeys; + } + get tagValues() { + return this.allValues || (this.allValues = Array.from(this.values())), this.allValues; + } + }; + function U(e3, t2, i3) { + let n3 = new L(); + for (let [e4, t3] of i3) + n3.set(e4, t3); + if (Array.isArray(t2)) + for (let i4 of t2) + e3.set(i4, n3); + else + e3.set(t2, n3); + return n3; + } + function F(e3, t2, i3) { + let n3, s2 = e3.get(t2); + for (n3 of i3) + s2.set(n3[0], n3[1]); + } + var E = /* @__PURE__ */ new Map(); + var B = /* @__PURE__ */ new Map(); + var N = /* @__PURE__ */ new Map(); + var G = ["chunked", "firstChunkSize", "firstChunkSizeNode", "firstChunkSizeBrowser", "chunkSize", "chunkLimit"]; + var V = ["jfif", "xmp", "icc", "iptc", "ihdr"]; + var z = ["tiff", ...V]; + var H = ["ifd0", "ifd1", "exif", "gps", "interop"]; + var j2 = [...z, ...H]; + var W = ["makerNote", "userComment"]; + var K = ["translateKeys", "translateValues", "reviveValues", "multiSegment"]; + var X = [...K, "sanitize", "mergeOutput", "silentErrors"]; + var _ = class { + get translate() { + return this.translateKeys || this.translateValues || this.reviveValues; + } + }; + var Y = class extends _ { + get needed() { + return this.enabled || this.deps.size > 0; + } + constructor(e3, t2, i3, n3) { + if (super(), c(this, "enabled", false), c(this, "skip", /* @__PURE__ */ new Set()), c(this, "pick", /* @__PURE__ */ new Set()), c(this, "deps", /* @__PURE__ */ new Set()), c(this, "translateKeys", false), c(this, "translateValues", false), c(this, "reviveValues", false), this.key = e3, this.enabled = t2, this.parse = this.enabled, this.applyInheritables(n3), this.canBeFiltered = H.includes(e3), this.canBeFiltered && (this.dict = E.get(e3)), void 0 !== i3) + if (Array.isArray(i3)) + this.parse = this.enabled = true, this.canBeFiltered && i3.length > 0 && this.translateTagSet(i3, this.pick); + else if ("object" == typeof i3) { + if (this.enabled = true, this.parse = false !== i3.parse, this.canBeFiltered) { + let { pick: e4, skip: t3 } = i3; + e4 && e4.length > 0 && this.translateTagSet(e4, this.pick), t3 && t3.length > 0 && this.translateTagSet(t3, this.skip); + } + this.applyInheritables(i3); + } else + true === i3 || false === i3 ? this.parse = this.enabled = i3 : g2(`Invalid options argument: ${i3}`); + } + applyInheritables(e3) { + let t2, i3; + for (t2 of K) + i3 = e3[t2], void 0 !== i3 && (this[t2] = i3); + } + translateTagSet(e3, t2) { + if (this.dict) { + let i3, n3, { tagKeys: s2, tagValues: r2 } = this.dict; + for (i3 of e3) + "string" == typeof i3 ? (n3 = r2.indexOf(i3), -1 === n3 && (n3 = s2.indexOf(Number(i3))), -1 !== n3 && t2.add(Number(s2[n3]))) : t2.add(i3); + } else + for (let i3 of e3) + t2.add(i3); + } + finalizeFilters() { + !this.enabled && this.deps.size > 0 ? (this.enabled = true, ee(this.pick, this.deps)) : this.enabled && this.pick.size > 0 && ee(this.pick, this.deps); + } + }; + var $2 = { jfif: false, tiff: true, xmp: false, icc: false, iptc: false, ifd0: true, ifd1: false, exif: true, gps: true, interop: false, ihdr: void 0, makerNote: false, userComment: false, multiSegment: false, skip: [], pick: [], translateKeys: true, translateValues: true, reviveValues: true, sanitize: true, mergeOutput: true, silentErrors: true, chunked: true, firstChunkSize: void 0, firstChunkSizeNode: 512, firstChunkSizeBrowser: 65536, chunkSize: 65536, chunkLimit: 5 }; + var J = /* @__PURE__ */ new Map(); + var q = class extends _ { + static useCached(e3) { + let t2 = J.get(e3); + return void 0 !== t2 || (t2 = new this(e3), J.set(e3, t2)), t2; + } + constructor(e3) { + super(), true === e3 ? this.setupFromTrue() : void 0 === e3 ? this.setupFromUndefined() : Array.isArray(e3) ? this.setupFromArray(e3) : "object" == typeof e3 ? this.setupFromObject(e3) : g2(`Invalid options argument ${e3}`), void 0 === this.firstChunkSize && (this.firstChunkSize = t ? this.firstChunkSizeBrowser : this.firstChunkSizeNode), this.mergeOutput && (this.ifd1.enabled = false), this.filterNestedSegmentTags(), this.traverseTiffDependencyTree(), this.checkLoadedPlugins(); + } + setupFromUndefined() { + let e3; + for (e3 of G) + this[e3] = $2[e3]; + for (e3 of X) + this[e3] = $2[e3]; + for (e3 of W) + this[e3] = $2[e3]; + for (e3 of j2) + this[e3] = new Y(e3, $2[e3], void 0, this); + } + setupFromTrue() { + let e3; + for (e3 of G) + this[e3] = $2[e3]; + for (e3 of X) + this[e3] = $2[e3]; + for (e3 of W) + this[e3] = true; + for (e3 of j2) + this[e3] = new Y(e3, true, void 0, this); + } + setupFromArray(e3) { + let t2; + for (t2 of G) + this[t2] = $2[t2]; + for (t2 of X) + this[t2] = $2[t2]; + for (t2 of W) + this[t2] = $2[t2]; + for (t2 of j2) + this[t2] = new Y(t2, false, void 0, this); + this.setupGlobalFilters(e3, void 0, H); + } + setupFromObject(e3) { + let t2; + for (t2 of (H.ifd0 = H.ifd0 || H.image, H.ifd1 = H.ifd1 || H.thumbnail, Object.assign(this, e3), G)) + this[t2] = Z(e3[t2], $2[t2]); + for (t2 of X) + this[t2] = Z(e3[t2], $2[t2]); + for (t2 of W) + this[t2] = Z(e3[t2], $2[t2]); + for (t2 of z) + this[t2] = new Y(t2, $2[t2], e3[t2], this); + for (t2 of H) + this[t2] = new Y(t2, $2[t2], e3[t2], this.tiff); + this.setupGlobalFilters(e3.pick, e3.skip, H, j2), true === e3.tiff ? this.batchEnableWithBool(H, true) : false === e3.tiff ? this.batchEnableWithUserValue(H, e3) : Array.isArray(e3.tiff) ? this.setupGlobalFilters(e3.tiff, void 0, H) : "object" == typeof e3.tiff && this.setupGlobalFilters(e3.tiff.pick, e3.tiff.skip, H); + } + batchEnableWithBool(e3, t2) { + for (let i3 of e3) + this[i3].enabled = t2; + } + batchEnableWithUserValue(e3, t2) { + for (let i3 of e3) { + let e4 = t2[i3]; + this[i3].enabled = false !== e4 && void 0 !== e4; + } + } + setupGlobalFilters(e3, t2, i3, n3 = i3) { + if (e3 && e3.length) { + for (let e4 of n3) + this[e4].enabled = false; + let t3 = Q(e3, i3); + for (let [e4, i4] of t3) + ee(this[e4].pick, i4), this[e4].enabled = true; + } else if (t2 && t2.length) { + let e4 = Q(t2, i3); + for (let [t3, i4] of e4) + ee(this[t3].skip, i4); + } + } + filterNestedSegmentTags() { + let { ifd0: e3, exif: t2, xmp: i3, iptc: n3, icc: s2 } = this; + this.makerNote ? t2.deps.add(37500) : t2.skip.add(37500), this.userComment ? t2.deps.add(37510) : t2.skip.add(37510), i3.enabled || e3.skip.add(700), n3.enabled || e3.skip.add(33723), s2.enabled || e3.skip.add(34675); + } + traverseTiffDependencyTree() { + let { ifd0: e3, exif: t2, gps: i3, interop: n3 } = this; + n3.needed && (t2.deps.add(40965), e3.deps.add(40965)), t2.needed && e3.deps.add(34665), i3.needed && e3.deps.add(34853), this.tiff.enabled = H.some((e4) => true === this[e4].enabled) || this.makerNote || this.userComment; + for (let e4 of H) + this[e4].finalizeFilters(); + } + get onlyTiff() { + return !V.map((e3) => this[e3].enabled).some((e3) => true === e3) && this.tiff.enabled; + } + checkLoadedPlugins() { + for (let e3 of z) + this[e3].enabled && !T.has(e3) && P("segment parser", e3); + } + }; + function Q(e3, t2) { + let i3, n3, s2, r2, a2 = []; + for (s2 of t2) { + for (r2 of (i3 = E.get(s2), n3 = [], i3)) + (e3.includes(r2[0]) || e3.includes(r2[1])) && n3.push(r2[0]); + n3.length && a2.push([s2, n3]); + } + return a2; + } + function Z(e3, t2) { + return void 0 !== e3 ? e3 : void 0 !== t2 ? t2 : void 0; + } + function ee(e3, t2) { + for (let i3 of t2) + e3.add(i3); + } + c(q, "default", $2); + var te = class { + constructor(e3) { + c(this, "parsers", {}), c(this, "output", {}), c(this, "errors", []), c(this, "pushToErrors", (e4) => this.errors.push(e4)), this.options = q.useCached(e3); + } + async read(e3) { + this.file = await D(e3, this.options); + } + setup() { + if (this.fileParser) + return; + let { file: e3 } = this, t2 = e3.getUint16(0); + for (let [i3, n3] of w) + if (n3.canHandle(e3, t2)) + return this.fileParser = new n3(this.options, this.file, this.parsers), e3[i3] = true; + this.file.close && this.file.close(), g2("Unknown file format"); + } + async parse() { + let { output: e3, errors: t2 } = this; + return this.setup(), this.options.silentErrors ? (await this.executeParsers().catch(this.pushToErrors), t2.push(...this.fileParser.errors)) : await this.executeParsers(), this.file.close && this.file.close(), this.options.silentErrors && t2.length > 0 && (e3.errors = t2), f2(e3); + } + async executeParsers() { + let { output: e3 } = this; + await this.fileParser.parse(); + let t2 = Object.values(this.parsers).map(async (t3) => { + let i3 = await t3.parse(); + t3.assignToOutput(e3, i3); + }); + this.options.silentErrors && (t2 = t2.map((e4) => e4.catch(this.pushToErrors))), await Promise.all(t2); + } + async extractThumbnail() { + this.setup(); + let { options: e3, file: t2 } = this, i3 = T.get("tiff", e3); + var n3; + if (t2.tiff ? n3 = { start: 0, type: "tiff" } : t2.jpeg && (n3 = await this.fileParser.getOrFindSegment("tiff")), void 0 === n3) + return; + let s2 = await this.fileParser.ensureSegmentChunk(n3), r2 = this.parsers.tiff = new i3(s2, e3, t2), a2 = await r2.extractThumbnail(); + return t2.close && t2.close(), a2; + } + }; + async function ie(e3, t2) { + let i3 = new te(t2); + return await i3.read(e3), i3.parse(); + } + var ne = Object.freeze({ __proto__: null, parse: ie, Exifr: te, fileParsers: w, segmentParsers: T, fileReaders: A, tagKeys: E, tagValues: B, tagRevivers: N, createDictionary: U, extendDictionary: F, fetchUrlAsArrayBuffer: M, readBlobAsArrayBuffer: R, chunkedProps: G, otherSegments: V, segments: z, tiffBlocks: H, segmentsAndBlocks: j2, tiffExtractables: W, inheritables: K, allFormatters: X, Options: q }); + var se = class { + constructor(e3, t2, i3) { + c(this, "errors", []), c(this, "ensureSegmentChunk", async (e4) => { + let t3 = e4.start, i4 = e4.size || 65536; + if (this.file.chunked) + if (this.file.available(t3, i4)) + e4.chunk = this.file.subarray(t3, i4); + else + try { + e4.chunk = await this.file.readChunk(t3, i4); + } catch (t4) { + g2(`Couldn't read segment: ${JSON.stringify(e4)}. ${t4.message}`); + } + else + this.file.byteLength > t3 + i4 ? e4.chunk = this.file.subarray(t3, i4) : void 0 === e4.size ? e4.chunk = this.file.subarray(t3) : g2("Segment unreachable: " + JSON.stringify(e4)); + return e4.chunk; + }), this.extendOptions && this.extendOptions(e3), this.options = e3, this.file = t2, this.parsers = i3; + } + injectSegment(e3, t2) { + this.options[e3].enabled && this.createParser(e3, t2); + } + createParser(e3, t2) { + let i3 = new (T.get(e3))(t2, this.options, this.file); + return this.parsers[e3] = i3; + } + createParsers(e3) { + for (let t2 of e3) { + let { type: e4, chunk: i3 } = t2, n3 = this.options[e4]; + if (n3 && n3.enabled) { + let t3 = this.parsers[e4]; + t3 && t3.append || t3 || this.createParser(e4, i3); + } + } + } + async readSegments(e3) { + let t2 = e3.map(this.ensureSegmentChunk); + await Promise.all(t2); + } + }; + var re2 = class { + static findPosition(e3, t2) { + let i3 = e3.getUint16(t2 + 2) + 2, n3 = "function" == typeof this.headerLength ? this.headerLength(e3, t2, i3) : this.headerLength, s2 = t2 + n3, r2 = i3 - n3; + return { offset: t2, length: i3, headerLength: n3, start: s2, size: r2, end: s2 + r2 }; + } + static parse(e3, t2 = {}) { + return new this(e3, new q({ [this.type]: t2 }), e3).parse(); + } + normalizeInput(e3) { + return e3 instanceof I ? e3 : new I(e3); + } + constructor(e3, t2 = {}, i3) { + c(this, "errors", []), c(this, "raw", /* @__PURE__ */ new Map()), c(this, "handleError", (e4) => { + if (!this.options.silentErrors) + throw e4; + this.errors.push(e4.message); + }), this.chunk = this.normalizeInput(e3), this.file = i3, this.type = this.constructor.type, this.globalOptions = this.options = t2, this.localOptions = t2[this.type], this.canTranslate = this.localOptions && this.localOptions.translate; + } + translate() { + this.canTranslate && (this.translated = this.translateBlock(this.raw, this.type)); + } + get output() { + return this.translated ? this.translated : this.raw ? Object.fromEntries(this.raw) : void 0; + } + translateBlock(e3, t2) { + let i3 = N.get(t2), n3 = B.get(t2), s2 = E.get(t2), r2 = this.options[t2], a2 = r2.reviveValues && !!i3, o2 = r2.translateValues && !!n3, l2 = r2.translateKeys && !!s2, h2 = {}; + for (let [t3, r3] of e3) + a2 && i3.has(t3) ? r3 = i3.get(t3)(r3) : o2 && n3.has(t3) && (r3 = this.translateValue(r3, n3.get(t3))), l2 && s2.has(t3) && (t3 = s2.get(t3) || t3), h2[t3] = r3; + return h2; + } + translateValue(e3, t2) { + return t2[e3] || t2.DEFAULT || e3; + } + assignToOutput(e3, t2) { + this.assignObjectToOutput(e3, this.constructor.type, t2); + } + assignObjectToOutput(e3, t2, i3) { + if (this.globalOptions.mergeOutput) + return Object.assign(e3, i3); + e3[t2] ? Object.assign(e3[t2], i3) : e3[t2] = i3; + } + }; + c(re2, "headerLength", 4), c(re2, "type", void 0), c(re2, "multiSegment", false), c(re2, "canHandle", () => false); + function ae(e3) { + return 192 === e3 || 194 === e3 || 196 === e3 || 219 === e3 || 221 === e3 || 218 === e3 || 254 === e3; + } + function oe(e3) { + return e3 >= 224 && e3 <= 239; + } + function le(e3, t2, i3) { + for (let [n3, s2] of T) + if (s2.canHandle(e3, t2, i3)) + return n3; + } + var he = class extends se { + constructor(...e3) { + super(...e3), c(this, "appSegments", []), c(this, "jpegSegments", []), c(this, "unknownSegments", []); + } + static canHandle(e3, t2) { + return 65496 === t2; + } + async parse() { + await this.findAppSegments(), await this.readSegments(this.appSegments), this.mergeMultiSegments(), this.createParsers(this.mergedAppSegments || this.appSegments); + } + setupSegmentFinderArgs(e3) { + true === e3 ? (this.findAll = true, this.wanted = new Set(T.keyList())) : (e3 = void 0 === e3 ? T.keyList().filter((e4) => this.options[e4].enabled) : e3.filter((e4) => this.options[e4].enabled && T.has(e4)), this.findAll = false, this.remaining = new Set(e3), this.wanted = new Set(e3)), this.unfinishedMultiSegment = false; + } + async findAppSegments(e3 = 0, t2) { + this.setupSegmentFinderArgs(t2); + let { file: i3, findAll: n3, wanted: s2, remaining: r2 } = this; + if (!n3 && this.file.chunked && (n3 = Array.from(s2).some((e4) => { + let t3 = T.get(e4), i4 = this.options[e4]; + return t3.multiSegment && i4.multiSegment; + }), n3 && await this.file.readWhole()), e3 = this.findAppSegmentsInRange(e3, i3.byteLength), !this.options.onlyTiff && i3.chunked) { + let t3 = false; + for (; r2.size > 0 && !t3 && (i3.canReadNextChunk || this.unfinishedMultiSegment); ) { + let { nextChunkOffset: n4 } = i3, s3 = this.appSegments.some((e4) => !this.file.available(e4.offset || e4.start, e4.length || e4.size)); + if (t3 = e3 > n4 && !s3 ? !await i3.readNextChunk(e3) : !await i3.readNextChunk(n4), void 0 === (e3 = this.findAppSegmentsInRange(e3, i3.byteLength))) + return; + } + } + } + findAppSegmentsInRange(e3, t2) { + t2 -= 2; + let i3, n3, s2, r2, a2, o2, { file: l2, findAll: h2, wanted: u2, remaining: c2, options: f3 } = this; + for (; e3 < t2; e3++) + if (255 === l2.getUint8(e3)) { + if (i3 = l2.getUint8(e3 + 1), oe(i3)) { + if (n3 = l2.getUint16(e3 + 2), s2 = le(l2, e3, n3), s2 && u2.has(s2) && (r2 = T.get(s2), a2 = r2.findPosition(l2, e3), o2 = f3[s2], a2.type = s2, this.appSegments.push(a2), !h2 && (r2.multiSegment && o2.multiSegment ? (this.unfinishedMultiSegment = a2.chunkNumber < a2.chunkCount, this.unfinishedMultiSegment || c2.delete(s2)) : c2.delete(s2), 0 === c2.size))) + break; + f3.recordUnknownSegments && (a2 = re2.findPosition(l2, e3), a2.marker = i3, this.unknownSegments.push(a2)), e3 += n3 + 1; + } else if (ae(i3)) { + if (n3 = l2.getUint16(e3 + 2), 218 === i3 && false !== f3.stopAfterSos) + return; + f3.recordJpegSegments && this.jpegSegments.push({ offset: e3, length: n3, marker: i3 }), e3 += n3 + 1; + } + } + return e3; + } + mergeMultiSegments() { + if (!this.appSegments.some((e4) => e4.multiSegment)) + return; + let e3 = function(e4, t2) { + let i3, n3, s2, r2 = /* @__PURE__ */ new Map(); + for (let a2 = 0; a2 < e4.length; a2++) + i3 = e4[a2], n3 = i3[t2], r2.has(n3) ? s2 = r2.get(n3) : r2.set(n3, s2 = []), s2.push(i3); + return Array.from(r2); + }(this.appSegments, "type"); + this.mergedAppSegments = e3.map(([e4, t2]) => { + let i3 = T.get(e4, this.options); + if (i3.handleMultiSegments) { + return { type: e4, chunk: i3.handleMultiSegments(t2) }; + } + return t2[0]; + }); + } + getSegment(e3) { + return this.appSegments.find((t2) => t2.type === e3); + } + async getOrFindSegment(e3) { + let t2 = this.getSegment(e3); + return void 0 === t2 && (await this.findAppSegments(0, [e3]), t2 = this.getSegment(e3)), t2; + } + }; + c(he, "type", "jpeg"), w.set("jpeg", he); + var ue = [void 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4]; + var ce = class extends re2 { + parseHeader() { + var e3 = this.chunk.getUint16(); + 18761 === e3 ? this.le = true : 19789 === e3 && (this.le = false), this.chunk.le = this.le, this.headerParsed = true; + } + parseTags(e3, t2, i3 = /* @__PURE__ */ new Map()) { + let { pick: n3, skip: s2 } = this.options[t2]; + n3 = new Set(n3); + let r2 = n3.size > 0, a2 = 0 === s2.size, o2 = this.chunk.getUint16(e3); + e3 += 2; + for (let l2 = 0; l2 < o2; l2++) { + let o3 = this.chunk.getUint16(e3); + if (r2) { + if (n3.has(o3) && (i3.set(o3, this.parseTag(e3, o3, t2)), n3.delete(o3), 0 === n3.size)) + break; + } else + !a2 && s2.has(o3) || i3.set(o3, this.parseTag(e3, o3, t2)); + e3 += 12; + } + return i3; + } + parseTag(e3, t2, i3) { + let { chunk: n3 } = this, s2 = n3.getUint16(e3 + 2), r2 = n3.getUint32(e3 + 4), a2 = ue[s2]; + if (a2 * r2 <= 4 ? e3 += 8 : e3 = n3.getUint32(e3 + 8), (s2 < 1 || s2 > 13) && g2(`Invalid TIFF value type. block: ${i3.toUpperCase()}, tag: ${t2.toString(16)}, type: ${s2}, offset ${e3}`), e3 > n3.byteLength && g2(`Invalid TIFF value offset. block: ${i3.toUpperCase()}, tag: ${t2.toString(16)}, type: ${s2}, offset ${e3} is outside of chunk size ${n3.byteLength}`), 1 === s2) + return n3.getUint8Array(e3, r2); + if (2 === s2) + return m(n3.getString(e3, r2)); + if (7 === s2) + return n3.getUint8Array(e3, r2); + if (1 === r2) + return this.parseTagValue(s2, e3); + { + let t3 = new (function(e4) { + switch (e4) { + case 1: + return Uint8Array; + case 3: + return Uint16Array; + case 4: + return Uint32Array; + case 5: + return Array; + case 6: + return Int8Array; + case 8: + return Int16Array; + case 9: + return Int32Array; + case 10: + return Array; + case 11: + return Float32Array; + case 12: + return Float64Array; + default: + return Array; + } + }(s2))(r2), i4 = a2; + for (let n4 = 0; n4 < r2; n4++) + t3[n4] = this.parseTagValue(s2, e3), e3 += i4; + return t3; + } + } + parseTagValue(e3, t2) { + let { chunk: i3 } = this; + switch (e3) { + case 1: + return i3.getUint8(t2); + case 3: + return i3.getUint16(t2); + case 4: + return i3.getUint32(t2); + case 5: + return i3.getUint32(t2) / i3.getUint32(t2 + 4); + case 6: + return i3.getInt8(t2); + case 8: + return i3.getInt16(t2); + case 9: + return i3.getInt32(t2); + case 10: + return i3.getInt32(t2) / i3.getInt32(t2 + 4); + case 11: + return i3.getFloat(t2); + case 12: + return i3.getDouble(t2); + case 13: + return i3.getUint32(t2); + default: + g2(`Invalid tiff type ${e3}`); + } + } + }; + var fe = class extends ce { + static canHandle(e3, t2) { + return 225 === e3.getUint8(t2 + 1) && 1165519206 === e3.getUint32(t2 + 4) && 0 === e3.getUint16(t2 + 8); + } + async parse() { + this.parseHeader(); + let { options: e3 } = this; + return e3.ifd0.enabled && await this.parseIfd0Block(), e3.exif.enabled && await this.safeParse("parseExifBlock"), e3.gps.enabled && await this.safeParse("parseGpsBlock"), e3.interop.enabled && await this.safeParse("parseInteropBlock"), e3.ifd1.enabled && await this.safeParse("parseThumbnailBlock"), this.createOutput(); + } + safeParse(e3) { + let t2 = this[e3](); + return void 0 !== t2.catch && (t2 = t2.catch(this.handleError)), t2; + } + findIfd0Offset() { + void 0 === this.ifd0Offset && (this.ifd0Offset = this.chunk.getUint32(4)); + } + findIfd1Offset() { + if (void 0 === this.ifd1Offset) { + this.findIfd0Offset(); + let e3 = this.chunk.getUint16(this.ifd0Offset), t2 = this.ifd0Offset + 2 + 12 * e3; + this.ifd1Offset = this.chunk.getUint32(t2); + } + } + parseBlock(e3, t2) { + let i3 = /* @__PURE__ */ new Map(); + return this[t2] = i3, this.parseTags(e3, t2, i3), i3; + } + async parseIfd0Block() { + if (this.ifd0) + return; + let { file: e3 } = this; + this.findIfd0Offset(), this.ifd0Offset < 8 && g2("Malformed EXIF data"), !e3.chunked && this.ifd0Offset > e3.byteLength && g2(`IFD0 offset points to outside of file. +this.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${e3.byteLength}`), e3.tiff && await e3.ensureChunk(this.ifd0Offset, S(this.options)); + let t2 = this.parseBlock(this.ifd0Offset, "ifd0"); + return 0 !== t2.size ? (this.exifOffset = t2.get(34665), this.interopOffset = t2.get(40965), this.gpsOffset = t2.get(34853), this.xmp = t2.get(700), this.iptc = t2.get(33723), this.icc = t2.get(34675), this.options.sanitize && (t2.delete(34665), t2.delete(40965), t2.delete(34853), t2.delete(700), t2.delete(33723), t2.delete(34675)), t2) : void 0; + } + async parseExifBlock() { + if (this.exif) + return; + if (this.ifd0 || await this.parseIfd0Block(), void 0 === this.exifOffset) + return; + this.file.tiff && await this.file.ensureChunk(this.exifOffset, S(this.options)); + let e3 = this.parseBlock(this.exifOffset, "exif"); + return this.interopOffset || (this.interopOffset = e3.get(40965)), this.makerNote = e3.get(37500), this.userComment = e3.get(37510), this.options.sanitize && (e3.delete(40965), e3.delete(37500), e3.delete(37510)), this.unpack(e3, 41728), this.unpack(e3, 41729), e3; + } + unpack(e3, t2) { + let i3 = e3.get(t2); + i3 && 1 === i3.length && e3.set(t2, i3[0]); + } + async parseGpsBlock() { + if (this.gps) + return; + if (this.ifd0 || await this.parseIfd0Block(), void 0 === this.gpsOffset) + return; + let e3 = this.parseBlock(this.gpsOffset, "gps"); + return e3 && e3.has(2) && e3.has(4) && (e3.set("latitude", de(...e3.get(2), e3.get(1))), e3.set("longitude", de(...e3.get(4), e3.get(3)))), e3; + } + async parseInteropBlock() { + if (!this.interop && (this.ifd0 || await this.parseIfd0Block(), void 0 !== this.interopOffset || this.exif || await this.parseExifBlock(), void 0 !== this.interopOffset)) + return this.parseBlock(this.interopOffset, "interop"); + } + async parseThumbnailBlock(e3 = false) { + if (!this.ifd1 && !this.ifd1Parsed && (!this.options.mergeOutput || e3)) + return this.findIfd1Offset(), this.ifd1Offset > 0 && (this.parseBlock(this.ifd1Offset, "ifd1"), this.ifd1Parsed = true), this.ifd1; + } + async extractThumbnail() { + if (this.headerParsed || this.parseHeader(), this.ifd1Parsed || await this.parseThumbnailBlock(true), void 0 === this.ifd1) + return; + let e3 = this.ifd1.get(513), t2 = this.ifd1.get(514); + return this.chunk.getUint8Array(e3, t2); + } + get image() { + return this.ifd0; + } + get thumbnail() { + return this.ifd1; + } + createOutput() { + let e3, t2, i3, n3 = {}; + for (t2 of H) + if (e3 = this[t2], !p(e3)) + if (i3 = this.canTranslate ? this.translateBlock(e3, t2) : Object.fromEntries(e3), this.options.mergeOutput) { + if ("ifd1" === t2) + continue; + Object.assign(n3, i3); + } else + n3[t2] = i3; + return this.makerNote && (n3.makerNote = this.makerNote), this.userComment && (n3.userComment = this.userComment), n3; + } + assignToOutput(e3, t2) { + if (this.globalOptions.mergeOutput) + Object.assign(e3, t2); + else + for (let [i3, n3] of Object.entries(t2)) + this.assignObjectToOutput(e3, i3, n3); + } + }; + function de(e3, t2, i3, n3) { + var s2 = e3 + t2 / 60 + i3 / 3600; + return "S" !== n3 && "W" !== n3 || (s2 *= -1), s2; + } + c(fe, "type", "tiff"), c(fe, "headerLength", 10), T.set("tiff", fe); + var pe = Object.freeze({ __proto__: null, default: ne, Exifr: te, fileParsers: w, segmentParsers: T, fileReaders: A, tagKeys: E, tagValues: B, tagRevivers: N, createDictionary: U, extendDictionary: F, fetchUrlAsArrayBuffer: M, readBlobAsArrayBuffer: R, chunkedProps: G, otherSegments: V, segments: z, tiffBlocks: H, segmentsAndBlocks: j2, tiffExtractables: W, inheritables: K, allFormatters: X, Options: q, parse: ie }); + var ge = { ifd0: false, ifd1: false, exif: false, gps: false, interop: false, sanitize: false, reviveValues: true, translateKeys: false, translateValues: false, mergeOutput: false }; + var me = Object.assign({}, ge, { firstChunkSize: 4e4, gps: [1, 2, 3, 4] }); + async function Se(e3) { + let t2 = new te(me); + await t2.read(e3); + let i3 = await t2.parse(); + if (i3 && i3.gps) { + let { latitude: e4, longitude: t3 } = i3.gps; + return { latitude: e4, longitude: t3 }; + } + } + var Ce = Object.assign({}, ge, { tiff: false, ifd1: true, mergeOutput: false }); + async function ye(e3) { + let t2 = new te(Ce); + await t2.read(e3); + let i3 = await t2.extractThumbnail(); + return i3 && a ? s.from(i3) : i3; + } + async function be(e3) { + let t2 = await this.thumbnail(e3); + if (void 0 !== t2) { + let e4 = new Blob([t2]); + return URL.createObjectURL(e4); + } + } + var Ie = Object.assign({}, ge, { firstChunkSize: 4e4, ifd0: [274] }); + async function Pe(e3) { + let t2 = new te(Ie); + await t2.read(e3); + let i3 = await t2.parse(); + if (i3 && i3.ifd0) + return i3.ifd0[274]; + } + var ke = Object.freeze({ 1: { dimensionSwapped: false, scaleX: 1, scaleY: 1, deg: 0, rad: 0 }, 2: { dimensionSwapped: false, scaleX: -1, scaleY: 1, deg: 0, rad: 0 }, 3: { dimensionSwapped: false, scaleX: 1, scaleY: 1, deg: 180, rad: 180 * Math.PI / 180 }, 4: { dimensionSwapped: false, scaleX: -1, scaleY: 1, deg: 180, rad: 180 * Math.PI / 180 }, 5: { dimensionSwapped: true, scaleX: 1, scaleY: -1, deg: 90, rad: 90 * Math.PI / 180 }, 6: { dimensionSwapped: true, scaleX: 1, scaleY: 1, deg: 90, rad: 90 * Math.PI / 180 }, 7: { dimensionSwapped: true, scaleX: 1, scaleY: -1, deg: 270, rad: 270 * Math.PI / 180 }, 8: { dimensionSwapped: true, scaleX: 1, scaleY: 1, deg: 270, rad: 270 * Math.PI / 180 } }); + var we = true; + var Te = true; + if ("object" == typeof navigator) { + let e3 = navigator.userAgent; + if (e3.includes("iPad") || e3.includes("iPhone")) { + let t2 = e3.match(/OS (\d+)_(\d+)/); + if (t2) { + let [, e4, i3] = t2, n3 = Number(e4) + 0.1 * Number(i3); + we = n3 < 13.4, Te = false; + } + } else if (e3.includes("OS X 10")) { + let [, t2] = e3.match(/OS X 10[_.](\d+)/); + we = Te = Number(t2) < 15; + } + if (e3.includes("Chrome/")) { + let [, t2] = e3.match(/Chrome\/(\d+)/); + we = Te = Number(t2) < 81; + } else if (e3.includes("Firefox/")) { + let [, t2] = e3.match(/Firefox\/(\d+)/); + we = Te = Number(t2) < 77; + } + } + async function Ae(e3) { + let t2 = await Pe(e3); + return Object.assign({ canvas: we, css: Te }, ke[t2]); + } + var De = class extends I { + constructor(...e3) { + super(...e3), c(this, "ranges", new Oe()), 0 !== this.byteLength && this.ranges.add(0, this.byteLength); + } + _tryExtend(e3, t2, i3) { + if (0 === e3 && 0 === this.byteLength && i3) { + let e4 = new DataView(i3.buffer || i3, i3.byteOffset, i3.byteLength); + this._swapDataView(e4); + } else { + let i4 = e3 + t2; + if (i4 > this.byteLength) { + let { dataView: e4 } = this._extend(i4); + this._swapDataView(e4); + } + } + } + _extend(e3) { + let t2; + t2 = a ? s.allocUnsafe(e3) : new Uint8Array(e3); + let i3 = new DataView(t2.buffer, t2.byteOffset, t2.byteLength); + return t2.set(new Uint8Array(this.buffer, this.byteOffset, this.byteLength), 0), { uintView: t2, dataView: i3 }; + } + subarray(e3, t2, i3 = false) { + return t2 = t2 || this._lengthToEnd(e3), i3 && this._tryExtend(e3, t2), this.ranges.add(e3, t2), super.subarray(e3, t2); + } + set(e3, t2, i3 = false) { + i3 && this._tryExtend(t2, e3.byteLength, e3); + let n3 = super.set(e3, t2); + return this.ranges.add(t2, n3.byteLength), n3; + } + async ensureChunk(e3, t2) { + this.chunked && (this.ranges.available(e3, t2) || await this.readChunk(e3, t2)); + } + available(e3, t2) { + return this.ranges.available(e3, t2); + } + }; + var Oe = class { + constructor() { + c(this, "list", []); + } + get length() { + return this.list.length; + } + add(e3, t2, i3 = 0) { + let n3 = e3 + t2, s2 = this.list.filter((t3) => xe(e3, t3.offset, n3) || xe(e3, t3.end, n3)); + if (s2.length > 0) { + e3 = Math.min(e3, ...s2.map((e4) => e4.offset)), n3 = Math.max(n3, ...s2.map((e4) => e4.end)), t2 = n3 - e3; + let i4 = s2.shift(); + i4.offset = e3, i4.length = t2, i4.end = n3, this.list = this.list.filter((e4) => !s2.includes(e4)); + } else + this.list.push({ offset: e3, length: t2, end: n3 }); + } + available(e3, t2) { + let i3 = e3 + t2; + return this.list.some((t3) => t3.offset <= e3 && i3 <= t3.end); + } + }; + function xe(e3, t2, i3) { + return e3 <= t2 && t2 <= i3; + } + var ve = class extends De { + constructor(e3, t2) { + super(0), c(this, "chunksRead", 0), this.input = e3, this.options = t2; + } + async readWhole() { + this.chunked = false, await this.readChunk(this.nextChunkOffset); + } + async readChunked() { + this.chunked = true, await this.readChunk(0, this.options.firstChunkSize); + } + async readNextChunk(e3 = this.nextChunkOffset) { + if (this.fullyRead) + return this.chunksRead++, false; + let t2 = this.options.chunkSize, i3 = await this.readChunk(e3, t2); + return !!i3 && i3.byteLength === t2; + } + async readChunk(e3, t2) { + if (this.chunksRead++, 0 !== (t2 = this.safeWrapAddress(e3, t2))) + return this._readChunk(e3, t2); + } + safeWrapAddress(e3, t2) { + return void 0 !== this.size && e3 + t2 > this.size ? Math.max(0, this.size - e3) : t2; + } + get nextChunkOffset() { + if (0 !== this.ranges.list.length) + return this.ranges.list[0].length; + } + get canReadNextChunk() { + return this.chunksRead < this.options.chunkLimit; + } + get fullyRead() { + return void 0 !== this.size && this.nextChunkOffset === this.size; + } + read() { + return this.options.chunked ? this.readChunked() : this.readWhole(); + } + close() { + } + }; + A.set("blob", class extends ve { + async readWhole() { + this.chunked = false; + let e3 = await R(this.input); + this._swapArrayBuffer(e3); + } + readChunked() { + return this.chunked = true, this.size = this.input.size, super.readChunked(); + } + async _readChunk(e3, t2) { + let i3 = t2 ? e3 + t2 : void 0, n3 = this.input.slice(e3, i3), s2 = await R(n3); + return this.set(s2, e3, true); + } + }); + var Me = Object.freeze({ __proto__: null, default: pe, Exifr: te, fileParsers: w, segmentParsers: T, fileReaders: A, tagKeys: E, tagValues: B, tagRevivers: N, createDictionary: U, extendDictionary: F, fetchUrlAsArrayBuffer: M, readBlobAsArrayBuffer: R, chunkedProps: G, otherSegments: V, segments: z, tiffBlocks: H, segmentsAndBlocks: j2, tiffExtractables: W, inheritables: K, allFormatters: X, Options: q, parse: ie, gpsOnlyOptions: me, gps: Se, thumbnailOnlyOptions: Ce, thumbnail: ye, thumbnailUrl: be, orientationOnlyOptions: Ie, orientation: Pe, rotations: ke, get rotateCanvas() { + return we; + }, get rotateCss() { + return Te; + }, rotation: Ae }); + A.set("url", class extends ve { + async readWhole() { + this.chunked = false; + let e3 = await M(this.input); + e3 instanceof ArrayBuffer ? this._swapArrayBuffer(e3) : e3 instanceof Uint8Array && this._swapBuffer(e3); + } + async _readChunk(e3, t2) { + let i3 = t2 ? e3 + t2 - 1 : void 0, n3 = this.options.httpHeaders || {}; + (e3 || i3) && (n3.range = `bytes=${[e3, i3].join("-")}`); + let s2 = await h(this.input, { headers: n3 }), r2 = await s2.arrayBuffer(), a2 = r2.byteLength; + if (416 !== s2.status) + return a2 !== t2 && (this.size = e3 + a2), this.set(r2, e3, true); + } + }); + I.prototype.getUint64 = function(e3) { + let t2 = this.getUint32(e3), i3 = this.getUint32(e3 + 4); + return t2 < 1048575 ? t2 << 32 | i3 : void 0 !== typeof r ? (console.warn("Using BigInt because of type 64uint but JS can only handle 53b numbers."), r(t2) << r(32) | r(i3)) : void g2("Trying to read 64b value but JS can only handle 53b numbers."); + }; + var Re = class extends se { + parseBoxes(e3 = 0) { + let t2 = []; + for (; e3 < this.file.byteLength - 4; ) { + let i3 = this.parseBoxHead(e3); + if (t2.push(i3), 0 === i3.length) + break; + e3 += i3.length; + } + return t2; + } + parseSubBoxes(e3) { + e3.boxes = this.parseBoxes(e3.start); + } + findBox(e3, t2) { + return void 0 === e3.boxes && this.parseSubBoxes(e3), e3.boxes.find((e4) => e4.kind === t2); + } + parseBoxHead(e3) { + let t2 = this.file.getUint32(e3), i3 = this.file.getString(e3 + 4, 4), n3 = e3 + 8; + return 1 === t2 && (t2 = this.file.getUint64(e3 + 8), n3 += 8), { offset: e3, length: t2, kind: i3, start: n3 }; + } + parseBoxFullHead(e3) { + if (void 0 !== e3.version) + return; + let t2 = this.file.getUint32(e3.start); + e3.version = t2 >> 24, e3.start += 4; + } + }; + var Le = class extends Re { + static canHandle(e3, t2) { + if (0 !== t2) + return false; + let i3 = e3.getUint16(2); + if (i3 > 50) + return false; + let n3 = 16, s2 = []; + for (; n3 < i3; ) + s2.push(e3.getString(n3, 4)), n3 += 4; + return s2.includes(this.type); + } + async parse() { + let e3 = this.file.getUint32(0), t2 = this.parseBoxHead(e3); + for (; "meta" !== t2.kind; ) + e3 += t2.length, await this.file.ensureChunk(e3, 16), t2 = this.parseBoxHead(e3); + await this.file.ensureChunk(t2.offset, t2.length), this.parseBoxFullHead(t2), this.parseSubBoxes(t2), this.options.icc.enabled && await this.findIcc(t2), this.options.tiff.enabled && await this.findExif(t2); + } + async registerSegment(e3, t2, i3) { + await this.file.ensureChunk(t2, i3); + let n3 = this.file.subarray(t2, i3); + this.createParser(e3, n3); + } + async findIcc(e3) { + let t2 = this.findBox(e3, "iprp"); + if (void 0 === t2) + return; + let i3 = this.findBox(t2, "ipco"); + if (void 0 === i3) + return; + let n3 = this.findBox(i3, "colr"); + void 0 !== n3 && await this.registerSegment("icc", n3.offset + 12, n3.length); + } + async findExif(e3) { + let t2 = this.findBox(e3, "iinf"); + if (void 0 === t2) + return; + let i3 = this.findBox(e3, "iloc"); + if (void 0 === i3) + return; + let n3 = this.findExifLocIdInIinf(t2), s2 = this.findExtentInIloc(i3, n3); + if (void 0 === s2) + return; + let [r2, a2] = s2; + await this.file.ensureChunk(r2, a2); + let o2 = 4 + this.file.getUint32(r2); + r2 += o2, a2 -= o2, await this.registerSegment("tiff", r2, a2); + } + findExifLocIdInIinf(e3) { + this.parseBoxFullHead(e3); + let t2, i3, n3, s2, r2 = e3.start, a2 = this.file.getUint16(r2); + for (r2 += 2; a2--; ) { + if (t2 = this.parseBoxHead(r2), this.parseBoxFullHead(t2), i3 = t2.start, t2.version >= 2 && (n3 = 3 === t2.version ? 4 : 2, s2 = this.file.getString(i3 + n3 + 2, 4), "Exif" === s2)) + return this.file.getUintBytes(i3, n3); + r2 += t2.length; + } + } + get8bits(e3) { + let t2 = this.file.getUint8(e3); + return [t2 >> 4, 15 & t2]; + } + findExtentInIloc(e3, t2) { + this.parseBoxFullHead(e3); + let i3 = e3.start, [n3, s2] = this.get8bits(i3++), [r2, a2] = this.get8bits(i3++), o2 = 2 === e3.version ? 4 : 2, l2 = 1 === e3.version || 2 === e3.version ? 2 : 0, h2 = a2 + n3 + s2, u2 = 2 === e3.version ? 4 : 2, c2 = this.file.getUintBytes(i3, u2); + for (i3 += u2; c2--; ) { + let e4 = this.file.getUintBytes(i3, o2); + i3 += o2 + l2 + 2 + r2; + let u3 = this.file.getUint16(i3); + if (i3 += 2, e4 === t2) + return u3 > 1 && console.warn("ILOC box has more than one extent but we're only processing one\nPlease create an issue at https://github.com/MikeKovarik/exifr with this file"), [this.file.getUintBytes(i3 + a2, n3), this.file.getUintBytes(i3 + a2 + n3, s2)]; + i3 += u3 * h2; + } + } + }; + var Ue = class extends Le { + }; + c(Ue, "type", "heic"); + var Fe = class extends Le { + }; + c(Fe, "type", "avif"), w.set("heic", Ue), w.set("avif", Fe), U(E, ["ifd0", "ifd1"], [[256, "ImageWidth"], [257, "ImageHeight"], [258, "BitsPerSample"], [259, "Compression"], [262, "PhotometricInterpretation"], [270, "ImageDescription"], [271, "Make"], [272, "Model"], [273, "StripOffsets"], [274, "Orientation"], [277, "SamplesPerPixel"], [278, "RowsPerStrip"], [279, "StripByteCounts"], [282, "XResolution"], [283, "YResolution"], [284, "PlanarConfiguration"], [296, "ResolutionUnit"], [301, "TransferFunction"], [305, "Software"], [306, "ModifyDate"], [315, "Artist"], [316, "HostComputer"], [317, "Predictor"], [318, "WhitePoint"], [319, "PrimaryChromaticities"], [513, "ThumbnailOffset"], [514, "ThumbnailLength"], [529, "YCbCrCoefficients"], [530, "YCbCrSubSampling"], [531, "YCbCrPositioning"], [532, "ReferenceBlackWhite"], [700, "ApplicationNotes"], [33432, "Copyright"], [33723, "IPTC"], [34665, "ExifIFD"], [34675, "ICC"], [34853, "GpsIFD"], [330, "SubIFD"], [40965, "InteropIFD"], [40091, "XPTitle"], [40092, "XPComment"], [40093, "XPAuthor"], [40094, "XPKeywords"], [40095, "XPSubject"]]), U(E, "exif", [[33434, "ExposureTime"], [33437, "FNumber"], [34850, "ExposureProgram"], [34852, "SpectralSensitivity"], [34855, "ISO"], [34858, "TimeZoneOffset"], [34859, "SelfTimerMode"], [34864, "SensitivityType"], [34865, "StandardOutputSensitivity"], [34866, "RecommendedExposureIndex"], [34867, "ISOSpeed"], [34868, "ISOSpeedLatitudeyyy"], [34869, "ISOSpeedLatitudezzz"], [36864, "ExifVersion"], [36867, "DateTimeOriginal"], [36868, "CreateDate"], [36873, "GooglePlusUploadCode"], [36880, "OffsetTime"], [36881, "OffsetTimeOriginal"], [36882, "OffsetTimeDigitized"], [37121, "ComponentsConfiguration"], [37122, "CompressedBitsPerPixel"], [37377, "ShutterSpeedValue"], [37378, "ApertureValue"], [37379, "BrightnessValue"], [37380, "ExposureCompensation"], [37381, "MaxApertureValue"], [37382, "SubjectDistance"], [37383, "MeteringMode"], [37384, "LightSource"], [37385, "Flash"], [37386, "FocalLength"], [37393, "ImageNumber"], [37394, "SecurityClassification"], [37395, "ImageHistory"], [37396, "SubjectArea"], [37500, "MakerNote"], [37510, "UserComment"], [37520, "SubSecTime"], [37521, "SubSecTimeOriginal"], [37522, "SubSecTimeDigitized"], [37888, "AmbientTemperature"], [37889, "Humidity"], [37890, "Pressure"], [37891, "WaterDepth"], [37892, "Acceleration"], [37893, "CameraElevationAngle"], [40960, "FlashpixVersion"], [40961, "ColorSpace"], [40962, "ExifImageWidth"], [40963, "ExifImageHeight"], [40964, "RelatedSoundFile"], [41483, "FlashEnergy"], [41486, "FocalPlaneXResolution"], [41487, "FocalPlaneYResolution"], [41488, "FocalPlaneResolutionUnit"], [41492, "SubjectLocation"], [41493, "ExposureIndex"], [41495, "SensingMethod"], [41728, "FileSource"], [41729, "SceneType"], [41730, "CFAPattern"], [41985, "CustomRendered"], [41986, "ExposureMode"], [41987, "WhiteBalance"], [41988, "DigitalZoomRatio"], [41989, "FocalLengthIn35mmFormat"], [41990, "SceneCaptureType"], [41991, "GainControl"], [41992, "Contrast"], [41993, "Saturation"], [41994, "Sharpness"], [41996, "SubjectDistanceRange"], [42016, "ImageUniqueID"], [42032, "OwnerName"], [42033, "SerialNumber"], [42034, "LensInfo"], [42035, "LensMake"], [42036, "LensModel"], [42037, "LensSerialNumber"], [42080, "CompositeImage"], [42081, "CompositeImageCount"], [42082, "CompositeImageExposureTimes"], [42240, "Gamma"], [59932, "Padding"], [59933, "OffsetSchema"], [65e3, "OwnerName"], [65001, "SerialNumber"], [65002, "Lens"], [65100, "RawFile"], [65101, "Converter"], [65102, "WhiteBalance"], [65105, "Exposure"], [65106, "Shadows"], [65107, "Brightness"], [65108, "Contrast"], [65109, "Saturation"], [65110, "Sharpness"], [65111, "Smoothness"], [65112, "MoireFilter"], [40965, "InteropIFD"]]), U(E, "gps", [[0, "GPSVersionID"], [1, "GPSLatitudeRef"], [2, "GPSLatitude"], [3, "GPSLongitudeRef"], [4, "GPSLongitude"], [5, "GPSAltitudeRef"], [6, "GPSAltitude"], [7, "GPSTimeStamp"], [8, "GPSSatellites"], [9, "GPSStatus"], [10, "GPSMeasureMode"], [11, "GPSDOP"], [12, "GPSSpeedRef"], [13, "GPSSpeed"], [14, "GPSTrackRef"], [15, "GPSTrack"], [16, "GPSImgDirectionRef"], [17, "GPSImgDirection"], [18, "GPSMapDatum"], [19, "GPSDestLatitudeRef"], [20, "GPSDestLatitude"], [21, "GPSDestLongitudeRef"], [22, "GPSDestLongitude"], [23, "GPSDestBearingRef"], [24, "GPSDestBearing"], [25, "GPSDestDistanceRef"], [26, "GPSDestDistance"], [27, "GPSProcessingMethod"], [28, "GPSAreaInformation"], [29, "GPSDateStamp"], [30, "GPSDifferential"], [31, "GPSHPositioningError"]]), U(B, ["ifd0", "ifd1"], [[274, { 1: "Horizontal (normal)", 2: "Mirror horizontal", 3: "Rotate 180", 4: "Mirror vertical", 5: "Mirror horizontal and rotate 270 CW", 6: "Rotate 90 CW", 7: "Mirror horizontal and rotate 90 CW", 8: "Rotate 270 CW" }], [296, { 1: "None", 2: "inches", 3: "cm" }]]); + var Ee = U(B, "exif", [[34850, { 0: "Not defined", 1: "Manual", 2: "Normal program", 3: "Aperture priority", 4: "Shutter priority", 5: "Creative program", 6: "Action program", 7: "Portrait mode", 8: "Landscape mode" }], [37121, { 0: "-", 1: "Y", 2: "Cb", 3: "Cr", 4: "R", 5: "G", 6: "B" }], [37383, { 0: "Unknown", 1: "Average", 2: "CenterWeightedAverage", 3: "Spot", 4: "MultiSpot", 5: "Pattern", 6: "Partial", 255: "Other" }], [37384, { 0: "Unknown", 1: "Daylight", 2: "Fluorescent", 3: "Tungsten (incandescent light)", 4: "Flash", 9: "Fine weather", 10: "Cloudy weather", 11: "Shade", 12: "Daylight fluorescent (D 5700 - 7100K)", 13: "Day white fluorescent (N 4600 - 5400K)", 14: "Cool white fluorescent (W 3900 - 4500K)", 15: "White fluorescent (WW 3200 - 3700K)", 17: "Standard light A", 18: "Standard light B", 19: "Standard light C", 20: "D55", 21: "D65", 22: "D75", 23: "D50", 24: "ISO studio tungsten", 255: "Other" }], [37385, { 0: "Flash did not fire", 1: "Flash fired", 5: "Strobe return light not detected", 7: "Strobe return light detected", 9: "Flash fired, compulsory flash mode", 13: "Flash fired, compulsory flash mode, return light not detected", 15: "Flash fired, compulsory flash mode, return light detected", 16: "Flash did not fire, compulsory flash mode", 24: "Flash did not fire, auto mode", 25: "Flash fired, auto mode", 29: "Flash fired, auto mode, return light not detected", 31: "Flash fired, auto mode, return light detected", 32: "No flash function", 65: "Flash fired, red-eye reduction mode", 69: "Flash fired, red-eye reduction mode, return light not detected", 71: "Flash fired, red-eye reduction mode, return light detected", 73: "Flash fired, compulsory flash mode, red-eye reduction mode", 77: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected", 79: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected", 89: "Flash fired, auto mode, red-eye reduction mode", 93: "Flash fired, auto mode, return light not detected, red-eye reduction mode", 95: "Flash fired, auto mode, return light detected, red-eye reduction mode" }], [41495, { 1: "Not defined", 2: "One-chip color area sensor", 3: "Two-chip color area sensor", 4: "Three-chip color area sensor", 5: "Color sequential area sensor", 7: "Trilinear sensor", 8: "Color sequential linear sensor" }], [41728, { 1: "Film Scanner", 2: "Reflection Print Scanner", 3: "Digital Camera" }], [41729, { 1: "Directly photographed" }], [41985, { 0: "Normal", 1: "Custom", 2: "HDR (no original saved)", 3: "HDR (original saved)", 4: "Original (for HDR)", 6: "Panorama", 7: "Portrait HDR", 8: "Portrait" }], [41986, { 0: "Auto", 1: "Manual", 2: "Auto bracket" }], [41987, { 0: "Auto", 1: "Manual" }], [41990, { 0: "Standard", 1: "Landscape", 2: "Portrait", 3: "Night", 4: "Other" }], [41991, { 0: "None", 1: "Low gain up", 2: "High gain up", 3: "Low gain down", 4: "High gain down" }], [41996, { 0: "Unknown", 1: "Macro", 2: "Close", 3: "Distant" }], [42080, { 0: "Unknown", 1: "Not a Composite Image", 2: "General Composite Image", 3: "Composite Image Captured While Shooting" }]]); + var Be = { 1: "No absolute unit of measurement", 2: "Inch", 3: "Centimeter" }; + Ee.set(37392, Be), Ee.set(41488, Be); + var Ne = { 0: "Normal", 1: "Low", 2: "High" }; + function Ge(e3) { + return "object" == typeof e3 && void 0 !== e3.length ? e3[0] : e3; + } + function Ve(e3) { + let t2 = Array.from(e3).slice(1); + return t2[1] > 15 && (t2 = t2.map((e4) => String.fromCharCode(e4))), "0" !== t2[2] && 0 !== t2[2] || t2.pop(), t2.join("."); + } + function ze(e3) { + if ("string" == typeof e3) { + var [t2, i3, n3, s2, r2, a2] = e3.trim().split(/[-: ]/g).map(Number), o2 = new Date(t2, i3 - 1, n3); + return Number.isNaN(s2) || Number.isNaN(r2) || Number.isNaN(a2) || (o2.setHours(s2), o2.setMinutes(r2), o2.setSeconds(a2)), Number.isNaN(+o2) ? e3 : o2; + } + } + function He(e3) { + if ("string" == typeof e3) + return e3; + let t2 = []; + if (0 === e3[1] && 0 === e3[e3.length - 1]) + for (let i3 = 0; i3 < e3.length; i3 += 2) + t2.push(je(e3[i3 + 1], e3[i3])); + else + for (let i3 = 0; i3 < e3.length; i3 += 2) + t2.push(je(e3[i3], e3[i3 + 1])); + return m(String.fromCodePoint(...t2)); + } + function je(e3, t2) { + return e3 << 8 | t2; + } + Ee.set(41992, Ne), Ee.set(41993, Ne), Ee.set(41994, Ne), U(N, ["ifd0", "ifd1"], [[50827, function(e3) { + return "string" != typeof e3 ? b(e3) : e3; + }], [306, ze], [40091, He], [40092, He], [40093, He], [40094, He], [40095, He]]), U(N, "exif", [[40960, Ve], [36864, Ve], [36867, ze], [36868, ze], [40962, Ge], [40963, Ge]]), U(N, "gps", [[0, (e3) => Array.from(e3).join(".")], [7, (e3) => Array.from(e3).join(":")]]); + var We = class extends re2 { + static canHandle(e3, t2) { + return 225 === e3.getUint8(t2 + 1) && 1752462448 === e3.getUint32(t2 + 4) && "http://ns.adobe.com/" === e3.getString(t2 + 4, "http://ns.adobe.com/".length); + } + static headerLength(e3, t2) { + return "http://ns.adobe.com/xmp/extension/" === e3.getString(t2 + 4, "http://ns.adobe.com/xmp/extension/".length) ? 79 : 4 + "http://ns.adobe.com/xap/1.0/".length + 1; + } + static findPosition(e3, t2) { + let i3 = super.findPosition(e3, t2); + return i3.multiSegment = i3.extended = 79 === i3.headerLength, i3.multiSegment ? (i3.chunkCount = e3.getUint8(t2 + 72), i3.chunkNumber = e3.getUint8(t2 + 76), 0 !== e3.getUint8(t2 + 77) && i3.chunkNumber++) : (i3.chunkCount = 1 / 0, i3.chunkNumber = -1), i3; + } + static handleMultiSegments(e3) { + return e3.map((e4) => e4.chunk.getString()).join(""); + } + normalizeInput(e3) { + return "string" == typeof e3 ? e3 : I.from(e3).getString(); + } + parse(e3 = this.chunk) { + if (!this.localOptions.parse) + return e3; + e3 = function(e4) { + let t3 = {}, i4 = {}; + for (let e6 of Ze) + t3[e6] = [], i4[e6] = 0; + return e4.replace(et, (e6, n4, s2) => { + if ("<" === n4) { + let n5 = ++i4[s2]; + return t3[s2].push(n5), `${e6}#${n5}`; + } + return `${e6}#${t3[s2].pop()}`; + }); + }(e3); + let t2 = Xe.findAll(e3, "rdf", "Description"); + 0 === t2.length && t2.push(new Xe("rdf", "Description", void 0, e3)); + let i3, n3 = {}; + for (let e4 of t2) + for (let t3 of e4.properties) + i3 = Je(t3.ns, n3), _e(t3, i3); + return function(e4) { + let t3; + for (let i4 in e4) + t3 = e4[i4] = f2(e4[i4]), void 0 === t3 && delete e4[i4]; + return f2(e4); + }(n3); + } + assignToOutput(e3, t2) { + if (this.localOptions.parse) + for (let [i3, n3] of Object.entries(t2)) + switch (i3) { + case "tiff": + this.assignObjectToOutput(e3, "ifd0", n3); + break; + case "exif": + this.assignObjectToOutput(e3, "exif", n3); + break; + case "xmlns": + break; + default: + this.assignObjectToOutput(e3, i3, n3); + } + else + e3.xmp = t2; + } + }; + c(We, "type", "xmp"), c(We, "multiSegment", true), T.set("xmp", We); + var Ke = class _Ke { + static findAll(e3) { + return qe(e3, /([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)=("[^"]*"|'[^']*')/gm).map(_Ke.unpackMatch); + } + static unpackMatch(e3) { + let t2 = e3[1], i3 = e3[2], n3 = e3[3].slice(1, -1); + return n3 = Qe(n3), new _Ke(t2, i3, n3); + } + constructor(e3, t2, i3) { + this.ns = e3, this.name = t2, this.value = i3; + } + serialize() { + return this.value; + } + }; + var Xe = class _Xe { + static findAll(e3, t2, i3) { + if (void 0 !== t2 || void 0 !== i3) { + t2 = t2 || "[\\w\\d-]+", i3 = i3 || "[\\w\\d-]+"; + var n3 = new RegExp(`<(${t2}):(${i3})(#\\d+)?((\\s+?[\\w\\d-:]+=("[^"]*"|'[^']*'))*\\s*)(\\/>|>([\\s\\S]*?)<\\/\\1:\\2\\3>)`, "gm"); + } else + n3 = /<([\w\d-]+):([\w\d-]+)(#\d+)?((\s+?[\w\d-:]+=("[^"]*"|'[^']*'))*\s*)(\/>|>([\s\S]*?)<\/\1:\2\3>)/gm; + return qe(e3, n3).map(_Xe.unpackMatch); + } + static unpackMatch(e3) { + let t2 = e3[1], i3 = e3[2], n3 = e3[4], s2 = e3[8]; + return new _Xe(t2, i3, n3, s2); + } + constructor(e3, t2, i3, n3) { + this.ns = e3, this.name = t2, this.attrString = i3, this.innerXml = n3, this.attrs = Ke.findAll(i3), this.children = _Xe.findAll(n3), this.value = 0 === this.children.length ? Qe(n3) : void 0, this.properties = [...this.attrs, ...this.children]; + } + get isPrimitive() { + return void 0 !== this.value && 0 === this.attrs.length && 0 === this.children.length; + } + get isListContainer() { + return 1 === this.children.length && this.children[0].isList; + } + get isList() { + let { ns: e3, name: t2 } = this; + return "rdf" === e3 && ("Seq" === t2 || "Bag" === t2 || "Alt" === t2); + } + get isListItem() { + return "rdf" === this.ns && "li" === this.name; + } + serialize() { + if (0 === this.properties.length && void 0 === this.value) + return; + if (this.isPrimitive) + return this.value; + if (this.isListContainer) + return this.children[0].serialize(); + if (this.isList) + return $e(this.children.map(Ye)); + if (this.isListItem && 1 === this.children.length && 0 === this.attrs.length) + return this.children[0].serialize(); + let e3 = {}; + for (let t2 of this.properties) + _e(t2, e3); + return void 0 !== this.value && (e3.value = this.value), f2(e3); + } + }; + function _e(e3, t2) { + let i3 = e3.serialize(); + void 0 !== i3 && (t2[e3.name] = i3); + } + var Ye = (e3) => e3.serialize(); + var $e = (e3) => 1 === e3.length ? e3[0] : e3; + var Je = (e3, t2) => t2[e3] ? t2[e3] : t2[e3] = {}; + function qe(e3, t2) { + let i3, n3 = []; + if (!e3) + return n3; + for (; null !== (i3 = t2.exec(e3)); ) + n3.push(i3); + return n3; + } + function Qe(e3) { + if (function(e4) { + return null == e4 || "null" === e4 || "undefined" === e4 || "" === e4 || "" === e4.trim(); + }(e3)) + return; + let t2 = Number(e3); + if (!Number.isNaN(t2)) + return t2; + let i3 = e3.toLowerCase(); + return "true" === i3 || "false" !== i3 && e3.trim(); + } + var Ze = ["rdf:li", "rdf:Seq", "rdf:Bag", "rdf:Alt", "rdf:Description"]; + var et = new RegExp(`(<|\\/)(${Ze.join("|")})`, "g"); + var tt = Object.freeze({ __proto__: null, default: Me, Exifr: te, fileParsers: w, segmentParsers: T, fileReaders: A, tagKeys: E, tagValues: B, tagRevivers: N, createDictionary: U, extendDictionary: F, fetchUrlAsArrayBuffer: M, readBlobAsArrayBuffer: R, chunkedProps: G, otherSegments: V, segments: z, tiffBlocks: H, segmentsAndBlocks: j2, tiffExtractables: W, inheritables: K, allFormatters: X, Options: q, parse: ie, gpsOnlyOptions: me, gps: Se, thumbnailOnlyOptions: Ce, thumbnail: ye, thumbnailUrl: be, orientationOnlyOptions: Ie, orientation: Pe, rotations: ke, get rotateCanvas() { + return we; + }, get rotateCss() { + return Te; + }, rotation: Ae }); + var at = l("fs", (e3) => e3.promises); + A.set("fs", class extends ve { + async readWhole() { + this.chunked = false, this.fs = await at; + let e3 = await this.fs.readFile(this.input); + this._swapBuffer(e3); + } + async readChunked() { + this.chunked = true, this.fs = await at, await this.open(), await this.readChunk(0, this.options.firstChunkSize); + } + async open() { + void 0 === this.fh && (this.fh = await this.fs.open(this.input, "r"), this.size = (await this.fh.stat(this.input)).size); + } + async _readChunk(e3, t2) { + void 0 === this.fh && await this.open(), e3 + t2 > this.size && (t2 = this.size - e3); + var i3 = this.subarray(e3, t2, true); + return await this.fh.read(i3.dataView, 0, t2, e3), i3; + } + async close() { + if (this.fh) { + let e3 = this.fh; + this.fh = void 0, await e3.close(); + } + } + }); + A.set("base64", class extends ve { + constructor(...e3) { + super(...e3), this.input = this.input.replace(/^data:([^;]+);base64,/gim, ""), this.size = this.input.length / 4 * 3, this.input.endsWith("==") ? this.size -= 2 : this.input.endsWith("=") && (this.size -= 1); + } + async _readChunk(e3, t2) { + let i3, n3, r2 = this.input; + void 0 === e3 ? (e3 = 0, i3 = 0, n3 = 0) : (i3 = 4 * Math.floor(e3 / 3), n3 = e3 - i3 / 4 * 3), void 0 === t2 && (t2 = this.size); + let o2 = e3 + t2, l2 = i3 + 4 * Math.ceil(o2 / 3); + r2 = r2.slice(i3, l2); + let h2 = Math.min(t2, this.size - e3); + if (a) { + let t3 = s.from(r2, "base64").slice(n3, n3 + h2); + return this.set(t3, e3, true); + } + { + let t3 = this.subarray(e3, h2, true), i4 = atob(r2), s2 = t3.toUint8(); + for (let e4 = 0; e4 < h2; e4++) + s2[e4] = i4.charCodeAt(n3 + e4); + return t3; + } + } + }); + var ot = class extends se { + static canHandle(e3, t2) { + return 18761 === t2 || 19789 === t2; + } + extendOptions(e3) { + let { ifd0: t2, xmp: i3, iptc: n3, icc: s2 } = e3; + i3.enabled && t2.deps.add(700), n3.enabled && t2.deps.add(33723), s2.enabled && t2.deps.add(34675), t2.finalizeFilters(); + } + async parse() { + let { tiff: e3, xmp: t2, iptc: i3, icc: n3 } = this.options; + if (e3.enabled || t2.enabled || i3.enabled || n3.enabled) { + let e4 = Math.max(S(this.options), this.options.chunkSize); + await this.file.ensureChunk(0, e4), this.createParser("tiff", this.file), this.parsers.tiff.parseHeader(), await this.parsers.tiff.parseIfd0Block(), this.adaptTiffPropAsSegment("xmp"), this.adaptTiffPropAsSegment("iptc"), this.adaptTiffPropAsSegment("icc"); + } + } + adaptTiffPropAsSegment(e3) { + if (this.parsers.tiff[e3]) { + let t2 = this.parsers.tiff[e3]; + this.injectSegment(e3, t2); + } + } + }; + c(ot, "type", "tiff"), w.set("tiff", ot); + var lt = l("zlib"); + var ht = ["ihdr", "iccp", "text", "itxt", "exif"]; + var ut = class extends se { + constructor(...e3) { + super(...e3), c(this, "catchError", (e4) => this.errors.push(e4)), c(this, "metaChunks", []), c(this, "unknownChunks", []); + } + static canHandle(e3, t2) { + return 35152 === t2 && 2303741511 === e3.getUint32(0) && 218765834 === e3.getUint32(4); + } + async parse() { + let { file: e3 } = this; + await this.findPngChunksInRange("\x89PNG\r\n\n".length, e3.byteLength), await this.readSegments(this.metaChunks), this.findIhdr(), this.parseTextChunks(), await this.findExif().catch(this.catchError), await this.findXmp().catch(this.catchError), await this.findIcc().catch(this.catchError); + } + async findPngChunksInRange(e3, t2) { + let { file: i3 } = this; + for (; e3 < t2; ) { + let t3 = i3.getUint32(e3), n3 = i3.getUint32(e3 + 4), s2 = i3.getString(e3 + 4, 4).toLowerCase(), r2 = t3 + 4 + 4 + 4, a2 = { type: s2, offset: e3, length: r2, start: e3 + 4 + 4, size: t3, marker: n3 }; + ht.includes(s2) ? this.metaChunks.push(a2) : this.unknownChunks.push(a2), e3 += r2; + } + } + parseTextChunks() { + let e3 = this.metaChunks.filter((e4) => "text" === e4.type); + for (let t2 of e3) { + let [e4, i3] = this.file.getString(t2.start, t2.size).split("\0"); + this.injectKeyValToIhdr(e4, i3); + } + } + injectKeyValToIhdr(e3, t2) { + let i3 = this.parsers.ihdr; + i3 && i3.raw.set(e3, t2); + } + findIhdr() { + let e3 = this.metaChunks.find((e4) => "ihdr" === e4.type); + e3 && false !== this.options.ihdr.enabled && this.createParser("ihdr", e3.chunk); + } + async findExif() { + let e3 = this.metaChunks.find((e4) => "exif" === e4.type); + e3 && this.injectSegment("tiff", e3.chunk); + } + async findXmp() { + let e3 = this.metaChunks.filter((e4) => "itxt" === e4.type); + for (let t2 of e3) { + "XML:com.adobe.xmp" === t2.chunk.getString(0, "XML:com.adobe.xmp".length) && this.injectSegment("xmp", t2.chunk); + } + } + async findIcc() { + let e3 = this.metaChunks.find((e4) => "iccp" === e4.type); + if (!e3) + return; + let { chunk: t2 } = e3, i3 = t2.getUint8Array(0, 81), s2 = 0; + for (; s2 < 80 && 0 !== i3[s2]; ) + s2++; + let r2 = s2 + 2, a2 = t2.getString(0, s2); + if (this.injectKeyValToIhdr("ProfileName", a2), n2) { + let e4 = await lt, i4 = t2.getUint8Array(r2); + i4 = e4.inflateSync(i4), this.injectSegment("icc", i4); + } + } + }; + c(ut, "type", "png"), w.set("png", ut), U(E, "interop", [[1, "InteropIndex"], [2, "InteropVersion"], [4096, "RelatedImageFileFormat"], [4097, "RelatedImageWidth"], [4098, "RelatedImageHeight"]]), F(E, "ifd0", [[11, "ProcessingSoftware"], [254, "SubfileType"], [255, "OldSubfileType"], [263, "Thresholding"], [264, "CellWidth"], [265, "CellLength"], [266, "FillOrder"], [269, "DocumentName"], [280, "MinSampleValue"], [281, "MaxSampleValue"], [285, "PageName"], [286, "XPosition"], [287, "YPosition"], [290, "GrayResponseUnit"], [297, "PageNumber"], [321, "HalftoneHints"], [322, "TileWidth"], [323, "TileLength"], [332, "InkSet"], [337, "TargetPrinter"], [18246, "Rating"], [18249, "RatingPercent"], [33550, "PixelScale"], [34264, "ModelTransform"], [34377, "PhotoshopSettings"], [50706, "DNGVersion"], [50707, "DNGBackwardVersion"], [50708, "UniqueCameraModel"], [50709, "LocalizedCameraModel"], [50736, "DNGLensInfo"], [50739, "ShadowScale"], [50740, "DNGPrivateData"], [33920, "IntergraphMatrix"], [33922, "ModelTiePoint"], [34118, "SEMInfo"], [34735, "GeoTiffDirectory"], [34736, "GeoTiffDoubleParams"], [34737, "GeoTiffAsciiParams"], [50341, "PrintIM"], [50721, "ColorMatrix1"], [50722, "ColorMatrix2"], [50723, "CameraCalibration1"], [50724, "CameraCalibration2"], [50725, "ReductionMatrix1"], [50726, "ReductionMatrix2"], [50727, "AnalogBalance"], [50728, "AsShotNeutral"], [50729, "AsShotWhiteXY"], [50730, "BaselineExposure"], [50731, "BaselineNoise"], [50732, "BaselineSharpness"], [50734, "LinearResponseLimit"], [50735, "CameraSerialNumber"], [50741, "MakerNoteSafety"], [50778, "CalibrationIlluminant1"], [50779, "CalibrationIlluminant2"], [50781, "RawDataUniqueID"], [50827, "OriginalRawFileName"], [50828, "OriginalRawFileData"], [50831, "AsShotICCProfile"], [50832, "AsShotPreProfileMatrix"], [50833, "CurrentICCProfile"], [50834, "CurrentPreProfileMatrix"], [50879, "ColorimetricReference"], [50885, "SRawType"], [50898, "PanasonicTitle"], [50899, "PanasonicTitle2"], [50931, "CameraCalibrationSig"], [50932, "ProfileCalibrationSig"], [50933, "ProfileIFD"], [50934, "AsShotProfileName"], [50936, "ProfileName"], [50937, "ProfileHueSatMapDims"], [50938, "ProfileHueSatMapData1"], [50939, "ProfileHueSatMapData2"], [50940, "ProfileToneCurve"], [50941, "ProfileEmbedPolicy"], [50942, "ProfileCopyright"], [50964, "ForwardMatrix1"], [50965, "ForwardMatrix2"], [50966, "PreviewApplicationName"], [50967, "PreviewApplicationVersion"], [50968, "PreviewSettingsName"], [50969, "PreviewSettingsDigest"], [50970, "PreviewColorSpace"], [50971, "PreviewDateTime"], [50972, "RawImageDigest"], [50973, "OriginalRawFileDigest"], [50981, "ProfileLookTableDims"], [50982, "ProfileLookTableData"], [51043, "TimeCodes"], [51044, "FrameRate"], [51058, "TStop"], [51081, "ReelName"], [51089, "OriginalDefaultFinalSize"], [51090, "OriginalBestQualitySize"], [51091, "OriginalDefaultCropSize"], [51105, "CameraLabel"], [51107, "ProfileHueSatMapEncoding"], [51108, "ProfileLookTableEncoding"], [51109, "BaselineExposureOffset"], [51110, "DefaultBlackRender"], [51111, "NewRawImageDigest"], [51112, "RawToPreviewGain"]]); + var ct = [[273, "StripOffsets"], [279, "StripByteCounts"], [288, "FreeOffsets"], [289, "FreeByteCounts"], [291, "GrayResponseCurve"], [292, "T4Options"], [293, "T6Options"], [300, "ColorResponseUnit"], [320, "ColorMap"], [324, "TileOffsets"], [325, "TileByteCounts"], [326, "BadFaxLines"], [327, "CleanFaxData"], [328, "ConsecutiveBadFaxLines"], [330, "SubIFD"], [333, "InkNames"], [334, "NumberofInks"], [336, "DotRange"], [338, "ExtraSamples"], [339, "SampleFormat"], [340, "SMinSampleValue"], [341, "SMaxSampleValue"], [342, "TransferRange"], [343, "ClipPath"], [344, "XClipPathUnits"], [345, "YClipPathUnits"], [346, "Indexed"], [347, "JPEGTables"], [351, "OPIProxy"], [400, "GlobalParametersIFD"], [401, "ProfileType"], [402, "FaxProfile"], [403, "CodingMethods"], [404, "VersionYear"], [405, "ModeNumber"], [433, "Decode"], [434, "DefaultImageColor"], [435, "T82Options"], [437, "JPEGTables"], [512, "JPEGProc"], [515, "JPEGRestartInterval"], [517, "JPEGLosslessPredictors"], [518, "JPEGPointTransforms"], [519, "JPEGQTables"], [520, "JPEGDCTables"], [521, "JPEGACTables"], [559, "StripRowCounts"], [999, "USPTOMiscellaneous"], [18247, "XP_DIP_XML"], [18248, "StitchInfo"], [28672, "SonyRawFileType"], [28688, "SonyToneCurve"], [28721, "VignettingCorrection"], [28722, "VignettingCorrParams"], [28724, "ChromaticAberrationCorrection"], [28725, "ChromaticAberrationCorrParams"], [28726, "DistortionCorrection"], [28727, "DistortionCorrParams"], [29895, "SonyCropTopLeft"], [29896, "SonyCropSize"], [32781, "ImageID"], [32931, "WangTag1"], [32932, "WangAnnotation"], [32933, "WangTag3"], [32934, "WangTag4"], [32953, "ImageReferencePoints"], [32954, "RegionXformTackPoint"], [32955, "WarpQuadrilateral"], [32956, "AffineTransformMat"], [32995, "Matteing"], [32996, "DataType"], [32997, "ImageDepth"], [32998, "TileDepth"], [33300, "ImageFullWidth"], [33301, "ImageFullHeight"], [33302, "TextureFormat"], [33303, "WrapModes"], [33304, "FovCot"], [33305, "MatrixWorldToScreen"], [33306, "MatrixWorldToCamera"], [33405, "Model2"], [33421, "CFARepeatPatternDim"], [33422, "CFAPattern2"], [33423, "BatteryLevel"], [33424, "KodakIFD"], [33445, "MDFileTag"], [33446, "MDScalePixel"], [33447, "MDColorTable"], [33448, "MDLabName"], [33449, "MDSampleInfo"], [33450, "MDPrepDate"], [33451, "MDPrepTime"], [33452, "MDFileUnits"], [33589, "AdventScale"], [33590, "AdventRevision"], [33628, "UIC1Tag"], [33629, "UIC2Tag"], [33630, "UIC3Tag"], [33631, "UIC4Tag"], [33918, "IntergraphPacketData"], [33919, "IntergraphFlagRegisters"], [33921, "INGRReserved"], [34016, "Site"], [34017, "ColorSequence"], [34018, "IT8Header"], [34019, "RasterPadding"], [34020, "BitsPerRunLength"], [34021, "BitsPerExtendedRunLength"], [34022, "ColorTable"], [34023, "ImageColorIndicator"], [34024, "BackgroundColorIndicator"], [34025, "ImageColorValue"], [34026, "BackgroundColorValue"], [34027, "PixelIntensityRange"], [34028, "TransparencyIndicator"], [34029, "ColorCharacterization"], [34030, "HCUsage"], [34031, "TrapIndicator"], [34032, "CMYKEquivalent"], [34152, "AFCP_IPTC"], [34232, "PixelMagicJBIGOptions"], [34263, "JPLCartoIFD"], [34306, "WB_GRGBLevels"], [34310, "LeafData"], [34687, "TIFF_FXExtensions"], [34688, "MultiProfiles"], [34689, "SharedData"], [34690, "T88Options"], [34732, "ImageLayer"], [34750, "JBIGOptions"], [34856, "Opto-ElectricConvFactor"], [34857, "Interlace"], [34908, "FaxRecvParams"], [34909, "FaxSubAddress"], [34910, "FaxRecvTime"], [34929, "FedexEDR"], [34954, "LeafSubIFD"], [37387, "FlashEnergy"], [37388, "SpatialFrequencyResponse"], [37389, "Noise"], [37390, "FocalPlaneXResolution"], [37391, "FocalPlaneYResolution"], [37392, "FocalPlaneResolutionUnit"], [37397, "ExposureIndex"], [37398, "TIFF-EPStandardID"], [37399, "SensingMethod"], [37434, "CIP3DataFile"], [37435, "CIP3Sheet"], [37436, "CIP3Side"], [37439, "StoNits"], [37679, "MSDocumentText"], [37680, "MSPropertySetStorage"], [37681, "MSDocumentTextPosition"], [37724, "ImageSourceData"], [40965, "InteropIFD"], [40976, "SamsungRawPointersOffset"], [40977, "SamsungRawPointersLength"], [41217, "SamsungRawByteOrder"], [41218, "SamsungRawUnknown"], [41484, "SpatialFrequencyResponse"], [41485, "Noise"], [41489, "ImageNumber"], [41490, "SecurityClassification"], [41491, "ImageHistory"], [41494, "TIFF-EPStandardID"], [41995, "DeviceSettingDescription"], [42112, "GDALMetadata"], [42113, "GDALNoData"], [44992, "ExpandSoftware"], [44993, "ExpandLens"], [44994, "ExpandFilm"], [44995, "ExpandFilterLens"], [44996, "ExpandScanner"], [44997, "ExpandFlashLamp"], [46275, "HasselbladRawImage"], [48129, "PixelFormat"], [48130, "Transformation"], [48131, "Uncompressed"], [48132, "ImageType"], [48256, "ImageWidth"], [48257, "ImageHeight"], [48258, "WidthResolution"], [48259, "HeightResolution"], [48320, "ImageOffset"], [48321, "ImageByteCount"], [48322, "AlphaOffset"], [48323, "AlphaByteCount"], [48324, "ImageDataDiscard"], [48325, "AlphaDataDiscard"], [50215, "OceScanjobDesc"], [50216, "OceApplicationSelector"], [50217, "OceIDNumber"], [50218, "OceImageLogic"], [50255, "Annotations"], [50459, "HasselbladExif"], [50547, "OriginalFileName"], [50560, "USPTOOriginalContentType"], [50656, "CR2CFAPattern"], [50710, "CFAPlaneColor"], [50711, "CFALayout"], [50712, "LinearizationTable"], [50713, "BlackLevelRepeatDim"], [50714, "BlackLevel"], [50715, "BlackLevelDeltaH"], [50716, "BlackLevelDeltaV"], [50717, "WhiteLevel"], [50718, "DefaultScale"], [50719, "DefaultCropOrigin"], [50720, "DefaultCropSize"], [50733, "BayerGreenSplit"], [50737, "ChromaBlurRadius"], [50738, "AntiAliasStrength"], [50752, "RawImageSegmentation"], [50780, "BestQualityScale"], [50784, "AliasLayerMetadata"], [50829, "ActiveArea"], [50830, "MaskedAreas"], [50935, "NoiseReductionApplied"], [50974, "SubTileBlockSize"], [50975, "RowInterleaveFactor"], [51008, "OpcodeList1"], [51009, "OpcodeList2"], [51022, "OpcodeList3"], [51041, "NoiseProfile"], [51114, "CacheVersion"], [51125, "DefaultUserCrop"], [51157, "NikonNEFInfo"], [65024, "KdcIFD"]]; + F(E, "ifd0", ct), F(E, "exif", ct), U(B, "gps", [[23, { M: "Magnetic North", T: "True North" }], [25, { K: "Kilometers", M: "Miles", N: "Nautical Miles" }]]); + var ft = class extends re2 { + static canHandle(e3, t2) { + return 224 === e3.getUint8(t2 + 1) && 1246120262 === e3.getUint32(t2 + 4) && 0 === e3.getUint8(t2 + 8); + } + parse() { + return this.parseTags(), this.translate(), this.output; + } + parseTags() { + this.raw = /* @__PURE__ */ new Map([[0, this.chunk.getUint16(0)], [2, this.chunk.getUint8(2)], [3, this.chunk.getUint16(3)], [5, this.chunk.getUint16(5)], [7, this.chunk.getUint8(7)], [8, this.chunk.getUint8(8)]]); + } + }; + c(ft, "type", "jfif"), c(ft, "headerLength", 9), T.set("jfif", ft), U(E, "jfif", [[0, "JFIFVersion"], [2, "ResolutionUnit"], [3, "XResolution"], [5, "YResolution"], [7, "ThumbnailWidth"], [8, "ThumbnailHeight"]]); + var dt = class extends re2 { + parse() { + return this.parseTags(), this.translate(), this.output; + } + parseTags() { + this.raw = new Map([[0, this.chunk.getUint32(0)], [4, this.chunk.getUint32(4)], [8, this.chunk.getUint8(8)], [9, this.chunk.getUint8(9)], [10, this.chunk.getUint8(10)], [11, this.chunk.getUint8(11)], [12, this.chunk.getUint8(12)], ...Array.from(this.raw)]); + } + }; + c(dt, "type", "ihdr"), T.set("ihdr", dt), U(E, "ihdr", [[0, "ImageWidth"], [4, "ImageHeight"], [8, "BitDepth"], [9, "ColorType"], [10, "Compression"], [11, "Filter"], [12, "Interlace"]]), U(B, "ihdr", [[9, { 0: "Grayscale", 2: "RGB", 3: "Palette", 4: "Grayscale with Alpha", 6: "RGB with Alpha", DEFAULT: "Unknown" }], [10, { 0: "Deflate/Inflate", DEFAULT: "Unknown" }], [11, { 0: "Adaptive", DEFAULT: "Unknown" }], [12, { 0: "Noninterlaced", 1: "Adam7 Interlace", DEFAULT: "Unknown" }]]); + var pt = class extends re2 { + static canHandle(e3, t2) { + return 226 === e3.getUint8(t2 + 1) && 1229144927 === e3.getUint32(t2 + 4); + } + static findPosition(e3, t2) { + let i3 = super.findPosition(e3, t2); + return i3.chunkNumber = e3.getUint8(t2 + 16), i3.chunkCount = e3.getUint8(t2 + 17), i3.multiSegment = i3.chunkCount > 1, i3; + } + static handleMultiSegments(e3) { + return function(e4) { + let t2 = function(e6) { + let t3 = e6[0].constructor, i3 = 0; + for (let t4 of e6) + i3 += t4.length; + let n3 = new t3(i3), s2 = 0; + for (let t4 of e6) + n3.set(t4, s2), s2 += t4.length; + return n3; + }(e4.map((e6) => e6.chunk.toUint8())); + return new I(t2); + }(e3); + } + parse() { + return this.raw = /* @__PURE__ */ new Map(), this.parseHeader(), this.parseTags(), this.translate(), this.output; + } + parseHeader() { + let { raw: e3 } = this; + this.chunk.byteLength < 84 && g2("ICC header is too short"); + for (let [t2, i3] of Object.entries(gt)) { + t2 = parseInt(t2, 10); + let n3 = i3(this.chunk, t2); + "\0\0\0\0" !== n3 && e3.set(t2, n3); + } + } + parseTags() { + let e3, t2, i3, n3, s2, { raw: r2 } = this, a2 = this.chunk.getUint32(128), o2 = 132, l2 = this.chunk.byteLength; + for (; a2--; ) { + if (e3 = this.chunk.getString(o2, 4), t2 = this.chunk.getUint32(o2 + 4), i3 = this.chunk.getUint32(o2 + 8), n3 = this.chunk.getString(t2, 4), t2 + i3 > l2) + return void console.warn("reached the end of the first ICC chunk. Enable options.tiff.multiSegment to read all ICC segments."); + s2 = this.parseTag(n3, t2, i3), void 0 !== s2 && "\0\0\0\0" !== s2 && r2.set(e3, s2), o2 += 12; + } + } + parseTag(e3, t2, i3) { + switch (e3) { + case "desc": + return this.parseDesc(t2); + case "mluc": + return this.parseMluc(t2); + case "text": + return this.parseText(t2, i3); + case "sig ": + return this.parseSig(t2); + } + if (!(t2 + i3 > this.chunk.byteLength)) + return this.chunk.getUint8Array(t2, i3); + } + parseDesc(e3) { + let t2 = this.chunk.getUint32(e3 + 8) - 1; + return m(this.chunk.getString(e3 + 12, t2)); + } + parseText(e3, t2) { + return m(this.chunk.getString(e3 + 8, t2 - 8)); + } + parseSig(e3) { + return m(this.chunk.getString(e3 + 8, 4)); + } + parseMluc(e3) { + let { chunk: t2 } = this, i3 = t2.getUint32(e3 + 8), n3 = t2.getUint32(e3 + 12), s2 = e3 + 16, r2 = []; + for (let a2 = 0; a2 < i3; a2++) { + let i4 = t2.getString(s2 + 0, 2), a3 = t2.getString(s2 + 2, 2), o2 = t2.getUint32(s2 + 4), l2 = t2.getUint32(s2 + 8) + e3, h2 = m(t2.getUnicodeString(l2, o2)); + r2.push({ lang: i4, country: a3, text: h2 }), s2 += n3; + } + return 1 === i3 ? r2[0].text : r2; + } + translateValue(e3, t2) { + return "string" == typeof e3 ? t2[e3] || t2[e3.toLowerCase()] || e3 : t2[e3] || e3; + } + }; + c(pt, "type", "icc"), c(pt, "multiSegment", true), c(pt, "headerLength", 18); + var gt = { 4: mt, 8: function(e3, t2) { + return [e3.getUint8(t2), e3.getUint8(t2 + 1) >> 4, e3.getUint8(t2 + 1) % 16].map((e4) => e4.toString(10)).join("."); + }, 12: mt, 16: mt, 20: mt, 24: function(e3, t2) { + const i3 = e3.getUint16(t2), n3 = e3.getUint16(t2 + 2) - 1, s2 = e3.getUint16(t2 + 4), r2 = e3.getUint16(t2 + 6), a2 = e3.getUint16(t2 + 8), o2 = e3.getUint16(t2 + 10); + return new Date(Date.UTC(i3, n3, s2, r2, a2, o2)); + }, 36: mt, 40: mt, 48: mt, 52: mt, 64: (e3, t2) => e3.getUint32(t2), 80: mt }; + function mt(e3, t2) { + return m(e3.getString(t2, 4)); + } + T.set("icc", pt), U(E, "icc", [[4, "ProfileCMMType"], [8, "ProfileVersion"], [12, "ProfileClass"], [16, "ColorSpaceData"], [20, "ProfileConnectionSpace"], [24, "ProfileDateTime"], [36, "ProfileFileSignature"], [40, "PrimaryPlatform"], [44, "CMMFlags"], [48, "DeviceManufacturer"], [52, "DeviceModel"], [56, "DeviceAttributes"], [64, "RenderingIntent"], [68, "ConnectionSpaceIlluminant"], [80, "ProfileCreator"], [84, "ProfileID"], ["Header", "ProfileHeader"], ["MS00", "WCSProfiles"], ["bTRC", "BlueTRC"], ["bXYZ", "BlueMatrixColumn"], ["bfd", "UCRBG"], ["bkpt", "MediaBlackPoint"], ["calt", "CalibrationDateTime"], ["chad", "ChromaticAdaptation"], ["chrm", "Chromaticity"], ["ciis", "ColorimetricIntentImageState"], ["clot", "ColorantTableOut"], ["clro", "ColorantOrder"], ["clrt", "ColorantTable"], ["cprt", "ProfileCopyright"], ["crdi", "CRDInfo"], ["desc", "ProfileDescription"], ["devs", "DeviceSettings"], ["dmdd", "DeviceModelDesc"], ["dmnd", "DeviceMfgDesc"], ["dscm", "ProfileDescriptionML"], ["fpce", "FocalPlaneColorimetryEstimates"], ["gTRC", "GreenTRC"], ["gXYZ", "GreenMatrixColumn"], ["gamt", "Gamut"], ["kTRC", "GrayTRC"], ["lumi", "Luminance"], ["meas", "Measurement"], ["meta", "Metadata"], ["mmod", "MakeAndModel"], ["ncl2", "NamedColor2"], ["ncol", "NamedColor"], ["ndin", "NativeDisplayInfo"], ["pre0", "Preview0"], ["pre1", "Preview1"], ["pre2", "Preview2"], ["ps2i", "PS2RenderingIntent"], ["ps2s", "PostScript2CSA"], ["psd0", "PostScript2CRD0"], ["psd1", "PostScript2CRD1"], ["psd2", "PostScript2CRD2"], ["psd3", "PostScript2CRD3"], ["pseq", "ProfileSequenceDesc"], ["psid", "ProfileSequenceIdentifier"], ["psvm", "PS2CRDVMSize"], ["rTRC", "RedTRC"], ["rXYZ", "RedMatrixColumn"], ["resp", "OutputResponse"], ["rhoc", "ReflectionHardcopyOrigColorimetry"], ["rig0", "PerceptualRenderingIntentGamut"], ["rig2", "SaturationRenderingIntentGamut"], ["rpoc", "ReflectionPrintOutputColorimetry"], ["sape", "SceneAppearanceEstimates"], ["scoe", "SceneColorimetryEstimates"], ["scrd", "ScreeningDesc"], ["scrn", "Screening"], ["targ", "CharTarget"], ["tech", "Technology"], ["vcgt", "VideoCardGamma"], ["view", "ViewingConditions"], ["vued", "ViewingCondDesc"], ["wtpt", "MediaWhitePoint"]]); + var St = { "4d2p": "Erdt Systems", AAMA: "Aamazing Technologies", ACER: "Acer", ACLT: "Acolyte Color Research", ACTI: "Actix Sytems", ADAR: "Adara Technology", ADBE: "Adobe", ADI: "ADI Systems", AGFA: "Agfa Graphics", ALMD: "Alps Electric", ALPS: "Alps Electric", ALWN: "Alwan Color Expertise", AMTI: "Amiable Technologies", AOC: "AOC International", APAG: "Apago", APPL: "Apple Computer", AST: "AST", "AT&T": "AT&T", BAEL: "BARBIERI electronic", BRCO: "Barco NV", BRKP: "Breakpoint", BROT: "Brother", BULL: "Bull", BUS: "Bus Computer Systems", "C-IT": "C-Itoh", CAMR: "Intel", CANO: "Canon", CARR: "Carroll Touch", CASI: "Casio", CBUS: "Colorbus PL", CEL: "Crossfield", CELx: "Crossfield", CGS: "CGS Publishing Technologies International", CHM: "Rochester Robotics", CIGL: "Colour Imaging Group, London", CITI: "Citizen", CL00: "Candela", CLIQ: "Color IQ", CMCO: "Chromaco", CMiX: "CHROMiX", COLO: "Colorgraphic Communications", COMP: "Compaq", COMp: "Compeq/Focus Technology", CONR: "Conrac Display Products", CORD: "Cordata Technologies", CPQ: "Compaq", CPRO: "ColorPro", CRN: "Cornerstone", CTX: "CTX International", CVIS: "ColorVision", CWC: "Fujitsu Laboratories", DARI: "Darius Technology", DATA: "Dataproducts", DCP: "Dry Creek Photo", DCRC: "Digital Contents Resource Center, Chung-Ang University", DELL: "Dell Computer", DIC: "Dainippon Ink and Chemicals", DICO: "Diconix", DIGI: "Digital", "DL&C": "Digital Light & Color", DPLG: "Doppelganger", DS: "Dainippon Screen", DSOL: "DOOSOL", DUPN: "DuPont", EPSO: "Epson", ESKO: "Esko-Graphics", ETRI: "Electronics and Telecommunications Research Institute", EVER: "Everex Systems", EXAC: "ExactCODE", Eizo: "Eizo", FALC: "Falco Data Products", FF: "Fuji Photo Film", FFEI: "FujiFilm Electronic Imaging", FNRD: "Fnord Software", FORA: "Fora", FORE: "Forefront Technology", FP: "Fujitsu", FPA: "WayTech Development", FUJI: "Fujitsu", FX: "Fuji Xerox", GCC: "GCC Technologies", GGSL: "Global Graphics Software", GMB: "Gretagmacbeth", GMG: "GMG", GOLD: "GoldStar Technology", GOOG: "Google", GPRT: "Giantprint", GTMB: "Gretagmacbeth", GVC: "WayTech Development", GW2K: "Sony", HCI: "HCI", HDM: "Heidelberger Druckmaschinen", HERM: "Hermes", HITA: "Hitachi America", HP: "Hewlett-Packard", HTC: "Hitachi", HiTi: "HiTi Digital", IBM: "IBM", IDNT: "Scitex", IEC: "Hewlett-Packard", IIYA: "Iiyama North America", IKEG: "Ikegami Electronics", IMAG: "Image Systems", IMI: "Ingram Micro", INTC: "Intel", INTL: "N/A (INTL)", INTR: "Intra Electronics", IOCO: "Iocomm International Technology", IPS: "InfoPrint Solutions Company", IRIS: "Scitex", ISL: "Ichikawa Soft Laboratory", ITNL: "N/A (ITNL)", IVM: "IVM", IWAT: "Iwatsu Electric", Idnt: "Scitex", Inca: "Inca Digital Printers", Iris: "Scitex", JPEG: "Joint Photographic Experts Group", JSFT: "Jetsoft Development", JVC: "JVC Information Products", KART: "Scitex", KFC: "KFC Computek Components", KLH: "KLH Computers", KMHD: "Konica Minolta", KNCA: "Konica", KODA: "Kodak", KYOC: "Kyocera", Kart: "Scitex", LCAG: "Leica", LCCD: "Leeds Colour", LDAK: "Left Dakota", LEAD: "Leading Technology", LEXM: "Lexmark International", LINK: "Link Computer", LINO: "Linotronic", LITE: "Lite-On", Leaf: "Leaf", Lino: "Linotronic", MAGC: "Mag Computronic", MAGI: "MAG Innovision", MANN: "Mannesmann", MICN: "Micron Technology", MICR: "Microtek", MICV: "Microvitec", MINO: "Minolta", MITS: "Mitsubishi Electronics America", MITs: "Mitsuba", MNLT: "Minolta", MODG: "Modgraph", MONI: "Monitronix", MONS: "Monaco Systems", MORS: "Morse Technology", MOTI: "Motive Systems", MSFT: "Microsoft", MUTO: "MUTOH INDUSTRIES", Mits: "Mitsubishi Electric", NANA: "NANAO", NEC: "NEC", NEXP: "NexPress Solutions", NISS: "Nissei Sangyo America", NKON: "Nikon", NONE: "none", OCE: "Oce Technologies", OCEC: "OceColor", OKI: "Oki", OKID: "Okidata", OKIP: "Okidata", OLIV: "Olivetti", OLYM: "Olympus", ONYX: "Onyx Graphics", OPTI: "Optiquest", PACK: "Packard Bell", PANA: "Matsushita Electric Industrial", PANT: "Pantone", PBN: "Packard Bell", PFU: "PFU", PHIL: "Philips Consumer Electronics", PNTX: "HOYA", POne: "Phase One A/S", PREM: "Premier Computer Innovations", PRIN: "Princeton Graphic Systems", PRIP: "Princeton Publishing Labs", QLUX: "Hong Kong", QMS: "QMS", QPCD: "QPcard AB", QUAD: "QuadLaser", QUME: "Qume", RADI: "Radius", RDDx: "Integrated Color Solutions", RDG: "Roland DG", REDM: "REDMS Group", RELI: "Relisys", RGMS: "Rolf Gierling Multitools", RICO: "Ricoh", RNLD: "Edmund Ronald", ROYA: "Royal", RPC: "Ricoh Printing Systems", RTL: "Royal Information Electronics", SAMP: "Sampo", SAMS: "Samsung", SANT: "Jaime Santana Pomares", SCIT: "Scitex", SCRN: "Dainippon Screen", SDP: "Scitex", SEC: "Samsung", SEIK: "Seiko Instruments", SEIk: "Seikosha", SGUY: "ScanGuy.com", SHAR: "Sharp Laboratories", SICC: "International Color Consortium", SONY: "Sony", SPCL: "SpectraCal", STAR: "Star", STC: "Sampo Technology", Scit: "Scitex", Sdp: "Scitex", Sony: "Sony", TALO: "Talon Technology", TAND: "Tandy", TATU: "Tatung", TAXA: "TAXAN America", TDS: "Tokyo Denshi Sekei", TECO: "TECO Information Systems", TEGR: "Tegra", TEKT: "Tektronix", TI: "Texas Instruments", TMKR: "TypeMaker", TOSB: "Toshiba", TOSH: "Toshiba", TOTK: "TOTOKU ELECTRIC", TRIU: "Triumph", TSBT: "Toshiba", TTX: "TTX Computer Products", TVM: "TVM Professional Monitor", TW: "TW Casper", ULSX: "Ulead Systems", UNIS: "Unisys", UTZF: "Utz Fehlau & Sohn", VARI: "Varityper", VIEW: "Viewsonic", VISL: "Visual communication", VIVO: "Vivo Mobile Communication", WANG: "Wang", WLBR: "Wilbur Imaging", WTG2: "Ware To Go", WYSE: "WYSE Technology", XERX: "Xerox", XRIT: "X-Rite", ZRAN: "Zoran", Zebr: "Zebra Technologies", appl: "Apple Computer", bICC: "basICColor", berg: "bergdesign", ceyd: "Integrated Color Solutions", clsp: "MacDermid ColorSpan", ds: "Dainippon Screen", dupn: "DuPont", ffei: "FujiFilm Electronic Imaging", flux: "FluxData", iris: "Scitex", kart: "Scitex", lcms: "Little CMS", lino: "Linotronic", none: "none", ob4d: "Erdt Systems", obic: "Medigraph", quby: "Qubyx Sarl", scit: "Scitex", scrn: "Dainippon Screen", sdp: "Scitex", siwi: "SIWI GRAFIKA", yxym: "YxyMaster" }; + var Ct = { scnr: "Scanner", mntr: "Monitor", prtr: "Printer", link: "Device Link", abst: "Abstract", spac: "Color Space Conversion Profile", nmcl: "Named Color", cenc: "ColorEncodingSpace profile", mid: "MultiplexIdentification profile", mlnk: "MultiplexLink profile", mvis: "MultiplexVisualization profile", nkpf: "Nikon Input Device Profile (NON-STANDARD!)" }; + U(B, "icc", [[4, St], [12, Ct], [40, Object.assign({}, St, Ct)], [48, St], [80, St], [64, { 0: "Perceptual", 1: "Relative Colorimetric", 2: "Saturation", 3: "Absolute Colorimetric" }], ["tech", { amd: "Active Matrix Display", crt: "Cathode Ray Tube Display", kpcd: "Photo CD", pmd: "Passive Matrix Display", dcam: "Digital Camera", dcpj: "Digital Cinema Projector", dmpc: "Digital Motion Picture Camera", dsub: "Dye Sublimation Printer", epho: "Electrophotographic Printer", esta: "Electrostatic Printer", flex: "Flexography", fprn: "Film Writer", fscn: "Film Scanner", grav: "Gravure", ijet: "Ink Jet Printer", imgs: "Photo Image Setter", mpfr: "Motion Picture Film Recorder", mpfs: "Motion Picture Film Scanner", offs: "Offset Lithography", pjtv: "Projection Television", rpho: "Photographic Paper Printer", rscn: "Reflective Scanner", silk: "Silkscreen", twax: "Thermal Wax Printer", vidc: "Video Camera", vidm: "Video Monitor" }]]); + var yt = class extends re2 { + static canHandle(e3, t2, i3) { + return 237 === e3.getUint8(t2 + 1) && "Photoshop" === e3.getString(t2 + 4, 9) && void 0 !== this.containsIptc8bim(e3, t2, i3); + } + static headerLength(e3, t2, i3) { + let n3, s2 = this.containsIptc8bim(e3, t2, i3); + if (void 0 !== s2) + return n3 = e3.getUint8(t2 + s2 + 7), n3 % 2 != 0 && (n3 += 1), 0 === n3 && (n3 = 4), s2 + 8 + n3; + } + static containsIptc8bim(e3, t2, i3) { + for (let n3 = 0; n3 < i3; n3++) + if (this.isIptcSegmentHead(e3, t2 + n3)) + return n3; + } + static isIptcSegmentHead(e3, t2) { + return 56 === e3.getUint8(t2) && 943868237 === e3.getUint32(t2) && 1028 === e3.getUint16(t2 + 4); + } + parse() { + let { raw: e3 } = this, t2 = this.chunk.byteLength - 1, i3 = false; + for (let n3 = 0; n3 < t2; n3++) + if (28 === this.chunk.getUint8(n3) && 2 === this.chunk.getUint8(n3 + 1)) { + i3 = true; + let t3 = this.chunk.getUint16(n3 + 3), s2 = this.chunk.getUint8(n3 + 2), r2 = this.chunk.getLatin1String(n3 + 5, t3); + e3.set(s2, this.pluralizeValue(e3.get(s2), r2)), n3 += 4 + t3; + } else if (i3) + break; + return this.translate(), this.output; + } + pluralizeValue(e3, t2) { + return void 0 !== e3 ? e3 instanceof Array ? (e3.push(t2), e3) : [e3, t2] : t2; + } + }; + c(yt, "type", "iptc"), c(yt, "translateValues", false), c(yt, "reviveValues", false), T.set("iptc", yt), U(E, "iptc", [[0, "ApplicationRecordVersion"], [3, "ObjectTypeReference"], [4, "ObjectAttributeReference"], [5, "ObjectName"], [7, "EditStatus"], [8, "EditorialUpdate"], [10, "Urgency"], [12, "SubjectReference"], [15, "Category"], [20, "SupplementalCategories"], [22, "FixtureIdentifier"], [25, "Keywords"], [26, "ContentLocationCode"], [27, "ContentLocationName"], [30, "ReleaseDate"], [35, "ReleaseTime"], [37, "ExpirationDate"], [38, "ExpirationTime"], [40, "SpecialInstructions"], [42, "ActionAdvised"], [45, "ReferenceService"], [47, "ReferenceDate"], [50, "ReferenceNumber"], [55, "DateCreated"], [60, "TimeCreated"], [62, "DigitalCreationDate"], [63, "DigitalCreationTime"], [65, "OriginatingProgram"], [70, "ProgramVersion"], [75, "ObjectCycle"], [80, "Byline"], [85, "BylineTitle"], [90, "City"], [92, "Sublocation"], [95, "State"], [100, "CountryCode"], [101, "Country"], [103, "OriginalTransmissionReference"], [105, "Headline"], [110, "Credit"], [115, "Source"], [116, "CopyrightNotice"], [118, "Contact"], [120, "Caption"], [121, "LocalCaption"], [122, "Writer"], [125, "RasterizedCaption"], [130, "ImageType"], [131, "ImageOrientation"], [135, "LanguageIdentifier"], [150, "AudioType"], [151, "AudioSamplingRate"], [152, "AudioSamplingResolution"], [153, "AudioDuration"], [154, "AudioOutcue"], [184, "JobID"], [185, "MasterDocumentID"], [186, "ShortDocumentID"], [187, "UniqueDocumentID"], [188, "OwnerID"], [200, "ObjectPreviewFileFormat"], [201, "ObjectPreviewFileVersion"], [202, "ObjectPreviewData"], [221, "Prefs"], [225, "ClassifyState"], [228, "SimilarityIndex"], [230, "DocumentNotes"], [231, "DocumentHistory"], [232, "ExifCameraInfo"], [255, "CatalogSets"]]), U(B, "iptc", [[10, { 0: "0 (reserved)", 1: "1 (most urgent)", 2: "2", 3: "3", 4: "4", 5: "5 (normal urgency)", 6: "6", 7: "7", 8: "8 (least urgent)", 9: "9 (user-defined priority)" }], [75, { a: "Morning", b: "Both Morning and Evening", p: "Evening" }], [131, { L: "Landscape", P: "Portrait", S: "Square" }]]); + var full_esm_default = tt; + + // modules/services/plane_photo.js + var dispatch6 = dispatch_default("viewerChanged"); + var _photo; + var _wrapper; + var imgZoom; + var _widthOverflow; + function zoomPan(d3_event) { + let t2 = d3_event.transform; + _photo.call(utilSetTransform, t2.x, t2.y, t2.k); + } + function zoomBeahvior() { + const { width: wrapperWidth, height: wrapperHeight } = _wrapper.node().getBoundingClientRect(); + const { naturalHeight, naturalWidth } = _photo.node(); + const intrinsicRatio = naturalWidth / naturalHeight; + _widthOverflow = wrapperHeight * intrinsicRatio - wrapperWidth; + return zoom_default2().extent([[0, 0], [wrapperWidth, wrapperHeight]]).translateExtent([[0, 0], [wrapperWidth + _widthOverflow, wrapperHeight]]).scaleExtent([1, 15]).on("zoom", zoomPan); + } + function loadImage(selection2, path) { + return new Promise((resolve) => { + selection2.attr("src", path); + selection2.on("load", () => { + resolve(selection2); + }); + }); + } + var plane_photo_default = { + init: async function(context, selection2) { + this.event = utilRebind(this, dispatch6, "on"); + _wrapper = selection2.append("div").attr("class", "photo-frame plane-frame").classed("hide", true); + _photo = _wrapper.append("img").attr("class", "plane-photo"); + context.ui().photoviewer.on("resize.plane", () => { + imgZoom = zoomBeahvior(); + _wrapper.call(imgZoom); + }); + await Promise.resolve(); + return this; + }, + showPhotoFrame: function(context) { + const isHidden = context.selectAll(".photo-frame.plane-frame.hide").size(); + if (isHidden) { + context.selectAll(".photo-frame:not(.plane-frame)").classed("hide", true); + context.selectAll(".photo-frame.plane-frame").classed("hide", false); + } + return this; + }, + hidePhotoFrame: function(context) { + context.select("photo-frame.plane-frame").classed("hide", false); + return this; + }, + selectPhoto: function(data, keepOrientation) { + dispatch6.call("viewerChanged"); + loadImage(_photo, ""); + loadImage(_photo, data.image_path).then(() => { + if (!keepOrientation) { + imgZoom = zoomBeahvior(); + _wrapper.call(imgZoom); + _wrapper.call(imgZoom.transform, identity2.translate(-_widthOverflow / 2, 0)); + } + }); + return this; + }, + getYaw: function() { + return 0; + } + }; + + // modules/svg/local_photos.js + var _initialized2 = false; + var _enabled2 = false; + var minViewfieldZoom = 16; + function svgLocalPhotos(projection2, context, dispatch14) { + const detected = utilDetect(); + let layer = select_default2(null); + let _fileList; + let _photos = []; + let _idAutoinc = 0; + let _photoFrame; + function init2() { + if (_initialized2) + return; + _enabled2 = true; + function over(d3_event) { + d3_event.stopPropagation(); + d3_event.preventDefault(); + d3_event.dataTransfer.dropEffect = "copy"; + } + context.container().attr("dropzone", "copy").on("drop.svgLocalPhotos", function(d3_event) { + d3_event.stopPropagation(); + d3_event.preventDefault(); + if (!detected.filedrop) + return; + drawPhotos.fileList(d3_event.dataTransfer.files, (loaded) => { + if (loaded.length > 0) { + drawPhotos.fitZoom(false); + } + }); + }).on("dragenter.svgLocalPhotos", over).on("dragexit.svgLocalPhotos", over).on("dragover.svgLocalPhotos", over); + _initialized2 = true; + } + function ensureViewerLoaded(context2) { + if (_photoFrame) { + return Promise.resolve(_photoFrame); + } + const viewer = context2.container().select(".photoviewer").selectAll(".local-photos-wrapper").data([0]); + const viewerEnter = viewer.enter().append("div").attr("class", "photo-wrapper local-photos-wrapper").classed("hide", true); + viewerEnter.append("div").attr("class", "photo-attribution fillD"); + return plane_photo_default.init(context2, viewerEnter).then((planePhotoFrame) => { + _photoFrame = planePhotoFrame; + }); + } + function click(d3_event, image, zoomTo) { + ensureViewerLoaded(context).then(() => { + const viewer = context.container().select(".photoviewer").datum(image).classed("hide", false); + const viewerWrap = viewer.select(".local-photos-wrapper").classed("hide", false); + const attribution = viewerWrap.selectAll(".photo-attribution").text(""); + if (image.name) { + attribution.append("span").classed("filename", true).text(image.name); + } + _photoFrame.selectPhoto({ image_path: "" }); + image.getSrc().then((src) => { + _photoFrame.selectPhoto({ image_path: src }).showPhotoFrame(viewerWrap); + setStyles(); + }); + }); + if (zoomTo) { + context.map().centerEase(image.loc); + } + } + function transform2(d2) { + var svgpoint = projection2(d2.loc); + return "translate(" + svgpoint[0] + "," + svgpoint[1] + ")"; + } + function setStyles(hovered) { + const viewer = context.container().select(".photoviewer"); + const selected = viewer.empty() ? void 0 : viewer.datum(); + context.container().selectAll(".layer-local-photos .viewfield-group").classed("hovered", (d2) => d2.id === hovered?.id).classed("highlighted", (d2) => d2.id === hovered?.id || d2.id === selected?.id).classed("currentView", (d2) => d2.id === selected?.id); + } + function display_markers(imageList) { + imageList = imageList.filter((image) => isArray_default(image.loc) && isNumber_default(image.loc[0]) && isNumber_default(image.loc[1])); + const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(imageList, function(d2) { + return d2.id; + }); + groups.exit().remove(); + const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", (d3_event, d2) => setStyles(d2)).on("mouseleave", () => setStyles(null)).on("click", click); + groupsEnter.append("g").attr("class", "viewfield-scale"); + const markers = groups.merge(groupsEnter).attr("transform", transform2).select(".viewfield-scale"); + markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); + const showViewfields = context.map().zoom() >= minViewfieldZoom; + const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); + viewfields.exit().remove(); + viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", function() { + const d2 = this.parentNode.__data__; + return `rotate(${Math.round(d2.direction ?? 0)},0,0),scale(1.5,1.5),translate(-8,-13)`; + }).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").style("visibility", function() { + const d2 = this.parentNode.__data__; + return isNumber_default(d2.direction) ? "visible" : "hidden"; + }); + } + function drawPhotos(selection2) { + layer = selection2.selectAll(".layer-local-photos").data(_photos ? [0] : []); + layer.exit().remove(); + const layerEnter = layer.enter().append("g").attr("class", "layer-local-photos"); + layerEnter.append("g").attr("class", "markers"); + layer = layerEnter.merge(layer); + if (_photos && _photos.length !== 0) { + display_markers(_photos); + } + } + function readFileAsDataURL(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.onerror = (error) => reject(error); + reader.readAsDataURL(file); + }); + } + async function readmultifiles(files, callback) { + const loaded = []; + for (const file of files) { + try { + const exifData = await full_esm_default.parse(file); + const photo = { + id: _idAutoinc++, + name: file.name, + getSrc: () => readFileAsDataURL(file), + file, + loc: [exifData.longitude, exifData.latitude], + direction: exifData.GPSImgDirection + }; + loaded.push(photo); + const sameName = _photos.filter((i3) => i3.name === photo.name); + if (sameName.length === 0) { + _photos.push(photo); + } else { + const thisContent = await photo.getSrc(); + const sameNameContent = await Promise.allSettled(sameName.map((i3) => i3.getSrc())); + if (!sameNameContent.some((i3) => i3.value === thisContent)) { + _photos.push(photo); + } + } + } catch (err) { + } + } + if (typeof callback === "function") + callback(loaded); + dispatch14.call("change"); + } + drawPhotos.setFiles = function(fileList, callback) { + readmultifiles(Array.from(fileList), callback); + return this; + }; + drawPhotos.fileList = function(fileList, callback) { + if (!arguments.length) + return _fileList; + _fileList = fileList; + if (!fileList || !fileList.length) + return this; + drawPhotos.setFiles(_fileList, callback); + return this; + }; + drawPhotos.getPhotos = function() { + return _photos; + }; + drawPhotos.removePhoto = function(id2) { + _photos = _photos.filter((i3) => i3.id !== id2); + dispatch14.call("change"); + return _photos; + }; + drawPhotos.openPhoto = click; + drawPhotos.fitZoom = function(force) { + const coords = _photos.map((image) => image.loc).filter((l2) => isArray_default(l2) && isNumber_default(l2[0]) && isNumber_default(l2[1])); + if (coords.length === 0) + return; + const extent = coords.map((l2) => geoExtent(l2, l2)).reduce((a2, b2) => a2.extend(b2)); + const map2 = context.map(); + var viewport = map2.trimmedExtent().polygon(); + if (force !== false || !geoPolygonIntersectsPolygon(viewport, coords, true)) { + map2.centerZoom(extent.center(), Math.min(18, map2.trimmedExtentZoom(extent))); + } + }; + function showLayer() { + layer.style("display", "block"); + layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { + dispatch14.call("change"); + }); + } + function hideLayer() { + layer.transition().duration(250).style("opacity", 0).on("end", () => { + layer.selectAll(".viewfield-group").remove(); + layer.style("display", "none"); + }); + } + drawPhotos.enabled = function(val) { + if (!arguments.length) + return _enabled2; + _enabled2 = val; + if (_enabled2) { + showLayer(); + } else { + hideLayer(); + } + dispatch14.call("change"); + return this; + }; + drawPhotos.hasData = function() { + return isArray_default(_photos) && _photos.length > 0; + }; + init2(); + return drawPhotos; + } + // modules/svg/improveOSM.js var _layerEnabled2 = false; var _qaService2; - function svgImproveOSM(projection2, context, dispatch10) { - const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3); - const minZoom3 = 12; + function svgImproveOSM(projection2, context, dispatch14) { + const throttledRedraw = throttle_default(() => dispatch14.call("change"), 1e3); + const minZoom4 = 12; let touchLayer = select_default2(null); let drawLayer = select_default2(null); let layerVisible = false; @@ -47445,7 +51571,7 @@ ${content} } function layerOn() { editOn(); - drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change")); + drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch14.call("change")); } function layerOff() { throttledRedraw.cancel(); @@ -47453,7 +51579,7 @@ ${content} touchLayer.selectAll(".qaItem.improveOSM").remove(); drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => { editOff(); - dispatch10.call("change"); + dispatch14.call("change"); }); } function updateMarkers() { @@ -47463,22 +51589,22 @@ ${content} const selectedID = context.selectedErrorID(); const data = service ? service.getItems(projection2) : []; const getTransform = svgPointTransform(projection2); - const markers = drawLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id); + const markers = drawLayer.selectAll(".qaItem.improveOSM").data(data, (d2) => d2.id); markers.exit().remove(); - const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); + const markersEnter = markers.enter().append("g").attr("class", (d2) => `qaItem ${d2.service} itemId-${d2.id} itemType-${d2.itemType}`); markersEnter.append("polygon").call(markerPath, "shadow"); markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke"); markersEnter.append("polygon").attr("fill", "currentColor").call(markerPath, "qaItem-fill"); - markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : ""); - markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform); + markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d2) => d2.icon ? "#" + d2.icon : ""); + markers.merge(markersEnter).sort(sortY).classed("selected", (d2) => d2.id === selectedID).attr("transform", getTransform); if (touchLayer.empty()) return; const fillClass = context.getDebug("target") ? "pink " : "nocolor "; - const targets = touchLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id); + const targets = touchLayer.selectAll(".qaItem.improveOSM").data(data, (d2) => d2.id); targets.exit().remove(); - targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform); - function sortY(a, b) { - return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1]; + targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d2) => `qaItem ${d2.service} target ${fillClass} itemId-${d2.id}`).attr("transform", getTransform); + function sortY(a2, b2) { + return a2.id === selectedID ? 1 : b2.id === selectedID ? -1 : b2.loc[1] - a2.loc[1]; } } function drawImproveOSM(selection2) { @@ -47491,7 +51617,7 @@ ${content} drawLayer.exit().remove(); drawLayer = drawLayer.enter().append("g").attr("class", "layer-improveOSM").style("display", _layerEnabled2 ? "block" : "none").merge(drawLayer); if (_layerEnabled2) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); service.loadIssues(projection2); updateMarkers(); @@ -47512,7 +51638,7 @@ ${content} context.enter(modeBrowse(context)); } } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawImproveOSM.supported = () => !!getService(); @@ -47522,9 +51648,9 @@ ${content} // modules/svg/osmose.js var _layerEnabled3 = false; var _qaService3; - function svgOsmose(projection2, context, dispatch10) { - const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3); - const minZoom3 = 12; + function svgOsmose(projection2, context, dispatch14) { + const throttledRedraw = throttle_default(() => dispatch14.call("change"), 1e3); + const minZoom4 = 12; let touchLayer = select_default2(null); let drawLayer = select_default2(null); let layerVisible = false; @@ -47556,7 +51682,7 @@ ${content} } function layerOn() { editOn(); - drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change")); + drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch14.call("change")); } function layerOff() { throttledRedraw.cancel(); @@ -47564,7 +51690,7 @@ ${content} touchLayer.selectAll(".qaItem.osmose").remove(); drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => { editOff(); - dispatch10.call("change"); + dispatch14.call("change"); }); } function updateMarkers() { @@ -47574,22 +51700,22 @@ ${content} const selectedID = context.selectedErrorID(); const data = service ? service.getItems(projection2) : []; const getTransform = svgPointTransform(projection2); - const markers = drawLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id); + const markers = drawLayer.selectAll(".qaItem.osmose").data(data, (d2) => d2.id); markers.exit().remove(); - const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); + const markersEnter = markers.enter().append("g").attr("class", (d2) => `qaItem ${d2.service} itemId-${d2.id} itemType-${d2.itemType}`); markersEnter.append("polygon").call(markerPath, "shadow"); markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke"); - markersEnter.append("polygon").attr("fill", (d) => service.getColor(d.item)).call(markerPath, "qaItem-fill"); - markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : ""); - markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform); + markersEnter.append("polygon").attr("fill", (d2) => service.getColor(d2.item)).call(markerPath, "qaItem-fill"); + markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d2) => d2.icon ? "#" + d2.icon : ""); + markers.merge(markersEnter).sort(sortY).classed("selected", (d2) => d2.id === selectedID).attr("transform", getTransform); if (touchLayer.empty()) return; const fillClass = context.getDebug("target") ? "pink" : "nocolor"; - const targets = touchLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id); + const targets = touchLayer.selectAll(".qaItem.osmose").data(data, (d2) => d2.id); targets.exit().remove(); - targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform); - function sortY(a, b) { - return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1]; + targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d2) => `qaItem ${d2.service} target ${fillClass} itemId-${d2.id}`).attr("transform", getTransform); + function sortY(a2, b2) { + return a2.id === selectedID ? 1 : b2.id === selectedID ? -1 : b2.loc[1] - a2.loc[1]; } } function drawOsmose(selection2) { @@ -47602,7 +51728,7 @@ ${content} drawLayer.exit().remove(); drawLayer = drawLayer.enter().append("g").attr("class", "layer-osmose").style("display", _layerEnabled3 ? "block" : "none").merge(drawLayer); if (_layerEnabled3) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); service.loadIssues(projection2); updateMarkers(); @@ -47625,7 +51751,7 @@ ${content} context.enter(modeBrowse(context)); } } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawOsmose.supported = () => !!getService(); @@ -47633,13 +51759,13 @@ ${content} } // modules/svg/streetside.js - function svgStreetside(projection2, context, dispatch10) { + function svgStreetside(projection2, context, dispatch14) { var throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - var minZoom3 = 14; + var minZoom4 = 14; var minMarkerZoom = 16; - var minViewfieldZoom = 18; + var minViewfieldZoom2 = 18; var layer = select_default2(null); var _viewerYaw = 0; var _selectedSequence = null; @@ -47665,7 +51791,7 @@ ${content} return; editOn(); layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function hideLayer() { @@ -47679,36 +51805,36 @@ ${content} layer.selectAll(".viewfield-group").remove(); layer.style("display", "none"); } - function click(d3_event, d) { + function click(d3_event, d2) { var service = getService(); if (!service) return; - if (d.sequenceKey !== _selectedSequence) { + if (d2.sequenceKey !== _selectedSequence) { _viewerYaw = 0; } - _selectedSequence = d.sequenceKey; + _selectedSequence = d2.sequenceKey; service.ensureViewerLoaded(context).then(function() { - service.selectImage(context, d.key).yaw(_viewerYaw).showViewer(context); + service.selectImage(context, d2.key).yaw(_viewerYaw).showViewer(context); }); - context.map().centerEase(d.loc); + context.map().centerEase(d2.loc); } - function mouseover(d3_event, d) { + function mouseover(d3_event, d2) { var service = getService(); if (service) - service.setStyles(context, d); + service.setStyles(context, d2); } function mouseout() { var service = getService(); if (service) service.setStyles(context, null); } - function transform2(d) { - var t = svgPointTransform(projection2)(d); - var rot = d.ca + _viewerYaw; + function transform2(d2) { + var t2 = svgPointTransform(projection2)(d2); + var rot = d2.ca + _viewerYaw; if (rot) { - t += " rotate(" + Math.floor(rot) + ",0,0)"; + t2 += " rotate(" + Math.floor(rot) + ",0,0)"; } - return t; + return t2; } function viewerChanged() { var service = getService(); @@ -47771,9 +51897,9 @@ ${content} function update() { var viewer = context.container().select(".photoviewer"); var selected = viewer.empty() ? void 0 : viewer.datum(); - var z = ~~context.map().zoom(); - var showMarkers = z >= minMarkerZoom; - var showViewfields = z >= minViewfieldZoom; + var z2 = ~~context.map().zoom(); + var showMarkers = z2 >= minMarkerZoom; + var showViewfields = z2 >= minViewfieldZoom2; var service = getService(); var sequences = []; var bubbles = []; @@ -47783,27 +51909,27 @@ ${content} sequences = filterSequences(sequences); bubbles = filterBubbles(bubbles); } - var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) { - return d.properties.key; + var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d2) { + return d2.properties.key; }); traces.exit().remove(); traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson); - var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(bubbles, function(d) { - return d.key + (d.sequenceKey ? "v1" : "v0"); + var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(bubbles, function(d2) { + return d2.key + (d2.sequenceKey ? "v1" : "v0"); }); groups.exit().remove(); var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click); groupsEnter.append("g").attr("class", "viewfield-scale"); - var markers = groups.merge(groupsEnter).sort(function(a, b) { - return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1]; + var markers = groups.merge(groupsEnter).sort(function(a2, b2) { + return a2 === selected ? 1 : b2 === selected ? -1 : b2.loc[1] - a2.loc[1]; }).attr("transform", transform2).select(".viewfield-scale"); markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); viewfields.exit().remove(); viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath); function viewfieldPath() { - var d = this.parentNode.__data__; - if (d.pano) { + var d2 = this.parentNode.__data__; + if (d2.pano) { return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0"; } else { return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z"; @@ -47820,7 +51946,7 @@ ${content} layerEnter.append("g").attr("class", "markers"); layer = layerEnter.merge(layer); if (enabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); service.loadBubbles(projection2); @@ -47829,10 +51955,10 @@ ${content} } } } - drawImages.enabled = function(_) { + drawImages.enabled = function(_2) { if (!arguments.length) return svgStreetside.enabled; - svgStreetside.enabled = _; + svgStreetside.enabled = _2; if (svgStreetside.enabled) { showLayer(); context.photos().on("change.streetside", update); @@ -47840,24 +51966,238 @@ ${content} hideLayer(); context.photos().on("change.streetside", null); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawImages.supported = function() { return !!getService(); }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; + init2(); + return drawImages; + } + + // modules/svg/vegbilder.js + function svgVegbilder(projection2, context, dispatch14) { + const throttledRedraw = throttle_default(() => dispatch14.call("change"), 1e3); + const minZoom4 = 14; + const minMarkerZoom = 16; + const minViewfieldZoom2 = 18; + let layer = select_default2(null); + let _viewerYaw = 0; + let _vegbilder; + function init2() { + if (svgVegbilder.initialized) + return; + svgVegbilder.enabled = false; + svgVegbilder.initialized = true; + } + function getService() { + if (services.vegbilder && !_vegbilder) { + _vegbilder = services.vegbilder; + _vegbilder.event.on("viewerChanged.svgVegbilder", viewerChanged).on("loadedImages.svgVegbilder", throttledRedraw); + } else if (!services.vegbilder && _vegbilder) { + _vegbilder = null; + } + return _vegbilder; + } + function showLayer() { + const service = getService(); + if (!service) + return; + editOn(); + layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", () => dispatch14.call("change")); + } + function hideLayer() { + throttledRedraw.cancel(); + layer.transition().duration(250).style("opacity", 0).on("end", editOff); + } + function editOn() { + layer.style("display", "block"); + } + function editOff() { + layer.selectAll(".viewfield-group").remove(); + layer.style("display", "none"); + } + function click(d3_event, d2) { + const service = getService(); + if (!service) + return; + service.ensureViewerLoaded(context).then(() => { + service.selectImage(context, d2.key).showViewer(context); + }); + context.map().centerEase(d2.loc); + } + function mouseover(d3_event, d2) { + const service = getService(); + if (service) + service.setStyles(context, d2); + } + function mouseout() { + const service = getService(); + if (service) + service.setStyles(context, null); + } + function transform2(d2, selected) { + let t2 = svgPointTransform(projection2)(d2); + let rot = d2.ca; + if (d2 === selected) { + rot += _viewerYaw; + } + if (rot) { + t2 += " rotate(" + Math.floor(rot) + ",0,0)"; + } + return t2; + } + function viewerChanged() { + const service = getService(); + if (!service) + return; + const frame2 = service.photoFrame(); + _viewerYaw = frame2.getYaw(); + if (context.map().isTransformed()) + return; + layer.selectAll(".viewfield-group.currentView").attr("transform", (d2) => transform2(d2, d2)); + } + function filterImages(images) { + const photoContext = context.photos(); + const fromDateString = photoContext.fromDate(); + const toDateString = photoContext.toDate(); + const showsFlat = photoContext.showsFlat(); + const showsPano = photoContext.showsPanoramic(); + if (fromDateString) { + const fromDate = new Date(fromDateString); + images = images.filter((image) => image.captured_at.getTime() >= fromDate.getTime()); + } + if (toDateString) { + const toDate = new Date(toDateString); + images = images.filter((image) => image.captured_at.getTime() <= toDate.getTime()); + } + if (!showsPano) { + images = images.filter((image) => !image.is_sphere); + } + if (!showsFlat) { + images = images.filter((image) => image.is_sphere); + } + return images; + } + function filterSequences(sequences) { + const photoContext = context.photos(); + const fromDateString = photoContext.fromDate(); + const toDateString = photoContext.toDate(); + const showsFlat = photoContext.showsFlat(); + const showsPano = photoContext.showsPanoramic(); + if (fromDateString) { + const fromDate = new Date(fromDateString); + sequences = sequences.filter(({ images }) => images[0].captured_at.getTime() >= fromDate.getTime()); + } + if (toDateString) { + const toDate = new Date(toDateString); + sequences = sequences.filter(({ images }) => images[images.length - 1].captured_at.getTime() <= toDate.getTime()); + } + if (!showsPano) { + sequences = sequences.filter(({ images }) => !images[0].is_sphere); + } + if (!showsFlat) { + sequences = sequences.filter(({ images }) => images[0].is_sphere); + } + return sequences; + } + function update() { + const viewer = context.container().select(".photoviewer"); + const selected = viewer.empty() ? void 0 : viewer.datum(); + const z2 = ~~context.map().zoom(); + const showMarkers = z2 >= minMarkerZoom; + const showViewfields = z2 >= minViewfieldZoom2; + const service = getService(); + let sequences = []; + let images = []; + if (service) { + service.loadImages(context); + sequences = service.sequences(projection2); + images = showMarkers ? service.images(projection2) : []; + images = filterImages(images); + sequences = filterSequences(sequences); + } + let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, (d2) => d2.key); + traces.exit().remove(); + traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson); + const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, (d2) => d2.key); + groups.exit().remove(); + const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click); + groupsEnter.append("g").attr("class", "viewfield-scale"); + const markers = groups.merge(groupsEnter).sort((a2, b2) => { + return a2 === selected ? 1 : b2 === selected ? -1 : b2.loc[1] - a2.loc[1]; + }).attr("transform", (d2) => transform2(d2, selected)).select(".viewfield-scale"); + markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); + const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); + viewfields.exit().remove(); + viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath); + function viewfieldPath() { + const d2 = this.parentNode.__data__; + if (d2.is_sphere) { + return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0"; + } else { + return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z"; + } + } + } + function drawImages(selection2) { + const enabled = svgVegbilder.enabled; + const service = getService(); + layer = selection2.selectAll(".layer-vegbilder").data(service ? [0] : []); + layer.exit().remove(); + const layerEnter = layer.enter().append("g").attr("class", "layer-vegbilder").style("display", enabled ? "block" : "none"); + layerEnter.append("g").attr("class", "sequences"); + layerEnter.append("g").attr("class", "markers"); + layer = layerEnter.merge(layer); + if (enabled) { + if (service && ~~context.map().zoom() >= minZoom4) { + editOn(); + update(); + service.loadImages(context); + } else { + editOff(); + } + } + } + drawImages.enabled = function(_2) { + if (!arguments.length) + return svgVegbilder.enabled; + svgVegbilder.enabled = _2; + if (svgVegbilder.enabled) { + showLayer(); + context.photos().on("change.vegbilder", update); + } else { + hideLayer(); + context.photos().on("change.vegbilder", null); + } + dispatch14.call("change"); + return this; + }; + drawImages.supported = function() { + return !!getService(); + }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; + drawImages.validHere = function(extent, zoom) { + return zoom >= minZoom4 - 2 && getService().validHere(extent); + }; init2(); return drawImages; } // modules/svg/mapillary_images.js - function svgMapillaryImages(projection2, context, dispatch10) { + function svgMapillaryImages(projection2, context, dispatch14) { const throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - const minZoom3 = 12; + const minZoom4 = 12; const minMarkerZoom = 16; - const minViewfieldZoom = 18; + const minViewfieldZoom2 = 18; let layer = select_default2(null); let _mapillary; function init2() { @@ -47881,7 +52221,7 @@ ${content} return; editOn(); layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function hideLayer() { @@ -47914,12 +52254,12 @@ ${content} if (service) service.setStyles(context, null); } - function transform2(d) { - let t = svgPointTransform(projection2)(d); - if (d.ca) { - t += " rotate(" + Math.floor(d.ca) + ",0,0)"; + function transform2(d2) { + let t2 = svgPointTransform(projection2)(d2); + if (d2.ca) { + t2 += " rotate(" + Math.floor(d2.ca) + ",0,0)"; } - return t; + return t2; } function filterImages(images) { const showsPano = context.photos().showsPanoramic(); @@ -47973,28 +52313,28 @@ ${content} return sequences; } function update() { - const z = ~~context.map().zoom(); - const showMarkers = z >= minMarkerZoom; - const showViewfields = z >= minViewfieldZoom; + const z2 = ~~context.map().zoom(); + const showMarkers = z2 >= minMarkerZoom; + const showViewfields = z2 >= minViewfieldZoom2; const service = getService(); let sequences = service ? service.sequences(projection2) : []; let images = service && showMarkers ? service.images(projection2) : []; images = filterImages(images); sequences = filterSequences(sequences, service); service.filterViewer(context); - let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) { - return d.properties.id; + let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d2) { + return d2.properties.id; }); traces.exit().remove(); traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson); - const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) { - return d.id; + const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d2) { + return d2.id; }); groups.exit().remove(); const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click); groupsEnter.append("g").attr("class", "viewfield-scale"); - const markers = groups.merge(groupsEnter).sort(function(a, b) { - return b.loc[1] - a.loc[1]; + const markers = groups.merge(groupsEnter).sort(function(a2, b2) { + return b2.loc[1] - a2.loc[1]; }).attr("transform", transform2).select(".viewfield-scale"); markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); @@ -48020,7 +52360,7 @@ ${content} layerEnter.append("g").attr("class", "markers"); layer = layerEnter.merge(layer); if (enabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); service.loadImages(projection2); @@ -48029,10 +52369,10 @@ ${content} } } } - drawImages.enabled = function(_) { + drawImages.enabled = function(_2) { if (!arguments.length) return svgMapillaryImages.enabled; - svgMapillaryImages.enabled = _; + svgMapillaryImages.enabled = _2; if (svgMapillaryImages.enabled) { showLayer(); context.photos().on("change.mapillary_images", update); @@ -48040,12 +52380,15 @@ ${content} hideLayer(); context.photos().on("change.mapillary_images", null); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawImages.supported = function() { return !!getService(); }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; init2(); return drawImages; } @@ -48055,8 +52398,8 @@ ${content} const throttledRedraw = throttle_default(function() { update(); }, 1e3); - const minZoom3 = 12; - const minViewfieldZoom = 18; + const minZoom4 = 12; + const minViewfieldZoom2 = 18; let layer = select_default2(null); let _mapillary; let viewerCompassAngle; @@ -48069,12 +52412,12 @@ ${content} if (services.mapillary && !_mapillary) { _mapillary = services.mapillary; _mapillary.event.on("imageChanged", throttledRedraw); - _mapillary.event.on("bearingChanged", function(e) { - viewerCompassAngle = e.bearing; + _mapillary.event.on("bearingChanged", function(e3) { + viewerCompassAngle = e3.bearing; if (context.map().isTransformed()) return; - layer.selectAll(".viewfield-group.currentView").filter(function(d) { - return d.is_pano; + layer.selectAll(".viewfield-group.currentView").filter(function(d2) { + return d2.is_pano; }).attr("transform", transform2); }); } else if (!services.mapillary && _mapillary) { @@ -48089,22 +52432,22 @@ ${content} layer.selectAll(".viewfield-group").remove(); layer.style("display", "none"); } - function transform2(d) { - let t = svgPointTransform(projection2)(d); - if (d.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) { - t += " rotate(" + Math.floor(viewerCompassAngle) + ",0,0)"; - } else if (d.ca) { - t += " rotate(" + Math.floor(d.ca) + ",0,0)"; + function transform2(d2) { + let t2 = svgPointTransform(projection2)(d2); + if (d2.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) { + t2 += " rotate(" + Math.floor(viewerCompassAngle) + ",0,0)"; + } else if (d2.ca) { + t2 += " rotate(" + Math.floor(d2.ca) + ",0,0)"; } - return t; + return t2; } function update() { - const z = ~~context.map().zoom(); - const showViewfields = z >= minViewfieldZoom; + const z2 = ~~context.map().zoom(); + const showViewfields = z2 >= minViewfieldZoom2; const service = getService(); const image = service && service.getActiveImage(); - const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(image ? [image] : [], function(d) { - return d.id; + const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(image ? [image] : [], function(d2) { + return d2.id; }); groups.exit().remove(); const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group currentView highlighted"); @@ -48122,7 +52465,7 @@ ${content} const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary-position"); layerEnter.append("g").attr("class", "markers"); layer = layerEnter.merge(layer); - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); } else { @@ -48136,16 +52479,19 @@ ${content} drawImages.supported = function() { return !!getService(); }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; init2(); return drawImages; } // modules/svg/mapillary_signs.js - function svgMapillarySigns(projection2, context, dispatch10) { + function svgMapillarySigns(projection2, context, dispatch14) { const throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - const minZoom3 = 12; + const minZoom4 = 12; let layer = select_default2(null); let _mapillary; function init2() { @@ -48181,13 +52527,13 @@ ${content} layer.selectAll(".icon-sign").remove(); layer.style("display", "none"); } - function click(d3_event, d) { + function click(d3_event, d2) { const service = getService(); if (!service) return; - context.map().centerEase(d.loc); + context.map().centerEase(d2.loc); const selectedImageId = service.getActiveImage() && service.getActiveImage().id; - service.getDetections(d.id).then((detections) => { + service.getDetections(d2.id).then((detections) => { if (detections.length) { const imageId = detections[0].image.id; if (imageId === selectedImageId) { @@ -48222,13 +52568,13 @@ ${content} let data = service ? service.signs(projection2) : []; data = filterData(data); const transform2 = svgPointTransform(projection2); - const signs = layer.selectAll(".icon-sign").data(data, function(d) { - return d.id; + const signs = layer.selectAll(".icon-sign").data(data, function(d2) { + return d2.id; }); signs.exit().remove(); const enter = signs.enter().append("g").attr("class", "icon-sign icon-detected").on("click", click); - enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) { - return "#" + d.value; + enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d2) { + return "#" + d2.value; }); enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px"); signs.merge(enter).attr("transform", transform2); @@ -48240,7 +52586,7 @@ ${content} layer.exit().remove(); layer = layer.enter().append("g").attr("class", "layer-mapillary-signs layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer); if (enabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); service.loadSigns(projection2); @@ -48252,10 +52598,10 @@ ${content} service.showSignDetections(false); } } - drawSigns.enabled = function(_) { + drawSigns.enabled = function(_2) { if (!arguments.length) return svgMapillarySigns.enabled; - svgMapillarySigns.enabled = _; + svgMapillarySigns.enabled = _2; if (svgMapillarySigns.enabled) { showLayer(); context.photos().on("change.mapillary_signs", update); @@ -48263,22 +52609,25 @@ ${content} hideLayer(); context.photos().on("change.mapillary_signs", null); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawSigns.supported = function() { return !!getService(); }; + drawSigns.rendered = function(zoom) { + return zoom >= minZoom4; + }; init2(); return drawSigns; } // modules/svg/mapillary_map_features.js - function svgMapillaryMapFeatures(projection2, context, dispatch10) { + function svgMapillaryMapFeatures(projection2, context, dispatch14) { const throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - const minZoom3 = 12; + const minZoom4 = 12; let layer = select_default2(null); let _mapillary; function init2() { @@ -48314,13 +52663,13 @@ ${content} layer.selectAll(".icon-map-feature").remove(); layer.style("display", "none"); } - function click(d3_event, d) { + function click(d3_event, d2) { const service = getService(); if (!service) return; - context.map().centerEase(d.loc); + context.map().centerEase(d2.loc); const selectedImageId = service.getActiveImage() && service.getActiveImage().id; - service.getDetections(d.id).then((detections) => { + service.getDetections(d2.id).then((detections) => { if (detections.length) { const imageId = detections[0].image.id; if (imageId === selectedImageId) { @@ -48353,20 +52702,20 @@ ${content} let data = service ? service.mapFeatures(projection2) : []; data = filterData(data); const transform2 = svgPointTransform(projection2); - const mapFeatures = layer.selectAll(".icon-map-feature").data(data, function(d) { - return d.id; + const mapFeatures = layer.selectAll(".icon-map-feature").data(data, function(d2) { + return d2.id; }); mapFeatures.exit().remove(); const enter = mapFeatures.enter().append("g").attr("class", "icon-map-feature icon-detected").on("click", click); - enter.append("title").text(function(d) { - var id2 = d.value.replace(/--/g, ".").replace(/-/g, "_"); + enter.append("title").text(function(d2) { + var id2 = d2.value.replace(/--/g, ".").replace(/-/g, "_"); return _t("mapillary_map_features." + id2); }); - enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) { - if (d.value === "object--billboard") { + enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d2) { + if (d2.value === "object--billboard") { return "#object--sign--advertisement"; } - return "#" + d.value; + return "#" + d2.value; }); enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px"); mapFeatures.merge(enter).attr("transform", transform2); @@ -48378,7 +52727,7 @@ ${content} layer.exit().remove(); layer = layer.enter().append("g").attr("class", "layer-mapillary-map-features layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer); if (enabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); service.loadMapFeatures(projection2); @@ -48390,10 +52739,10 @@ ${content} service.showFeatureDetections(false); } } - drawMapFeatures.enabled = function(_) { + drawMapFeatures.enabled = function(_2) { if (!arguments.length) return svgMapillaryMapFeatures.enabled; - svgMapillaryMapFeatures.enabled = _; + svgMapillaryMapFeatures.enabled = _2; if (svgMapillaryMapFeatures.enabled) { showLayer(); context.photos().on("change.mapillary_map_features", update); @@ -48401,24 +52750,27 @@ ${content} hideLayer(); context.photos().on("change.mapillary_map_features", null); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawMapFeatures.supported = function() { return !!getService(); }; + drawMapFeatures.rendered = function(zoom) { + return zoom >= minZoom4; + }; init2(); return drawMapFeatures; } // modules/svg/kartaview_images.js - function svgKartaviewImages(projection2, context, dispatch10) { + function svgKartaviewImages(projection2, context, dispatch14) { var throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - var minZoom3 = 12; + var minZoom4 = 12; var minMarkerZoom = 16; - var minViewfieldZoom = 18; + var minViewfieldZoom2 = 18; var layer = select_default2(null); var _kartaview; function init2() { @@ -48442,7 +52794,7 @@ ${content} return; editOn(); layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function hideLayer() { @@ -48456,31 +52808,31 @@ ${content} layer.selectAll(".viewfield-group").remove(); layer.style("display", "none"); } - function click(d3_event, d) { + function click(d3_event, d2) { var service = getService(); if (!service) return; service.ensureViewerLoaded(context).then(function() { - service.selectImage(context, d.key).showViewer(context); + service.selectImage(context, d2.key).showViewer(context); }); - context.map().centerEase(d.loc); + context.map().centerEase(d2.loc); } - function mouseover(d3_event, d) { + function mouseover(d3_event, d2) { var service = getService(); if (service) - service.setStyles(context, d); + service.setStyles(context, d2); } function mouseout() { var service = getService(); if (service) service.setStyles(context, null); } - function transform2(d) { - var t = svgPointTransform(projection2)(d); - if (d.ca) { - t += " rotate(" + Math.floor(d.ca) + ",0,0)"; + function transform2(d2) { + var t2 = svgPointTransform(projection2)(d2); + if (d2.ca) { + t2 += " rotate(" + Math.floor(d2.ca) + ",0,0)"; } - return t; + return t2; } function filterImages(images) { var fromDate = context.photos().fromDate(); @@ -48531,9 +52883,9 @@ ${content} function update() { var viewer = context.container().select(".photoviewer"); var selected = viewer.empty() ? void 0 : viewer.datum(); - var z = ~~context.map().zoom(); - var showMarkers = z >= minMarkerZoom; - var showViewfields = z >= minViewfieldZoom; + var z2 = ~~context.map().zoom(); + var showMarkers = z2 >= minMarkerZoom; + var showViewfields = z2 >= minViewfieldZoom2; var service = getService(); var sequences = []; var images = []; @@ -48543,19 +52895,19 @@ ${content} sequences = filterSequences(sequences); images = filterImages(images); } - var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) { - return d.properties.key; + var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d2) { + return d2.properties.key; }); traces.exit().remove(); traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson); - var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) { - return d.key; + var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d2) { + return d2.key; }); groups.exit().remove(); var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click); groupsEnter.append("g").attr("class", "viewfield-scale"); - var markers = groups.merge(groupsEnter).sort(function(a, b) { - return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1]; + var markers = groups.merge(groupsEnter).sort(function(a2, b2) { + return a2 === selected ? 1 : b2 === selected ? -1 : b2.loc[1] - a2.loc[1]; }).attr("transform", transform2).select(".viewfield-scale"); markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); @@ -48571,7 +52923,7 @@ ${content} layerEnter.append("g").attr("class", "markers"); layer = layerEnter.merge(layer); if (enabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); update(); service.loadImages(projection2); @@ -48580,10 +52932,10 @@ ${content} } } } - drawImages.enabled = function(_) { + drawImages.enabled = function(_2) { if (!arguments.length) return svgKartaviewImages.enabled; - svgKartaviewImages.enabled = _; + svgKartaviewImages.enabled = _2; if (svgKartaviewImages.enabled) { showLayer(); context.photos().on("change.kartaview_images", update); @@ -48591,32 +52943,181 @@ ${content} hideLayer(); context.photos().on("change.kartaview_images", null); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawImages.supported = function() { return !!getService(); }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; + init2(); + return drawImages; + } + + // modules/svg/mapilio_images.js + function svgMapilioImages(projection2, context, dispatch14) { + const throttledRedraw = throttle_default(function() { + dispatch14.call("change"); + }, 1e3); + const minZoom4 = 12; + let layer = select_default2(null); + let _mapilio; + const viewFieldZoomLevel = 18; + function init2() { + if (svgMapilioImages.initialized) + return; + svgMapilioImages.enabled = false; + svgMapilioImages.initialized = true; + } + function getService() { + if (services.mapilio && !_mapilio) { + _mapilio = services.mapilio; + _mapilio.event.on("loadedImages", throttledRedraw); + } else if (!services.mapilio && _mapilio) { + _mapilio = null; + } + return _mapilio; + } + function showLayer() { + const service = getService(); + if (!service) + return; + editOn(); + layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() { + dispatch14.call("change"); + }); + } + function hideLayer() { + throttledRedraw.cancel(); + layer.transition().duration(250).style("opacity", 0).on("end", editOff); + } + function transform2(d2) { + let t2 = svgPointTransform(projection2)(d2); + if (d2.heading) { + t2 += " rotate(" + Math.floor(d2.heading) + ",0,0)"; + } + return t2; + } + function editOn() { + layer.style("display", "block"); + } + function editOff() { + layer.selectAll(".viewfield-group").remove(); + layer.style("display", "none"); + } + function click(d3_event, image) { + const service = getService(); + if (!service) + return; + service.ensureViewerLoaded(context, image.id).then(function() { + service.selectImage(context, image.id).showViewer(context); + }); + context.map().centerEase(image.loc); + } + function mouseover(d3_event, image) { + const service = getService(); + if (service) + service.setStyles(context, image); + } + function mouseout() { + const service = getService(); + if (service) + service.setStyles(context, null); + } + function update() { + const z2 = ~~context.map().zoom(); + const showViewfields = z2 >= viewFieldZoomLevel; + const service = getService(); + let sequences = service ? service.sequences(projection2) : []; + let images = service ? service.images(projection2) : []; + let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d2) { + return d2.properties.id; + }); + traces.exit().remove(); + traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson); + const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d2) { + return d2.id; + }); + groups.exit().remove(); + const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click); + groupsEnter.append("g").attr("class", "viewfield-scale"); + const markers = groups.merge(groupsEnter).sort(function(a2, b2) { + return b2.loc[1] - a2.loc[1]; + }).attr("transform", transform2).select(".viewfield-scale"); + markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6"); + const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []); + viewfields.exit().remove(); + viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath); + function viewfieldPath() { + if (this.parentNode.__data__.isPano) { + return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0"; + } else { + return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z"; + } + } + } + function drawImages(selection2) { + const enabled = svgMapilioImages.enabled; + const service = getService(); + layer = selection2.selectAll(".layer-mapilio").data(service ? [0] : []); + layer.exit().remove(); + const layerEnter = layer.enter().append("g").attr("class", "layer-mapilio").style("display", enabled ? "block" : "none"); + layerEnter.append("g").attr("class", "sequences"); + layerEnter.append("g").attr("class", "markers"); + layer = layerEnter.merge(layer); + if (enabled) { + if (service && ~~context.map().zoom() >= minZoom4) { + editOn(); + update(); + service.loadImages(projection2); + service.loadLines(projection2); + } else { + editOff(); + } + } + } + drawImages.enabled = function(_2) { + if (!arguments.length) + return svgMapilioImages.enabled; + svgMapilioImages.enabled = _2; + if (svgMapilioImages.enabled) { + showLayer(); + context.photos().on("change.mapilio_images", null); + } else { + hideLayer(); + context.photos().on("change.mapilio_images", null); + } + dispatch14.call("change"); + return this; + }; + drawImages.supported = function() { + return !!getService(); + }; + drawImages.rendered = function(zoom) { + return zoom >= minZoom4; + }; init2(); return drawImages; } // modules/svg/osm.js - function svgOsm(projection2, context, dispatch10) { + function svgOsm(projection2, context, dispatch14) { var enabled = true; function drawOsm(selection2) { - selection2.selectAll(".layer-osm").data(["covered", "areas", "lines", "points", "labels"]).enter().append("g").attr("class", function(d) { - return "layer-osm " + d; + selection2.selectAll(".layer-osm").data(["covered", "areas", "lines", "points", "labels"]).enter().append("g").attr("class", function(d2) { + return "layer-osm " + d2; }); - selection2.selectAll(".layer-osm.points").selectAll(".points-group").data(["points", "midpoints", "vertices", "turns"]).enter().append("g").attr("class", function(d) { - return "points-group " + d; + selection2.selectAll(".layer-osm.points").selectAll(".points-group").data(["points", "midpoints", "vertices", "turns"]).enter().append("g").attr("class", function(d2) { + return "points-group " + d2; }); } function showLayer() { var layer = context.surface().selectAll(".data-layer.osm"); layer.interrupt(); layer.classed("disabled", false).style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function hideLayer() { @@ -48624,7 +53125,7 @@ ${content} layer.interrupt(); layer.transition().duration(250).style("opacity", 0).on("end interrupt", function() { layer.classed("disabled", true); - dispatch10.call("change"); + dispatch14.call("change"); }); } drawOsm.enabled = function(val) { @@ -48636,7 +53137,7 @@ ${content} } else { hideLayer(); } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; return drawOsm; @@ -48645,14 +53146,14 @@ ${content} // modules/svg/notes.js var _notesEnabled = false; var _osmService; - function svgNotes(projection2, context, dispatch10) { - if (!dispatch10) { - dispatch10 = dispatch_default("change"); + function svgNotes(projection2, context, dispatch14) { + if (!dispatch14) { + dispatch14 = dispatch_default("change"); } var throttledRedraw = throttle_default(function() { - dispatch10.call("change"); + dispatch14.call("change"); }, 1e3); - var minZoom3 = 12; + var minZoom4 = 12; var touchLayer = select_default2(null); var drawLayer = select_default2(null); var _notesVisible = false; @@ -48685,7 +53186,7 @@ ${content} function layerOn() { editOn(); drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() { - dispatch10.call("change"); + dispatch14.call("change"); }); } function layerOff() { @@ -48694,7 +53195,7 @@ ${content} touchLayer.selectAll(".note").remove(); drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", function() { editOff(); - dispatch10.call("change"); + dispatch14.call("change"); }); } function updateMarkers() { @@ -48704,49 +53205,49 @@ ${content} var selectedID = context.selectedNoteID(); var data = service ? service.notes(projection2) : []; var getTransform = svgPointTransform(projection2); - var notes = drawLayer.selectAll(".note").data(data, function(d) { - return d.status + d.id; + var notes = drawLayer.selectAll(".note").data(data, function(d2) { + return d2.status + d2.id; }); notes.exit().remove(); - var notesEnter = notes.enter().append("g").attr("class", function(d) { - return "note note-" + d.id + " " + d.status; - }).classed("new", function(d) { - return d.id < 0; + var notesEnter = notes.enter().append("g").attr("class", function(d2) { + return "note note-" + d2.id + " " + d2.status; + }).classed("new", function(d2) { + return d2.id < 0; }); notesEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke"); notesEnter.append("path").call(markerPath, "shadow"); notesEnter.append("use").attr("class", "note-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-note"); - notesEnter.selectAll(".icon-annotation").data(function(d) { - return [d]; - }).enter().append("use").attr("class", "icon-annotation").attr("width", "10px").attr("height", "10px").attr("x", "-3px").attr("y", "-19px").attr("xlink:href", function(d) { - if (d.id < 0) + notesEnter.selectAll(".icon-annotation").data(function(d2) { + return [d2]; + }).enter().append("use").attr("class", "icon-annotation").attr("width", "10px").attr("height", "10px").attr("x", "-3px").attr("y", "-19px").attr("xlink:href", function(d2) { + if (d2.id < 0) return "#iD-icon-plus"; - if (d.status === "open") + if (d2.status === "open") return "#iD-icon-close"; return "#iD-icon-apply"; }); - notes.merge(notesEnter).sort(sortY).classed("selected", function(d) { + notes.merge(notesEnter).sort(sortY).classed("selected", function(d2) { var mode = context.mode(); var isMoving = mode && mode.id === "drag-note"; - return !isMoving && d.id === selectedID; + return !isMoving && d2.id === selectedID; }).attr("transform", getTransform); if (touchLayer.empty()) return; var fillClass = context.getDebug("target") ? "pink " : "nocolor "; - var targets = touchLayer.selectAll(".note").data(data, function(d) { - return d.id; + var targets = touchLayer.selectAll(".note").data(data, function(d2) { + return d2.id; }); targets.exit().remove(); - targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", function(d) { - var newClass = d.id < 0 ? "new" : ""; - return "note target note-" + d.id + " " + fillClass + newClass; + targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", function(d2) { + var newClass = d2.id < 0 ? "new" : ""; + return "note target note-" + d2.id + " " + fillClass + newClass; }).attr("transform", getTransform); - function sortY(a, b) { - if (a.id === selectedID) + function sortY(a2, b2) { + if (a2.id === selectedID) return 1; - if (b.id === selectedID) + if (b2.id === selectedID) return -1; - return b.loc[1] - a.loc[1]; + return b2.loc[1] - a2.loc[1]; } } function drawNotes(selection2) { @@ -48759,7 +53260,7 @@ ${content} drawLayer.exit().remove(); drawLayer = drawLayer.enter().append("g").attr("class", "layer-notes").style("display", _notesEnabled ? "block" : "none").merge(drawLayer); if (_notesEnabled) { - if (service && ~~context.map().zoom() >= minZoom3) { + if (service && ~~context.map().zoom() >= minZoom4) { editOn(); service.loadNotes(projection2); updateMarkers(); @@ -48780,7 +53281,7 @@ ${content} context.enter(modeBrowse(context)); } } - dispatch10.call("change"); + dispatch14.call("change"); return this; }; return drawNotes; @@ -48789,8 +53290,8 @@ ${content} // modules/svg/touch.js function svgTouch() { function drawTouch(selection2) { - selection2.selectAll(".layer-touch").data(["areas", "lines", "points", "turns", "markers"]).enter().append("g").attr("class", function(d) { - return "layer-touch " + d; + selection2.selectAll(".layer-touch").data(["areas", "lines", "points", "turns", "markers"]).enter().append("g").attr("class", function(d2) { + return "layer-touch " + d2; }); } return drawTouch; @@ -48824,24 +53325,27 @@ ${content} // modules/svg/layers.js function svgLayers(projection2, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var svg2 = select_default2(null); var _layers = [ - { id: "osm", layer: svgOsm(projection2, context, dispatch10) }, - { id: "notes", layer: svgNotes(projection2, context, dispatch10) }, - { id: "data", layer: svgData(projection2, context, dispatch10) }, - { id: "keepRight", layer: svgKeepRight(projection2, context, dispatch10) }, - { id: "improveOSM", layer: svgImproveOSM(projection2, context, dispatch10) }, - { id: "osmose", layer: svgOsmose(projection2, context, dispatch10) }, - { id: "streetside", layer: svgStreetside(projection2, context, dispatch10) }, - { id: "mapillary", layer: svgMapillaryImages(projection2, context, dispatch10) }, - { id: "mapillary-position", layer: svgMapillaryPosition(projection2, context, dispatch10) }, - { id: "mapillary-map-features", layer: svgMapillaryMapFeatures(projection2, context, dispatch10) }, - { id: "mapillary-signs", layer: svgMapillarySigns(projection2, context, dispatch10) }, - { id: "kartaview", layer: svgKartaviewImages(projection2, context, dispatch10) }, - { id: "debug", layer: svgDebug(projection2, context, dispatch10) }, - { id: "geolocate", layer: svgGeolocate(projection2, context, dispatch10) }, - { id: "touch", layer: svgTouch(projection2, context, dispatch10) } + { id: "osm", layer: svgOsm(projection2, context, dispatch14) }, + { id: "notes", layer: svgNotes(projection2, context, dispatch14) }, + { id: "data", layer: svgData(projection2, context, dispatch14) }, + { id: "keepRight", layer: svgKeepRight(projection2, context, dispatch14) }, + { id: "improveOSM", layer: svgImproveOSM(projection2, context, dispatch14) }, + { id: "osmose", layer: svgOsmose(projection2, context, dispatch14) }, + { id: "streetside", layer: svgStreetside(projection2, context, dispatch14) }, + { id: "mapillary", layer: svgMapillaryImages(projection2, context, dispatch14) }, + { id: "mapillary-position", layer: svgMapillaryPosition(projection2, context, dispatch14) }, + { id: "mapillary-map-features", layer: svgMapillaryMapFeatures(projection2, context, dispatch14) }, + { id: "mapillary-signs", layer: svgMapillarySigns(projection2, context, dispatch14) }, + { id: "kartaview", layer: svgKartaviewImages(projection2, context, dispatch14) }, + { id: "mapilio", layer: svgMapilioImages(projection2, context, dispatch14) }, + { id: "vegbilder", layer: svgVegbilder(projection2, context, dispatch14) }, + { id: "local-photos", layer: svgLocalPhotos(projection2, context, dispatch14) }, + { id: "debug", layer: svgDebug(projection2, context, dispatch14) }, + { id: "geolocate", layer: svgGeolocate(projection2, context, dispatch14) }, + { id: "touch", layer: svgTouch(projection2, context, dispatch14) } ]; function drawLayers(selection2) { svg2 = selection2.selectAll(".surface").data([0]); @@ -48850,18 +53354,18 @@ ${content} defs.enter().append("defs").attr("class", "surface-defs"); var groups = svg2.selectAll(".data-layer").data(_layers); groups.exit().remove(); - groups.enter().append("g").attr("class", function(d) { - return "data-layer " + d.id; - }).merge(groups).each(function(d) { - select_default2(this).call(d.layer); + groups.enter().append("g").attr("class", function(d2) { + return "data-layer " + d2.id; + }).merge(groups).each(function(d2) { + select_default2(this).call(d2.layer); }); } drawLayers.all = function() { return _layers; }; drawLayers.layer = function(id2) { - var obj = _layers.find(function(o) { - return o.id === id2; + var obj = _layers.find(function(o2) { + return o2.id === id2; }); return obj && obj.layer; }; @@ -48875,11 +53379,11 @@ ${content} drawLayers.remove = function(what) { var arr = [].concat(what); arr.forEach(function(id2) { - _layers = _layers.filter(function(o) { - return o.id !== id2; + _layers = _layers.filter(function(o2) { + return o2.id !== id2; }); }); - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawLayers.add = function(what) { @@ -48889,7 +53393,7 @@ ${content} _layers.push(obj); } }); - dispatch10.call("change"); + dispatch14.call("change"); return this; }; drawLayers.dimensions = function(val) { @@ -48898,7 +53402,7 @@ ${content} utilSetDimensions(svg2, val); return this; }; - return utilRebind(drawLayers, dispatch10, "on"); + return utilRebind(drawLayers, dispatch14, "on"); } // modules/svg/lines.js @@ -48927,51 +53431,51 @@ ${content} var base = context.history().base(); var data = { targets: [], nopes: [] }; entities.forEach(function(way) { - var features2 = svgSegmentWay(way, graph, activeID); - data.targets.push.apply(data.targets, features2.passive); - data.nopes.push.apply(data.nopes, features2.active); + var features = svgSegmentWay(way, graph, activeID); + data.targets.push.apply(data.targets, features.passive); + data.nopes.push.apply(data.nopes, features.active); }); var targetData = data.targets.filter(getPath); - var targets = selection2.selectAll(".line.target-allowed").filter(function(d) { - return filter2(d.properties.entity); - }).data(targetData, function key(d) { - return d.id; + var targets = selection2.selectAll(".line.target-allowed").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(targetData, function key(d2) { + return d2.id; }); targets.exit().remove(); - var segmentWasEdited = function(d) { - var wayID = d.properties.entity.id; + var segmentWasEdited = function(d2) { + var wayID = d2.properties.entity.id; if (!base.entities[wayID] || !(0, import_fast_deep_equal6.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) { return false; } - return d.properties.nodes.some(function(n2) { - return !base.entities[n2.id] || !(0, import_fast_deep_equal6.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc); + return d2.properties.nodes.some(function(n3) { + return !base.entities[n3.id] || !(0, import_fast_deep_equal6.default)(graph.entities[n3.id].loc, base.entities[n3.id].loc); }); }; - targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) { - return "way line target target-allowed " + targetClass + d.id; + targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d2) { + return "way line target target-allowed " + targetClass + d2.id; }).classed("segment-edited", segmentWasEdited); var nopeData = data.nopes.filter(getPath); - var nopes = selection2.selectAll(".line.target-nope").filter(function(d) { - return filter2(d.properties.entity); - }).data(nopeData, function key(d) { - return d.id; + var nopes = selection2.selectAll(".line.target-nope").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(nopeData, function key(d2) { + return d2.id; }); nopes.exit().remove(); - nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) { - return "way line target target-nope " + nopeClass + d.id; + nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d2) { + return "way line target target-nope " + nopeClass + d2.id; }).classed("segment-edited", segmentWasEdited); } function drawLines(selection2, graph, entities, filter2) { var base = context.history().base(); - function waystack(a, b) { + function waystack(a2, b2) { var selected = context.selectedIDs(); - var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0; - var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0; - if (a.tags.highway) { - scoreA -= highway_stack[a.tags.highway]; + var scoreA = selected.indexOf(a2.id) !== -1 ? 20 : 0; + var scoreB = selected.indexOf(b2.id) !== -1 ? 20 : 0; + if (a2.tags.highway) { + scoreA -= highway_stack[a2.tags.highway]; } - if (b.tags.highway) { - scoreB -= highway_stack[b.tags.highway]; + if (b2.tags.highway) { + scoreB -= highway_stack[b2.tags.highway]; } return scoreA - scoreB; } @@ -48981,25 +53485,26 @@ ${content} var selectedClass = !isDrawing && isSelected ? "selected " : ""; var lines = selection3.selectAll("path").filter(filter2).data(getPathData(isSelected), osmEntity.key); lines.exit().remove(); - lines.enter().append("path").attr("class", function(d) { + lines.enter().append("path").attr("class", function(d2) { var prefix = "way line"; - if (!d.hasInterestingTags()) { - var parentRelations = graph.parentRelations(d); + if (!d2.hasInterestingTags()) { + var parentRelations = graph.parentRelations(d2); var parentMultipolygons = parentRelations.filter(function(relation) { return relation.isMultipolygon(); }); - if (parentMultipolygons.length > 0 && parentRelations.length === parentMultipolygons.length) { + if (parentMultipolygons.length > 0 && // and only multipolygon relations + parentRelations.length === parentMultipolygons.length) { prefix = "relation area"; } } - var oldMPClass = oldMultiPolygonOuters[d.id] ? "old-multipolygon " : ""; - return prefix + " " + klass + " " + selectedClass + oldMPClass + d.id; - }).classed("added", function(d) { - return !base.entities[d.id]; - }).classed("geometry-edited", function(d) { - return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes); - }).classed("retagged", function(d) { - return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].tags, base.entities[d.id].tags); + var oldMPClass = oldMultiPolygonOuters[d2.id] ? "old-multipolygon " : ""; + return prefix + " " + klass + " " + selectedClass + oldMPClass + d2.id; + }).classed("added", function(d2) { + return !base.entities[d2.id]; + }).classed("geometry-edited", function(d2) { + return graph.entities[d2.id] && base.entities[d2.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d2.id].nodes, base.entities[d2.id].nodes); + }).classed("retagged", function(d2) { + return graph.entities[d2.id] && base.entities[d2.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d2.id].tags, base.entities[d2.id].tags); }).call(svgTagClasses()).merge(lines).sort(waystack).attr("d", getPath).call(svgTagClasses().tags(svgRelationMemberTags(graph))); return selection3; } @@ -49007,11 +53512,11 @@ ${content} return function() { var layer = this.parentNode.__data__; var data = pathdata[layer] || []; - return data.filter(function(d) { + return data.filter(function(d2) { if (isSelected) { - return context.selectedIDs().indexOf(d.id) !== -1; + return context.selectedIDs().indexOf(d2.id) !== -1; } else { - return context.selectedIDs().indexOf(d.id) === -1; + return context.selectedIDs().indexOf(d2.id) === -1; } }); }; @@ -49023,13 +53528,13 @@ ${content} function data() { return groupdata[this.parentNode.__data__] || []; }, - function key(d) { - return [d.id, d.index]; + function key(d2) { + return [d2.id, d2.index]; } ); markers.exit().remove(); - markers = markers.enter().append("path").attr("class", pathclass).merge(markers).attr("marker-mid", marker).attr("d", function(d) { - return d.d; + markers = markers.enter().append("path").attr("class", pathclass).merge(markers).attr("marker-mid", marker).attr("d", function(d2) { + return d2.d; }); if (detected.ie) { markers.each(function() { @@ -49042,8 +53547,8 @@ ${content} var onewaydata = {}; var sideddata = {}; var oldMultiPolygonOuters = {}; - for (var i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; + for (var i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; var outer = osmOldMultipolygonOuterMember(entity, graph); if (outer) { ways.push(entity.mergeTags(outer.tags)); @@ -49056,10 +53561,10 @@ ${content} var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); }); - Object.keys(pathdata).forEach(function(k) { - var v = pathdata[k]; - var onewayArr = v.filter(function(d) { - return d.isOneWay(); + Object.keys(pathdata).forEach(function(k2) { + var v2 = pathdata[k2]; + var onewayArr = v2.filter(function(d2) { + return d2.isOneWay(); }); var onewaySegments = svgMarkerSegments( projection2, @@ -49072,9 +53577,9 @@ ${content} return entity2.tags.oneway === "reversible" || entity2.tags.oneway === "alternating"; } ); - onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments)); - var sidedArr = v.filter(function(d) { - return d.isSided(); + onewaydata[k2] = utilArrayFlatten(onewayArr.map(onewaySegments)); + var sidedArr = v2.filter(function(d2) { + return d2.isSided(); }); var sidedSegments = svgMarkerSegments( projection2, @@ -49087,7 +53592,7 @@ ${content} return false; } ); - sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments)); + sideddata[k2] = utilArrayFlatten(sidedArr.map(sidedSegments)); }); var covered = selection2.selectAll(".layer-osm.covered"); var uncovered = selection2.selectAll(".layer-osm.lines"); @@ -49095,11 +53600,11 @@ ${content} [covered, uncovered].forEach(function(selection3) { var range3 = selection3 === covered ? range(-10, 0) : range(0, 11); var layergroup = selection3.selectAll("g.layergroup").data(range3); - layergroup = layergroup.enter().append("g").attr("class", function(d) { - return "layergroup layer" + String(d); + layergroup = layergroup.enter().append("g").attr("class", function(d2) { + return "layergroup layer" + String(d2); }).merge(layergroup); - layergroup.selectAll("g.linegroup").data(["shadow", "casing", "stroke", "shadow-highlighted", "casing-highlighted", "stroke-highlighted"]).enter().append("g").attr("class", function(d) { - return "linegroup line-" + d; + layergroup.selectAll("g.linegroup").data(["shadow", "casing", "stroke", "shadow-highlighted", "casing-highlighted", "stroke-highlighted"]).enter().append("g").attr("class", function(d2) { + return "linegroup line-" + d2; }); layergroup.selectAll("g.line-shadow").call(drawLineGroup, "shadow", false); layergroup.selectAll("g.line-casing").call(drawLineGroup, "casing", false); @@ -49113,8 +53618,8 @@ ${content} "sided", "sidedgroup", sideddata, - function marker(d) { - var category = graph.entity(d.id).sidednessIdentifier(); + function marker(d2) { + var category = graph.entity(d2.id).sidednessIdentifier(); return "url(#ideditor-sided-marker-" + category + ")"; } ); @@ -49144,14 +53649,14 @@ ${content} } }; }); - var targets = selection2.selectAll(".midpoint.target").filter(function(d) { - return filter2(d.properties.entity); - }).data(data, function key(d) { - return d.id; + var targets = selection2.selectAll(".midpoint.target").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(data, function key(d2) { + return d2.id; }); targets.exit().remove(); - targets.enter().append("circle").attr("r", targetRadius).merge(targets).attr("class", function(d) { - return "node midpoint target " + fillClass + d.id; + targets.enter().append("circle").attr("r", targetRadius).merge(targets).attr("class", function(d2) { + return "node midpoint target " + fillClass + d2.id; }).attr("transform", getTransform); } function drawMidpoints(selection2, graph, entities, filter2, extent) { @@ -49165,8 +53670,8 @@ ${content} } var poly = extent.polygon(); var midpoints = {}; - for (var i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; + for (var i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; if (entity.type !== "way") continue; if (!filter2(entity)) @@ -49174,22 +53679,22 @@ ${content} if (context.selectedIDs().indexOf(entity.id) < 0) continue; var nodes = graph.childNodes(entity); - for (var j2 = 0; j2 < nodes.length - 1; j2++) { - var a = nodes[j2]; - var b = nodes[j2 + 1]; - var id2 = [a.id, b.id].sort().join("-"); + for (var j3 = 0; j3 < nodes.length - 1; j3++) { + var a2 = nodes[j3]; + var b2 = nodes[j3 + 1]; + var id2 = [a2.id, b2.id].sort().join("-"); if (midpoints[id2]) { midpoints[id2].parents.push(entity); - } else if (geoVecLength(projection2(a.loc), projection2(b.loc)) > 40) { - var point = geoVecInterp(a.loc, b.loc, 0.5); + } else if (geoVecLength(projection2(a2.loc), projection2(b2.loc)) > 40) { + var point2 = geoVecInterp(a2.loc, b2.loc, 0.5); var loc = null; - if (extent.intersects(point)) { - loc = point; + if (extent.intersects(point2)) { + loc = point2; } else { - for (var k = 0; k < 4; k++) { - point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]); - if (point && geoVecLength(projection2(a.loc), projection2(point)) > 20 && geoVecLength(projection2(b.loc), projection2(point)) > 20) { - loc = point; + for (var k2 = 0; k2 < 4; k2++) { + point2 = geoLineIntersection([a2.loc, b2.loc], [poly[k2], poly[k2 + 1]]); + if (point2 && geoVecLength(projection2(a2.loc), projection2(point2)) > 20 && geoVecLength(projection2(b2.loc), projection2(point2)) > 20) { + loc = point2; break; } } @@ -49199,39 +53704,39 @@ ${content} type: "midpoint", id: id2, loc, - edge: [a.id, b.id], + edge: [a2.id, b2.id], parents: [entity] }; } } } } - function midpointFilter(d) { - if (midpoints[d.id]) + function midpointFilter(d2) { + if (midpoints[d2.id]) return true; - for (var i3 = 0; i3 < d.parents.length; i3++) { - if (filter2(d.parents[i3])) { + for (var i4 = 0; i4 < d2.parents.length; i4++) { + if (filter2(d2.parents[i4])) { return true; } } return false; } - var groups = drawLayer.selectAll(".midpoint").filter(midpointFilter).data(Object.values(midpoints), function(d) { - return d.id; + var groups = drawLayer.selectAll(".midpoint").filter(midpointFilter).data(Object.values(midpoints), function(d2) { + return d2.id; }); groups.exit().remove(); var enter = groups.enter().insert("g", ":first-child").attr("class", "midpoint"); enter.append("polygon").attr("points", "-6,8 10,0 -6,-8").attr("class", "shadow"); enter.append("polygon").attr("points", "-3,4 5,0 -3,-4").attr("class", "fill"); - groups = groups.merge(enter).attr("transform", function(d) { + groups = groups.merge(enter).attr("transform", function(d2) { var translate = svgPointTransform(projection2); - var a2 = graph.entity(d.edge[0]); - var b2 = graph.entity(d.edge[1]); - var angle2 = geoAngle(a2, b2, projection2) * (180 / Math.PI); - return translate(d) + " rotate(" + angle2 + ")"; + var a3 = graph.entity(d2.edge[0]); + var b3 = graph.entity(d2.edge[1]); + var angle2 = geoAngle(a3, b3, projection2) * (180 / Math.PI); + return translate(d2) + " rotate(" + angle2 + ")"; }).call(svgTagClasses().tags( - function(d) { - return d.parents[0].tags; + function(d2) { + return d2.parents[0].tags; } )); groups.select("polygon.shadow"); @@ -49247,13 +53752,13 @@ ${content} function markerPath(selection2, klass) { selection2.attr("class", klass).attr("transform", "translate(-8, -23)").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"); } - function sortY(a, b) { - return b.loc[1] - a.loc[1]; + function sortY(a2, b2) { + return b2.loc[1] - a2.loc[1]; } - function fastEntityKey(d) { + function fastEntityKey(d2) { var mode = context.mode(); var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id); - return isMoving ? d.id : osmEntity.key(d); + return isMoving ? d2.id : osmEntity.key(d2); } function drawTargets(selection2, graph, entities, filter2) { var fillClass = context.getDebug("target") ? "pink " : "nocolor "; @@ -49273,14 +53778,14 @@ ${content} geometry: node.asGeoJSON() }); }); - var targets = selection2.selectAll(".point.target").filter(function(d) { - return filter2(d.properties.entity); - }).data(data, function key(d) { - return d.id; + var targets = selection2.selectAll(".point.target").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(data, function key(d2) { + return d2.id; }); targets.exit().remove(); - targets.enter().append("rect").attr("x", -10).attr("y", -26).attr("width", 20).attr("height", 30).merge(targets).attr("class", function(d) { - return "node point target " + fillClass + d.id; + targets.enter().append("rect").attr("x", -10).attr("y", -26).attr("width", 20).attr("height", 30).merge(targets).attr("class", function(d2) { + return "node point target " + fillClass + d2.id; }).attr("transform", getTransform); } function drawPoints(selection2, graph, entities, filter2) { @@ -49296,19 +53801,19 @@ ${content} var touchLayer = selection2.selectAll(".layer-touch.points"); var groups = drawLayer.selectAll("g.point").filter(filter2).data(points, fastEntityKey); groups.exit().remove(); - var enter = groups.enter().append("g").attr("class", function(d) { - return "node point " + d.id; + var enter = groups.enter().append("g").attr("class", function(d2) { + return "node point " + d2.id; }).order(); enter.append("path").call(markerPath, "shadow"); enter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke"); enter.append("path").call(markerPath, "stroke"); enter.append("use").attr("transform", "translate(-5.5, -20)").attr("class", "icon").attr("width", "12px").attr("height", "12px"); - groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("added", function(d) { - return !base.entities[d.id]; - }).classed("moved", function(d) { - return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].loc, base.entities[d.id].loc); - }).classed("retagged", function(d) { - return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].tags, base.entities[d.id].tags); + groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("added", function(d2) { + return !base.entities[d2.id]; + }).classed("moved", function(d2) { + return base.entities[d2.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d2.id].loc, base.entities[d2.id].loc); + }).classed("retagged", function(d2) { + return base.entities[d2.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d2.id].tags, base.entities[d2.id].tags); }).call(svgTagClasses()); groups.select(".shadow"); groups.select(".stroke"); @@ -49325,68 +53830,68 @@ ${content} // modules/svg/turns.js function svgTurns(projection2, context) { function icon2(turn) { - var u = turn.u ? "-u" : ""; + var u2 = turn.u ? "-u" : ""; if (turn.no) - return "#iD-turn-no" + u; + return "#iD-turn-no" + u2; if (turn.only) - return "#iD-turn-only" + u; - return "#iD-turn-yes" + u; + return "#iD-turn-only" + u2; + return "#iD-turn-yes" + u2; } function drawTurns(selection2, graph, turns) { - function turnTransform(d) { + function turnTransform(d2) { var pxRadius = 50; - var toWay = graph.entity(d.to.way); - var toPoints = graph.childNodes(toWay).map(function(n2) { - return n2.loc; + var toWay = graph.entity(d2.to.way); + var toPoints = graph.childNodes(toWay).map(function(n3) { + return n3.loc; }).map(projection2); var toLength = geoPathLength(toPoints); var mid = toLength / 2; - var toNode = graph.entity(d.to.node); - var toVertex = graph.entity(d.to.vertex); - var a = geoAngle(toVertex, toNode, projection2); - var o = projection2(toVertex.loc); - var r = d.u ? 0 : !toWay.__via ? pxRadius : Math.min(mid, pxRadius); - return "translate(" + (r * Math.cos(a) + o[0]) + "," + (r * Math.sin(a) + o[1]) + ") rotate(" + a * 180 / Math.PI + ")"; + var toNode = graph.entity(d2.to.node); + var toVertex = graph.entity(d2.to.vertex); + var a2 = geoAngle(toVertex, toNode, projection2); + var o2 = projection2(toVertex.loc); + var r2 = d2.u ? 0 : !toWay.__via ? pxRadius : Math.min(mid, pxRadius); + return "translate(" + (r2 * Math.cos(a2) + o2[0]) + "," + (r2 * Math.sin(a2) + o2[1]) + ") rotate(" + a2 * 180 / Math.PI + ")"; } var drawLayer = selection2.selectAll(".layer-osm.points .points-group.turns"); var touchLayer = selection2.selectAll(".layer-touch.turns"); - var groups = drawLayer.selectAll("g.turn").data(turns, function(d) { - return d.key; + var groups = drawLayer.selectAll("g.turn").data(turns, function(d2) { + return d2.key; }); groups.exit().remove(); - var groupsEnter = groups.enter().append("g").attr("class", function(d) { - return "turn " + d.key; + var groupsEnter = groups.enter().append("g").attr("class", function(d2) { + return "turn " + d2.key; }); - var turnsEnter = groupsEnter.filter(function(d) { - return !d.u; + var turnsEnter = groupsEnter.filter(function(d2) { + return !d2.u; }); turnsEnter.append("rect").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24"); turnsEnter.append("use").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24"); - var uEnter = groupsEnter.filter(function(d) { - return d.u; + var uEnter = groupsEnter.filter(function(d2) { + return d2.u; }); uEnter.append("circle").attr("r", "16"); uEnter.append("use").attr("transform", "translate(-16, -16)").attr("width", "32").attr("height", "32"); - groups = groups.merge(groupsEnter).attr("opacity", function(d) { - return d.direct === false ? "0.7" : null; + groups = groups.merge(groupsEnter).attr("opacity", function(d2) { + return d2.direct === false ? "0.7" : null; }).attr("transform", turnTransform); groups.select("use").attr("xlink:href", icon2); groups.select("rect"); groups.select("circle"); var fillClass = context.getDebug("target") ? "pink " : "nocolor "; - groups = touchLayer.selectAll("g.turn").data(turns, function(d) { - return d.key; + groups = touchLayer.selectAll("g.turn").data(turns, function(d2) { + return d2.key; }); groups.exit().remove(); - groupsEnter = groups.enter().append("g").attr("class", function(d) { - return "turn " + d.key; + groupsEnter = groups.enter().append("g").attr("class", function(d2) { + return "turn " + d2.key; }); - turnsEnter = groupsEnter.filter(function(d) { - return !d.u; + turnsEnter = groupsEnter.filter(function(d2) { + return !d2.u; }); turnsEnter.append("rect").attr("class", "target " + fillClass).attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24"); - uEnter = groupsEnter.filter(function(d) { - return d.u; + uEnter = groupsEnter.filter(function(d2) { + return d2.u; }); uEnter.append("circle").attr("class", "target " + fillClass).attr("r", "16"); groups = groups.merge(groupsEnter).attr("transform", turnTransform); @@ -49401,6 +53906,7 @@ ${content} var import_fast_deep_equal8 = __toESM(require_fast_deep_equal()); function svgVertices(projection2, context) { var radiuses = { + // z16-, z17, z18+, w/icon shadow: [6, 7.5, 7.5, 12], stroke: [2.5, 3.5, 3.5, 8], fill: [1, 1.5, 1.5, 1.5] @@ -49412,13 +53918,13 @@ ${content} var _currSelected = {}; var _prevSelected = {}; var _radii = {}; - function sortY(a, b) { - return b.loc[1] - a.loc[1]; + function sortY(a2, b2) { + return b2.loc[1] - a2.loc[1]; } - function fastEntityKey(d) { + function fastEntityKey(d2) { var mode = context.mode(); var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id); - return isMoving ? d.id : osmEntity.key(d); + return isMoving ? d2.id : osmEntity.key(d2); } function draw(selection2, graph, vertices, sets2, filter2) { sets2 = sets2 || { selected: {}, important: {}, hovered: {} }; @@ -49426,11 +53932,11 @@ ${content} var directions = {}; var wireframe = context.surface().classed("fill-wireframe"); var zoom = geoScaleToZoom(projection2.scale()); - var z = zoom < 17 ? 0 : zoom < 18 ? 1 : 2; + var z2 = zoom < 17 ? 0 : zoom < 18 ? 1 : 2; var activeID = context.activeID(); var base = context.history().base(); - function getIcon(d) { - var entity = graph.entity(d.id); + function getIcon(d2) { + var entity = graph.entity(d2.id); if (entity.id in icons) return icons[entity.id]; icons[entity.id] = entity.hasInterestingTags() && _mainPresetIndex.match(entity, graph).icon; @@ -49447,61 +53953,61 @@ ${content} ["shadow", "stroke", "fill"].forEach(function(klass) { var rads = radiuses[klass]; selection3.selectAll("." + klass).each(function(entity) { - var i2 = z && getIcon(entity); - var r = rads[i2 ? 3 : z]; + var i3 = z2 && getIcon(entity); + var r2 = rads[i3 ? 3 : z2]; if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) { - r += 1.5; + r2 += 1.5; } if (klass === "shadow") { - _radii[entity.id] = r; + _radii[entity.id] = r2; } - select_default2(this).attr("r", r).attr("visibility", i2 && klass === "fill" ? "hidden" : null); + select_default2(this).attr("r", r2).attr("visibility", i3 && klass === "fill" ? "hidden" : null); }); }); } vertices.sort(sortY); var groups = selection2.selectAll("g.vertex").filter(filter2).data(vertices, fastEntityKey); groups.exit().remove(); - var enter = groups.enter().append("g").attr("class", function(d) { - return "node vertex " + d.id; + var enter = groups.enter().append("g").attr("class", function(d2) { + return "node vertex " + d2.id; }).order(); enter.append("circle").attr("class", "shadow"); enter.append("circle").attr("class", "stroke"); - enter.filter(function(d) { - return d.hasInterestingTags(); + enter.filter(function(d2) { + return d2.hasInterestingTags(); }).append("circle").attr("class", "fill"); - groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("sibling", function(d) { - return d.id in sets2.selected; - }).classed("shared", function(d) { - return graph.isShared(d); - }).classed("endpoint", function(d) { - return d.isEndpoint(graph); - }).classed("added", function(d) { - return !base.entities[d.id]; - }).classed("moved", function(d) { - return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].loc, base.entities[d.id].loc); - }).classed("retagged", function(d) { - return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].tags, base.entities[d.id].tags); + groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("sibling", function(d2) { + return d2.id in sets2.selected; + }).classed("shared", function(d2) { + return graph.isShared(d2); + }).classed("endpoint", function(d2) { + return d2.isEndpoint(graph); + }).classed("added", function(d2) { + return !base.entities[d2.id]; + }).classed("moved", function(d2) { + return base.entities[d2.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d2.id].loc, base.entities[d2.id].loc); + }).classed("retagged", function(d2) { + return base.entities[d2.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d2.id].tags, base.entities[d2.id].tags); }).call(updateAttributes); - var iconUse = groups.selectAll(".icon").data(function data(d) { - return zoom >= 17 && getIcon(d) ? [d] : []; + var iconUse = groups.selectAll(".icon").data(function data(d2) { + return zoom >= 17 && getIcon(d2) ? [d2] : []; }, fastEntityKey); iconUse.exit().remove(); - iconUse.enter().append("use").attr("class", "icon").attr("width", "12px").attr("height", "12px").attr("transform", "translate(-6, -6)").attr("xlink:href", function(d) { - var picon = getIcon(d); + iconUse.enter().append("use").attr("class", "icon").attr("width", "12px").attr("height", "12px").attr("transform", "translate(-6, -6)").attr("xlink:href", function(d2) { + var picon = getIcon(d2); return picon ? "#" + picon : ""; }); - var dgroups = groups.selectAll(".viewfieldgroup").data(function data(d) { - return zoom >= 18 && getDirections(d) ? [d] : []; + var dgroups = groups.selectAll(".viewfieldgroup").data(function data(d2) { + return zoom >= 18 && getDirections(d2) ? [d2] : []; }, fastEntityKey); dgroups.exit().remove(); dgroups = dgroups.enter().insert("g", ".shadow").attr("class", "viewfieldgroup").merge(dgroups); - var viewfields = dgroups.selectAll(".viewfield").data(getDirections, function key(d) { - return osmEntity.key(d); + var viewfields = dgroups.selectAll(".viewfield").data(getDirections, function key(d2) { + return osmEntity.key(d2); }); viewfields.exit().remove(); - viewfields.enter().append("path").attr("class", "viewfield").attr("d", "M0,0H0").merge(viewfields).attr("marker-start", "url(#ideditor-viewfield-marker" + (wireframe ? "-wireframe" : "") + ")").attr("transform", function(d) { - return "rotate(" + d + ")"; + viewfields.enter().append("path").attr("class", "viewfield").attr("d", "M0,0H0").merge(viewfields).attr("marker-start", "url(#ideditor-viewfield-marker" + (wireframe ? "-wireframe" : "") + ")").attr("transform", function(d2) { + return "rotate(" + d2 + ")"; }); } function drawTargets(selection2, graph, entities, filter2) { @@ -49537,27 +54043,27 @@ ${content} }); } }); - var targets = selection2.selectAll(".vertex.target-allowed").filter(function(d) { - return filter2(d.properties.entity); - }).data(data.targets, function key(d) { - return d.id; + var targets = selection2.selectAll(".vertex.target-allowed").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(data.targets, function key(d2) { + return d2.id; }); targets.exit().remove(); - targets.enter().append("circle").attr("r", function(d) { - return _radii[d.id] || radiuses.shadow[3]; - }).merge(targets).attr("class", function(d) { - return "node vertex target target-allowed " + targetClass + d.id; + targets.enter().append("circle").attr("r", function(d2) { + return _radii[d2.id] || radiuses.shadow[3]; + }).merge(targets).attr("class", function(d2) { + return "node vertex target target-allowed " + targetClass + d2.id; }).attr("transform", getTransform); - var nopes = selection2.selectAll(".vertex.target-nope").filter(function(d) { - return filter2(d.properties.entity); - }).data(data.nopes, function key(d) { - return d.id; + var nopes = selection2.selectAll(".vertex.target-nope").filter(function(d2) { + return filter2(d2.properties.entity); + }).data(data.nopes, function key(d2) { + return d2.id; }); nopes.exit().remove(); - nopes.enter().append("circle").attr("r", function(d) { - return _radii[d.properties.entity.id] || radiuses.shadow[3]; - }).merge(nopes).attr("class", function(d) { - return "node vertex target target-nope " + nopeClass + d.id; + nopes.enter().append("circle").attr("r", function(d2) { + return _radii[d2.properties.entity.id] || radiuses.shadow[3]; + }).merge(nopes).attr("class", function(d2) { + return "node vertex target target-nope " + nopeClass + d2.id; }).attr("transform", getTransform); } function renderAsVertex(entity, graph, wireframe, zoom) { @@ -49578,17 +54084,17 @@ ${content} seenIds[entity.id] = true; var geometry = entity.geometry(graph); if (!context.features().isHiddenFeature(entity, graph, geometry)) { - var i2; + var i3; if (entity.type === "way") { - for (i2 = 0; i2 < entity.nodes.length; i2++) { - var child = graph.hasEntity(entity.nodes[i2]); + for (i3 = 0; i3 < entity.nodes.length; i3++) { + var child = graph.hasEntity(entity.nodes[i3]); if (child) { addChildVertices(child); } } } else if (entity.type === "relation") { - for (i2 = 0; i2 < entity.members.length; i2++) { - var member = graph.hasEntity(entity.members[i2].id); + for (i3 = 0; i3 < entity.members.length; i3++) { + var member = graph.hasEntity(entity.members[i3].id); if (member) { addChildVertices(member); } @@ -49628,8 +54134,8 @@ ${content} _currPersistent = {}; _radii = {}; } - for (var i2 = 0; i2 < entities.length; i2++) { - var entity = entities[i2]; + for (var i3 = 0; i3 < entities.length; i3++) { + var entity = entities[i3]; var geometry = entity.geometry(graph); var keep = false; if (geometry === "point" && renderAsVertex(entity, graph, wireframe, zoom)) { @@ -49645,16 +54151,19 @@ ${content} } var sets2 = { persistent: _currPersistent, + // persistent = important vertices (render always) selected: _currSelected, + // selected + siblings of selected (render always) hovered: _currHover + // hovered + siblings of hovered (render only in draw modes) }; var all = Object.assign({}, isMoving ? _currHover : {}, _currSelected, _currPersistent); - var filterRendered = function(d) { - return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter2(d); + var filterRendered = function(d2) { + return d2.id in _currPersistent || d2.id in _currSelected || d2.id in _currHover || filter2(d2); }; drawLayer.call(draw, graph, currentVisible(all), sets2, filterRendered); - var filterTouch = function(d) { - return isMoving ? true : filterRendered(d); + var filterTouch = function(d2) { + return isMoving ? true : filterRendered(d2); }; touchLayer.call(drawTargets, graph, currentVisible(all), filterTouch); function currentVisible(which) { @@ -49682,8 +54191,8 @@ ${content} } else { _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom); } - var filter2 = function(d) { - return d.id in _prevSelected; + var filter2 = function(d2) { + return d2.id in _prevSelected; }; drawVertices(selection2, graph, Object.values(_prevSelected), filter2, extent, false); }; @@ -49700,8 +54209,8 @@ ${content} } else { _currHover = {}; } - var filter2 = function(d) { - return d.id in _prevHover; + var filter2 = function(d2) { + return d2.id in _prevHover; }; drawVertices(selection2, graph, Object.values(_prevHover), filter2, extent, false); }; @@ -49709,8 +54218,8 @@ ${content} } // modules/util/bind_once.js - function utilBindOnce(target, type3, listener, capture) { - var typeOnce = type3 + ".once"; + function utilBindOnce(target, type2, listener, capture) { + var typeOnce = type2 + ".once"; function one2() { target.on(typeOnce, null); listener.apply(this, arguments); @@ -49724,16 +54233,16 @@ ${content} return !d3_event.ctrlKey && !d3_event.button; } function defaultExtent2() { - var e = this; - if (e instanceof SVGElement) { - e = e.ownerSVGElement || e; - if (e.hasAttribute("viewBox")) { - e = e.viewBox.baseVal; - return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + var e3 = this; + if (e3 instanceof SVGElement) { + e3 = e3.ownerSVGElement || e3; + if (e3.hasAttribute("viewBox")) { + e3 = e3.viewBox.baseVal; + return [[e3.x, e3.y], [e3.x + e3.width, e3.y + e3.height]]; } - return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + return [[0, 0], [e3.width.baseVal.value, e3.height.baseVal.value]]; } - return [[0, 0], [e.clientWidth, e.clientHeight]]; + return [[0, 0], [e3.clientWidth, e3.clientHeight]]; } function defaultWheelDelta2(d3_event) { return -d3_event.deltaY * (d3_event.deltaMode === 1 ? 0.05 : d3_event.deltaMode ? 1 : 2e-3); @@ -49746,77 +54255,77 @@ ${content} ); } function utilZoomPan() { - var filter2 = defaultFilter3, extent = defaultExtent2, constrain = defaultConstrain2, wheelDelta = defaultWheelDelta2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], interpolate = zoom_default, dispatch10 = dispatch_default("start", "zoom", "end"), _wheelDelay = 150, _transform = identity2, _activeGesture; + var filter2 = defaultFilter3, extent = defaultExtent2, constrain = defaultConstrain2, wheelDelta = defaultWheelDelta2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], interpolate = zoom_default, dispatch14 = dispatch_default("start", "zoom", "end"), _wheelDelay = 150, _transform = identity2, _activeGesture; function zoom(selection2) { selection2.on("pointerdown.zoom", pointerdown).on("wheel.zoom", wheeled).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); select_default2(window).on("pointermove.zoompan", pointermove).on("pointerup.zoompan pointercancel.zoompan", pointerup); } - zoom.transform = function(collection, transform2, point) { + zoom.transform = function(collection, transform2, point2) { var selection2 = collection.selection ? collection.selection() : collection; if (collection !== selection2) { - schedule(collection, transform2, point); + schedule(collection, transform2, point2); } else { selection2.interrupt().each(function() { gesture(this, arguments).start(null).zoom(null, null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(null); }); } }; - zoom.scaleBy = function(selection2, k, p) { + zoom.scaleBy = function(selection2, k2, p2) { zoom.scaleTo(selection2, function() { - var k0 = _transform.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + var k0 = _transform.k, k1 = typeof k2 === "function" ? k2.apply(this, arguments) : k2; return k0 * k1; - }, p); + }, p2); }; - zoom.scaleTo = function(selection2, k, p) { + zoom.scaleTo = function(selection2, k2, p2) { zoom.transform(selection2, function() { - var e = extent.apply(this, arguments), t0 = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent); - }, p); + var e3 = extent.apply(this, arguments), t0 = _transform, p02 = !p2 ? centroid(e3) : typeof p2 === "function" ? p2.apply(this, arguments) : p2, p1 = t0.invert(p02), k1 = typeof k2 === "function" ? k2.apply(this, arguments) : k2; + return constrain(translate(scale(t0, k1), p02, p1), e3, translateExtent); + }, p2); }; - zoom.translateBy = function(selection2, x, y) { + zoom.translateBy = function(selection2, x2, y2) { zoom.transform(selection2, function() { return constrain(_transform.translate( - typeof x === "function" ? x.apply(this, arguments) : x, - typeof y === "function" ? y.apply(this, arguments) : y + typeof x2 === "function" ? x2.apply(this, arguments) : x2, + typeof y2 === "function" ? y2.apply(this, arguments) : y2 ), extent.apply(this, arguments), translateExtent); }); }; - zoom.translateTo = function(selection2, x, y, p) { + zoom.translateTo = function(selection2, x2, y2, p2) { zoom.transform(selection2, function() { - var e = extent.apply(this, arguments), t = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate( - typeof x === "function" ? -x.apply(this, arguments) : -x, - typeof y === "function" ? -y.apply(this, arguments) : -y - ), e, translateExtent); - }, p); + var e3 = extent.apply(this, arguments), t2 = _transform, p02 = !p2 ? centroid(e3) : typeof p2 === "function" ? p2.apply(this, arguments) : p2; + return constrain(identity2.translate(p02[0], p02[1]).scale(t2.k).translate( + typeof x2 === "function" ? -x2.apply(this, arguments) : -x2, + typeof y2 === "function" ? -y2.apply(this, arguments) : -y2 + ), e3, translateExtent); + }, p2); }; - function scale(transform2, k) { - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); - return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + function scale(transform2, k2) { + k2 = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k2)); + return k2 === transform2.k ? transform2 : new Transform(k2, transform2.x, transform2.y); } function translate(transform2, p02, p1) { - var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k; - return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y); + var x2 = p02[0] - p1[0] * transform2.k, y2 = p02[1] - p1[1] * transform2.k; + return x2 === transform2.x && y2 === transform2.y ? transform2 : new Transform(transform2.k, x2, y2); } function centroid(extent2) { return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; } - function schedule(transition2, transform2, point) { + function schedule(transition2, transform2, point2) { transition2.on("start.zoom", function() { gesture(this, arguments).start(null); }).on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(null); }).tween("zoom", function() { - var that = this, args = arguments, g = gesture(that, args), e = extent.apply(that, args), p = !point ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = _transform, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); - return function(t) { - if (t === 1) { - t = b; + var that = this, args = arguments, g3 = gesture(that, args), e3 = extent.apply(that, args), p2 = !point2 ? centroid(e3) : typeof point2 === "function" ? point2.apply(that, args) : point2, w2 = Math.max(e3[1][0] - e3[0][0], e3[1][1] - e3[0][1]), a2 = _transform, b2 = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i3 = interpolate(a2.invert(p2).concat(w2 / a2.k), b2.invert(p2).concat(w2 / b2.k)); + return function(t2) { + if (t2 === 1) { + t2 = b2; } else { - var l = i2(t); - var k = w / l[2]; - t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + var l2 = i3(t2); + var k2 = w2 / l2[2]; + t2 = new Transform(k2, p2[0] - l2[0] * k2, p2[1] - l2[1] * k2); } - g.zoom(null, null, t); + g3.zoom(null, null, t2); }; }); } @@ -49833,7 +54342,7 @@ ${content} start: function(d3_event) { if (++this.active === 1) { _activeGesture = this; - dispatch10.call("start", this, d3_event); + dispatch14.call("start", this, d3_event); } return this; }, @@ -49845,13 +54354,13 @@ ${content} if (this.pointer1 && key !== "touch") this.pointer1[1] = transform2.invert(this.pointer1[0]); _transform = transform2; - dispatch10.call("zoom", this, d3_event, key, transform2); + dispatch14.call("zoom", this, d3_event, key, transform2); return this; }, end: function(d3_event) { if (--this.active === 0) { _activeGesture = null; - dispatch10.call("end", this, d3_event); + dispatch14.call("end", this, d3_event); } return this; } @@ -49859,24 +54368,24 @@ ${content} function wheeled(d3_event) { if (!filter2.apply(this, arguments)) return; - var g = gesture(this, arguments), t = _transform, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = utilFastMouse(this)(d3_event); - if (g.wheel) { - if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { - g.mouse[1] = t.invert(g.mouse[0] = p); + var g3 = gesture(this, arguments), t2 = _transform, k2 = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t2.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p2 = utilFastMouse(this)(d3_event); + if (g3.wheel) { + if (g3.mouse[0][0] !== p2[0] || g3.mouse[0][1] !== p2[1]) { + g3.mouse[1] = t2.invert(g3.mouse[0] = p2); } - clearTimeout(g.wheel); + clearTimeout(g3.wheel); } else { - g.mouse = [p, t.invert(p)]; + g3.mouse = [p2, t2.invert(p2)]; interrupt_default(this); - g.start(d3_event); + g3.start(d3_event); } d3_event.preventDefault(); d3_event.stopImmediatePropagation(); - g.wheel = setTimeout(wheelidled, _wheelDelay); - g.zoom(d3_event, "mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + g3.wheel = setTimeout(wheelidled, _wheelDelay); + g3.zoom(d3_event, "mouse", constrain(translate(scale(t2, k2), g3.mouse[0], g3.mouse[1]), g3.extent, translateExtent)); function wheelidled() { - g.wheel = null; - g.end(d3_event); + g3.wheel = null; + g3.end(d3_event); } } var _downPointerIDs = /* @__PURE__ */ new Set(); @@ -49885,21 +54394,21 @@ ${content} _downPointerIDs.add(d3_event.pointerId); if (!filter2.apply(this, arguments)) return; - var g = gesture(this, arguments, _downPointerIDs.size === 1); + var g3 = gesture(this, arguments, _downPointerIDs.size === 1); var started; d3_event.stopImmediatePropagation(); _pointerLocGetter = utilFastMouse(this); var loc = _pointerLocGetter(d3_event); - var p = [loc, _transform.invert(loc), d3_event.pointerId]; - if (!g.pointer0) { - g.pointer0 = p; + var p2 = [loc, _transform.invert(loc), d3_event.pointerId]; + if (!g3.pointer0) { + g3.pointer0 = p2; started = true; - } else if (!g.pointer1 && g.pointer0[2] !== p[2]) { - g.pointer1 = p; + } else if (!g3.pointer1 && g3.pointer0[2] !== p2[2]) { + g3.pointer1 = p2; } if (started) { interrupt_default(this); - g.start(d3_event); + g3.start(d3_event); } } function pointermove(d3_event) { @@ -49907,38 +54416,38 @@ ${content} return; if (!_activeGesture || !_pointerLocGetter) return; - var g = gesture(this, arguments); - var isPointer0 = g.pointer0 && g.pointer0[2] === d3_event.pointerId; - var isPointer1 = !isPointer0 && g.pointer1 && g.pointer1[2] === d3_event.pointerId; + var g3 = gesture(this, arguments); + var isPointer0 = g3.pointer0 && g3.pointer0[2] === d3_event.pointerId; + var isPointer1 = !isPointer0 && g3.pointer1 && g3.pointer1[2] === d3_event.pointerId; if ((isPointer0 || isPointer1) && "buttons" in d3_event && !d3_event.buttons) { - if (g.pointer0) - _downPointerIDs.delete(g.pointer0[2]); - if (g.pointer1) - _downPointerIDs.delete(g.pointer1[2]); - g.end(d3_event); + if (g3.pointer0) + _downPointerIDs.delete(g3.pointer0[2]); + if (g3.pointer1) + _downPointerIDs.delete(g3.pointer1[2]); + g3.end(d3_event); return; } d3_event.preventDefault(); d3_event.stopImmediatePropagation(); var loc = _pointerLocGetter(d3_event); - var t, p, l; + var t2, p2, l2; if (isPointer0) - g.pointer0[0] = loc; + g3.pointer0[0] = loc; else if (isPointer1) - g.pointer1[0] = loc; - t = _transform; - if (g.pointer1) { - var p02 = g.pointer0[0], l0 = g.pointer0[1], p1 = g.pointer1[0], l1 = g.pointer1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; - t = scale(t, Math.sqrt(dp / dl)); - p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2]; - l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - } else if (g.pointer0) { - p = g.pointer0[0]; - l = g.pointer0[1]; + g3.pointer1[0] = loc; + t2 = _transform; + if (g3.pointer1) { + var p02 = g3.pointer0[0], l0 = g3.pointer0[1], p1 = g3.pointer1[0], l1 = g3.pointer1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t2 = scale(t2, Math.sqrt(dp / dl)); + p2 = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2]; + l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g3.pointer0) { + p2 = g3.pointer0[0]; + l2 = g3.pointer0[1]; } else { return; } - g.zoom(d3_event, "touch", constrain(translate(t, p, l), g.extent, translateExtent)); + g3.zoom(d3_event, "touch", constrain(translate(t2, p2, l2), g3.extent, translateExtent)); } function pointerup(d3_event) { if (!_downPointerIDs.has(d3_event.pointerId)) @@ -49946,57 +54455,58 @@ ${content} _downPointerIDs.delete(d3_event.pointerId); if (!_activeGesture) return; - var g = gesture(this, arguments); + var g3 = gesture(this, arguments); d3_event.stopImmediatePropagation(); - if (g.pointer0 && g.pointer0[2] === d3_event.pointerId) - delete g.pointer0; - else if (g.pointer1 && g.pointer1[2] === d3_event.pointerId) - delete g.pointer1; - if (g.pointer1 && !g.pointer0) { - g.pointer0 = g.pointer1; - delete g.pointer1; - } - if (g.pointer0) { - g.pointer0[1] = _transform.invert(g.pointer0[0]); + if (g3.pointer0 && g3.pointer0[2] === d3_event.pointerId) + delete g3.pointer0; + else if (g3.pointer1 && g3.pointer1[2] === d3_event.pointerId) + delete g3.pointer1; + if (g3.pointer1 && !g3.pointer0) { + g3.pointer0 = g3.pointer1; + delete g3.pointer1; + } + if (g3.pointer0) { + g3.pointer0[1] = _transform.invert(g3.pointer0[0]); } else { - g.end(d3_event); + g3.end(d3_event); } } - zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = utilFunctor(+_), zoom) : wheelDelta; + zoom.wheelDelta = function(_2) { + return arguments.length ? (wheelDelta = utilFunctor(+_2), zoom) : wheelDelta; }; - zoom.filter = function(_) { - return arguments.length ? (filter2 = utilFunctor(!!_), zoom) : filter2; + zoom.filter = function(_2) { + return arguments.length ? (filter2 = utilFunctor(!!_2), zoom) : filter2; }; - zoom.extent = function(_) { - return arguments.length ? (extent = utilFunctor([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + zoom.extent = function(_2) { + return arguments.length ? (extent = utilFunctor([[+_2[0][0], +_2[0][1]], [+_2[1][0], +_2[1][1]]]), zoom) : extent; }; - zoom.scaleExtent = function(_) { - return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + zoom.scaleExtent = function(_2) { + return arguments.length ? (scaleExtent[0] = +_2[0], scaleExtent[1] = +_2[1], zoom) : [scaleExtent[0], scaleExtent[1]]; }; - zoom.translateExtent = function(_) { - 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]]]; + zoom.translateExtent = function(_2) { + return arguments.length ? (translateExtent[0][0] = +_2[0][0], translateExtent[1][0] = +_2[1][0], translateExtent[0][1] = +_2[0][1], translateExtent[1][1] = +_2[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; }; - zoom.constrain = function(_) { - return arguments.length ? (constrain = _, zoom) : constrain; + zoom.constrain = function(_2) { + return arguments.length ? (constrain = _2, zoom) : constrain; }; - zoom.interpolate = function(_) { - return arguments.length ? (interpolate = _, zoom) : interpolate; + zoom.interpolate = function(_2) { + return arguments.length ? (interpolate = _2, zoom) : interpolate; }; - zoom._transform = function(_) { - return arguments.length ? (_transform = _, zoom) : _transform; + zoom._transform = function(_2) { + return arguments.length ? (_transform = _2, zoom) : _transform; }; - return utilRebind(zoom, dispatch10, "on"); + return utilRebind(zoom, dispatch14, "on"); } // modules/util/double_up.js function utilDoubleUp() { - var dispatch10 = dispatch_default("doubleUp"); + var dispatch14 = dispatch_default("doubleUp"); var _maxTimespan = 500; var _maxDistance = 20; var _pointer; function pointerIsValidFor(loc) { - return new Date().getTime() - _pointer.startTime <= _maxTimespan && geoVecLength(_pointer.startLoc, loc) <= _maxDistance; + return (/* @__PURE__ */ new Date()).getTime() - _pointer.startTime <= _maxTimespan && // all pointer events must occur within a small distance of the first pointerdown + geoVecLength(_pointer.startLoc, loc) <= _maxDistance; } function pointerdown(d3_event) { if (d3_event.ctrlKey || d3_event.button === 2) @@ -50008,7 +54518,7 @@ ${content} if (!_pointer) { _pointer = { startLoc: loc, - startTime: new Date().getTime(), + startTime: (/* @__PURE__ */ new Date()).getTime(), upCount: 0, pointerId: d3_event.pointerId }; @@ -50026,7 +54536,7 @@ ${content} var loc = [d3_event.clientX, d3_event.clientY]; if (pointerIsValidFor(loc)) { var locInThis = utilFastMouse(this)(d3_event); - dispatch10.call("doubleUp", this, d3_event, locInThis); + dispatch14.call("doubleUp", this, d3_event, locInThis); } _pointer = void 0; } @@ -50036,14 +54546,14 @@ ${content} selection2.on("pointerdown.doubleUp", pointerdown).on("pointerup.doubleUp", pointerup); } else { selection2.on("dblclick.doubleUp", function(d3_event) { - dispatch10.call("doubleUp", this, d3_event, utilFastMouse(this)(d3_event)); + dispatch14.call("doubleUp", this, d3_event, utilFastMouse(this)(d3_event)); }); } } doubleUp.off = function(selection2) { selection2.on("pointerdown.doubleUp", null).on("pointerup.doubleUp", null).on("dblclick.doubleUp", null); }; - return utilRebind(doubleUp, dispatch10, "on"); + return utilRebind(doubleUp, dispatch14, "on"); } // modules/renderer/map.js @@ -50056,7 +54566,7 @@ ${content} return Math.max(min3, Math.min(num, max3)); } function rendererMap(context) { - var dispatch10 = dispatch_default( + var dispatch14 = dispatch_default( "move", "drawn", "crossEditableZoom", @@ -50091,7 +54601,7 @@ ${content} var _pointerDown = false; var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; var _zoomerPannerFunction = "PointerEvent" in window ? utilZoomPan : zoom_default2; - var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(value_default).filter(zoomEventFilter).on("zoom.map", zoomPan).on("start.map", function(d3_event) { + var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(value_default).filter(zoomEventFilter).on("zoom.map", zoomPan2).on("start.map", function(d3_event) { _pointerDown = d3_event && (d3_event.type === "pointerdown" || d3_event.sourceEvent && d3_event.sourceEvent.type === "pointerdown"); }).on("end.map", function() { _pointerDown = false; @@ -50151,17 +54661,19 @@ ${content} if (map2.editableDataEnabled() && !_isTransformed) { var hover = d3_event.target.__data__; surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent()); - dispatch10.call("drawn", this, { full: false }); + dispatch14.call("drawn", this, { full: false }); } }).on(_pointerPrefix + "out.vertices", function(d3_event) { if (map2.editableDataEnabled() && !_isTransformed) { var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__; surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent()); - dispatch10.call("drawn", this, { full: false }); + dispatch14.call("drawn", this, { full: false }); } }); var detected = utilDetect(); - if ("GestureEvent" in window && !detected.isMobileWebKit) { + if ("GestureEvent" in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping, + // but we only need to do this on desktop Safari anyway. – #7694 + !detected.isMobileWebKit) { surface.on("gesturestart.surface", function(d3_event) { d3_event.preventDefault(); _gestureTransformStart = projection2.transform(); @@ -50171,18 +54683,22 @@ ${content} _doubleUpHandler.on("doubleUp.map", function(d3_event, p02) { if (!_dblClickZoomEnabled) return; - if (typeof d3_event.target.__data__ === "object" && !select_default2(d3_event.target).classed("fill")) + if (typeof d3_event.target.__data__ === "object" && // or area fills + !select_default2(d3_event.target).classed("fill")) return; var zoomOut2 = d3_event.shiftKey; - var t = projection2.transform(); - var p1 = t.invert(p02); - t = t.scale(zoomOut2 ? 0.5 : 2); - t.x = p02[0] - p1[0] * t.k; - t.y = p02[1] - p1[1] * t.k; - map2.transformEase(t); + var t2 = projection2.transform(); + var p1 = t2.invert(p02); + t2 = t2.scale(zoomOut2 ? 0.5 : 2); + t2.x = p02[0] - p1[0] * t2.k; + t2.y = p02[1] - p1[1] * t2.k; + map2.transformEase(t2); }); context.on("enter.map", function() { - if (!map2.editableDataEnabled(true)) + if (!map2.editableDataEnabled( + true + /* skip zoom check */ + )) return; if (_isTransformed) return; @@ -50200,12 +54716,12 @@ ${content} } }); var data = Object.values(selectedAndParents); - var filter2 = function(d) { - return d.id in selectedAndParents; + var filter2 = function(d2) { + return d2.id in selectedAndParents; }; data = context.features().filter(data, graph); surface.call(drawVertices.drawSelected, graph, map2.extent()).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent()); - dispatch10.call("drawn", this, { full: false }); + dispatch14.call("drawn", this, { full: false }); scheduleRedraw(); }); map2.dimensions(utilGetDimensions(selection2)); @@ -50214,8 +54730,8 @@ ${content} if (d3_event.type === "mousedown") { var hasOrphan = false; var listeners = window.__on; - for (var i2 = 0; i2 < listeners.length; i2++) { - var listener = listeners[i2]; + for (var i3 = 0; i3 < listeners.length; i3++) { + var listener = listeners[i3]; if (listener.name === "zoom" && listener.type === "mouseup") { hasOrphan = true; break; @@ -50241,7 +54757,7 @@ ${content} function drawEditable(difference, extent) { var mode = context.mode(); var graph = context.graph(); - var features2 = context.features(); + var features = context.features(); var all = context.history().intersects(map2.extent()); var fullRedraw = false; var data; @@ -50262,12 +54778,12 @@ ${content} var complete = difference.complete(map2.extent()); data = Object.values(complete).filter(Boolean); set3 = new Set(Object.keys(complete)); - filter2 = function(d) { - return set3.has(d.id); + filter2 = function(d2) { + return set3.has(d2.id); }; - features2.clear(data); + features.clear(data); } else { - if (features2.gatherStats(all, graph, _dimensions)) { + if (features.gatherStats(all, graph, _dimensions)) { extent = void 0; } if (extent) { @@ -50275,8 +54791,8 @@ ${content} set3 = new Set(data.map(function(entity) { return entity.id; })); - filter2 = function(d) { - return set3.has(d.id); + filter2 = function(d2) { + return set3.has(d2.id); }; } else { data = all; @@ -50285,7 +54801,7 @@ ${content} } } if (applyFeatureLayerFilters) { - data = features2.filter(data, graph); + data = features.filter(data, graph); } else { context.features().resetStats(); } @@ -50293,7 +54809,7 @@ ${content} surface.call(drawVertices.drawSelected, graph, map2.extent()); } surface.call(drawVertices, graph, data, filter2, map2.extent(), fullRedraw).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent()).call(drawLabels, graph, data, filter2, _dimensions, fullRedraw).call(drawPoints, graph, data, filter2); - dispatch10.call("drawn", this, { full: true }); + dispatch14.call("drawn", this, { full: true }); } map2.init = function() { drawLayers = svgLayers(projection2, context); @@ -50319,41 +54835,43 @@ ${content} if (mode && !allowed[mode.id]) { context.enter(modeBrowse(context)); } - dispatch10.call("drawn", this, { full: true }); + dispatch14.call("drawn", this, { full: true }); } function gestureChange(d3_event) { - var e = d3_event; - e.preventDefault(); + var e3 = d3_event; + e3.preventDefault(); var props = { deltaMode: 0, + // dummy values to ignore in zoomPan deltaY: 1, - clientX: e.clientX, - clientY: e.clientY, - screenX: e.screenX, - screenY: e.screenY, - x: e.x, - y: e.y + // dummy values to ignore in zoomPan + clientX: e3.clientX, + clientY: e3.clientY, + screenX: e3.screenX, + screenY: e3.screenY, + x: e3.x, + y: e3.y }; var e22 = new WheelEvent("wheel", props); - e22._scale = e.scale; - e22._rotation = e.rotation; + e22._scale = e3.scale; + e22._rotation = e3.rotation; _selection.node().dispatchEvent(e22); } - function zoomPan(event, key, transform2) { + function zoomPan2(event, key, transform2) { var source = event && event.sourceEvent || event; var eventTransform = transform2 || event && event.transform; - var x = eventTransform.x; - var y = eventTransform.y; - var k = eventTransform.k; + var x2 = eventTransform.x; + var y2 = eventTransform.y; + var k2 = eventTransform.k; if (source && source.type === "wheel") { if (_pointerDown) return; var detected = utilDetect(); var dX = source.deltaX; var dY = source.deltaY; - var x2 = x; - var y2 = y; - var k2 = k; + var x22 = x2; + var y22 = y2; + var k22 = k2; var t0, p02, p1; if (source.deltaMode === 1) { var lines = Math.abs(source.deltaY); @@ -50361,7 +54879,9 @@ ${content} dY = sign2 * clamp( Math.exp((lines - 1) * 0.75) * 4.000244140625, 4.000244140625, + // min 350.000244140625 + // max ); if (detected.os !== "mac") { dY *= 5; @@ -50369,47 +54889,47 @@ ${content} t0 = _isTransformed ? _transformLast : _transformStart; p02 = _getMouseCoords(source); p1 = t0.invert(p02); - k2 = t0.k * Math.pow(2, -dY / 500); - k2 = clamp(k2, kMin, kMax); - x2 = p02[0] - p1[0] * k2; - y2 = p02[1] - p1[1] * k2; + k22 = t0.k * Math.pow(2, -dY / 500); + k22 = clamp(k22, kMin, kMax); + x22 = p02[0] - p1[0] * k22; + y22 = p02[1] - p1[1] * k22; } else if (source._scale) { t0 = _gestureTransformStart; p02 = _getMouseCoords(source); p1 = t0.invert(p02); - k2 = t0.k * source._scale; - k2 = clamp(k2, kMin, kMax); - x2 = p02[0] - p1[0] * k2; - y2 = p02[1] - p1[1] * k2; + k22 = t0.k * source._scale; + k22 = clamp(k22, kMin, kMax); + x22 = p02[0] - p1[0] * k22; + y22 = p02[1] - p1[1] * k22; } else if (source.ctrlKey && !isInteger(dY)) { dY *= 6; t0 = _isTransformed ? _transformLast : _transformStart; p02 = _getMouseCoords(source); p1 = t0.invert(p02); - k2 = t0.k * Math.pow(2, -dY / 500); - k2 = clamp(k2, kMin, kMax); - x2 = p02[0] - p1[0] * k2; - y2 = p02[1] - p1[1] * k2; + k22 = t0.k * Math.pow(2, -dY / 500); + k22 = clamp(k22, kMin, kMax); + x22 = p02[0] - p1[0] * k22; + y22 = p02[1] - p1[1] * k22; } else if ((source.altKey || source.shiftKey) && isInteger(dY)) { t0 = _isTransformed ? _transformLast : _transformStart; p02 = _getMouseCoords(source); p1 = t0.invert(p02); - k2 = t0.k * Math.pow(2, -dY / 500); - k2 = clamp(k2, kMin, kMax); - x2 = p02[0] - p1[0] * k2; - y2 = p02[1] - p1[1] * k2; + k22 = t0.k * Math.pow(2, -dY / 500); + k22 = clamp(k22, kMin, kMax); + x22 = p02[0] - p1[0] * k22; + y22 = p02[1] - p1[1] * k22; } else if (detected.os === "mac" && detected.browser !== "Firefox" && !source.ctrlKey && isInteger(dX) && isInteger(dY)) { p1 = projection2.translate(); - x2 = p1[0] - dX; - y2 = p1[1] - dY; - k2 = projection2.scale(); - k2 = clamp(k2, kMin, kMax); - } - if (x2 !== x || y2 !== y || k2 !== k) { - x = x2; - y = y2; - k = k2; - eventTransform = identity2.translate(x2, y2).scale(k2); + x22 = p1[0] - dX; + y22 = p1[1] - dY; + k22 = projection2.scale(); + k22 = clamp(k22, kMin, kMax); + } + if (x22 !== x2 || y22 !== y2 || k22 !== k2) { + x2 = x22; + y2 = y22; + k2 = k22; + eventTransform = identity2.translate(x22, y22).scale(k22); if (_zoomerPanner._transform) { _zoomerPanner._transform(eventTransform); } else { @@ -50417,33 +54937,33 @@ ${content} } } } - if (_transformStart.x === x && _transformStart.y === y && _transformStart.k === k) { + if (_transformStart.x === x2 && _transformStart.y === y2 && _transformStart.k === k2) { return; } - if (geoScaleToZoom(k, TILESIZE) < _minzoom) { + if (geoScaleToZoom(k2, TILESIZE) < _minzoom) { surface.interrupt(); - dispatch10.call("hitMinZoom", this, map2); + dispatch14.call("hitMinZoom", this, map2); setCenterZoom(map2.center(), context.minEditableZoom(), 0, true); scheduleRedraw(); - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); return; } projection2.transform(eventTransform); var withinEditableZoom = map2.withinEditableZoom(); if (_lastWithinEditableZoom !== withinEditableZoom) { if (_lastWithinEditableZoom !== void 0) { - dispatch10.call("crossEditableZoom", this, withinEditableZoom); + dispatch14.call("crossEditableZoom", this, withinEditableZoom); } _lastWithinEditableZoom = withinEditableZoom; } - var scale = k / _transformStart.k; - var tX = (x / scale - _transformStart.x) * scale; - var tY = (y / scale - _transformStart.y) * scale; + var scale = k2 / _transformStart.k; + var tX = (x2 / scale - _transformStart.x) * scale; + var tY = (y2 / scale - _transformStart.y) * scale; if (context.inIntro()) { curtainProjection.transform({ - x: x - tX, - y: y - tY, - k + x: x2 - tX, + y: y2 - tY, + k: k2 }); } if (source) { @@ -50453,7 +54973,7 @@ ${content} _transformLast = eventTransform; utilSetTransform(supersurface, tX, tY, scale); scheduleRedraw(); - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); function isInteger(val) { return typeof val === "number" && isFinite(val) && Math.floor(val) === val; } @@ -50475,9 +54995,9 @@ ${content} difference = extent = void 0; } var zoom = map2.zoom(); - var z = String(~~zoom); - if (surface.attr("data-zoom") !== z) { - surface.attr("data-zoom", z); + var z2 = String(~~zoom); + if (surface.attr("data-zoom") !== z2) { + surface.attr("data-zoom", z2); } var lat = map2.center()[1]; var lowzoom = linear3().domain([-60, 0, 60]).range([17, 18.5, 17]).clamp(true); @@ -50506,9 +55026,9 @@ ${content} map2.mouse = function(d3_event) { var event = d3_event || _lastPointerEvent; if (event) { - var s; - while (s = event.sourceEvent) { - event = s; + var s2; + while (s2 = event.sourceEvent) { + event = s2; } return _getMouseCoords(event); } @@ -50534,8 +55054,8 @@ ${content} return _isTransformed; }; function setTransform(t2, duration, force) { - var t = projection2.transform(); - if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) + var t3 = projection2.transform(); + if (!force && t2.k === t3.k && t2.x === t3.x && t2.y === t3.y) return false; if (duration) { _selection.transition().duration(duration).on("start", function() { @@ -50549,34 +55069,34 @@ ${content} return true; } function setCenterZoom(loc2, z2, duration, force) { - var c = map2.center(); - var z = map2.zoom(); - if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) + var c2 = map2.center(); + var z3 = map2.zoom(); + if (loc2[0] === c2[0] && loc2[1] === c2[1] && z2 === z3 && !force) return false; var proj = geoRawMercator().transform(projection2.transform()); var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax); proj.scale(k2); - var t = proj.translate(); - var point = proj(loc2); + var t2 = proj.translate(); + var point2 = proj(loc2); var center = pxCenter(); - t[0] += center[0] - point[0]; - t[1] += center[1] - point[1]; - return setTransform(identity2.translate(t[0], t[1]).scale(k2), duration, force); + t2[0] += center[0] - point2[0]; + t2[1] += center[1] - point2[1]; + return setTransform(identity2.translate(t2[0], t2[1]).scale(k2), duration, force); } map2.pan = function(delta, duration) { - var t = projection2.translate(); - var k = projection2.scale(); - t[0] += delta[0]; - t[1] += delta[1]; + var t2 = projection2.translate(); + var k2 = projection2.scale(); + t2[0] += delta[0]; + t2[1] += delta[1]; if (duration) { _selection.transition().duration(duration).on("start", function() { map2.startEase(); - }).call(_zoomerPanner.transform, identity2.translate(t[0], t[1]).scale(k)); + }).call(_zoomerPanner.transform, identity2.translate(t2[0], t2[1]).scale(k2)); } else { - projection2.translate(t); + projection2.translate(t2); _transformStart = projection2.transform(); _selection.call(_zoomerPanner.transform, _transformStart); - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); immediateRedraw(); } return map2; @@ -50621,7 +55141,7 @@ ${content} return projection2.invert(pxCenter()); } if (setCenterZoom(loc2, map2.zoom())) { - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); } scheduleRedraw(); return map2; @@ -50648,18 +55168,18 @@ ${content} } if (z2 < _minzoom) { surface.interrupt(); - dispatch10.call("hitMinZoom", this, map2); + dispatch14.call("hitMinZoom", this, map2); z2 = context.minEditableZoom(); } if (setCenterZoom(map2.center(), z2)) { - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); } scheduleRedraw(); return map2; }; map2.centerZoom = function(loc2, z2) { if (setCenterZoom(loc2, z2)) { - dispatch10.call("move", this, map2); + dispatch14.call("move", this, map2); } scheduleRedraw(); return map2; @@ -50688,7 +55208,12 @@ ${content} }; map2.transformEase = function(t2, duration) { duration = duration || 250; - setTransform(t2, duration, false); + setTransform( + t2, + duration, + false + /* don't force */ + ); return map2; }; map2.zoomToEase = function(obj, duration) { @@ -50791,7 +55316,7 @@ ${content} map2.toggleHighlightEdited = function() { surface.classed("highlight-edited", !surface.classed("highlight-edited")); map2.pan([0, 0]); - dispatch10.call("changeHighlighting", this); + dispatch14.call("changeHighlighting", this); }; map2.areaFillOptions = ["wireframe", "partial", "full"]; map2.activeAreaFill = function(val) { @@ -50803,7 +55328,7 @@ ${content} } updateAreaFill(); map2.pan([0, 0]); - dispatch10.call("changeAreaFill", this); + dispatch14.call("changeAreaFill", this); return map2; }; map2.toggleWireframe = function() { @@ -50825,13 +55350,13 @@ ${content} map2.doubleUpHandler = function() { return _doubleUpHandler; }; - return utilRebind(map2, dispatch10, "on"); + return utilRebind(map2, dispatch14, "on"); } // modules/renderer/photos.js function rendererPhotos(context) { - var dispatch10 = dispatch_default("change"); - var _layerIDs = ["streetside", "mapillary", "mapillary-map-features", "mapillary-signs", "kartaview"]; + var dispatch14 = dispatch_default("change"); + var _layerIDs = ["streetside", "mapillary", "mapillary-map-features", "mapillary-signs", "kartaview", "mapilio", "vegbilder"]; var _allPhotoTypes = ["flat", "panoramic"]; var _shownPhotoTypes = _allPhotoTypes.slice(); var _dateFilters = ["fromDate", "toDate"]; @@ -50844,10 +55369,10 @@ ${content} if (window.mocha) return; var hash = utilStringQs(window.location.hash); - var enabled = context.layers().all().filter(function(d) { - return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled(); - }).map(function(d) { - return d.id; + var enabled = context.layers().all().filter(function(d2) { + return _layerIDs.indexOf(d2.id) !== -1 && d2.layer && d2.layer.supported() && d2.layer.enabled(); + }).map(function(d2) { + return d2.id; }); if (enabled.length) { hash.photo_overlay = enabled.join(","); @@ -50868,26 +55393,26 @@ ${content} photos.dateFilterValue = function(val) { return val === _dateFilters[0] ? _fromDate : _toDate; }; - photos.setDateFilter = function(type3, val, updateUrl) { + photos.setDateFilter = function(type2, val, updateUrl) { var date = val && new Date(val); if (date && !isNaN(date)) { val = date.toISOString().slice(0, 10); } else { val = null; } - if (type3 === _dateFilters[0]) { + if (type2 === _dateFilters[0]) { _fromDate = val; if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) { _toDate = _fromDate; } } - if (type3 === _dateFilters[1]) { + if (type2 === _dateFilters[1]) { _toDate = val; if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) { _fromDate = _toDate; } } - dispatch10.call("change", this); + dispatch14.call("change", this); if (updateUrl) { var rangeString; if (_fromDate || _toDate) { @@ -50900,13 +55425,13 @@ ${content} if (val && typeof val === "string") val = val.replace(/;/g, ",").split(","); if (val) { - val = val.map((d) => d.trim()).filter(Boolean); + val = val.map((d2) => d2.trim()).filter(Boolean); if (!val.length) { val = null; } } _usernames = val; - dispatch10.call("change", this); + dispatch14.call("change", this); if (updateUrl) { var hashString; if (_usernames) { @@ -50935,10 +55460,10 @@ ${content} return layer && layer.supported() && layer.enabled(); } photos.shouldFilterByDate = function() { - return showsLayer("mapillary") || showsLayer("kartaview") || showsLayer("streetside"); + return showsLayer("mapillary") || showsLayer("kartaview") || showsLayer("streetside") || showsLayer("vegbilder"); }; photos.shouldFilterByPhotoType = function() { - return showsLayer("mapillary") || showsLayer("streetside") && showsLayer("kartaview"); + return showsLayer("mapillary") || showsLayer("streetside") && showsLayer("kartaview") || showsLayer("vegbilder"); }; photos.shouldFilterByUsername = function() { return !showsLayer("mapillary") && showsLayer("kartaview") && !showsLayer("streetside"); @@ -50967,7 +55492,7 @@ ${content} } else { _shownPhotoTypes.push(val); } - dispatch10.call("change", this); + dispatch14.call("change", this); return photos; }; photos.usernames = function() { @@ -51025,7 +55550,7 @@ ${content} } context.layers().on("change.rendererPhotos", updateStorage); }; - return utilRebind(photos, dispatch10, "on"); + return utilRebind(photos, dispatch14, "on"); } // modules/ui/account.js @@ -51052,15 +55577,15 @@ ${content} userLink.call(svgIcon("#iD-icon-avatar", "pre-text light")); } userLink.append("span").attr("class", "label").html(user.display_name); - loginLogout.classed("hide", false).select("a").text(_t("logout")).on("click", (e) => { - e.preventDefault(); + loginLogout.classed("hide", false).select("a").text(_t("logout")).on("click", (e3) => { + e3.preventDefault(); osm.logout(); tryLogout(); }); } else { userInfo.html("").classed("hide", true); - loginLogout.classed("hide", false).select("a").text(_t("login")).on("click", (e) => { - e.preventDefault(); + loginLogout.classed("hide", false).select("a").text(_t("login")).on("click", (e3) => { + e3.preventDefault(); osm.authenticate(); }); } @@ -51069,14 +55594,14 @@ ${content} if (!osm) return; const url = osm.getUrlRoot() + "/logout?referer=%2Flogin"; - const w = 600; - const h = 550; + const w2 = 600; + const h2 = 550; const settings = [ - ["width", w], - ["height", h], - ["left", window.screen.width / 2 - w / 2], - ["top", window.screen.height / 2 - h / 2] - ].map((x) => x.join("=")).join(","); + ["width", w2], + ["height", h2], + ["left", window.screen.width / 2 - w2 / 2], + ["top", window.screen.height / 2 - h2 / 2] + ].map((x2) => x2.join("=")).join(","); window.open(url, "_blank", settings); } return function(selection2) { @@ -51095,29 +55620,29 @@ ${content} function render(selection2, data, klass) { let div = selection2.selectAll(`.${klass}`).data([0]); div = div.enter().append("div").attr("class", klass).merge(div); - let attributions = div.selectAll(".attribution").data(data, (d) => d.id); + let attributions = div.selectAll(".attribution").data(data, (d2) => d2.id); attributions.exit().remove(); - attributions = attributions.enter().append("span").attr("class", "attribution").each((d, i2, nodes) => { - let attribution = select_default2(nodes[i2]); - if (d.terms_html) { - attribution.html(d.terms_html); + attributions = attributions.enter().append("span").attr("class", "attribution").each((d2, i3, nodes) => { + let attribution = select_default2(nodes[i3]); + if (d2.terms_html) { + attribution.html(d2.terms_html); return; } - if (d.terms_url) { - attribution = attribution.append("a").attr("href", d.terms_url).attr("target", "_blank"); + if (d2.terms_url) { + attribution = attribution.append("a").attr("href", d2.terms_url).attr("target", "_blank"); } - const sourceID = d.id.replace(/\./g, ""); + const sourceID = d2.id.replace(/\./g, ""); const terms_text = _t( `imagery.${sourceID}.attribution.text`, - { default: d.terms_text || d.id || d.name() } + { default: d2.terms_text || d2.id || d2.name() } ); - if (d.icon && !d.overlay) { - attribution.append("img").attr("class", "source-image").attr("src", d.icon); + if (d2.icon && !d2.overlay) { + attribution.append("img").attr("class", "source-image").attr("src", d2.icon); } attribution.append("span").attr("class", "attribution-text").text(terms_text); }).merge(attributions); - let copyright = attributions.selectAll(".copyright-notice").data((d) => { - let notice = d.copyrightNotices(context.map().zoom(), context.map().extent()); + let copyright = attributions.selectAll(".copyright-notice").data((d2) => { + let notice = d2.copyrightNotices(context.map().zoom(), context.map().extent()); return notice ? [notice] : []; }); copyright.exit().remove(); @@ -51127,9 +55652,9 @@ ${content} function update() { let baselayer = context.background().baseLayerSource(); _selection.call(render, baselayer ? [baselayer] : [], "base-layer-attribution"); - const z = context.map().zoom(); + const z2 = context.map().zoom(); let overlays = context.background().overlayLayerSources() || []; - _selection.call(render, overlays.filter((s) => s.validZoom(z)), "overlay-layer-attribution"); + _selection.call(render, overlays.filter((s2) => s2.validZoom(z2)), "overlay-layer-attribution"); } return function(selection2) { _selection = selection2; @@ -51152,15 +55677,15 @@ ${content} if (entity && entity.user) users[entity.user] = true; }); - var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit); + var u2 = Object.keys(users), subset = u2.slice(0, u2.length > limit ? limit - 1 : limit); wrap2.html("").call(svgIcon("#iD-icon-nearby", "pre-text light")); var userList = select_default2(document.createElement("span")); - userList.selectAll().data(subset).enter().append("a").attr("class", "user-link").attr("href", function(d) { - return osm.userURL(d); + userList.selectAll().data(subset).enter().append("a").attr("class", "user-link").attr("href", function(d2) { + return osm.userURL(d2); }).attr("target", "_blank").text(String); - if (u.length > limit) { + if (u2.length > limit) { var count = select_default2(document.createElement("span")); - var othersNum = u.length - limit + 1; + var othersNum = u2.length - limit + 1; count.append("a").attr("target", "_blank").attr("href", function() { return osm.changesetsURL(context.map().center(), context.map().zoom()); }).text(othersNum); @@ -51168,7 +55693,7 @@ ${content} } else { wrap2.append("span").html(_t.html("contributors.list", { users: { html: userList.html() } })); } - if (!u.length) { + if (!u2.length) { hidden = true; wrap2.transition().style("opacity", 0); } else if (hidden) { @@ -51482,9 +56007,9 @@ ${content} tooltip.content(function() { var heading = _heading.apply(this, arguments); var text2 = _title.apply(this, arguments); - var keys = _keys.apply(this, arguments); - var headingCallback = typeof heading === "function" ? heading : (s) => s.text(heading); - var textCallback = typeof text2 === "function" ? text2 : (s) => s.text(text2); + var keys2 = _keys.apply(this, arguments); + var headingCallback = typeof heading === "function" ? heading : (s2) => s2.text(heading); + var textCallback = typeof text2 === "function" ? text2 : (s2) => s2.text(text2); return function(selection2) { var headingSelect = selection2.selectAll(".tooltip-heading").data(heading ? [heading] : []); headingSelect.exit().remove(); @@ -51492,13 +56017,13 @@ ${content} var textSelect = selection2.selectAll(".tooltip-text").data(text2 ? [text2] : []); textSelect.exit().remove(); textSelect.enter().append("div").attr("class", "tooltip-text").merge(textSelect).text("").call(textCallback); - var keyhintWrap = selection2.selectAll(".keyhint-wrap").data(keys && keys.length ? [0] : []); + var keyhintWrap = selection2.selectAll(".keyhint-wrap").data(keys2 && keys2.length ? [0] : []); keyhintWrap.exit().remove(); var keyhintWrapEnter = keyhintWrap.enter().append("div").attr("class", "keyhint-wrap"); keyhintWrapEnter.append("span").call(_t.append("tooltip_keyhint")); keyhintWrap = keyhintWrapEnter.merge(keyhintWrap); - keyhintWrap.selectAll("kbd.shortcut").data(keys && keys.length ? keys : []).enter().append("kbd").attr("class", "shortcut").text(function(d) { - return d; + keyhintWrap.selectAll("kbd.shortcut").data(keys2 && keys2.length ? keys2 : []).enter().append("kbd").attr("class", "shortcut").text(function(d2) { + return d2; }); }; }); @@ -51507,7 +56032,7 @@ ${content} // modules/ui/edit_menu.js function uiEditMenu(context) { - var dispatch10 = dispatch_default("toggled"); + var dispatch14 = dispatch_default("toggled"); var _menu = select_default2(null); var _operations = []; var _anchorLoc = [0, 0]; @@ -51544,31 +56069,31 @@ ${content} _menuHeight = _verticalPadding * 2 + ops.length * buttonHeight; _menu = selection2.append("div").attr("class", "edit-menu").classed("touch-menu", isTouchMenu).style("padding", _verticalPadding + "px 0"); var buttons = _menu.selectAll(".edit-menu-item").data(ops); - var buttonsEnter = buttons.enter().append("button").attr("class", function(d) { - return "edit-menu-item edit-menu-item-" + d.id; + var buttonsEnter = buttons.enter().append("button").attr("class", function(d2) { + return "edit-menu-item edit-menu-item-" + d2.id; }).style("height", buttonHeight + "px").on("click", click).on("pointerup", pointerup).on("pointerdown mousedown", function pointerdown(d3_event) { d3_event.stopPropagation(); - }).on("mouseenter.highlight", function(d3_event, d) { - if (!d.relatedEntityIds || select_default2(this).classed("disabled")) + }).on("mouseenter.highlight", function(d3_event, d2) { + if (!d2.relatedEntityIds || select_default2(this).classed("disabled")) return; - utilHighlightEntities(d.relatedEntityIds(), true, context); - }).on("mouseleave.highlight", function(d3_event, d) { - if (!d.relatedEntityIds) + utilHighlightEntities(d2.relatedEntityIds(), true, context); + }).on("mouseleave.highlight", function(d3_event, d2) { + if (!d2.relatedEntityIds) return; - utilHighlightEntities(d.relatedEntityIds(), false, context); + utilHighlightEntities(d2.relatedEntityIds(), false, context); }); - buttonsEnter.each(function(d) { - var tooltip = uiTooltip().heading(() => d.title).title(d.tooltip).keys([d.keys[0]]); + buttonsEnter.each(function(d2) { + var tooltip = uiTooltip().heading(() => d2.title).title(d2.tooltip).keys([d2.keys[0]]); _tooltips.push(tooltip); - select_default2(this).call(tooltip).append("div").attr("class", "icon-wrap").call(svgIcon(d.icon && d.icon() || "#iD-operation-" + d.id, "operation")); + select_default2(this).call(tooltip).append("div").attr("class", "icon-wrap").call(svgIcon(d2.icon && d2.icon() || "#iD-operation-" + d2.id, "operation")); }); if (showLabels) { - buttonsEnter.append("span").attr("class", "label").html(function(d) { - return d.title; + buttonsEnter.append("span").attr("class", "label").each(function(d2) { + select_default2(this).call(d2.title); }); } - buttonsEnter.merge(buttons).classed("disabled", function(d) { - return d.disabled(); + buttonsEnter.merge(buttons).classed("disabled", function(d2) { + return d2.disabled(); }); updatePosition(); var initialScale = context.projection.scale(); @@ -51602,7 +56127,7 @@ ${content} } lastPointerUpType = null; } - dispatch10.call("toggled", this, true); + dispatch14.call("toggled", this, true); }; function updatePosition() { if (!_menu || _menu.empty()) @@ -51672,7 +56197,7 @@ ${content} context.map().on("move.edit-menu", null).on("drawn.edit-menu", null); _menu.remove(); _tooltips = []; - dispatch10.call("toggled", this, false); + dispatch14.call("toggled", this, false); }; editMenu.anchorLoc = function(val) { if (!arguments.length) @@ -51693,21 +56218,21 @@ ${content} _operations = val; return editMenu; }; - return utilRebind(editMenu, dispatch10, "on"); + return utilRebind(editMenu, dispatch14, "on"); } // modules/ui/feature_info.js function uiFeatureInfo(context) { function update(selection2) { - var features2 = context.features(); - var stats = features2.stats(); + var features = context.features(); + var stats = features.stats(); var count = 0; - var hiddenList = features2.hidden().map(function(k) { - if (stats[k]) { - count += stats[k]; + var hiddenList = features.hidden().map(function(k2) { + if (stats[k2]) { + count += stats[k2]; return _t.append("inspector.title_count", { - title: _t("feature." + k + ".description"), - count: stats[k] + title: _t("feature." + k2 + ".description"), + count: stats[k2] }); } return null; @@ -51743,7 +56268,7 @@ ${content} var _duration = 2e3; var _iconName = "#iD-icon-no"; var _iconClass = "disabled"; - var _label = (s) => s.text(""); + var _label = (s2) => s2.text(""); function flash() { if (_flashTimer) { _flashTimer.stop(); @@ -51767,32 +56292,32 @@ ${content} }, _duration); return content; } - flash.duration = function(_) { + flash.duration = function(_2) { if (!arguments.length) return _duration; - _duration = _; + _duration = _2; return flash; }; - flash.label = function(_) { + flash.label = function(_2) { if (!arguments.length) return _label; - if (typeof _ !== "function") { - _label = (selection2) => selection2.text(_); + if (typeof _2 !== "function") { + _label = (selection2) => selection2.text(_2); } else { - _label = (selection2) => selection2.text("").call(_); + _label = (selection2) => selection2.text("").call(_2); } return flash; }; - flash.iconName = function(_) { + flash.iconName = function(_2) { if (!arguments.length) return _iconName; - _iconName = _; + _iconName = _2; return flash; }; - flash.iconClass = function(_) { + flash.iconClass = function(_2) { if (!arguments.length) return _iconClass; - _iconClass = _; + _iconClass = _2; return flash; }; return flash; @@ -51841,16 +56366,19 @@ ${content} if (!isSupported()) return; var detected = utilDetect(); - var keys = detected.os === "mac" ? [uiCmd("\u2303\u2318F"), "f11"] : ["f11"]; - context.keybinding().on(keys, fullScreen); + var keys2 = detected.os === "mac" ? [uiCmd("\u2303\u2318F"), "f11"] : ["f11"]; + context.keybinding().on(keys2, fullScreen); }; } // modules/ui/geolocate.js function uiGeolocate(context) { var _geolocationOptions = { + // prioritize speed and power usage over precision enableHighAccuracy: false, + // don't hang indefinitely getting the location timeout: 6e3 + // 6sec }; var _locating = uiLoading(context).message(_t.html("geolocate.locating")).blocking(true); var _layer = context.layers().layer("geolocate"); @@ -51862,7 +56390,11 @@ ${content} if (context.inIntro()) return; if (!_layer.enabled() && !_locating.isShown()) { - _timeoutID = setTimeout(error, 1e4); + _timeoutID = setTimeout( + error, + 1e4 + /* 10sec */ + ); context.container().call(_locating); navigator.geolocation.getCurrentPosition(success, error, _geolocationOptions); } else { @@ -51941,10 +56473,10 @@ ${content} selection2.text(""); var list = selection2.append("ul").attr("class", "background-info"); list.append("li").call(_currSourceName); - _metadataKeys.forEach(function(k) { - if (isDG && k === "vintage") + _metadataKeys.forEach(function(k2) { + if (isDG && k2 === "vintage") return; - list.append("li").attr("class", "background-info-list-" + k).classed("hide", !_metadata[k]).call(_t.append("info_panels.background." + k, { suffix: ":" })).append("span").attr("class", "background-info-span-" + k).text(_metadata[k]); + list.append("li").attr("class", "background-info-list-" + k2).classed("hide", !_metadata[k2]).call(_t.append("info_panels.background." + k2, { suffix: ":" })).append("span").attr("class", "background-info-span-" + k2).text(_metadata[k2]); }); debouncedGetMetadata(selection2); var toggleTiles = context.getDebug("tile") ? "hide_tiles" : "show_tiles"; @@ -51980,25 +56512,25 @@ ${content} if (tile.empty()) return; var sourceName = _currSourceName; - var d = tile.datum(); - var zoom = d && d.length >= 3 && d[2] || Math.floor(context.map().zoom()); + var d2 = tile.datum(); + var zoom = d2 && d2.length >= 3 && d2[2] || Math.floor(context.map().zoom()); var center = context.map().center(); _metadata.zoom = String(zoom); selection2.selectAll(".background-info-list-zoom").classed("hide", false).selectAll(".background-info-span-zoom").text(_metadata.zoom); - if (!d || !d.length >= 3) + if (!d2 || !d2.length >= 3) return; - background.baseLayerSource().getMetadata(center, d, function(err, result) { + background.baseLayerSource().getMetadata(center, d2, function(err, result) { if (err || _currSourceName !== sourceName) return; var vintage = result.vintage; _metadata.vintage = vintage && vintage.range || _t("info_panels.background.unknown"); selection2.selectAll(".background-info-list-vintage").classed("hide", false).selectAll(".background-info-span-vintage").text(_metadata.vintage); - _metadataKeys.forEach(function(k) { - if (k === "zoom" || k === "vintage") + _metadataKeys.forEach(function(k2) { + if (k2 === "zoom" || k2 === "vintage") return; - var val = result[k]; - _metadata[k] = val; - selection2.selectAll(".background-info-list-" + k).classed("hide", !val).selectAll(".background-info-span-" + k).text(val); + var val = result[k2]; + _metadata[k2] = val; + selection2.selectAll(".background-info-list-" + k2).classed("hide", !val).selectAll(".background-info-span-" + k2).text(val); }); }); } @@ -52033,10 +56565,10 @@ ${content} minute: "numeric", second: "numeric" }; - var d = new Date(timestamp); - if (isNaN(d.getTime())) + var d2 = new Date(timestamp); + if (isNaN(d2.getTime())) return _t("info_panels.history.unknown"); - return d.toLocaleString(_mainLocalizer.localeCode(), options2); + return d2.toLocaleString(_mainLocalizer.localeCode(), options2); } function displayUser(selection2, userName) { if (!userName) { @@ -52071,8 +56603,8 @@ ${content} selected = [_t.html("note.note") + " " + selectedNoteID]; note = osm.getNote(selectedNoteID); } else { - selected = context.selectedIDs().filter(function(e) { - return context.hasEntity(e); + selected = context.selectedIDs().filter(function(e3) { + return context.hasEntity(e3); }); if (selected.length) { entity = context.entity(selected[0]); @@ -52145,58 +56677,58 @@ ${content} // modules/util/units.js var OSM_PRECISION = 7; - function displayLength(m, isImperial) { - var d = m * (isImperial ? 3.28084 : 1); + function displayLength(m2, isImperial) { + var d2 = m2 * (isImperial ? 3.28084 : 1); var unit2; if (isImperial) { - if (d >= 5280) { - d /= 5280; + if (d2 >= 5280) { + d2 /= 5280; unit2 = "miles"; } else { unit2 = "feet"; } } else { - if (d >= 1e3) { - d /= 1e3; + if (d2 >= 1e3) { + d2 /= 1e3; unit2 = "kilometers"; } else { unit2 = "meters"; } } return _t("units." + unit2, { - quantity: d.toLocaleString(_mainLocalizer.localeCode(), { + quantity: d2.toLocaleString(_mainLocalizer.localeCode(), { maximumSignificantDigits: 4 }) }); } function displayArea(m2, isImperial) { var locale2 = _mainLocalizer.localeCode(); - var d = m2 * (isImperial ? 10.7639111056 : 1); - var d1, d2, area; + var d2 = m2 * (isImperial ? 10.7639111056 : 1); + var d1, d22, area; var unit1 = ""; var unit2 = ""; if (isImperial) { - if (d >= 6969600) { - d1 = d / 27878400; + if (d2 >= 6969600) { + d1 = d2 / 27878400; unit1 = "square_miles"; } else { - d1 = d; + d1 = d2; unit1 = "square_feet"; } - if (d > 4356 && d < 4356e4) { - d2 = d / 43560; + if (d2 > 4356 && d2 < 4356e4) { + d22 = d2 / 43560; unit2 = "acres"; } } else { - if (d >= 25e4) { - d1 = d / 1e6; + if (d2 >= 25e4) { + d1 = d2 / 1e6; unit1 = "square_kilometers"; } else { - d1 = d; + d1 = d2; unit1 = "square_meters"; } - if (d > 1e3 && d < 1e7) { - d2 = d / 1e4; + if (d2 > 1e3 && d2 < 1e7) { + d22 = d2 / 1e4; unit2 = "hectares"; } } @@ -52205,11 +56737,11 @@ ${content} maximumSignificantDigits: 4 }) }); - if (d2) { + if (d22) { return _t("units.area_pair", { area1: area, area2: _t("units." + unit2, { - quantity: d2.toLocaleString(locale2, { + quantity: d22.toLocaleString(locale2, { maximumSignificantDigits: 2 }) }) @@ -52218,12 +56750,12 @@ ${content} return area; } } - function wrap(x, min3, max3) { - var d = max3 - min3; - return ((x - min3) % d + d) % d + min3; + function wrap(x2, min3, max3) { + var d2 = max3 - min3; + return ((x2 - min3) % d2 + d2) % d2 + min3; } - function clamp2(x, min3, max3) { - return Math.max(min3, Math.min(x, max3)); + function clamp2(x2, min3, max3) { + return Math.max(min3, Math.min(x2, max3)); } function displayCoordinate(deg, pos, neg) { var locale2 = _mainLocalizer.localeCode(); @@ -52313,11 +56845,11 @@ ${content} // modules/ui/panels/measurement.js function uiPanelMeasurement(context) { - function radiansToMeters(r) { - return r * 63710071809e-4; + function radiansToMeters(r2) { + return r2 * 63710071809e-4; } - function steradiansToSqmeters(r) { - return r / (4 * Math.PI) * 510065621724e3; + function steradiansToSqmeters(r2) { + return r2 / (4 * Math.PI) * 510065621724e3; } function toLineString(feature3) { if (feature3.type === "LineString") @@ -52355,8 +56887,8 @@ ${content} heading = selected.length === 1 ? selected[0].id : _t.html("info_panels.selected", { n: selected.length }); if (selected.length) { var extent = geoExtent(); - for (var i2 in selected) { - var entity = selected[i2]; + for (var i3 in selected) { + var entity = selected[i3]; extent._extend(entity.extent(graph)); geometry = entity.geometry(graph); if (geometry === "line" || geometry === "area") { @@ -52471,46 +57003,46 @@ ${content} var wasActive = ["measurement"]; var panels = {}; var active = {}; - ids.forEach(function(k) { - if (!panels[k]) { - panels[k] = uiInfoPanels[k](context); - active[k] = false; + ids.forEach(function(k2) { + if (!panels[k2]) { + panels[k2] = uiInfoPanels[k2](context); + active[k2] = false; } }); function info(selection2) { function redraw() { - var activeids = ids.filter(function(k) { - return active[k]; + var activeids = ids.filter(function(k2) { + return active[k2]; }).sort(); - var containers = infoPanels.selectAll(".panel-container").data(activeids, function(k) { - return k; + var containers = infoPanels.selectAll(".panel-container").data(activeids, function(k2) { + return k2; }); - containers.exit().style("opacity", 1).transition().duration(200).style("opacity", 0).on("end", function(d) { - select_default2(this).call(panels[d].off).remove(); + containers.exit().style("opacity", 1).transition().duration(200).style("opacity", 0).on("end", function(d2) { + select_default2(this).call(panels[d2].off).remove(); }); - var enter = containers.enter().append("div").attr("class", function(d) { - return "fillD2 panel-container panel-container-" + d; + var enter = containers.enter().append("div").attr("class", function(d2) { + return "fillD2 panel-container panel-container-" + d2; }); enter.style("opacity", 0).transition().duration(200).style("opacity", 1); var title = enter.append("div").attr("class", "panel-title fillD2"); - title.append("h3").each(function(d) { - return panels[d].label(select_default2(this)); + title.append("h3").each(function(d2) { + return panels[d2].label(select_default2(this)); }); - title.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function(d3_event, d) { + title.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function(d3_event, d2) { d3_event.stopImmediatePropagation(); d3_event.preventDefault(); - info.toggle(d); + info.toggle(d2); }).call(svgIcon("#iD-icon-close")); - enter.append("div").attr("class", function(d) { - return "panel-content panel-content-" + d; + enter.append("div").attr("class", function(d2) { + return "panel-content panel-content-" + d2; }); - infoPanels.selectAll(".panel-content").each(function(d) { - select_default2(this).call(panels[d]); + infoPanels.selectAll(".panel-content").each(function(d2) { + select_default2(this).call(panels[d2]); }); } info.toggle = function(which) { - var activeids = ids.filter(function(k) { - return active[k]; + var activeids = ids.filter(function(k2) { + return active[k2]; }); if (which) { active[which] = !active[which]; @@ -52521,12 +57053,12 @@ ${content} } else { if (activeids.length) { wasActive = activeids; - activeids.forEach(function(k) { - active[k] = false; + activeids.forEach(function(k2) { + active[k2] = false; }); } else { - wasActive.forEach(function(k) { - active[k] = true; + wasActive.forEach(function(k2) { + active[k2] = true; }); } } @@ -52540,14 +57072,14 @@ ${content} d3_event.preventDefault(); info.toggle(); }); - ids.forEach(function(k) { - var key = _t("info_panels." + k + ".key", { default: null }); + ids.forEach(function(k2) { + var key = _t("info_panels." + k2 + ".key", { default: null }); if (!key) return; context.keybinding().on(uiCmd("\u2318\u21E7" + key), function(d3_event) { d3_event.stopImmediatePropagation(); d3_event.preventDefault(); - info.toggle(k); + info.toggle(k2); }); }); } @@ -52557,10 +57089,10 @@ ${content} // modules/ui/intro/helper.js function pointBox(loc, context) { var rect = context.surfaceRect(); - var point = context.curtainProjection(loc); + var point2 = context.curtainProjection(loc); return { - left: point[0] + rect.left - 40, - top: point[1] + rect.top - 60, + left: point2[0] + rect.left - 40, + top: point2[1] + rect.top - 60, width: 80, height: 90 }; @@ -52569,10 +57101,10 @@ ${content} var box; if (locOrBox instanceof Array) { var rect = context.surfaceRect(); - var point = context.curtainProjection(locOrBox); + var point2 = context.curtainProjection(locOrBox); box = { - left: point[0] + rect.left, - top: point[1] + rect.top + left: point2[0] + rect.left, + top: point2[1] + rect.top }; } else { box = locOrBox; @@ -52591,6 +57123,7 @@ ${content} function helpHtml(id2, replacements) { if (!helpStringReplacements) { helpStringReplacements = { + // insert icons corresponding to various UI elements point_icon: icon("#iD-icon-point", "inline"), line_icon: icon("#iD-icon-line", "inline"), area_icon: icon("#iD-icon-area", "inline"), @@ -52604,6 +57137,7 @@ ${content} undo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo", "inline"), redo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-undo" : "#iD-icon-redo", "inline"), save_icon: icon("#iD-icon-save", "inline"), + // operation icons circularize_icon: icon("#iD-operation-circularize", "inline operation"), continue_icon: icon("#iD-operation-continue", "inline operation"), copy_icon: icon("#iD-operation-copy", "inline operation"), @@ -52621,6 +57155,7 @@ ${content} rotate_icon: icon("#iD-operation-rotate", "inline operation"), split_icon: icon("#iD-operation-split", "inline operation"), straighten_icon: icon("#iD-operation-straighten", "inline operation"), + // interaction icons leftclick: icon("#iD-walkthrough-mouse-left", "inline operation"), rightclick: icon("#iD-walkthrough-mouse-right", "inline operation"), mousewheel_icon: icon("#iD-walkthrough-mousewheel", "inline operation"), @@ -52629,6 +57164,7 @@ ${content} longpress_icon: icon("#iD-walkthrough-longpress", "inline operation"), touchdrag_icon: icon("#iD-walkthrough-touchdrag", "inline operation"), pinch_icon: icon("#iD-walkthrough-pinch-apart", "inline operation"), + // insert keys; may be localized and platform-dependent shift: uiCmd.display("\u21E7"), alt: uiCmd.display("\u2325"), return: uiCmd.display("\u21B5"), @@ -52637,6 +57173,7 @@ ${content} add_note_key: _t.html("modes.add_note.key"), help_key: _t.html("help.key"), shortcuts_key: _t.html("shortcuts.toggle.key"), + // reference localized UI labels directly so that they'll always match save: _t.html("save.title"), undo: _t.html("undo.title"), redo: _t.html("redo.title"), @@ -52728,9 +57265,9 @@ ${content} "subdistrict", "suburb" ]; - addrTags.forEach(function(k) { - var key2 = "intro.graph." + k; - var tag = "addr:" + k; + addrTags.forEach(function(k2) { + var key2 = "intro.graph." + k2; + var tag = "addr:" + k2; var val = obj.tags && obj.tags[tag]; var str2 = _t(key2, { default: val }); if (str2) { @@ -52748,11 +57285,11 @@ ${content} var threshold = 15; var lowerBound = Math.cos((90 - threshold) * Math.PI / 180); var upperBound = Math.cos(threshold * Math.PI / 180); - for (var i2 = 0; i2 < points.length; i2++) { - var a = points[(i2 - 1 + points.length) % points.length]; - var origin = points[i2]; - var b = points[(i2 + 1) % points.length]; - var dotp = geoVecNormalizedDot(a, b, origin); + for (var i3 = 0; i3 < points.length; i3++) { + var a2 = points[(i3 - 1 + points.length) % points.length]; + var origin = points[i3]; + var b2 = points[(i3 + 1) % points.length]; + var dotp = geoVecNormalizedDot(a2, b2, origin); var mag = Math.abs(dotp); if (mag > lowerBound && mag < upperBound) { return false; @@ -52855,15 +57392,15 @@ ${content} options2.buttonCallback(); }); } - var tip = copyBox(tooltip.node().getBoundingClientRect()), w = containerNode.clientWidth, h = containerNode.clientHeight, tooltipWidth = 200, tooltipArrow = 5, side, pos; + var tip = copyBox(tooltip.node().getBoundingClientRect()), w2 = containerNode.clientWidth, h2 = containerNode.clientHeight, tooltipWidth = 200, tooltipArrow = 5, side, pos; if (options2.tooltipClass === "intro-mouse") { tip.height += 80; } - if (tooltipBox.top + tooltipBox.height > h) { - tooltipBox.height -= tooltipBox.top + tooltipBox.height - h; + if (tooltipBox.top + tooltipBox.height > h2) { + tooltipBox.height -= tooltipBox.top + tooltipBox.height - h2; } - if (tooltipBox.left + tooltipBox.width > w) { - tooltipBox.width -= tooltipBox.left + tooltipBox.width - w; + if (tooltipBox.left + tooltipBox.width > w2) { + tooltipBox.width -= tooltipBox.left + tooltipBox.width - w2; } if (tooltipBox.top + tooltipBox.height < 100) { side = "bottom"; @@ -52871,7 +57408,7 @@ ${content} tooltipBox.left + tooltipBox.width / 2 - tip.width / 2, tooltipBox.top + tooltipBox.height ]; - } else if (tooltipBox.top > h - 140) { + } else if (tooltipBox.top > h2 - 140) { side = "top"; pos = [ tooltipBox.left + tooltipBox.width / 2 - tip.width / 2, @@ -52888,7 +57425,7 @@ ${content} pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY]; } } else { - if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) { + if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w2 - 70) { side = "left"; pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY]; } else { @@ -52905,8 +57442,8 @@ ${content} if (side === "left" || side === "right") { if (pos[1] < 60) { shiftY = 60 - pos[1]; - } else if (pos[1] + tip.height > h - 100) { - shiftY = h - pos[1] - tip.height - 100; + } else if (pos[1] + tip.height > h2 - 100) { + shiftY = h2 - pos[1] - tip.height - 100; } } tooltip.selectAll(".popover-inner").style("top", shiftY + "px"); @@ -52924,13 +57461,13 @@ ${content} } else { selection2 = darkness.transition().duration(duration || 600).ease(linear2); } - selection2.attr("d", function(d) { + selection2.attr("d", function(d2) { var containerWidth = containerNode.clientWidth; var containerHeight = containerNode.clientHeight; var string = "M 0,0 L 0," + containerHeight + " L " + containerWidth + "," + containerHeight + "L" + containerWidth + ",0 Z"; - if (!d) + if (!d2) return string; - return string + "M" + d.left + "," + d.top + "L" + d.left + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + d.top + "Z"; + return string + "M" + d2.left + "," + d2.top + "L" + d2.left + "," + (d2.top + d2.height) + "L" + (d2.left + d2.width) + "," + (d2.top + d2.height) + "L" + (d2.left + d2.width) + "," + d2.top + "Z"; }); }; curtain.remove = function() { @@ -52953,7 +57490,7 @@ ${content} // modules/ui/intro/welcome.js function uiIntroWelcome(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var chapter = { title: "intro.welcome.title" }; @@ -52980,7 +57517,7 @@ ${content} ); } function chapters() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".intro-nav-wrap .chapter-navigation", helpHtml("intro.welcome.chapters", { next: _t("intro.navigation.title") }) @@ -52996,12 +57533,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/navigation.js function uiIntroNavigation(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var timeouts = []; var hallId = "n2061"; var townHall = [-85.63591, 41.94285]; @@ -53013,8 +57550,8 @@ ${content} var chapter = { title: "intro.navigation.title" }; - function timeout2(f2, t) { - timeouts.push(window.setTimeout(f2, t)); + function timeout2(f3, t2) { + timeouts.push(window.setTimeout(f3, t2)); } function eventCancel(d3_event) { d3_event.stopPropagation(); @@ -53067,7 +57604,7 @@ ${content} if (context.map().zoom() !== zoomStart) { context.map().on("move.intro", null); timeout2(function() { - continueTo(features2); + continueTo(features); }, 3e3); } }); @@ -53076,7 +57613,7 @@ ${content} nextStep(); } } - function features2() { + function features() { var onClick = function() { continueTo(pointsLinesAreas); }; @@ -53447,7 +57984,7 @@ ${content} } } function play() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".ideditor", helpHtml("intro.navigation.play", { next: _t("intro.points.title") }), @@ -53475,12 +58012,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/point.js function uiIntroPoint(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var timeouts = []; var intersection = [-85.63279, 41.94394]; var building = [-85.632422, 41.944045]; @@ -53489,8 +58026,8 @@ ${content} var chapter = { title: "intro.points.title" }; - function timeout2(f2, t) { - timeouts.push(window.setTimeout(f2, t)); + function timeout2(f3, t2) { + timeouts.push(window.setTimeout(f3, t2)); } function eventCancel(d3_event) { d3_event.stopPropagation(); @@ -53843,7 +58380,7 @@ ${content} } } function play() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".ideditor", helpHtml("intro.points.play", { next: _t("intro.areas.title") }), @@ -53871,12 +58408,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/area.js function uiIntroArea(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var playground = [-85.63552, 41.94159]; var playgroundPreset = _mainPresetIndex.item("leisure/playground"); var nameField = _mainPresetIndex.field("name"); @@ -53886,8 +58423,8 @@ ${content} var chapter = { title: "intro.areas.title" }; - function timeout2(f2, t) { - timeouts.push(window.setTimeout(f2, t)); + function timeout2(f3, t2) { + timeouts.push(window.setTimeout(f3, t2)); } function eventCancel(d3_event) { d3_event.stopPropagation(); @@ -54116,9 +58653,9 @@ ${content} var end = start2 + (box.top - 300); pane.transition().duration(250).tween("scroll.inspector", function() { var node = this; - var i2 = number_default(start2, end); - return function(t) { - node.scrollTop = i2(t); + var i3 = number_default(start2, end); + return function(t2) { + node.scrollTop = i3(t2); }; }); } @@ -54247,7 +58784,7 @@ ${content} } } function play() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".ideditor", helpHtml("intro.areas.play", { next: _t("intro.lines.title") }), @@ -54276,12 +58813,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/line.js function uiIntroLine(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var timeouts = []; var _tulipRoadID = null; var flowerRoadID = "w646"; @@ -54307,8 +58844,8 @@ ${content} var chapter = { title: "intro.lines.title" }; - function timeout2(f2, t) { - timeouts.push(window.setTimeout(f2, t)); + function timeout2(f3, t2) { + timeouts.push(window.setTimeout(f3, t2)); } function eventCancel(d3_event) { d3_event.stopPropagation(); @@ -55151,7 +59688,7 @@ ${content} } } function play() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".ideditor", helpHtml("intro.lines.play", { next: _t("intro.buildings.title") }), @@ -55180,12 +59717,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/building.js function uiIntroBuilding(context, reveal) { - var dispatch10 = dispatch_default("done"); + var dispatch14 = dispatch_default("done"); var house = [-85.62815, 41.95638]; var tank = [-85.62732, 41.95347]; var buildingCatetory = _mainPresetIndex.item("category-building"); @@ -55197,8 +59734,8 @@ ${content} var chapter = { title: "intro.buildings.title" }; - function timeout2(f2, t) { - timeouts.push(window.setTimeout(f2, t)); + function timeout2(f3, t2) { + timeouts.push(window.setTimeout(f3, t2)); } function eventCancel(d3_event) { d3_event.stopPropagation(); @@ -55281,8 +59818,8 @@ ${content} var graph = context.graph(); var way = context.entity(context.selectedIDs()[0]); var nodes = graph.childNodes(way); - var points = utilArrayUniq(nodes).map(function(n2) { - return context.projection(n2.loc); + var points = utilArrayUniq(nodes).map(function(n3) { + return context.projection(n3.loc); }); if (isMostlySquare(points)) { _houseID = way.id; @@ -55786,7 +60323,7 @@ ${content} } } function play() { - dispatch10.call("done"); + dispatch14.call("done"); reveal( ".ideditor", helpHtml("intro.buildings.play", { next: _t("intro.startediting.title") }), @@ -55815,12 +60352,12 @@ ${content} chapter.exit(); chapter.enter(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/start_editing.js function uiIntroStartEditing(context, reveal) { - var dispatch10 = dispatch_default("done", "startEditing"); + var dispatch14 = dispatch_default("done", "startEditing"); var modalSelection = select_default2(null); var chapter = { title: "intro.startediting.title" @@ -55872,7 +60409,7 @@ ${content} }); startbutton.append("svg").attr("class", "illustration").append("use").attr("xlink:href", "#iD-logo-walkthrough"); startbutton.append("h2").call(_t.append("intro.startediting.start")); - dispatch10.call("startEditing"); + dispatch14.call("startEditing"); } chapter.enter = function() { showHelp(); @@ -55881,7 +60418,7 @@ ${content} modalSelection.remove(); context.container().selectAll(".shaded").remove(); }; - return utilRebind(chapter, dispatch10, "on"); + return utilRebind(chapter, dispatch14, "on"); } // modules/ui/intro/intro.js @@ -55945,7 +60482,7 @@ ${content} } else { context.background().bing(); } - overlays.forEach((d) => context.background().toggleOverlayLayer(d)); + overlays.forEach((d2) => context.background().toggleOverlayLayer(d2)); let layers = context.layers(); layers.all().forEach((item) => { if (typeof item.layer.enabled === "function") { @@ -55958,17 +60495,17 @@ ${content} corePreferences("walkthrough_started", "yes"); let storedProgress = corePreferences("walkthrough_progress") || ""; let progress = storedProgress.split(";").filter(Boolean); - let chapters = chapterFlow.map((chapter, i2) => { - let s = chapterUi[chapter](context, curtain.reveal).on("done", () => { - buttons.filter((d) => d.title === s.title).classed("finished", true); - if (i2 < chapterFlow.length - 1) { - const next = chapterFlow[i2 + 1]; + let chapters = chapterFlow.map((chapter, i3) => { + let s2 = chapterUi[chapter](context, curtain.reveal).on("done", () => { + buttons.filter((d2) => d2.title === s2.title).classed("finished", true); + if (i3 < chapterFlow.length - 1) { + const next = chapterFlow[i3 + 1]; context.container().select(`button.chapter-${next}`).classed("next", true); } progress.push(chapter); corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";")); }); - return s; + return s2; }); chapters[chapters.length - 1].on("startEditing", () => { progress.push("startEditing"); @@ -55986,7 +60523,7 @@ ${content} } context.history().reset().merge(Object.values(baseEntities)); context.background().baseLayerSource(background); - overlays.forEach((d) => context.background().toggleOverlayLayer(d)); + overlays.forEach((d2) => context.background().toggleOverlayLayer(d2)); if (history) { context.history().fromJSON(history, false); } @@ -55997,8 +60534,8 @@ ${content} let navwrap = selection2.append("div").attr("class", "intro-nav-wrap fillD"); navwrap.append("svg").attr("class", "intro-nav-wrap-logo").append("use").attr("xlink:href", "#iD-logo-walkthrough"); let buttonwrap = navwrap.append("div").attr("class", "joined").selectAll("button.chapter"); - let buttons = buttonwrap.data(chapters).enter().append("button").attr("class", (d, i2) => `chapter chapter-${chapterFlow[i2]}`).on("click", enterChapter); - buttons.append("span").html((d) => _t.html(d.title)); + let buttons = buttonwrap.data(chapters).enter().append("button").attr("class", (d2, i3) => `chapter chapter-${chapterFlow[i3]}`).on("click", enterChapter); + buttons.append("span").html((d2) => _t.html(d2.title)); buttons.append("span").attr("class", "status").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline")); enterChapter(null, chapters[0]); function enterChapter(d3_event, newChapter) { @@ -56008,7 +60545,7 @@ ${content} context.enter(modeBrowse(context)); _currChapter = newChapter; _currChapter.enter(); - buttons.classed("next", false).classed("active", (d) => d.title === _currChapter.title); + buttons.classed("next", false).classed("active", (d2) => d2.title === _currChapter.title); } } return intro; @@ -56045,25 +60582,25 @@ ${content} shownItems.push(resolvedItem); } } - var chips = selection2.selectAll(".chip").data(shownItems, function(d) { - return d.id; + var chips = selection2.selectAll(".chip").data(shownItems, function(d2) { + return d2.id; }); chips.exit().remove(); - var enter = chips.enter().append("a").attr("class", function(d) { - return "chip " + d.id + "-count"; - }).attr("href", "#").each(function(d) { + var enter = chips.enter().append("a").attr("class", function(d2) { + return "chip " + d2.id + "-count"; + }).attr("href", "#").each(function(d2) { var chipSelection = select_default2(this); - var tooltipBehavior = uiTooltip().placement("top").title(() => _t.append(d.descriptionID)); + var tooltipBehavior = uiTooltip().placement("top").title(() => _t.append(d2.descriptionID)); chipSelection.call(tooltipBehavior).on("click", function(d3_event) { d3_event.preventDefault(); tooltipBehavior.hide(select_default2(this)); context.ui().togglePanes(context.container().select(".map-panes .issues-pane")); }); - chipSelection.call(svgIcon("#" + d.iconID)); + chipSelection.call(svgIcon("#" + d2.iconID)); }); enter.append("span").attr("class", "count"); - enter.merge(chips).selectAll("span.count").text(function(d) { - return d.count.toString(); + enter.merge(chips).selectAll("span.count").text(function(d2) { + return d2.count.toString(); }); } return function(selection2) { @@ -56105,11 +60642,11 @@ ${content} function zoomed(d3_event) { if (_skipEvents) return; - var x = d3_event.transform.x; - var y = d3_event.transform.y; - var k = d3_event.transform.k; - var isZooming = k !== _tStart.k; - var isPanning = x !== _tStart.x || y !== _tStart.y; + var x2 = d3_event.transform.x; + var y2 = d3_event.transform.y; + var k2 = d3_event.transform.k; + var isZooming = k2 !== _tStart.k; + var isPanning = x2 !== _tStart.x || y2 !== _tStart.y; if (!isZooming && !isPanning) { return; } @@ -56119,21 +60656,21 @@ ${content} var tMini = projection2.transform(); var tX, tY, scale; if (_gesture === "zoom") { - scale = k / tMini.k; + scale = k2 / tMini.k; tX = (_cMini[0] / scale - _cMini[0]) * scale; tY = (_cMini[1] / scale - _cMini[1]) * scale; } else { - k = tMini.k; + k2 = tMini.k; scale = 1; - tX = x - tMini.x; - tY = y - tMini.y; + tX = x2 - tMini.x; + tY = y2 - tMini.y; } utilSetTransform(tiles, tX, tY, scale); utilSetTransform(viewport, 0, 0, scale); _isTransformed = true; - _tCurr = identity2.translate(x, y).scale(k); + _tCurr = identity2.translate(x2, y2).scale(k2); var zMain = geoScaleToZoom(context.projection.scale()); - var zMini = geoScaleToZoom(k); + var zMini = geoScaleToZoom(k2); _zDiff = zMain - zMini; queueRedraw(); } @@ -56153,10 +60690,10 @@ ${content} var zMini = Math.max(zMain - _zDiff, 0.5); var kMini = geoZoomToScale(zMini); projection2.translate([tMain.x, tMain.y]).scale(kMini); - var point = projection2(loc); + var point2 = projection2(loc); var mouse = _gesture === "pan" ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0]; - var xMini = _cMini[0] - point[0] + tMain.x + mouse[0]; - var yMini = _cMini[1] - point[1] + tMain.y + mouse[1]; + var xMini = _cMini[0] - point2[0] + tMain.x + mouse[0]; + var yMini = _cMini[1] - point2[1] + tMain.y + mouse[1]; projection2.translate([xMini, yMini]).clipExtent([[0, 0], _dMini]); _tCurr = projection2.transform(); if (_isTransformed) { @@ -56182,17 +60719,17 @@ ${content} background.enter().append("div").attr("class", "map-in-map-background").merge(background).call(backgroundLayer); var overlaySources = context.background().overlayLayerSources(); var activeOverlayLayers = []; - for (var i2 = 0; i2 < overlaySources.length; i2++) { - if (overlaySources[i2].validZoom(zMini)) { - if (!overlayLayers[i2]) - overlayLayers[i2] = rendererTileLayer(context); - activeOverlayLayers.push(overlayLayers[i2].source(overlaySources[i2]).projection(projection2).dimensions(_dMini)); + for (var i3 = 0; i3 < overlaySources.length; i3++) { + if (overlaySources[i3].validZoom(zMini)) { + if (!overlayLayers[i3]) + overlayLayers[i3] = rendererTileLayer(context); + activeOverlayLayers.push(overlayLayers[i3].source(overlaySources[i3]).projection(projection2).dimensions(_dMini)); } } var overlay = tiles.selectAll(".map-in-map-overlay").data([0]); overlay = overlay.enter().append("div").attr("class", "map-in-map-overlay").merge(overlay); - var overlays = overlay.selectAll("div").data(activeOverlayLayers, function(d) { - return d.source().name(); + var overlays = overlay.selectAll("div").data(activeOverlayLayers, function(d2) { + return d2.source().name(); }); overlays.exit().remove(); overlays = overlays.enter().append("div").merge(overlays).each(function(layer) { @@ -56203,12 +60740,12 @@ ${content} dataLayers = dataLayers.enter().append("svg").attr("class", "map-in-map-data").merge(dataLayers).call(dataLayer).call(debugLayer); if (_gesture !== "pan") { var getPath = path_default(projection2); - var bbox = { type: "Polygon", coordinates: [context.map().extent().polygon()] }; + var bbox2 = { type: "Polygon", coordinates: [context.map().extent().polygon()] }; viewport = wrap2.selectAll(".map-in-map-viewport").data([0]); viewport = viewport.enter().append("svg").attr("class", "map-in-map-viewport").merge(viewport); - var path = viewport.selectAll(".map-in-map-bbox").data([bbox]); - path.enter().append("path").attr("class", "map-in-map-bbox").merge(path).attr("d", getPath).classed("thick", function(d) { - return getPath.area(d) < 30; + var path = viewport.selectAll(".map-in-map-bbox").data([bbox2]); + path.enter().append("path").attr("class", "map-in-map-bbox").merge(path).attr("d", getPath).classed("thick", function(d2) { + return getPath.area(d2) < 30; }); } } @@ -56271,7 +60808,7 @@ ${content} // modules/ui/photoviewer.js function uiPhotoviewer(context) { - var dispatch10 = dispatch_default("resize"); + var dispatch14 = dispatch_default("resize"); var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse"; function photoviewer(selection2) { selection2.append("button").attr("class", "thumb-hide").attr("title", _t("icons.close")).on("click", function() { @@ -56284,23 +60821,29 @@ ${content} if (services.kartaview) { services.kartaview.hideViewer(context); } + if (services.mapilio) { + services.mapilio.hideViewer(context); + } + if (services.vegbilder) { + services.vegbilder.hideViewer(context); + } }).append("div").call(svgIcon("#iD-icon-close")); function preventDefault(d3_event) { d3_event.preventDefault(); } selection2.append("button").attr("class", "resize-handle-xy").on("touchstart touchdown touchend", preventDefault).on( _pointerPrefix + "down", - buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true, resizeOnY: true }) + buildResizeListener(selection2, "resize", dispatch14, { resizeOnX: true, resizeOnY: true }) ); selection2.append("button").attr("class", "resize-handle-x").on("touchstart touchdown touchend", preventDefault).on( _pointerPrefix + "down", - buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true }) + buildResizeListener(selection2, "resize", dispatch14, { resizeOnX: true }) ); selection2.append("button").attr("class", "resize-handle-y").on("touchstart touchdown touchend", preventDefault).on( _pointerPrefix + "down", - buildResizeListener(selection2, "resize", dispatch10, { resizeOnY: true }) + buildResizeListener(selection2, "resize", dispatch14, { resizeOnY: true }) ); - function buildResizeListener(target, eventName, dispatch11, options2) { + function buildResizeListener(target, eventName, dispatch15, options2) { var resizeOnX = !!options2.resizeOnX; var resizeOnY = !!options2.resizeOnY; var minHeight = options2.minHeight || 240; @@ -56326,7 +60869,7 @@ ${content} var newHeight = clamp3(startHeight + startY - d3_event.clientY, minHeight, maxHeight); target.style("height", newHeight + "px"); } - dispatch11.call(eventName, target, utilGetDimensions(target, true)); + dispatch15.call(eventName, target, subtractPadding(utilGetDimensions(target, true), target)); } function clamp3(num, min3, max3) { return Math.max(min3, Math.min(num, max3)); @@ -56365,10 +60908,16 @@ ${content} Math.min(photoDimensions[1], mapDimensions[1] - 90) ]; photoviewer2.style("width", setPhotoDimensions[0] + "px").style("height", setPhotoDimensions[1] + "px"); - dispatch10.call("resize", photoviewer2, setPhotoDimensions); + dispatch14.call("resize", photoviewer2, subtractPadding(setPhotoDimensions, photoviewer2)); } }; - return utilRebind(photoviewer, dispatch10, "on"); + function subtractPadding(dimensions, selection2) { + return [ + dimensions[0] - parseFloat(selection2.style("padding-left")) - parseFloat(selection2.style("padding-right")), + dimensions[1] - parseFloat(selection2.style("padding-top")) - parseFloat(selection2.style("padding-bottom")) + ]; + } + return utilRebind(photoviewer, dispatch14, "on"); } // modules/ui/restore.js @@ -56402,14 +60951,14 @@ ${content} function uiScale(context) { var projection2 = context.projection, isImperial = !_mainLocalizer.usesMetric(), maxLength = 180, tickHeight = 8; function scaleDefs(loc1, loc2) { - var lat = (loc2[1] + loc1[1]) / 2, conversion = isImperial ? 3.28084 : 1, dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion, scale = { dist: 0, px: 0, text: "" }, buckets, i2, val, dLon; + var lat = (loc2[1] + loc1[1]) / 2, conversion = isImperial ? 3.28084 : 1, dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion, scale = { dist: 0, px: 0, text: "" }, buckets, i3, val, dLon; if (isImperial) { buckets = [528e4, 528e3, 52800, 5280, 500, 50, 5, 1]; } else { buckets = [5e6, 5e5, 5e4, 5e3, 500, 50, 5, 1]; } - for (i2 = 0; i2 < buckets.length; i2++) { - val = buckets[i2]; + for (i3 = 0; i3 < buckets.length; i3++) { + val = buckets[i3]; if (dist >= val) { scale.dist = Math.floor(dist / val) * val; break; @@ -56468,108 +61017,108 @@ ${content} var shortcutsList = wrapperEnter.append("div").attr("class", "shortcuts-list"); wrapper = wrapper.merge(wrapperEnter); var tabs = tabsBar.selectAll(".tab").data(_dataShortcuts); - var tabsEnter = tabs.enter().append("a").attr("class", "tab").attr("href", "#").on("click", function(d3_event, d) { + var tabsEnter = tabs.enter().append("a").attr("class", "tab").attr("href", "#").on("click", function(d3_event, d2) { d3_event.preventDefault(); - var i2 = _dataShortcuts.indexOf(d); - _activeTab = i2; + var i3 = _dataShortcuts.indexOf(d2); + _activeTab = i3; render(selection2); }); - tabsEnter.append("span").html(function(d) { - return _t.html(d.text); + tabsEnter.append("span").html(function(d2) { + return _t.html(d2.text); }); - wrapper.selectAll(".tab").classed("active", function(d, i2) { - return i2 === _activeTab; + wrapper.selectAll(".tab").classed("active", function(d2, i3) { + return i3 === _activeTab; }); var shortcuts = shortcutsList.selectAll(".shortcut-tab").data(_dataShortcuts); - var shortcutsEnter = shortcuts.enter().append("div").attr("class", function(d) { - return "shortcut-tab shortcut-tab-" + d.tab; + var shortcutsEnter = shortcuts.enter().append("div").attr("class", function(d2) { + return "shortcut-tab shortcut-tab-" + d2.tab; }); - var columnsEnter = shortcutsEnter.selectAll(".shortcut-column").data(function(d) { - return d.columns; + var columnsEnter = shortcutsEnter.selectAll(".shortcut-column").data(function(d2) { + return d2.columns; }).enter().append("table").attr("class", "shortcut-column"); - var rowsEnter = columnsEnter.selectAll(".shortcut-row").data(function(d) { - return d.rows; + var rowsEnter = columnsEnter.selectAll(".shortcut-row").data(function(d2) { + return d2.rows; }).enter().append("tr").attr("class", "shortcut-row"); - var sectionRows = rowsEnter.filter(function(d) { - return !d.shortcuts; + var sectionRows = rowsEnter.filter(function(d2) { + return !d2.shortcuts; }); sectionRows.append("td"); - sectionRows.append("td").attr("class", "shortcut-section").append("h3").html(function(d) { - return _t.html(d.text); + sectionRows.append("td").attr("class", "shortcut-section").append("h3").html(function(d2) { + return _t.html(d2.text); }); - var shortcutRows = rowsEnter.filter(function(d) { - return d.shortcuts; + var shortcutRows = rowsEnter.filter(function(d2) { + return d2.shortcuts; }); var shortcutKeys = shortcutRows.append("td").attr("class", "shortcut-keys"); - var modifierKeys = shortcutKeys.filter(function(d) { - return d.modifiers; + var modifierKeys = shortcutKeys.filter(function(d2) { + return d2.modifiers; }); - modifierKeys.selectAll("kbd.modifier").data(function(d) { - if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") { + modifierKeys.selectAll("kbd.modifier").data(function(d2) { + if (detected.os === "win" && d2.text === "shortcuts.editing.commands.redo") { return ["\u2318"]; - } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") { + } else if (detected.os !== "mac" && d2.text === "shortcuts.browsing.display_options.fullscreen") { return []; } else { - return d.modifiers; + return d2.modifiers; } }).enter().each(function() { var selection3 = select_default2(this); - selection3.append("kbd").attr("class", "modifier").text(function(d) { - return uiCmd.display(d); + selection3.append("kbd").attr("class", "modifier").text(function(d2) { + return uiCmd.display(d2); }); selection3.append("span").text("+"); }); - shortcutKeys.selectAll("kbd.shortcut").data(function(d) { - var arr = d.shortcuts; - if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") { + shortcutKeys.selectAll("kbd.shortcut").data(function(d2) { + var arr = d2.shortcuts; + if (detected.os === "win" && d2.text === "shortcuts.editing.commands.redo") { arr = ["Y"]; - } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") { + } else if (detected.os !== "mac" && d2.text === "shortcuts.browsing.display_options.fullscreen") { arr = ["F11"]; } - arr = arr.map(function(s) { - return uiCmd.display(s.indexOf(".") !== -1 ? _t(s) : s); + arr = arr.map(function(s2) { + return uiCmd.display(s2.indexOf(".") !== -1 ? _t(s2) : s2); }); - return utilArrayUniq(arr).map(function(s) { + return utilArrayUniq(arr).map(function(s2) { return { - shortcut: s, - separator: d.separator, - suffix: d.suffix + shortcut: s2, + separator: d2.separator, + suffix: d2.suffix }; }); - }).enter().each(function(d, i2, nodes) { + }).enter().each(function(d2, i3, nodes) { var selection3 = select_default2(this); - var click = d.shortcut.toLowerCase().match(/(.*).click/); + var click = d2.shortcut.toLowerCase().match(/(.*).click/); if (click && click[1]) { selection3.call(svgIcon("#iD-walkthrough-mouse-" + click[1], "operation")); - } else if (d.shortcut.toLowerCase() === "long-press") { + } else if (d2.shortcut.toLowerCase() === "long-press") { selection3.call(svgIcon("#iD-walkthrough-longpress", "longpress operation")); - } else if (d.shortcut.toLowerCase() === "tap") { + } else if (d2.shortcut.toLowerCase() === "tap") { selection3.call(svgIcon("#iD-walkthrough-tap", "tap operation")); } else { - selection3.append("kbd").attr("class", "shortcut").text(function(d2) { - return d2.shortcut; + selection3.append("kbd").attr("class", "shortcut").text(function(d4) { + return d4.shortcut; }); } - if (i2 < nodes.length - 1) { - selection3.append("span").html(d.separator || "\xA0" + _t.html("shortcuts.or") + "\xA0"); - } else if (i2 === nodes.length - 1 && d.suffix) { - selection3.append("span").text(d.suffix); + if (i3 < nodes.length - 1) { + selection3.append("span").html(d2.separator || "\xA0" + _t.html("shortcuts.or") + "\xA0"); + } else if (i3 === nodes.length - 1 && d2.suffix) { + selection3.append("span").text(d2.suffix); } }); - shortcutKeys.filter(function(d) { - return d.gesture; + shortcutKeys.filter(function(d2) { + return d2.gesture; }).each(function() { var selection3 = select_default2(this); selection3.append("span").text("+"); - selection3.append("span").attr("class", "gesture").html(function(d) { - return _t.html(d.gesture); + selection3.append("span").attr("class", "gesture").html(function(d2) { + return _t.html(d2.gesture); }); }); - shortcutRows.append("td").attr("class", "shortcut-desc").html(function(d) { - return d.text ? _t.html(d.text) : "\xA0"; + shortcutRows.append("td").attr("class", "shortcut-desc").html(function(d2) { + return d2.text ? _t.html(d2.text) : "\xA0"; }); - wrapper.selectAll(".shortcut-tab").style("display", function(d, i2) { - return i2 === _activeTab ? "flex" : "none"; + wrapper.selectAll(".shortcut-tab").style("display", function(d2, i3) { + return i3 === _activeTab ? "flex" : "none"; }); } return function(selection2, show) { @@ -56599,8 +61148,8 @@ ${content} function dataHeader(selection2) { var header = selection2.selectAll(".data-header").data( _datum ? [_datum] : [], - function(d) { - return d.__featurehash__; + function(d2) { + return d2.__featurehash__; } ); header.exit().remove(); @@ -56621,7 +61170,7 @@ ${content} // modules/ui/combobox.js var _comboHideTimerID; function uiCombobox(context, klass) { - var dispatch10 = dispatch_default("accept", "cancel"); + var dispatch14 = dispatch_default("accept", "cancel", "update"); var container = context.container(); var _suggestions = []; var _data = []; @@ -56634,9 +61183,12 @@ ${content} var _tDown = 0; var _mouseEnterHandler, _mouseLeaveHandler; var _fetcher = function(val, cb) { - cb(_data.filter(function(d) { - var terms = d.terms || []; - terms.push(d.value); + cb(_data.filter(function(d2) { + var terms = d2.terms || []; + terms.push(d2.value); + if (d2.key) { + terms.push(d2.key); + } return terms.some(function(term) { return term.toString().toLowerCase().indexOf(val.toLowerCase()) !== -1; }); @@ -56648,8 +61200,8 @@ ${content} input.classed("combobox-input", true).on("focus.combo-input", focus).on("blur.combo-input", blur).on("keydown.combo-input", keydown).on("keyup.combo-input", keyup).on("input.combo-input", change).on("mousedown.combo-input", mousedown).each(function() { var parent = this.parentNode; var sibling = this.nextSibling; - select_default2(parent).selectAll(".combobox-caret").filter(function(d) { - return d === input.node(); + select_default2(parent).selectAll(".combobox-caret").filter(function(d2) { + return d2 === input.node(); }).data([input.node()]).enter().insert("div", function() { return sibling; }).attr("class", "combobox-caret").on("mousedown.combo-caret", function(d3_event) { @@ -56666,7 +61218,7 @@ ${content} return; if (input.classed("disabled")) return; - _tDown = +new Date(); + _tDown = +/* @__PURE__ */ new Date(); var start2 = input.property("selectionStart"); var end = input.property("selectionEnd"); if (start2 !== end) { @@ -56737,6 +61289,7 @@ ${content} var start2 = input.property("selectionStart"); input.node().setSelectionRange(start2, start2); input.on("input.combo-input", change); + change(false); }); break; case 9: @@ -56745,6 +61298,7 @@ ${content} case 13: d3_event.preventDefault(); d3_event.stopPropagation(); + accept(d3_event); break; case 38: if (tagName === "textarea" && !shown) @@ -56771,17 +61325,16 @@ ${content} case 27: cancel(); break; - case 13: - accept(d3_event); - break; } } - function change() { + function change(doAutoComplete) { + if (doAutoComplete === void 0) + doAutoComplete = true; fetchComboData(value(), function() { _selected = null; var val = input.property("value"); if (_suggestions.length) { - if (input.property("selectionEnd") === val.length) { + if (doAutoComplete && input.property("selectionEnd") === val.length) { _selected = tryAutocomplete(); } if (!_selected) { @@ -56802,15 +61355,16 @@ ${content} function nav(dir) { if (_suggestions.length) { var index = -1; - for (var i2 = 0; i2 < _suggestions.length; i2++) { - if (_selected && _suggestions[i2].value === _selected) { - index = i2; + for (var i3 = 0; i3 < _suggestions.length; i3++) { + if (_selected && _suggestions[i3].value === _selected) { + index = i3; break; } } index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0); _selected = _suggestions[index].value; - input.property("value", _selected); + utilGetSetValue(input, _selected); + dispatch14.call("update"); } render(); ensureVisible(); @@ -56840,14 +61394,14 @@ ${content} } return value2; } - function fetchComboData(v, cb) { + function fetchComboData(v2, cb) { _cancelFetch = false; - _fetcher.call(input, v, function(results) { + _fetcher.call(input, v2, function(results) { if (_cancelFetch) return; _suggestions = results; - results.forEach(function(d) { - _fetched[d.value] = d; + results.forEach(function(d2) { + _fetched[d2.value] = d2; }); if (cb) { cb(); @@ -56860,23 +61414,31 @@ ${content} var val = _caseSensitive ? value() : value().toLowerCase(); if (!val) return; - if (!isNaN(parseFloat(val)) && isFinite(val)) + if (isFinite(val)) return; + const suggestionValues = []; + _suggestions.forEach((s2) => { + suggestionValues.push(s2.value); + if (s2.key && s2.key !== s2.value) { + suggestionValues.push(s2.key); + } + }); var bestIndex = -1; - for (var i2 = 0; i2 < _suggestions.length; i2++) { - var suggestion = _suggestions[i2].value; + for (var i3 = 0; i3 < suggestionValues.length; i3++) { + var suggestion = suggestionValues[i3]; var compare = _caseSensitive ? suggestion : suggestion.toLowerCase(); if (compare === val) { - bestIndex = i2; + bestIndex = i3; break; } else if (bestIndex === -1 && compare.indexOf(val) === 0) { - bestIndex = i2; + bestIndex = i3; } } if (bestIndex !== -1) { - var bestVal = _suggestions[bestIndex].value; + var bestVal = suggestionValues[bestIndex]; input.property("value", bestVal); input.node().setSelectionRange(val.length, bestVal.length); + dispatch14.call("update"); return bestVal; } } @@ -56889,39 +61451,39 @@ ${content} if (!shown) return; var combo = container.selectAll(".combobox"); - var options2 = combo.selectAll(".combobox-option").data(_suggestions, function(d) { - return d.value; + var options2 = combo.selectAll(".combobox-option").data(_suggestions, function(d2) { + return d2.value; }); options2.exit().remove(); - options2.enter().append("a").attr("class", function(d) { - return "combobox-option " + (d.klass || ""); - }).attr("title", function(d) { - return d.title; - }).each(function(d) { - if (d.display) { - d.display(select_default2(this)); + options2.enter().append("a").attr("class", function(d2) { + return "combobox-option " + (d2.klass || ""); + }).attr("title", function(d2) { + return d2.title; + }).each(function(d2) { + if (d2.display) { + d2.display(select_default2(this)); } else { - select_default2(this).text(d.value); + select_default2(this).text(d2.value); } - }).on("mouseenter", _mouseEnterHandler).on("mouseleave", _mouseLeaveHandler).merge(options2).classed("selected", function(d) { - return d.value === _selected; + }).on("mouseenter", _mouseEnterHandler).on("mouseleave", _mouseLeaveHandler).merge(options2).classed("selected", function(d2) { + return d2.value === _selected || d2.key === _selected; }).on("click.combo-option", accept).order(); var node = attachTo ? attachTo.node() : input.node(); var containerRect = container.node().getBoundingClientRect(); var rect = node.getBoundingClientRect(); combo.style("left", rect.left + 5 - containerRect.left + "px").style("width", rect.width - 10 + "px").style("top", rect.height + rect.top - containerRect.top + "px"); } - function accept(d3_event, d) { + function accept(d3_event, d2) { _cancelFetch = true; var thiz = input.node(); - if (d) { - utilGetSetValue(input, d.value); + if (d2) { + utilGetSetValue(input, d2.value); utilTriggerEvent(input, "change"); } var val = utilGetSetValue(input); thiz.setSelectionRange(val.length, val.length); - d = _fetched[val]; - dispatch10.call("accept", thiz, d, val); + d2 = _fetched[val]; + dispatch14.call("accept", thiz, d2, val); hide(); } function cancel() { @@ -56933,7 +61495,7 @@ ${content} val = val.slice(0, start2) + val.slice(end); utilGetSetValue(input, val); thiz.setSelectionRange(val.length, val.length); - dispatch10.call("cancel", thiz); + dispatch14.call("cancel", thiz); hide(); } }; @@ -56979,7 +61541,7 @@ ${content} _mouseLeaveHandler = val; return combobox; }; - return utilRebind(combobox, dispatch10, "on"); + return utilRebind(combobox, dispatch14, "on"); } uiCombobox.off = function(input, context) { input.on("focus.combo-input", null).on("blur.combo-input", null).on("keydown.combo-input", null).on("keyup.combo-input", null).on("input.combo-input", null).on("mousedown.combo-input", null).on("mouseup.combo-input", null); @@ -56988,7 +61550,7 @@ ${content} // modules/ui/disclosure.js function uiDisclosure(context, key, expandedDefault) { - var dispatch10 = dispatch_default("toggled"); + var dispatch14 = dispatch_default("toggled"); var _expanded; var _label = utilFunctor(""); var _updatePreference = true; @@ -57035,7 +61597,7 @@ ${content} if (_expanded) { wrap2.call(_content); } - dispatch10.call("toggled", this, _expanded); + dispatch14.call("toggled", this, _expanded); } }; disclosure.label = function(val) { @@ -57062,7 +61624,7 @@ ${content} _content = val; return disclosure; }; - return utilRebind(disclosure, dispatch10, "on"); + return utilRebind(disclosure, dispatch14, "on"); } // modules/ui/section.js @@ -57250,8 +61812,8 @@ ${content} }; tagReference.body = function(selection2) { var itemID = what.qid || what.key + "-" + (what.value || ""); - _body = selection2.selectAll(".tag-reference-body").data([itemID], function(d) { - return d; + _body = selection2.selectAll(".tag-reference-body").data([itemID], function(d2) { + return d2; }); _body.exit().remove(); _body = _body.enter().append("div").attr("class", "tag-reference-body").style("max-height", "0").style("opacity", "0").merge(_body); @@ -57343,18 +61905,18 @@ ${content} }); } function clickHelp(index) { - var d = docs[index]; + var d2 = docs[index]; var tkeys = fieldHelpKeys[fieldName][index][1]; - _body.selectAll(".field-help-nav-item").classed("active", function(d2, i2) { - return i2 === index; + _body.selectAll(".field-help-nav-item").classed("active", function(d4, i3) { + return i3 === index; }); - var content = _body.selectAll(".field-help-content").html(d.html); - content.selectAll("p").attr("class", function(d2, i2) { - return tkeys[i2]; + var content = _body.selectAll(".field-help-content").html(d2.html); + content.selectAll("p").attr("class", function(d4, i3) { + return tkeys[i3]; }); - if (d.key === "help.field.restrictions.inspecting") { + if (d2.key === "help.field.restrictions.inspecting") { content.insert("img", "p.from_shadow").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_inspect.gif")); - } else if (d.key === "help.field.restrictions.modifying") { + } else if (d2.key === "help.field.restrictions.modifying") { content.insert("img", "p.allow_turn").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_modify.gif")); } } @@ -57396,15 +61958,15 @@ ${content} hide(); }).call(svgIcon("#iD-icon-close")); var navEnter = enter.append("div").attr("class", "field-help-nav cf"); - var titles = docs.map(function(d) { - return d.title; + var titles = docs.map(function(d2) { + return d2.title; }); - navEnter.selectAll(".field-help-nav-item").data(titles).enter().append("div").attr("class", "field-help-nav-item").html(function(d) { - return d; - }).on("click", function(d3_event, d) { + navEnter.selectAll(".field-help-nav-item").data(titles).enter().append("div").attr("class", "field-help-nav-item").html(function(d2) { + return d2; + }).on("click", function(d3_event, d2) { d3_event.stopPropagation(); d3_event.preventDefault(); - clickHelp(titles.indexOf(d)); + clickHelp(titles.indexOf(d2)); }); enter.append("div").attr("class", "field-help-content"); _body = _body.merge(enter); @@ -57415,7 +61977,7 @@ ${content} // modules/ui/fields/check.js function uiFieldCheck(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var options2 = field.options; var values = []; var texts = []; @@ -57427,11 +61989,15 @@ ${content} var _impliedYes; var _entityIDs = []; var _value; + var stringsField = field.resolveReference("stringsCrossReference"); + if (!options2 && stringsField.options) { + options2 = stringsField.options; + } if (options2) { - for (var i2 in options2) { - var v = options2[i2]; - values.push(v === "undefined" ? void 0 : v); - texts.push(field.t.html("options." + v, { "default": v })); + for (var i3 in options2) { + var v2 = options2[i3]; + values.push(v2 === "undefined" ? void 0 : v2); + texts.push(stringsField.t.html("options." + v2, { "default": v2 })); } } else { values = [void 0, "yes"]; @@ -57484,20 +62050,20 @@ ${content} text2 = label.selectAll("span.value"); input.on("click", function(d3_event) { d3_event.stopPropagation(); - var t = {}; + var t2 = {}; if (Array.isArray(_tags[field.key])) { if (values.indexOf("yes") !== -1) { - t[field.key] = "yes"; + t2[field.key] = "yes"; } else { - t[field.key] = values[0]; + t2[field.key] = values[0]; } } else { - t[field.key] = values[(values.indexOf(_value) + 1) % values.length]; + t2[field.key] = values[(values.indexOf(_value) + 1) % values.length]; } - if (t[field.key] === "reversible" || t[field.key] === "alternating") { - t[field.key] = values[0]; + if (t2[field.key] === "reversible" || t2[field.key] === "alternating") { + t2[field.key] = values[0]; } - dispatch10.call("change", this, t); + dispatch14.call("change", this, t2); }); if (field.type === "onewayCheck") { reverser = label.selectAll(".reverser"); @@ -57506,8 +62072,8 @@ ${content} d3_event.stopPropagation(); context.perform( function(graph) { - for (var i3 in _entityIDs) { - graph = actionReverse(_entityIDs[i3])(graph); + for (var i4 in _entityIDs) { + graph = actionReverse(_entityIDs[i4])(graph); } return graph; }, @@ -57551,23 +62117,58 @@ ${content} check.focus = function() { input.node().focus(); }; - return utilRebind(check, dispatch10, "on"); + return utilRebind(check, dispatch14, "on"); + } + + // modules/ui/length_indicator.js + function uiLengthIndicator(maxChars) { + var _wrap = select_default2(null); + var _tooltip = uiPopover("tooltip max-length-warning").placement("bottom").hasArrow(true).content(() => (selection2) => { + selection2.text(""); + selection2.call(svgIcon("#iD-icon-alert", "inline")); + selection2.call(_t.append("inspector.max_length_reached", { maxChars })); + }); + var _silent = false; + var lengthIndicator = function(selection2) { + _wrap = selection2.selectAll("span.length-indicator-wrap").data([0]); + _wrap = _wrap.enter().append("span").merge(_wrap).classed("length-indicator-wrap", true); + selection2.call(_tooltip); + }; + lengthIndicator.update = function(val) { + const strLen = utilUnicodeCharsCount(utilCleanOsmString(val, Number.POSITIVE_INFINITY)); + let indicator = _wrap.selectAll("span.length-indicator").data([strLen]); + indicator.enter().append("span").merge(indicator).classed("length-indicator", true).classed("limit-reached", (d2) => d2 > maxChars).style("border-right-width", (d2) => `${Math.abs(maxChars - d2) * 2}px`).style("margin-right", (d2) => d2 > maxChars ? `${(maxChars - d2) * 2}px` : 0).style("opacity", (d2) => d2 > maxChars * 0.8 ? Math.min(1, (d2 / maxChars - 0.8) / (1 - 0.8)) : 0).style("pointer-events", (d2) => d2 > maxChars * 0.8 ? null : "none"); + if (_silent) + return; + if (strLen > maxChars) { + _tooltip.show(); + } else { + _tooltip.hide(); + } + }; + lengthIndicator.silent = function(val) { + if (!arguments.length) + return _silent; + _silent = val; + return lengthIndicator; + }; + return lengthIndicator; } // modules/ui/fields/combo.js function uiFieldCombo(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var _isMulti = field.type === "multiCombo" || field.type === "manyCombo"; var _isNetwork = field.type === "networkCombo"; var _isSemi = field.type === "semiCombo"; - var _optarray = field.options; var _showTagInfoSuggestions = field.type !== "manyCombo" && field.autoSuggestions !== false; var _allowCustomValues = field.type !== "manyCombo" && field.customValues !== false; var _snake_case = field.snake_case || field.snake_case === void 0; - var _combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(field.caseSensitive).minItems(_isMulti || _isSemi ? 1 : 2); + var _combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(field.caseSensitive).minItems(1); var _container = select_default2(null); var _inputWrap = select_default2(null); var _input = select_default2(null); + var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()); var _comboData = []; var _multiData = []; var _entityIDs = []; @@ -57575,37 +62176,51 @@ ${content} var _countryCode; var _staticPlaceholder; var _dataDeprecated = []; - _mainFileFetcher.get("deprecated").then(function(d) { - _dataDeprecated = d; + _mainFileFetcher.get("deprecated").then(function(d2) { + _dataDeprecated = d2; }).catch(function() { }); if (_isMulti && field.key && /[^:]$/.test(field.key)) { field.key += ":"; } - function snake(s) { - return s.replace(/\s+/g, "_").toLowerCase(); + function snake(s2) { + return s2.replace(/\s+/g, "_"); } - function clean2(s) { - return s.split(";").map(function(s2) { - return s2.trim(); + function clean2(s2) { + return s2.split(";").map(function(s3) { + return s3.trim(); }).join(";"); } function tagValue(dval) { dval = clean2(dval || ""); - var found = _comboData.find(function(o) { - return o.key && clean2(o.value) === dval; + var found = getOptions(true).find(function(o2) { + return o2.key && clean2(o2.value) === dval; }); if (found) return found.key; if (field.type === "typeCombo" && !dval) { return "yes"; } - return (_snake_case ? snake(dval) : dval) || void 0; + return restrictTagValueSpelling(dval) || void 0; + } + function restrictTagValueSpelling(dval) { + if (_snake_case) { + dval = snake(dval); + } + if (!field.caseSensitive) { + dval = dval.toLowerCase(); + } + return dval; + } + function getLabelId(field2, v2) { + return field2.hasTextForStringId(`options.${v2}.title`) ? `options.${v2}.title` : `options.${v2}`; } function displayValue(tval) { tval = tval || ""; - if (field.hasTextForStringId("options." + tval)) { - return field.t("options." + tval, { default: tval }); + var stringsField = field.resolveReference("stringsCrossReference"); + const labelId = getLabelId(stringsField, tval); + if (stringsField.hasTextForStringId(labelId)) { + return stringsField.t(labelId, { default: tval }); } if (field.type === "typeCombo" && tval.toLowerCase() === "yes") { return ""; @@ -57614,18 +62229,20 @@ ${content} } function renderValue(tval) { tval = tval || ""; - if (field.hasTextForStringId("options." + tval)) { - return field.t.append("options." + tval, { default: tval }); + var stringsField = field.resolveReference("stringsCrossReference"); + const labelId = getLabelId(stringsField, tval); + if (stringsField.hasTextForStringId(labelId)) { + return stringsField.t.append(labelId, { default: tval }); } if (field.type === "typeCombo" && tval.toLowerCase() === "yes") { tval = ""; } return (selection2) => selection2.text(tval); } - function objectDifference(a, b) { - return a.filter(function(d1) { - return !b.some(function(d2) { - return !d2.isMixed && d1.value === d2.value; + function objectDifference(a2, b2) { + return a2.filter(function(d1) { + return !b2.some(function(d2) { + return d1.value === d2.value; }); }); } @@ -57638,34 +62255,52 @@ ${content} setTaginfoValues("", setPlaceholder); } else { selection2.call(_combobox, attachTo); - setStaticValues(setPlaceholder); + setTimeout(() => setStaticValues(setPlaceholder), 0); } } - function setStaticValues(callback) { - if (!_optarray) - return; - _comboData = _optarray.map(function(v) { + function getOptions(allOptions) { + var stringsField = field.resolveReference("stringsCrossReference"); + if (!(field.options || stringsField.options)) + return []; + let options2; + if (allOptions !== true) { + options2 = field.options || stringsField.options; + } else { + options2 = [].concat(field.options, stringsField.options).filter(Boolean); + } + return options2.map(function(v2) { + const labelId = getLabelId(stringsField, v2); return { - key: v, - value: field.t("options." + v, { default: v }), - title: v, - display: field.t.append("options." + v, { default: v }), - klass: field.hasTextForStringId("options." + v) ? "" : "raw-option" + key: v2, + value: stringsField.t(labelId, { default: v2 }), + title: stringsField.t(`options.${v2}.description`, { default: v2 }), + display: addComboboxIcons(stringsField.t.append(labelId, { default: v2 }), v2), + klass: stringsField.hasTextForStringId(labelId) ? "" : "raw-option" }; }); - _combobox.data(objectDifference(_comboData, _multiData)); + } + function setStaticValues(callback, filter2) { + _comboData = getOptions(); + if (filter2 !== void 0) { + _comboData = _comboData.filter(filter2); + } + _comboData = objectDifference(_comboData, _multiData); + _combobox.data(_comboData); if (callback) callback(_comboData); } - function setTaginfoValues(q, callback) { + function setTaginfoValues(q2, callback) { + var queryFilter = (d2) => d2.value.toLowerCase().includes(q2.toLowerCase()) || d2.key.toLowerCase().includes(q2.toLowerCase()); + setStaticValues(callback, queryFilter); + var stringsField = field.resolveReference("stringsCrossReference"); var fn = _isMulti ? "multikeys" : "values"; - var query = (_isMulti ? field.key : "") + q; - var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q.toLowerCase()) === 0; + var query = (_isMulti ? field.key : "") + q2; + var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q2.toLowerCase()) === 0; if (hasCountryPrefix) { query = _countryCode + ":"; } var params = { - debounce: q !== "", + debounce: q2 !== "", key: field.key, query }; @@ -57675,50 +62310,68 @@ ${content} services.taginfo[fn](params, function(err, data) { if (err) return; - data = data.filter(function(d) { - return field.type !== "typeCombo" || d.value !== "yes"; + data = data.filter((d2) => field.type !== "typeCombo" || d2.value !== "yes"); + data = data.filter((d2) => { + var value = d2.value; + if (_isMulti) { + value = value.slice(field.key.length); + } + return value === restrictTagValueSpelling(value); }); var deprecatedValues = osmEntity.deprecatedTagValuesByKey(_dataDeprecated)[field.key]; if (deprecatedValues) { - data = data.filter(function(d) { - return deprecatedValues.indexOf(d.value) === -1; - }); + data = data.filter((d2) => !deprecatedValues.includes(d2.value)); } if (hasCountryPrefix) { - data = data.filter(function(d) { - return d.value.toLowerCase().indexOf(_countryCode + ":") === 0; - }); + data = data.filter((d2) => d2.value.toLowerCase().indexOf(_countryCode + ":") === 0); } + const additionalOptions = (field.options || stringsField.options || []).filter((v2) => !data.some((dv) => dv.value === (_isMulti ? field.key + v2 : v2))).map((v2) => ({ value: v2 })); _container.classed("empty-combobox", data.length === 0); - _comboData = data.map(function(d) { - var k = d.value; + _comboData = data.concat(additionalOptions).map(function(d2) { + var v2 = d2.value; if (_isMulti) - k = k.replace(field.key, ""); - var label = field.t("options." + k, { default: k }); + v2 = v2.replace(field.key, ""); + const labelId = getLabelId(stringsField, v2); + var isLocalizable = stringsField.hasTextForStringId(labelId); + var label = stringsField.t(labelId, { default: v2 }); return { - key: k, - value: _isMulti ? k : label, - display: field.t.append("options." + k, { default: k }), - title: d.title || label, - klass: field.hasTextForStringId("options." + k) ? "" : "raw-option" + key: v2, + value: label, + title: stringsField.t(`options.${v2}.description`, { default: isLocalizable ? v2 : d2.title !== label ? d2.title : "" }), + display: addComboboxIcons(stringsField.t.append(labelId, { default: v2 }), v2), + klass: isLocalizable ? "" : "raw-option" }; }); + _comboData = _comboData.filter(queryFilter); _comboData = objectDifference(_comboData, _multiData); if (callback) callback(_comboData); }); } + function addComboboxIcons(disp, value) { + const iconsField = field.resolveReference("iconsCrossReference"); + if (iconsField.icons) { + return function(selection2) { + var span = selection2.insert("span", ":first-child").attr("class", "tag-value-icon"); + if (iconsField.icons[value]) { + span.call(svgIcon(`#${iconsField.icons[value]}`)); + } + disp.call(this, selection2); + }; + } + return disp; + } function setPlaceholder(values) { if (_isMulti || _isSemi) { _staticPlaceholder = field.placeholder() || _t("inspector.add"); } else { - var vals = values.map(function(d) { - return d.value; - }).filter(function(s) { - return s.length < 20; + var vals = values.map(function(d2) { + return d2.value; + }).filter(function(s2) { + return s2.length < 20; }); - var placeholders = vals.length > 1 ? vals : values.map(function(d) { - return d.key; + var placeholders = vals.length > 1 ? vals : values.map(function(d2) { + return d2.key; }); _staticPlaceholder = field.placeholder() || placeholders.slice(0, 3).join(", "); } @@ -57732,20 +62385,29 @@ ${content} ph = _staticPlaceholder; } _container.selectAll("input").attr("placeholder", ph); + var hideAdd = !_allowCustomValues && !values.length; + _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null); } function change() { - var t = {}; + var t2 = {}; var val; if (_isMulti || _isSemi) { - val = tagValue(utilGetSetValue(_input).replace(/,/g, ";")) || ""; - _container.classed("active", false); - utilGetSetValue(_input, ""); - var vals = val.split(";").filter(Boolean); + var vals; + if (_isMulti) { + vals = [tagValue(utilGetSetValue(_input))]; + } else if (_isSemi) { + val = tagValue(utilGetSetValue(_input)) || ""; + val = val.replace(/,/g, ";"); + vals = val.split(";"); + } + vals = vals.filter(Boolean); if (!vals.length) return; + _container.classed("active", false); + utilGetSetValue(_input, ""); if (_isMulti) { - utilArrayUniq(vals).forEach(function(v) { - var key = (field.key || "") + v; + utilArrayUniq(vals).forEach(function(v2) { + var key = (field.key || "") + v2; if (_tags) { var old = _tags[key]; if (typeof old === "string" && old.toLowerCase() !== "no") @@ -57753,14 +62415,14 @@ ${content} } key = context.cleanTagKey(key); field.keys.push(key); - t[key] = "yes"; + t2[key] = "yes"; }); } else if (_isSemi) { - var arr = _multiData.map(function(d) { - return d.key; + var arr = _multiData.map(function(d2) { + return d2.key; }); arr = arr.concat(vals); - t[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(";")); + t2[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(";")); } window.setTimeout(function() { _input.node().focus(); @@ -57770,29 +62432,39 @@ ${content} if (!rawValue && Array.isArray(_tags[field.key])) return; val = context.cleanTagValue(tagValue(rawValue)); - t[field.key] = val || void 0; + t2[field.key] = val || void 0; } - dispatch10.call("change", this, t); + dispatch14.call("change", this, t2); } - function removeMultikey(d3_event, d) { + function removeMultikey(d3_event, d2) { d3_event.preventDefault(); d3_event.stopPropagation(); - var t = {}; + var t2 = {}; if (_isMulti) { - t[d.key] = void 0; + t2[d2.key] = void 0; } else if (_isSemi) { var arr = _multiData.map(function(md) { - return md.key === d.key ? null : md.key; + return md.key === d2.key ? null : md.key; }).filter(Boolean); arr = utilArrayUniq(arr); - t[field.key] = arr.length ? arr.join(";") : void 0; + t2[field.key] = arr.length ? arr.join(";") : void 0; + _lengthIndicator.update(t2[field.key]); } - dispatch10.call("change", this, t); + dispatch14.call("change", this, t2); + } + function invertMultikey(d3_event, d2) { + d3_event.preventDefault(); + d3_event.stopPropagation(); + var t2 = {}; + if (_isMulti) { + t2[d2.key] = _tags[d2.key] === "yes" ? "no" : "yes"; + } + dispatch14.call("change", this, t2); } function combo(selection2) { _container = selection2.selectAll(".form-field-input-wrap").data([0]); - var type3 = _isMulti || _isSemi ? "multicombo" : "combo"; - _container = _container.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + type3).merge(_container); + var type2 = _isMulti || _isSemi ? "multicombo" : "combo"; + _container = _container.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + type2).merge(_container); if (_isMulti || _isSemi) { _container = _container.selectAll(".chiplist").data([0]); var listClass = "chiplist"; @@ -57806,17 +62478,31 @@ ${content} }).merge(_container); _inputWrap = _container.selectAll(".input-wrap").data([0]); _inputWrap = _inputWrap.enter().append("li").attr("class", "input-wrap").merge(_inputWrap); + var hideAdd = !_allowCustomValues && !_comboData.length; + _inputWrap.style("display", hideAdd ? "none" : null); _input = _inputWrap.selectAll("input").data([0]); } else { _input = _container.selectAll("input").data([0]); } - _input = _input.enter().append("input").attr("type", "text").attr("id", field.domId).call(utilNoAuto).call(initCombo, selection2).merge(_input); + _input = _input.enter().append("input").attr("type", "text").attr("id", field.domId).call(utilNoAuto).call(initCombo, _container).merge(_input); + if (_isSemi) { + _inputWrap.call(_lengthIndicator); + } else if (!_isMulti) { + _container.call(_lengthIndicator); + } if (_isNetwork) { var extent = combinedEntityExtent(); var countryCode = extent && iso1A2Code(extent.center()); _countryCode = countryCode && countryCode.toLowerCase(); } - _input.on("change", change).on("blur", change); + _input.on("change", change).on("blur", change).on("input", function() { + let val = utilGetSetValue(_input); + updateIcon(val); + if (_isSemi && _tags[field.key]) { + val += ";" + _tags[field.key]; + } + _lengthIndicator.update(val); + }); _input.on("keydown.field", function(d3_event) { switch (d3_event.keyCode) { case 13: @@ -57834,32 +62520,56 @@ ${content} _container.classed("active", true); }); } + _combobox.on("cancel", function() { + _input.node().blur(); + }).on("update", function() { + updateIcon(utilGetSetValue(_input)); + }); + } + function updateIcon(value) { + value = tagValue(value); + let container = _container; + if (field.type === "multiCombo" || field.type === "semiCombo") { + container = _container.select(".input-wrap"); + } + const iconsField = field.resolveReference("iconsCrossReference"); + if (iconsField.icons) { + container.selectAll(".tag-value-icon").remove(); + if (iconsField.icons[value]) { + container.selectAll(".tag-value-icon").data([value]).enter().insert("div", "input").attr("class", "tag-value-icon").call(svgIcon(`#${iconsField.icons[value]}`)); + } + } } combo.tags = function(tags) { _tags = tags; + var stringsField = field.resolveReference("stringsCrossReference"); + var isMixed = Array.isArray(tags[field.key]); + var showsValue = (value) => !isMixed && value && !(field.type === "typeCombo" && value === "yes"); + var isRawValue = (value) => showsValue(value) && !stringsField.hasTextForStringId(`options.${value}`) && !stringsField.hasTextForStringId(`options.${value}.title`); + var isKnownValue = (value) => showsValue(value) && !isRawValue(value); + var isReadOnly = !_allowCustomValues; if (_isMulti || _isSemi) { _multiData = []; var maxLength; if (_isMulti) { - for (var k in tags) { - if (field.key && k.indexOf(field.key) !== 0) - continue; - if (!field.key && field.keys.indexOf(k) === -1) + for (var k2 in tags) { + if (field.key && k2.indexOf(field.key) !== 0) continue; - var v = tags[k]; - if (!v || typeof v === "string" && v.toLowerCase() === "no") + if (!field.key && field.keys.indexOf(k2) === -1) continue; - var suffix = field.key ? k.slice(field.key.length) : k; + var v2 = tags[k2]; + var suffix = field.key ? k2.slice(field.key.length) : k2; _multiData.push({ - key: k, + key: k2, value: displayValue(suffix), - display: renderValue(suffix), - isMixed: Array.isArray(v) + display: addComboboxIcons(renderValue(suffix), suffix), + state: typeof v2 === "string" ? v2.toLowerCase() : "", + isMixed: Array.isArray(v2) }); } if (field.key) { - field.keys = _multiData.map(function(d) { - return d.key; + field.keys = _multiData.map(function(d2) { + return d2.key; }); maxLength = context.maxCharsForTagKey() - utilUnicodeCharsCount(field.key); } else { @@ -57883,12 +62593,12 @@ ${content} allValues = utilArrayUniq((tags[field.key] || "").split(";")).filter(Boolean); commonValues = allValues; } - _multiData = allValues.map(function(v2) { + _multiData = allValues.map(function(v3) { return { - key: v2, - value: displayValue(v2), - display: renderValue(v2), - isMixed: !commonValues.includes(v2) + key: v3, + value: displayValue(v3), + display: addComboboxIcons(renderValue(v3), v3), + isMixed: !commonValues.includes(v3) }; }); var currLength = utilUnicodeCharsCount(commonValues.join(";")); @@ -57898,58 +62608,74 @@ ${content} } } maxLength = Math.max(0, maxLength); - var allowDragAndDrop = _isSemi && !Array.isArray(tags[field.key]); - var available = objectDifference(_comboData, _multiData); - _combobox.data(available); - var hideAdd = !_allowCustomValues && !available.length || maxLength <= 0; + var hideAdd = maxLength <= 0 || !_allowCustomValues && !_comboData.length; _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null); + var allowDragAndDrop = _isSemi && !Array.isArray(tags[field.key]); var chips = _container.selectAll(".chip").data(_multiData); chips.exit().remove(); var enter = chips.enter().insert("li", ".input-wrap").attr("class", "chip"); enter.append("span"); enter.append("a"); - chips = chips.merge(enter).order().classed("raw-value", function(d) { - var k2 = d.key; + chips = chips.merge(enter).order().classed("raw-value", function(d2) { + var k3 = d2.key; if (_isMulti) - k2 = k2.replace(field.key, ""); - return !field.hasTextForStringId("options." + k2); - }).classed("draggable", allowDragAndDrop).classed("mixed", function(d) { - return d.isMixed; - }).attr("title", function(d) { - return d.isMixed ? _t("inspector.unshared_value_tooltip") : null; - }); + k3 = k3.replace(field.key, ""); + return !stringsField.hasTextForStringId("options." + k3); + }).classed("draggable", allowDragAndDrop).classed("mixed", function(d2) { + return d2.isMixed; + }).attr("title", function(d2) { + if (d2.isMixed) { + return _t("inspector.unshared_value_tooltip"); + } + if (!["yes", "no"].includes(d2.state)) { + return d2.state; + } + return null; + }).classed("negated", (d2) => d2.state === "no"); + if (!_isSemi) { + chips.selectAll("input[type=checkbox]").remove(); + chips.insert("input", "span").attr("type", "checkbox").property("checked", (d2) => d2.state === "yes").property("indeterminate", (d2) => d2.isMixed || !["yes", "no"].includes(d2.state)).on("click", invertMultikey); + } if (allowDragAndDrop) { registerDragAndDrop(chips); } - chips.select("span").each(function(d) { + chips.select("span").each(function(d2) { const selection2 = select_default2(this); - if (d.display) { + if (d2.display) { selection2.text(""); - d.display(selection2); + d2.display(selection2); } else { - selection2.text(d.value); + selection2.text(d2.value); } }); chips.select("a").attr("href", "#").on("click", removeMultikey).attr("class", "remove").text("\xD7"); + updateIcon(""); } else { - var isMixed = Array.isArray(tags[field.key]); var mixedValues = isMixed && tags[field.key].map(function(val) { return displayValue(val); }).filter(Boolean); - var showsValue = !isMixed && tags[field.key] && !(field.type === "typeCombo" && tags[field.key] === "yes"); - var isRawValue = showsValue && !field.hasTextForStringId("options." + tags[field.key]); - var isKnownValue = showsValue && !isRawValue; - var isReadOnly = !_allowCustomValues || isKnownValue; - utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : "").classed("raw-value", isRawValue).classed("known-value", isKnownValue).attr("readonly", isReadOnly ? "readonly" : void 0).attr("title", isMixed ? mixedValues.join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _staticPlaceholder || "").classed("mixed", isMixed).on("keydown.deleteCapture", function(d3_event) { - if (isReadOnly && isKnownValue && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) { + utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : "").data([tags[field.key]]).classed("raw-value", isRawValue).classed("known-value", isKnownValue).attr("readonly", isReadOnly ? "readonly" : void 0).attr("title", isMixed ? mixedValues.join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _staticPlaceholder || "").classed("mixed", isMixed).on("keydown.deleteCapture", function(d3_event) { + if (isReadOnly && isKnownValue(tags[field.key]) && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) { d3_event.preventDefault(); d3_event.stopPropagation(); - var t = {}; - t[field.key] = void 0; - dispatch10.call("change", this, t); + var t2 = {}; + t2[field.key] = void 0; + dispatch14.call("change", this, t2); } }); + if (!Array.isArray(tags[field.key])) { + updateIcon(tags[field.key]); + } + if (!isMixed) { + _lengthIndicator.update(tags[field.key]); + } } + const refreshStyles = () => { + _input.data([tagValue(utilGetSetValue(_input))]).classed("raw-value", isRawValue).classed("known-value", isKnownValue); + }; + _input.on("input.refreshStyles", refreshStyles); + _combobox.on("update.refreshStyles", refreshStyles); + refreshStyles(); }; function registerDragAndDrop(selection2) { var dragOrigin, targetIndex; @@ -57961,8 +62687,9 @@ ${content} }; targetIndex = null; }).on("drag", function(d3_event) { - var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y; - if (!select_default2(this).classed("dragging") && Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) + var x2 = d3_event.x - dragOrigin.x, y2 = d3_event.y - dragOrigin.y; + if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold + Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2)) <= 5) return; var index = selection2.nodes().indexOf(this); select_default2(this).classed("dragging", true); @@ -57973,7 +62700,7 @@ ${content} _container.selectAll(".chip").style("transform", function(d2, index2) { var node = select_default2(this).node(); if (index === index2) { - return "translate(" + x + "px, " + y + "px)"; + return "translate(" + x2 + "px, " + y2 + "px)"; } else if (index2 > index && d3_event.y > node.offsetTop) { if (targetIndex === null || index2 > targetIndex) { targetIndex = index2; @@ -57997,7 +62724,7 @@ ${content} }).style("transform", function(d2, index2) { var node = select_default2(this).node(); if (index === index2) { - return "translate(" + x + "px, " + y + "px)"; + return "translate(" + x2 + "px, " + y2 + "px)"; } if (node.offsetTop === targetIndexOffsetTop) { if (index2 < index && index2 >= targetIndex) { @@ -58020,15 +62747,15 @@ ${content} var element = _multiData[index]; _multiData.splice(index, 1); _multiData.splice(targetIndex, 0, element); - var t = {}; + var t2 = {}; if (_multiData.length) { - t[field.key] = _multiData.map(function(element2) { + t2[field.key] = _multiData.map(function(element2) { return element2.key; }).join(";"); } else { - t[field.key] = void 0; + t2[field.key] = void 0; } - dispatch10.call("change", this, t); + dispatch14.call("change", this, t2); } dragOrigin = void 0; targetIndex = void 0; @@ -58047,21 +62774,27 @@ ${content} function combinedEntityExtent() { return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph()); } - return utilRebind(combo, dispatch10, "on"); + return utilRebind(combo, dispatch14, "on"); } // modules/ui/fields/input.js + var likelyRawNumberFormat = /^-?(0\.\d*|\d*\.\d{0,2}(\d{4,})?|\d{4,}\.\d{3})$/; function uiFieldText(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var input = select_default2(null); var outlinkButton = select_default2(null); var wrap2 = select_default2(null); + var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()); var _entityIDs = []; var _tags; var _phoneFormats = {}; + const isDirectionField = field.key.split(":").some((keyPart) => keyPart === "direction"); + const formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode()); + const parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode()); + const countDecimalPlaces = _mainLocalizer.decimalPlaceCounter(_mainLocalizer.languageCode()); if (field.type === "tel") { - _mainFileFetcher.get("phone_formats").then(function(d) { - _phoneFormats = d; + _mainFileFetcher.get("phone_formats").then(function(d2) { + _phoneFormats = d2; updatePhonePlaceholder(); }).catch(function() { }); @@ -58080,7 +62813,7 @@ ${content} }); field.locked(isLocked); } - function i2(selection2) { + function i3(selection2) { calcLocked(); var isLocked = field.locked(); wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]); @@ -58088,6 +62821,7 @@ ${content} input = wrap2.selectAll("input").data([0]); input = input.enter().append("input").attr("type", field.type === "identifier" ? "text" : field.type).attr("id", field.domId).classed(field.type, true).call(utilNoAuto).merge(input); input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change()); + wrap2.call(_lengthIndicator); if (field.type === "tel") { updatePhonePlaceholder(); } else if (field.type === "number") { @@ -58095,24 +62829,39 @@ ${content} input.attr("type", "text"); var inc = field.increment; var buttons = wrap2.selectAll(".increment, .decrement").data(rtl ? [inc, -inc] : [-inc, inc]); - buttons.enter().append("button").attr("class", function(d) { - var which = d > 0 ? "increment" : "decrement"; + buttons.enter().append("button").attr("class", function(d2) { + var which = d2 > 0 ? "increment" : "decrement"; return "form-field-button " + which; - }).attr("title", function(d) { - var which = d > 0 ? "increment" : "decrement"; + }).attr("title", function(d2) { + var which = d2 > 0 ? "increment" : "decrement"; return _t(`inspector.${which}`); - }).merge(buttons).on("click", function(d3_event, d) { + }).merge(buttons).on("click", function(d3_event, d2) { d3_event.preventDefault(); + var isMixed = Array.isArray(_tags[field.key]); + if (isMixed) + return; var raw_vals = input.node().value || "0"; var vals = raw_vals.split(";"); - vals = vals.map(function(v) { - var num = parseFloat(v.trim(), 10); - if (isFinite(num)) - return clamped(num + d); - const compassDir = cardinal[v.trim().toLowerCase()]; - if (compassDir !== void 0) - return clamped(compassDir + d); - return v.trim(); + vals = vals.map(function(v2) { + v2 = v2.trim(); + const isRawNumber = likelyRawNumberFormat.test(v2); + var num = isRawNumber ? parseFloat(v2) : parseLocaleFloat(v2); + if (isDirectionField) { + const compassDir = cardinal[v2.toLowerCase()]; + if (compassDir !== void 0) { + num = compassDir; + } + } + if (!isFinite(num)) + return v2; + num = parseFloat(num); + if (!isFinite(num)) + return v2; + num += d2; + if (isDirectionField) { + num = (num % 360 + 360) % 360; + } + return formatFloat(clamped(num), isRawNumber ? v2.includes(".") ? v2.split(".")[1].length : 0 : countDecimalPlaces(v2)); }); input.node().value = vals.join(";"); change()(); @@ -58134,7 +62883,7 @@ ${content} var url = field.urlFormat.replace(/{value}/, encodeURIComponent(value)); window.open(url, "_blank"); } - }).merge(outlinkButton); + }).classed("disabled", () => !validIdentifierValueForLink()).merge(outlinkButton); } else if (field.type === "url") { input.attr("type", "text"); outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]); @@ -58144,27 +62893,32 @@ ${content} if (value) window.open(value, "_blank"); }).merge(outlinkButton); - } else if (field.key.split(":").includes("colour")) { + } else if (field.type === "colour") { input.attr("type", "text"); updateColourPreview(); + } else if (field.type === "date") { + input.attr("type", "text"); + updateDateField(); } } - function isColourValid(colour) { - if (!colour.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) { - return false; - } else if (!CSS.supports("color", colour) || ["unset", "inherit", "initial", "revert"].includes(colour)) { - return false; - } - return true; - } function updateColourPreview() { + function isColourValid(colour2) { + if (!colour2.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) { + return false; + } else if (!CSS.supports("color", colour2) || ["unset", "inherit", "initial", "revert"].includes(colour2)) { + return false; + } + return true; + } wrap2.selectAll(".colour-preview").remove(); const colour = utilGetSetValue(input); - if (!isColourValid(colour) && colour !== "") + if (!isColourValid(colour) && colour !== "") { + wrap2.selectAll("input.colour-selector").remove(); + wrap2.selectAll(".form-field-button").remove(); return; + } var colourSelector = wrap2.selectAll(".colour-selector").data([0]); - outlinkButton = wrap2.selectAll(".colour-preview").data([colour]); - colourSelector.enter().append("input").attr("type", "color").attr("class", "form-field-button colour-selector").attr("value", colour).on("input", debounce_default(function(d3_event) { + colourSelector.enter().append("input").attr("type", "color").attr("class", "colour-selector").on("input", debounce_default(function(d3_event) { d3_event.preventDefault(); var colour2 = this.value; if (!isColourValid(colour2)) @@ -58173,11 +62927,51 @@ ${content} change()(); updateColourPreview(); }, 100)); - outlinkButton = outlinkButton.enter().append("div").attr("class", "form-field-button colour-preview").append("div").style("background-color", (d) => d).attr("class", "colour-box"); + wrap2.selectAll("input.colour-selector").attr("value", colour); + var chooserButton = wrap2.selectAll(".colour-preview").data([colour]); + chooserButton = chooserButton.enter().append("div").attr("class", "form-field-button colour-preview").append("div").style("background-color", (d2) => d2).attr("class", "colour-box"); if (colour === "") { - outlinkButton = outlinkButton.call(svgIcon("#iD-icon-edit")); + chooserButton = chooserButton.call(svgIcon("#iD-icon-edit")); + } + chooserButton.on("click", () => wrap2.select(".colour-selector").node().showPicker()); + } + function updateDateField() { + function isDateValid(date2) { + return date2.match(/^[0-9]{4}(-[0-9]{2}(-[0-9]{2})?)?$/); + } + const date = utilGetSetValue(input); + const now3 = /* @__PURE__ */ new Date(); + const today = new Date(now3.getTime() - now3.getTimezoneOffset() * 6e4).toISOString().split("T")[0]; + if ((field.key === "check_date" || field.key === "survey:date") && date !== today) { + wrap2.selectAll(".date-set-today").data([0]).enter().append("button").attr("class", "form-field-button date-set-today").call(svgIcon("#fas-rotate")).call(uiTooltip().title(() => _t.append("inspector.set_today"))).on("click", () => { + utilGetSetValue(input, today); + change()(); + updateDateField(); + }); + } else { + wrap2.selectAll(".date-set-today").remove(); + } + if (!isDateValid(date) && date !== "") { + wrap2.selectAll("input.date-selector").remove(); + wrap2.selectAll(".date-calendar").remove(); + return; + } + if (utilDetect().browser !== "Safari") { + var dateSelector = wrap2.selectAll(".date-selector").data([0]); + dateSelector.enter().append("input").attr("type", "date").attr("class", "date-selector").on("input", debounce_default(function(d3_event) { + d3_event.preventDefault(); + var date2 = this.value; + if (!isDateValid(date2)) + return; + utilGetSetValue(input, this.value); + change()(); + updateDateField(); + }, 100)); + wrap2.selectAll("input.date-selector").attr("value", date); + var calendarButton = wrap2.selectAll(".date-calendar").data([date]); + calendarButton = calendarButton.enter().append("button").attr("class", "form-field-button date-calendar").call(svgIcon("#fas-calendar-days")); + calendarButton.on("click", () => wrap2.select(".date-selector").node().showPicker()); } - outlinkButton.on("click", () => wrap2.select(".colour-selector").node().click()).merge(outlinkButton); } function updatePhonePlaceholder() { if (input.empty() || !Object.keys(_phoneFormats).length) @@ -58193,12 +62987,12 @@ ${content} if (field.type === "url" && value) { try { return new URL(value).href; - } catch (e) { + } catch (e3) { return null; } } if (field.type === "identifier" && field.pattern) { - return value && value.match(new RegExp(field.pattern))[0]; + return value && value.match(new RegExp(field.pattern))?.[0]; } return null; } @@ -58211,47 +63005,115 @@ ${content} } return num; } + function getVals(tags) { + if (field.keys) { + const multiSelection = context.selectedIDs(); + tags = multiSelection.length > 1 ? context.selectedIDs().map((id2) => context.graph().entity(id2)).map((entity) => entity.tags) : [tags]; + return tags.map((tags2) => new Set(field.keys.reduce((acc, key) => acc.concat(tags2[key]), []).filter(Boolean))).map((vals) => vals.size === 0 ? /* @__PURE__ */ new Set([void 0]) : vals).reduce((a2, b2) => /* @__PURE__ */ new Set([...a2, ...b2])); + } else { + return new Set([].concat(tags[field.key])); + } + } function change(onInput) { return function() { - var t = {}; + var t2 = {}; var val = utilGetSetValue(input); if (!onInput) val = context.cleanTagValue(val); - if (!val && Array.isArray(_tags[field.key])) + if (!val && getVals(_tags).size > 1) return; - if (!onInput) { - if (field.type === "number" && val) { - var vals = val.split(";"); - vals = vals.map(function(v) { - var num = parseFloat(v.trim(), 10); - return isFinite(num) ? clamped(num) : v.trim(); - }); - val = vals.join(";"); - } - utilGetSetValue(input, val); + var displayVal = val; + if (field.type === "number" && val) { + var numbers2 = val.split(";"); + numbers2 = numbers2.map(function(v2) { + if (likelyRawNumberFormat.test(v2)) { + return v2; + } + var num = parseLocaleFloat(v2); + const fractionDigits = countDecimalPlaces(v2); + return isFinite(num) ? clamped(num).toFixed(fractionDigits) : v2; + }); + val = numbers2.join(";"); + } + if (!onInput) + utilGetSetValue(input, displayVal); + t2[field.key] = val || void 0; + if (field.keys) { + dispatch14.call("change", this, (tags) => { + if (field.keys.some((key) => tags[key])) { + field.keys.filter((key) => tags[key]).forEach((key) => { + tags[key] = val || void 0; + }); + } else { + tags[field.key] = val || void 0; + } + return tags; + }, onInput); + } else { + dispatch14.call("change", this, t2, onInput); } - t[field.key] = val || void 0; - dispatch10.call("change", this, t, onInput); }; } - i2.entityIDs = function(val) { + i3.entityIDs = function(val) { if (!arguments.length) return _entityIDs; _entityIDs = val; - return i2; + return i3; }; - i2.tags = function(tags) { + i3.tags = function(tags) { _tags = tags; - var isMixed = Array.isArray(tags[field.key]); - utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed); - if (field.key.split(":").includes("colour")) + const vals = getVals(tags); + const isMixed = vals.size > 1; + var val = vals.size === 1 ? [...vals][0] ?? "" : ""; + var shouldUpdate; + if (field.type === "number" && val) { + var numbers2 = val.split(";"); + var oriNumbers = utilGetSetValue(input).split(";"); + if (numbers2.length !== oriNumbers.length) + shouldUpdate = true; + numbers2 = numbers2.map(function(v2) { + v2 = v2.trim(); + var num = Number(v2); + if (!isFinite(num) || v2 === "") + return v2; + const fractionDigits = v2.includes(".") ? v2.split(".")[1].length : 0; + return formatFloat(num, fractionDigits); + }); + val = numbers2.join(";"); + shouldUpdate = (inputValue, setValue) => { + const inputNums = inputValue.split(";").map( + (setVal) => likelyRawNumberFormat.test(setVal) ? parseFloat(setVal) : parseLocaleFloat(setVal) + ); + const setNums = setValue.split(";").map(parseLocaleFloat); + return !isEqual_default(inputNums, setNums); + }; + } + utilGetSetValue(input, val, shouldUpdate).attr("title", isMixed ? [...vals].join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed); + if (field.type === "number") { + const buttons = wrap2.selectAll(".increment, .decrement"); + if (isMixed) { + buttons.attr("disabled", "disabled").classed("disabled", true); + } else { + var raw_vals = tags[field.key] || "0"; + const canIncDec = raw_vals.split(";").some((val2) => isFinite(Number(val2)) || isDirectionField && cardinal[val2.trim().toLowerCase()]); + buttons.attr("disabled", canIncDec ? null : "disabled").classed("disabled", !canIncDec); + } + } + if (field.type === "tel") + updatePhonePlaceholder(); + if (field.type === "colour") updateColourPreview(); + if (field.type === "date") + updateDateField(); if (outlinkButton && !outlinkButton.empty()) { var disabled = !validIdentifierValueForLink(); outlinkButton.classed("disabled", disabled); } + if (!isMixed) { + _lengthIndicator.update(tags[field.key]); + } }; - i2.focus = function() { + i3.focus = function() { var node = input.node(); if (node) node.focus(); @@ -58259,12 +63121,12 @@ ${content} function combinedEntityExtent() { return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph()); } - return utilRebind(i2, dispatch10, "on"); + return utilRebind(i3, dispatch14, "on"); } // modules/ui/fields/access.js function uiFieldAccess(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var items = select_default2(null); var _tags; function access(selection2) { @@ -58273,33 +63135,33 @@ ${content} var list = wrap2.selectAll("ul").data([0]); list = list.enter().append("ul").attr("class", "rows").merge(list); items = list.selectAll("li").data(field.keys); - var enter = items.enter().append("li").attr("class", function(d) { - return "labeled-input preset-access-" + d; + var enter = items.enter().append("li").attr("class", function(d2) { + return "labeled-input preset-access-" + d2; }); - enter.append("span").attr("class", "label preset-label-access").attr("for", function(d) { - return "preset-input-access-" + d; - }).html(function(d) { - return field.t.html("types." + d); + enter.append("span").attr("class", "label preset-label-access").attr("for", function(d2) { + return "preset-input-access-" + d2; + }).html(function(d2) { + return field.t.html("types." + d2); }); - enter.append("div").attr("class", "preset-input-access-wrap").append("input").attr("type", "text").attr("class", function(d) { - return "preset-input-access preset-input-access-" + d; - }).call(utilNoAuto).each(function(d) { + enter.append("div").attr("class", "preset-input-access-wrap").append("input").attr("type", "text").attr("class", function(d2) { + return "preset-input-access preset-input-access-" + d2; + }).call(utilNoAuto).each(function(d2) { select_default2(this).call( - uiCombobox(context, "access-" + d).data(access.options(d)) + uiCombobox(context, "access-" + d2).data(access.options(d2)) ); }); items = items.merge(enter); wrap2.selectAll(".preset-input-access").on("change", change).on("blur", change); } - function change(d3_event, d) { + function change(d3_event, d2) { var tag = {}; var value = context.cleanTagValue(utilGetSetValue(select_default2(this))); - if (!value && typeof _tags[d] !== "string") + if (!value && typeof _tags[d2] !== "string") return; - tag[d] = value || void 0; - dispatch10.call("change", this, tag); + tag[d2] = value || void 0; + dispatch14.call("change", this, tag); } - access.options = function(type3) { + access.options = function(type2) { var options2 = [ "yes", "no", @@ -58311,15 +63173,16 @@ ${content} "permit", "unknown" ]; - if (type3 === "access") { - options2 = options2.filter((v) => v !== "yes" && v !== "designated"); + if (type2 === "access") { + options2 = options2.filter((v2) => v2 !== "yes" && v2 !== "designated"); } - if (type3 === "bicycle") { + if (type2 === "bicycle") { options2.splice(options2.length - 4, 0, "dismount"); } + var stringsField = field.resolveReference("stringsCrossReference"); return options2.map(function(option) { return { - title: field.t("options." + option + ".description"), + title: stringsField.t("options." + option + ".description"), value: option }; }); @@ -58476,17 +63339,17 @@ ${content} }; access.tags = function(tags) { _tags = tags; - utilGetSetValue(items.selectAll(".preset-input-access"), function(d) { - return typeof tags[d] === "string" ? tags[d] : ""; - }).classed("mixed", function(d) { - return tags[d] && Array.isArray(tags[d]); - }).attr("title", function(d) { - return tags[d] && Array.isArray(tags[d]) && tags[d].filter(Boolean).join("\n"); - }).attr("placeholder", function(d) { - if (tags[d] && Array.isArray(tags[d])) { + utilGetSetValue(items.selectAll(".preset-input-access"), function(d2) { + return typeof tags[d2] === "string" ? tags[d2] : ""; + }).classed("mixed", function(d2) { + return tags[d2] && Array.isArray(tags[d2]); + }).attr("title", function(d2) { + return tags[d2] && Array.isArray(tags[d2]) && tags[d2].filter(Boolean).join("\n"); + }).attr("placeholder", function(d2) { + if (tags[d2] && Array.isArray(tags[d2])) { return _t("inspector.multiple_values"); } - if (d === "bicycle" || d === "motor_vehicle") { + if (d2 === "bicycle" || d2 === "motor_vehicle") { if (tags.vehicle && typeof tags.vehicle === "string") { return tags.vehicle; } @@ -58496,12 +63359,12 @@ ${content} } function getPlaceholdersByTag(key, placeholdersByKey) { if (typeof tags[key] === "string") { - if (placeholdersByKey[tags[key]] && placeholdersByKey[tags[key]][d]) { - return placeholdersByKey[tags[key]][d]; + if (placeholdersByKey[tags[key]] && placeholdersByKey[tags[key]][d2]) { + return placeholdersByKey[tags[key]][d2]; } } else { var impliedAccesses = tags[key].filter(Boolean).map(function(val) { - return placeholdersByKey[val] && placeholdersByKey[val][d]; + return placeholdersByKey[val] && placeholdersByKey[val][d2]; }).filter(Boolean); if (impliedAccesses.length === tags[key].length && new Set(impliedAccesses).size === 1) { return impliedAccesses[0]; @@ -58516,7 +63379,7 @@ ${content} } } } - if (d === "access" && !tags.barrier) { + if (d2 === "access" && !tags.barrier) { return "yes"; } return field.placeholder(); @@ -58525,12 +63388,12 @@ ${content} access.focus = function() { items.selectAll(".preset-input-access").node().focus(); }; - return utilRebind(access, dispatch10, "on"); + return utilRebind(access, dispatch14, "on"); } // modules/ui/fields/address.js function uiFieldAddress(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var _selection = select_default2(null); var _wrap = select_default2(null); var addrField = _mainPresetIndex.field("address"); @@ -58543,87 +63406,96 @@ ${content} ["city", "postcode"] ] }]; - _mainFileFetcher.get("address_formats").then(function(d) { - _addressFormats = d; + _mainFileFetcher.get("address_formats").then(function(d2) { + _addressFormats = d2; if (!_selection.empty()) { _selection.call(address); } }).catch(function() { }); - function getNearStreets() { + function getNear(isAddressable, type2, searchRadius, resultProp) { var extent = combinedEntityExtent(); - var l = extent.center(); - var box = geoExtent(l).padByMeters(200); - var streets = context.history().intersects(box).filter(isAddressable).map(function(d) { - var loc = context.projection([ - (extent[0][0] + extent[1][0]) / 2, - (extent[0][1] + extent[1][1]) / 2 - ]); - var choice = geoChooseEdge(context.graph().childNodes(d), loc, context.projection); + var l2 = extent.center(); + var box = geoExtent(l2).padByMeters(searchRadius); + var features = context.history().intersects(box).filter(isAddressable).map((d2) => { + let dist = geoSphericalDistance(d2.extent(context.graph()).center(), l2); + if (d2.geometry(context.graph()) === "line") { + var loc = context.projection([ + (extent[0][0] + extent[1][0]) / 2, + (extent[0][1] + extent[1][1]) / 2 + ]); + var choice = geoChooseEdge(context.graph().childNodes(d2), loc, context.projection); + dist = geoSphericalDistance(choice.loc, l2); + } + const value = resultProp && d2.tags[resultProp] ? d2.tags[resultProp] : d2.tags.name; + let title = value; + if (type2 === "street") { + title = `${addrField.t("placeholders.street")}: ${title}`; + } else if (type2 === "place") { + title = `${addrField.t("placeholders.place")}: ${title}`; + } return { - title: d.tags.name, - value: d.tags.name, - dist: choice.distance + title, + value, + dist, + type: type2, + klass: `address-${type2}` }; - }).sort(function(a, b) { - return a.dist - b.dist; + }).sort(function(a2, b2) { + return a2.dist - b2.dist; }); - return utilArrayUniqBy(streets, "value"); - function isAddressable(d) { - return d.tags.highway && d.tags.name && d.type === "way"; + return utilArrayUniqBy(features, "value"); + } + function getNearStreets() { + function isAddressable(d2) { + return d2.tags.highway && d2.tags.name && d2.type === "way"; + } + return getNear(isAddressable, "street", 200); + } + function getNearPlaces() { + function isAddressable(d2) { + if (d2.tags.name) { + if (d2.tags.place) + return true; + if (d2.tags.boundary === "administrative" && d2.tags.admin_level > 8) + return true; + } + return false; } + return getNear(isAddressable, "place", 200); } function getNearCities() { - var extent = combinedEntityExtent(); - var l = extent.center(); - var box = geoExtent(l).padByMeters(200); - var cities = context.history().intersects(box).filter(isAddressable).map(function(d) { - return { - title: d.tags["addr:city"] || d.tags.name, - value: d.tags["addr:city"] || d.tags.name, - dist: geoSphericalDistance(d.extent(context.graph()).center(), l) - }; - }).sort(function(a, b) { - return a.dist - b.dist; - }); - return utilArrayUniqBy(cities, "value"); - function isAddressable(d) { - if (d.tags.name) { - if (d.tags.admin_level === "8" && d.tags.boundary === "administrative") + function isAddressable(d2) { + if (d2.tags.name) { + if (d2.tags.boundary === "administrative" && d2.tags.admin_level === "8") return true; - if (d.tags.border_type === "city") + if (d2.tags.border_type === "city") return true; - if (d.tags.place === "city" || d.tags.place === "town" || d.tags.place === "village") + if (d2.tags.place === "city" || d2.tags.place === "town" || d2.tags.place === "village") return true; } - if (d.tags["addr:city"]) + if (d2.tags[`${field.key}:city`]) return true; return false; } + return getNear(isAddressable, "city", 200, `${field.key}:city`); + } + function getNearPostcodes() { + return [...new Set([].concat(getNearValues("postcode")).concat(getNear((d2) => d2.tags.postal_code, "postcode", 200, "postal_code")))]; } function getNearValues(key) { - var extent = combinedEntityExtent(); - var l = extent.center(); - var box = geoExtent(l).padByMeters(200); - var results = context.history().intersects(box).filter(function hasTag(d) { - return _entityIDs.indexOf(d.id) === -1 && d.tags[key]; - }).map(function(d) { - return { - title: d.tags[key], - value: d.tags[key], - dist: geoSphericalDistance(d.extent(context.graph()).center(), l) - }; - }).sort(function(a, b) { - return a.dist - b.dist; - }); - return utilArrayUniqBy(results, "value"); + const tagKey = `${field.key}:${key}`; + function hasTag(d2) { + return _entityIDs.indexOf(d2.id) === -1 && d2.tags[tagKey]; + } + return getNear(hasTag, key, 200, tagKey); } function updateForCountryCode() { if (!_countryCode) return; var addressFormat; - for (var i2 = 0; i2 < _addressFormats.length; i2++) { - var format2 = _addressFormats[i2]; + for (var i3 = 0; i3 < _addressFormats.length; i3++) { + var format2 = _addressFormats[i3]; if (!format2.countryCodes) { addressFormat = format2; } else if (format2.countryCodes.indexOf(_countryCode) !== -1) { @@ -58644,43 +63516,72 @@ ${content} "quarter", "state", "street", + "street+place", "subdistrict", "suburb" ]; var widths = addressFormat.widths || { - housenumber: 1 / 3, - street: 2 / 3, + housenumber: 1 / 5, + unit: 1 / 5, + street: 1 / 2, + place: 1 / 2, city: 2 / 3, state: 1 / 4, postcode: 1 / 3 }; - function row(r) { - var total = r.reduce(function(sum, key) { + function row(r2) { + var total = r2.reduce(function(sum, key) { return sum + (widths[key] || 0.5); }, 0); - return r.map(function(key) { + return r2.map(function(key) { return { id: key, width: (widths[key] || 0.5) / total }; }); } - var rows = _wrap.selectAll(".addr-row").data(addressFormat.format, function(d) { - return d.toString(); + var rows = _wrap.selectAll(".addr-row").data(addressFormat.format, function(d2) { + return d2.toString(); }); rows.exit().remove(); - rows.enter().append("div").attr("class", "addr-row").selectAll("input").data(row).enter().append("input").property("type", "text").call(updatePlaceholder).attr("class", function(d) { - return "addr-" + d.id; - }).call(utilNoAuto).each(addDropdown).style("width", function(d) { - return d.width * 100 + "%"; + rows.enter().append("div").attr("class", "addr-row").selectAll("input").data(row).enter().append("input").property("type", "text").call(updatePlaceholder).attr("class", function(d2) { + return "addr-" + d2.id; + }).call(utilNoAuto).each(addDropdown).style("width", function(d2) { + return d2.width * 100 + "%"; }); - function addDropdown(d) { - if (dropdowns.indexOf(d.id) === -1) + function addDropdown(d2) { + if (dropdowns.indexOf(d2.id) === -1) return; - var nearValues = d.id === "street" ? getNearStreets : d.id === "city" ? getNearCities : getNearValues; + var nearValues; + switch (d2.id) { + case "street": + nearValues = getNearStreets; + break; + case "place": + nearValues = getNearPlaces; + break; + case "street+place": + nearValues = () => [].concat(getNearStreets()).concat(getNearPlaces()); + d2.isAutoStreetPlace = true; + d2.id = _tags[`${field.key}:place`] ? "place" : "street"; + break; + case "city": + nearValues = getNearCities; + break; + case "postcode": + nearValues = getNearPostcodes; + break; + default: + nearValues = getNearValues; + } select_default2(this).call( - uiCombobox(context, "address-" + d.id).minItems(1).caseSensitive(true).fetcher(function(value, callback) { - callback(nearValues("addr:" + d.id)); + uiCombobox(context, `address-${d2.isAutoStreetPlace ? "street-place" : d2.id}`).minItems(1).caseSensitive(true).fetcher(function(typedValue, callback) { + typedValue = typedValue.toLowerCase(); + callback(nearValues(d2.id).filter((v2) => v2.value.toLowerCase().indexOf(typedValue) !== -1)); + }).on("accept", function(selected) { + if (d2.isAutoStreetPlace) { + d2.id = selected ? selected.type : "street"; + } }) ); } @@ -58710,17 +63611,27 @@ ${content} } function change(onInput) { return function() { - var tags = {}; - _wrap.selectAll("input").each(function(subfield) { - var key = field.key + ":" + subfield.id; - var value = this.value; - if (!onInput) - value = context.cleanTagValue(value); - if (Array.isArray(_tags[key]) && !value) - return; - tags[key] = value || void 0; - }); - dispatch10.call("change", this, tags, onInput); + setTimeout(() => { + var tags = {}; + _wrap.selectAll("input").each(function(subfield) { + var key = field.key + ":" + subfield.id; + var value = this.value; + if (!onInput) + value = context.cleanTagValue(value); + if (Array.isArray(_tags[key]) && !value) + return; + if (subfield.isAutoStreetPlace) { + if (subfield.id === "street") { + tags[`${field.key}:place`] = void 0; + } else if (subfield.id === "place") { + tags[`${field.key}:street`] = void 0; + } + } + tags[key] = value || void 0; + }); + Object.keys(tags).filter((k2) => tags[k2]).forEach((k2) => _tags[k2] = tags[k2]); + dispatch14.call("change", this, tags, onInput); + }, 0); }; } function updatePlaceholder(inputSelection) { @@ -58728,16 +63639,35 @@ ${content} if (_tags && Array.isArray(_tags[field.key + ":" + subfield.id])) { return _t("inspector.multiple_values"); } - if (_countryCode) { - var localkey = subfield.id + "!" + _countryCode; - var tkey = addrField.hasTextForStringId("placeholders." + localkey) ? localkey : subfield.id; - return addrField.t("placeholders." + tkey); + if (subfield.isAutoStreetPlace) { + return `${getLocalPlaceholder("street")} / ${getLocalPlaceholder("place")}`; } + return getLocalPlaceholder(subfield.id); }); } + function getLocalPlaceholder(key) { + if (_countryCode) { + var localkey = key + "!" + _countryCode; + var tkey = addrField.hasTextForStringId("placeholders." + localkey) ? localkey : key; + return addrField.t("placeholders." + tkey); + } + } function updateTags(tags) { - utilGetSetValue(_wrap.selectAll("input"), function(subfield) { - var val = tags[field.key + ":" + subfield.id]; + utilGetSetValue(_wrap.selectAll("input"), (subfield) => { + var val; + if (subfield.isAutoStreetPlace) { + const streetKey = `${field.key}:street`; + const placeKey = `${field.key}:place`; + if (tags[streetKey] !== void 0 || tags[placeKey] === void 0) { + val = tags[streetKey]; + subfield.id = "street"; + } else { + val = tags[placeKey]; + subfield.id = "place"; + } + } else { + val = tags[`${field.key}:${subfield.id}`]; + } return typeof val === "string" ? val : ""; }).attr("title", function(subfield) { var val = tags[field.key + ":" + subfield.id]; @@ -58764,121 +63694,90 @@ ${content} if (node) node.focus(); }; - return utilRebind(address, dispatch10, "on"); + return utilRebind(address, dispatch14, "on"); } - // modules/ui/fields/cycleway.js - function uiFieldCycleway(field, context) { - var dispatch10 = dispatch_default("change"); + // modules/ui/fields/directional_combo.js + function uiFieldDirectionalCombo(field, context) { + var dispatch14 = dispatch_default("change"); var items = select_default2(null); var wrap2 = select_default2(null); var _tags; - function cycleway(selection2) { - function stripcolon(s) { - return s.replace(":", ""); + var _combos = {}; + if (field.type === "cycleway") { + field = { + ...field, + key: field.keys[0], + keys: field.keys.slice(1) + }; + } + function directionalCombo(selection2) { + function stripcolon(s2) { + return s2.replace(":", ""); } wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]); wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2); var div = wrap2.selectAll("ul").data([0]); div = div.enter().append("ul").attr("class", "rows").merge(div); - var keys = ["cycleway:left", "cycleway:right"]; - items = div.selectAll("li").data(keys); - var enter = items.enter().append("li").attr("class", function(d) { - return "labeled-input preset-cycleway-" + stripcolon(d); - }); - enter.append("span").attr("class", "label preset-label-cycleway").attr("for", function(d) { - return "preset-input-cycleway-" + stripcolon(d); - }).html(function(d) { - return field.t.html("types." + d); - }); - enter.append("div").attr("class", "preset-input-cycleway-wrap").append("input").attr("type", "text").attr("class", function(d) { - return "preset-input-cycleway preset-input-" + stripcolon(d); - }).call(utilNoAuto).each(function(d) { - select_default2(this).call( - uiCombobox(context, "cycleway-" + stripcolon(d)).data(cycleway.options(d)) - ); - }); - items = items.merge(enter); - wrap2.selectAll(".preset-input-cycleway").on("change", change).on("blur", change); - } - function change(d3_event, key) { - var newValue = context.cleanTagValue(utilGetSetValue(select_default2(this))); - if (!newValue && (Array.isArray(_tags.cycleway) || Array.isArray(_tags[key]))) - return; - if (newValue === "none" || newValue === "") { - newValue = void 0; - } - var otherKey = key === "cycleway:left" ? "cycleway:right" : "cycleway:left"; - var otherValue = typeof _tags.cycleway === "string" ? _tags.cycleway : _tags[otherKey]; - if (otherValue && Array.isArray(otherValue)) { - otherValue = otherValue[0]; - } - if (otherValue === "none" || otherValue === "") { - otherValue = void 0; - } - var tag = {}; - if (newValue === otherValue) { - tag = { - cycleway: newValue, - "cycleway:left": void 0, - "cycleway:right": void 0 - }; - } else { - tag = { - cycleway: void 0 - }; - tag[key] = newValue; - tag[otherKey] = otherValue; - } - dispatch10.call("change", this, tag); - } - cycleway.options = function() { - return field.options.map(function(option) { - return { - title: field.t("options." + option + ".description"), - value: option + items = div.selectAll("li").data(field.keys); + var enter = items.enter().append("li").attr("class", function(d2) { + return "labeled-input preset-directionalcombo-" + stripcolon(d2); + }); + enter.append("span").attr("class", "label preset-label-directionalcombo").attr("for", function(d2) { + return "preset-input-directionalcombo-" + stripcolon(d2); + }).html(function(d2) { + return field.t.html("types." + d2); + }); + enter.append("div").attr("class", "preset-input-directionalcombo-wrap form-field-input-wrap").each(function(key) { + const subField = { + ...field, + type: "combo", + key }; + const combo = uiFieldCombo(subField, context); + combo.on("change", (t2) => change(key, t2[key])); + _combos[key] = combo; + select_default2(this).call(combo); }); - }; - cycleway.tags = function(tags) { - _tags = tags; - var commonValue = typeof tags.cycleway === "string" && tags.cycleway; - utilGetSetValue(items.selectAll(".preset-input-cycleway"), function(d) { - if (commonValue) - return commonValue; - return !tags.cycleway && typeof tags[d] === "string" ? tags[d] : ""; - }).attr("title", function(d) { - if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) { - var vals = []; - if (Array.isArray(tags.cycleway)) { - vals = vals.concat(tags.cycleway); - } - if (Array.isArray(tags[d])) { - vals = vals.concat(tags[d]); - } - return vals.filter(Boolean).join("\n"); - } - return null; - }).attr("placeholder", function(d) { - if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) { - return _t("inspector.multiple_values"); + items = items.merge(enter); + wrap2.selectAll(".preset-input-directionalcombo").on("change", change).on("blur", change); + } + function change(key, newValue) { + const commonKey = field.key; + const otherKey = key === field.keys[0] ? field.keys[1] : field.keys[0]; + dispatch14.call("change", this, (tags) => { + const otherValue = tags[otherKey] || tags[commonKey]; + if (newValue === otherValue) { + tags[commonKey] = newValue; + delete tags[key]; + delete tags[otherKey]; + } else { + tags[key] = newValue; + delete tags[commonKey]; + tags[otherKey] = otherValue; } - return field.placeholder(); - }).classed("mixed", function(d) { - return Array.isArray(tags.cycleway) || Array.isArray(tags[d]); + return tags; }); + } + directionalCombo.tags = function(tags) { + _tags = tags; + const commonKey = field.key; + for (let key in _combos) { + const uniqueValues = [...new Set([].concat(_tags[commonKey]).concat(_tags[key]).filter(Boolean))]; + _combos[key].tags({ [key]: uniqueValues.length > 1 ? uniqueValues : uniqueValues[0] }); + } }; - cycleway.focus = function() { + directionalCombo.focus = function() { var node = wrap2.selectAll("input").node(); if (node) node.focus(); }; - return utilRebind(cycleway, dispatch10, "on"); + return utilRebind(directionalCombo, dispatch14, "on"); } // modules/ui/fields/lanes.js function uiFieldLanes(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var LANE_WIDTH = 40; var LANE_HEIGHT = 200; var _entityIDs = []; @@ -58891,9 +63790,9 @@ ${content} var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]); wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2); var surface = wrap2.selectAll(".surface").data([0]); - var d = utilGetDimensions(wrap2); - var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5; - surface = surface.enter().append("svg").attr("width", d[0]).attr("height", 300).attr("class", "surface").merge(surface); + var d2 = utilGetDimensions(wrap2); + var freeSpace = d2[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5; + surface = surface.enter().append("svg").attr("width", d2[0]).attr("height", 300).attr("class", "surface").merge(surface); var lanesSelection = surface.selectAll(".lanes").data([0]); lanesSelection = lanesSelection.enter().append("g").attr("class", "lanes").merge(lanesSelection); lanesSelection.attr("transform", function() { @@ -58907,17 +63806,17 @@ ${content} enter.append("g").attr("class", "bothways").append("text").attr("y", 40).attr("x", 14).text("\u25B2\u25BC"); enter.append("g").attr("class", "backward").append("text").attr("y", 40).attr("x", 14).text("\u25BC"); lane = lane.merge(enter); - lane.attr("transform", function(d2) { - return "translate(" + LANE_WIDTH * d2.index * 1.5 + ", 0)"; + lane.attr("transform", function(d4) { + return "translate(" + LANE_WIDTH * d4.index * 1.5 + ", 0)"; }); - lane.select(".forward").style("visibility", function(d2) { - return d2.direction === "forward" ? "visible" : "hidden"; + lane.select(".forward").style("visibility", function(d4) { + return d4.direction === "forward" ? "visible" : "hidden"; }); - lane.select(".bothways").style("visibility", function(d2) { - return d2.direction === "bothways" ? "visible" : "hidden"; + lane.select(".bothways").style("visibility", function(d4) { + return d4.direction === "bothways" ? "visible" : "hidden"; }); - lane.select(".backward").style("visibility", function(d2) { - return d2.direction === "backward" ? "visible" : "hidden"; + lane.select(".backward").style("visibility", function(d4) { + return d4.direction === "backward" ? "visible" : "hidden"; }); } lanes.entityIDs = function(val) { @@ -58929,24 +63828,25 @@ ${content} }; lanes.off = function() { }; - return utilRebind(lanes, dispatch10, "on"); + return utilRebind(lanes, dispatch14, "on"); } uiFieldLanes.supportsMultiselection = false; // modules/ui/fields/localized.js var _languagesArray = []; function uiFieldLocalized(field, context) { - var dispatch10 = dispatch_default("change", "input"); + var dispatch14 = dispatch_default("change", "input"); var wikipedia = services.wikipedia; var input = select_default2(null); var localizedInputs = select_default2(null); + var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()); var _countryCode; var _tags; _mainFileFetcher.get("languages").then(loadLanguagesArray).catch(function() { }); var _territoryLanguages = {}; - _mainFileFetcher.get("territory_languages").then(function(d) { - _territoryLanguages = d; + _mainFileFetcher.get("territory_languages").then(function(d2) { + _territoryLanguages = d2; }).catch(function() { }); var langCombo = uiCombobox(context, "localized-lang").fetcher(fetchLanguages).minItems(0); @@ -58960,7 +63860,9 @@ ${content} return; var replacements = { sr: "sr-Cyrl", + // in OSM, `sr` implies Cyrillic "sr-Cyrl": false + // `sr-Cyrl` isn't used in OSM }; for (var code in dataLanguages) { if (replacements[code] === false) @@ -58988,12 +63890,12 @@ ${content} var preset = _mainPresetIndex.match(entity, context.graph()); if (preset) { var isSuggestion = preset.suggestion; - var fields = preset.fields(); - var showsBrandField = fields.some(function(d) { - return d.id === "brand"; + var fields = preset.fields(entity.extent(context.graph()).center()); + var showsBrandField = fields.some(function(d2) { + return d2.id === "brand"; }); - var showsOperatorField = fields.some(function(d) { - return d.id === "operator"; + var showsOperatorField = fields.some(function(d2) { + return d2.id === "operator"; }); var setsName = preset.addTags.name; var setsBrandWikidata = preset.addTags["brand:wikidata"]; @@ -59009,10 +63911,10 @@ ${content} return item2.lang; }); var existingLangs = new Set(existingLangsOrdered.filter(Boolean)); - for (var k in tags) { - var m = k.match(/^(.*):([a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?)$/); - if (m && m[1] === field.key && m[2]) { - var item = { lang: m[2], value: tags[k] }; + for (var k2 in tags) { + var m2 = k2.match(/^(.*):([a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?)$/); + if (m2 && m2[1] === field.key && m2[2]) { + var item = { lang: m2[2], value: tags[k2] }; if (existingLangs.has(item.lang)) { _multilingual[existingLangsOrdered.indexOf(item.lang)].value = item.value; existingLangs.delete(item.lang); @@ -59036,6 +63938,7 @@ ${content} input = wrap2.selectAll(".localized-main").data([0]); input = input.enter().append("input").attr("type", "text").attr("id", field.domId).attr("class", "localized-main").call(utilNoAuto).merge(input); input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change()); + wrap2.call(_lengthIndicator); var translateButton = wrap2.selectAll(".localized-add").data([0]); translateButton = translateButton.enter().append("button").attr("class", "localized-add form-field-button").attr("aria-label", _t("icons.plus")).call(svgIcon("#iD-icon-plus")).merge(translateButton); translateButton.classed("disabled", !!isLocked).call(isLocked ? _buttonTip.destroy : _buttonTip).on("click", addNew); @@ -59078,49 +63981,49 @@ ${content} val = context.cleanTagValue(val); if (!val && Array.isArray(_tags[field.key])) return; - var t = {}; - t[field.key] = val || void 0; - dispatch10.call("change", this, t, onInput); + var t2 = {}; + t2[field.key] = val || void 0; + dispatch14.call("change", this, t2, onInput); }; } } function key(lang) { return field.key + ":" + lang; } - function changeLang(d3_event, d) { + function changeLang(d3_event, d2) { var tags = {}; var lang = utilGetSetValue(select_default2(this)).toLowerCase(); - var language = _languagesArray.find(function(d2) { - return d2.label.toLowerCase() === lang || d2.localName && d2.localName.toLowerCase() === lang || d2.nativeName && d2.nativeName.toLowerCase() === lang; + var language = _languagesArray.find(function(d4) { + return d4.label.toLowerCase() === lang || d4.localName && d4.localName.toLowerCase() === lang || d4.nativeName && d4.nativeName.toLowerCase() === lang; }); if (language) lang = language.code; - if (d.lang && d.lang !== lang) { - tags[key(d.lang)] = void 0; + if (d2.lang && d2.lang !== lang) { + tags[key(d2.lang)] = void 0; } var newKey = lang && context.cleanTagKey(key(lang)); var value = utilGetSetValue(select_default2(this.parentNode).selectAll(".localized-value")); if (newKey && value) { tags[newKey] = value; - } else if (newKey && _wikiTitles && _wikiTitles[d.lang]) { - tags[newKey] = _wikiTitles[d.lang]; + } else if (newKey && _wikiTitles && _wikiTitles[d2.lang]) { + tags[newKey] = _wikiTitles[d2.lang]; } - d.lang = lang; - dispatch10.call("change", this, tags); + d2.lang = lang; + dispatch14.call("change", this, tags); } - function changeValue(d3_event, d) { - if (!d.lang) + function changeValue(d3_event, d2) { + if (!d2.lang) return; var value = context.cleanTagValue(utilGetSetValue(select_default2(this))) || void 0; - if (!value && Array.isArray(d.value)) + if (!value && Array.isArray(d2.value)) return; - var t = {}; - t[key(d.lang)] = value; - d.value = value; - dispatch10.call("change", this, t); + var t2 = {}; + t2[key(d2.lang)] = value; + d2.value = value; + dispatch14.call("change", this, t2); } function fetchLanguages(value, cb) { - var v = value.toLowerCase(); + var v2 = value.toLowerCase(); var langCodes = [_mainLocalizer.localeCode(), _mainLocalizer.languageCode()]; if (_countryCode && _territoryLanguages[_countryCode]) { langCodes = langCodes.concat(_territoryLanguages[_countryCode]); @@ -59134,35 +64037,35 @@ ${content} langItems.push(langItem); }); langItems = utilArrayUniq(langItems.concat(_languagesArray)); - cb(langItems.filter(function(d) { - return d.label.toLowerCase().indexOf(v) >= 0 || d.localName && d.localName.toLowerCase().indexOf(v) >= 0 || d.nativeName && d.nativeName.toLowerCase().indexOf(v) >= 0 || d.code.toLowerCase().indexOf(v) >= 0; - }).map(function(d) { - return { value: d.label }; + cb(langItems.filter(function(d2) { + return d2.label.toLowerCase().indexOf(v2) >= 0 || d2.localName && d2.localName.toLowerCase().indexOf(v2) >= 0 || d2.nativeName && d2.nativeName.toLowerCase().indexOf(v2) >= 0 || d2.code.toLowerCase().indexOf(v2) >= 0; + }).map(function(d2) { + return { value: d2.label }; })); } function renderMultilingual(selection2) { - var entries = selection2.selectAll("div.entry").data(_multilingual, function(d) { - return d.lang; + var entries = selection2.selectAll("div.entry").data(_multilingual, function(d2) { + return d2.lang; }); entries.exit().style("top", "0").style("max-height", "240px").transition().duration(200).style("opacity", "0").style("max-height", "0px").remove(); - var entriesEnter = entries.enter().append("div").attr("class", "entry").each(function(_, index) { + var entriesEnter = entries.enter().append("div").attr("class", "entry").each(function(_2, index) { var wrap2 = select_default2(this); var domId = utilUniqueDomId(index); var label = wrap2.append("label").attr("class", "field-label").attr("for", domId); var text2 = label.append("span").attr("class", "label-text"); text2.append("span").attr("class", "label-textvalue").call(_t.append("translate.localized_translation_label")); text2.append("span").attr("class", "label-textannotation"); - label.append("button").attr("class", "remove-icon-multilingual").attr("title", _t("icons.remove")).on("click", function(d3_event, d) { + label.append("button").attr("class", "remove-icon-multilingual").attr("title", _t("icons.remove")).on("click", function(d3_event, d2) { if (field.locked()) return; d3_event.preventDefault(); - _multilingual.splice(_multilingual.indexOf(d), 1); - var langKey = d.lang && key(d.lang); + _multilingual.splice(_multilingual.indexOf(d2), 1); + var langKey = d2.lang && key(d2.lang); if (langKey && langKey in _tags) { delete _tags[langKey]; - var t = {}; - t[langKey] = void 0; - dispatch10.call("change", this, t); + var t2 = {}; + t2[langKey] = void 0; + dispatch14.call("change", this, t2); return; } renderMultilingual(selection2); @@ -59176,22 +64079,22 @@ ${content} entries = entries.merge(entriesEnter); entries.order(); entries.classed("present", true); - utilGetSetValue(entries.select(".localized-lang"), function(d) { + utilGetSetValue(entries.select(".localized-lang"), function(d2) { var langItem = _languagesArray.find(function(item) { - return item.code === d.lang; + return item.code === d2.lang; }); if (langItem) return langItem.label; - return d.lang; + return d2.lang; }); - utilGetSetValue(entries.select(".localized-value"), function(d) { - return typeof d.value === "string" ? d.value : ""; - }).attr("title", function(d) { - return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : null; - }).attr("placeholder", function(d) { - return Array.isArray(d.value) ? _t("inspector.multiple_values") : _t("translate.localized_translation_name"); - }).classed("mixed", function(d) { - return Array.isArray(d.value); + utilGetSetValue(entries.select(".localized-value"), function(d2) { + return typeof d2.value === "string" ? d2.value : ""; + }).attr("title", function(d2) { + return Array.isArray(d2.value) ? d2.value.filter(Boolean).join("\n") : null; + }).attr("placeholder", function(d2) { + return Array.isArray(d2.value) ? _t("inspector.multiple_values") : _t("translate.localized_translation_name"); + }).classed("mixed", function(d2) { + return Array.isArray(d2.value); }); } localized.tags = function(tags) { @@ -59200,10 +64103,10 @@ ${content} _wikiTitles = {}; var wm = tags.wikipedia.match(/([^:]+):(.+)/); if (wm && wm[0] && wm[1]) { - wikipedia.translations(wm[1], wm[2], function(err, d) { - if (err || !d) + wikipedia.translations(wm[1], wm[2], function(err, d2) { + if (err || !d2) return; - _wikiTitles = d; + _wikiTitles = d2; }); } } @@ -59211,6 +64114,9 @@ ${content} utilGetSetValue(input, typeof tags[field.key] === "string" ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed); calcMultilingual(tags); _selection.call(localized); + if (!isMixed) { + _lengthIndicator.update(tags[field.key]); + } }; localized.focus = function() { input.node().focus(); @@ -59231,12 +64137,12 @@ ${content} function combinedEntityExtent() { return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph()); } - return utilRebind(localized, dispatch10, "on"); + return utilRebind(localized, dispatch14, "on"); } // modules/ui/fields/roadheight.js function uiFieldRoadheight(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var primaryUnitInput = select_default2(null); var primaryInput = select_default2(null); var secondaryInput = select_default2(null); @@ -59244,6 +64150,8 @@ ${content} var _entityIDs = []; var _tags; var _isImperial; + var formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode()); + var parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode()); var primaryUnits = [ { value: "m", @@ -59294,18 +64202,26 @@ ${content} return; if (!primaryValue && !secondaryValue) { tag[field.key] = void 0; - } else if (isNaN(primaryValue) || isNaN(secondaryValue) || !_isImperial) { - tag[field.key] = context.cleanTagValue(primaryValue); } else { - if (primaryValue !== "") { - primaryValue = context.cleanTagValue(primaryValue + "'"); - } - if (secondaryValue !== "") { - secondaryValue = context.cleanTagValue(secondaryValue + '"'); + var rawPrimaryValue = likelyRawNumberFormat.test(primaryValue) ? parseFloat(primaryValue) : parseLocaleFloat(primaryValue); + if (isNaN(rawPrimaryValue)) + rawPrimaryValue = primaryValue; + var rawSecondaryValue = likelyRawNumberFormat.test(secondaryValue) ? parseFloat(secondaryValue) : parseLocaleFloat(secondaryValue); + if (isNaN(rawSecondaryValue)) + rawSecondaryValue = secondaryValue; + if (isNaN(rawPrimaryValue) || isNaN(rawSecondaryValue) || !_isImperial) { + tag[field.key] = context.cleanTagValue(rawPrimaryValue); + } else { + if (rawPrimaryValue !== "") { + rawPrimaryValue = rawPrimaryValue + "'"; + } + if (rawSecondaryValue !== "") { + rawSecondaryValue = rawSecondaryValue + '"'; + } + tag[field.key] = context.cleanTagValue(rawPrimaryValue + rawSecondaryValue); } - tag[field.key] = primaryValue + secondaryValue; } - dispatch10.call("change", this, tag); + dispatch14.call("change", this, tag); } roadheight.tags = function(tags) { _tags = tags; @@ -59316,20 +64232,28 @@ ${content} if (primaryValue && (primaryValue.indexOf("'") >= 0 || primaryValue.indexOf('"') >= 0)) { secondaryValue = primaryValue.match(/(-?[\d.]+)"/); if (secondaryValue !== null) { - secondaryValue = secondaryValue[1]; + secondaryValue = formatFloat(parseFloat(secondaryValue[1])); } primaryValue = primaryValue.match(/(-?[\d.]+)'/); if (primaryValue !== null) { - primaryValue = primaryValue[1]; + primaryValue = formatFloat(parseFloat(primaryValue[1])); } _isImperial = true; } else if (primaryValue) { + var rawValue = primaryValue; + primaryValue = parseFloat(rawValue); + if (isNaN(primaryValue)) { + primaryValue = rawValue; + } else { + primaryValue = formatFloat(primaryValue); + } _isImperial = false; } } setUnitSuggestions(); + var inchesPlaceholder = formatFloat(0); utilGetSetValue(primaryInput, typeof primaryValue === "string" ? primaryValue : "").attr("title", isMixed ? primaryValue.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _t("inspector.unknown")).classed("mixed", isMixed); - utilGetSetValue(secondaryInput, typeof secondaryValue === "string" ? secondaryValue : "").attr("placeholder", isMixed ? _t("inspector.multiple_values") : _isImperial ? "0" : null).classed("mixed", isMixed).classed("disabled", !_isImperial).attr("readonly", _isImperial ? null : "readonly"); + utilGetSetValue(secondaryInput, typeof secondaryValue === "string" ? secondaryValue : "").attr("placeholder", isMixed ? _t("inspector.multiple_values") : _isImperial ? inchesPlaceholder : null).classed("mixed", isMixed).classed("disabled", !_isImperial).attr("readonly", _isImperial ? null : "readonly"); secondaryUnitInput.attr("value", _isImperial ? _t("inspector.roadheight.inch") : null); }; roadheight.focus = function() { @@ -59341,17 +64265,19 @@ ${content} function combinedEntityExtent() { return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph()); } - return utilRebind(roadheight, dispatch10, "on"); + return utilRebind(roadheight, dispatch14, "on"); } // modules/ui/fields/roadspeed.js function uiFieldRoadspeed(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var unitInput = select_default2(null); var input = select_default2(null); var _entityIDs = []; var _tags; var _isImperial; + var formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode()); + var parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode()); var speedCombo = uiCombobox(context, "roadspeed"); var unitCombo = uiCombobox(context, "roadspeed-unit").data(["km/h", "mph"].map(comboValues)); var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]; @@ -59383,10 +64309,10 @@ ${content} speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues)); utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h"); } - function comboValues(d) { + function comboValues(d2) { return { - value: d.toString(), - title: d.toString() + value: formatFloat(d2), + title: formatFloat(d2) }; } function change() { @@ -59396,24 +64322,35 @@ ${content} return; if (!value) { tag[field.key] = void 0; - } else if (isNaN(value) || !_isImperial) { - tag[field.key] = context.cleanTagValue(value); } else { - tag[field.key] = context.cleanTagValue(value + " mph"); + var rawValue = likelyRawNumberFormat.test(value) ? parseFloat(value) : parseLocaleFloat(value); + if (isNaN(rawValue)) + rawValue = value; + if (isNaN(rawValue) || !_isImperial) { + tag[field.key] = context.cleanTagValue(rawValue); + } else { + tag[field.key] = context.cleanTagValue(rawValue + " mph"); + } } - dispatch10.call("change", this, tag); + dispatch14.call("change", this, tag); } roadspeed.tags = function(tags) { _tags = tags; - var value = tags[field.key]; + var rawValue = tags[field.key]; + var value = rawValue; var isMixed = Array.isArray(value); if (!isMixed) { - if (value && value.indexOf("mph") >= 0) { - value = parseInt(value, 10).toString(); + if (rawValue && rawValue.indexOf("mph") >= 0) { _isImperial = true; - } else if (value) { + } else if (rawValue) { _isImperial = false; } + value = parseInt(value, 10); + if (isNaN(value)) { + value = rawValue; + } else { + value = formatFloat(value); + } } setUnitSuggestions(); utilGetSetValue(input, typeof value === "string" ? value : "").attr("title", isMixed ? value.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed); @@ -59427,12 +64364,12 @@ ${content} function combinedEntityExtent() { return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph()); } - return utilRebind(roadspeed, dispatch10, "on"); + return utilRebind(roadspeed, dispatch14, "on"); } // modules/ui/fields/radio.js function uiFieldRadio(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var placeholder = select_default2(null); var wrap2 = select_default2(null); var labels = select_default2(null); @@ -59455,18 +64392,19 @@ ${content} placeholder = wrap2.selectAll(".placeholder"); labels = wrap2.selectAll("label").data(radioData); enter = labels.enter().append("label"); - enter.append("input").attr("type", "radio").attr("name", field.id).attr("value", function(d) { - return field.t("options." + d, { "default": d }); + var stringsField = field.resolveReference("stringsCrossReference"); + enter.append("input").attr("type", "radio").attr("name", field.id).attr("value", function(d2) { + return stringsField.t("options." + d2, { "default": d2 }); }).attr("checked", false); - enter.append("span").html(function(d) { - return field.t.html("options." + d, { "default": d }); + enter.append("span").each(function(d2) { + stringsField.t.append("options." + d2, { "default": d2 })(select_default2(this)); }); labels = labels.merge(enter); radios = labels.selectAll("input").on("change", changeRadio); } function structureExtras(selection2, tags) { var selected = selectedKey() || tags.layer !== void 0; - var type3 = _mainPresetIndex.field(selected); + var type2 = _mainPresetIndex.field(selected); var layer = _mainPresetIndex.field("layer"); var showLayer = selected === "bridge" || selected === "tunnel" || tags.layer !== void 0; var extrasWrap = selection2.selectAll(".structure-extras-wrap").data(selected ? [0] : []); @@ -59474,16 +64412,16 @@ ${content} extrasWrap = extrasWrap.enter().append("div").attr("class", "structure-extras-wrap").merge(extrasWrap); var list = extrasWrap.selectAll("ul").data([0]); list = list.enter().append("ul").attr("class", "rows").merge(list); - if (type3) { + if (type2) { if (!typeField || typeField.id !== selected) { - typeField = uiField(context, type3, _entityIDs, { wrap: false }).on("change", changeType); + typeField = uiField(context, type2, _entityIDs, { wrap: false }).on("change", changeType); } typeField.tags(tags); } else { typeField = null; } - var typeItem = list.selectAll(".structure-type-item").data(typeField ? [typeField] : [], function(d) { - return d.id; + var typeItem = list.selectAll(".structure-type-item").data(typeField ? [typeField] : [], function(d2) { + return d2.id; }); typeItem.exit().remove(); var typeEnter = typeItem.enter().insert("li", ":first-child").attr("class", "labeled-input structure-type-item"); @@ -59501,8 +64439,8 @@ ${content} field.keys = utilArrayUnion(field.keys, ["layer"]); } else { layerField = null; - field.keys = field.keys.filter(function(k) { - return k !== "layer"; + field.keys = field.keys.filter(function(k2) { + return k2 !== "layer"; }); } var layerItem = list.selectAll(".structure-layer-item").data(layerField ? [layerField] : []); @@ -59515,87 +64453,87 @@ ${content} layerItem.selectAll(".structure-input-layer-wrap").call(layerField.render); } } - function changeType(t, onInput) { + function changeType(t2, onInput) { var key = selectedKey(); if (!key) return; - var val = t[key]; + var val = t2[key]; if (val !== "no") { _oldType[key] = val; } if (field.type === "structureRadio") { if (val === "no" || key !== "bridge" && key !== "tunnel" || key === "tunnel" && val === "building_passage") { - t.layer = void 0; + t2.layer = void 0; } - if (t.layer === void 0) { + if (t2.layer === void 0) { if (key === "bridge" && val !== "no") { - t.layer = "1"; + t2.layer = "1"; } if (key === "tunnel" && val !== "no" && val !== "building_passage") { - t.layer = "-1"; + t2.layer = "-1"; } } } - dispatch10.call("change", this, t, onInput); + dispatch14.call("change", this, t2, onInput); } - function changeLayer(t, onInput) { - if (t.layer === "0") { - t.layer = void 0; + function changeLayer(t2, onInput) { + if (t2.layer === "0") { + t2.layer = void 0; } - dispatch10.call("change", this, t, onInput); + dispatch14.call("change", this, t2, onInput); } function changeRadio() { - var t = {}; + var t2 = {}; var activeKey; if (field.key) { - t[field.key] = void 0; + t2[field.key] = void 0; } - radios.each(function(d) { + radios.each(function(d2) { var active = select_default2(this).property("checked"); if (active) - activeKey = d; + activeKey = d2; if (field.key) { if (active) - t[field.key] = d; + t2[field.key] = d2; } else { var val = _oldType[activeKey] || "yes"; - t[d] = active ? val : void 0; + t2[d2] = active ? val : void 0; } }); if (field.type === "structureRadio") { if (activeKey === "bridge") { - t.layer = "1"; - } else if (activeKey === "tunnel" && t.tunnel !== "building_passage") { - t.layer = "-1"; + t2.layer = "1"; + } else if (activeKey === "tunnel" && t2.tunnel !== "building_passage") { + t2.layer = "-1"; } else { - t.layer = void 0; + t2.layer = void 0; } } - dispatch10.call("change", this, t); + dispatch14.call("change", this, t2); } radio.tags = function(tags) { - function isOptionChecked(d) { + function isOptionChecked(d2) { if (field.key) { - return tags[field.key] === d; + return tags[field.key] === d2; } - return !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no"); + return !!(typeof tags[d2] === "string" && tags[d2].toLowerCase() !== "no"); } - function isMixed(d) { + function isMixed(d2) { if (field.key) { - return Array.isArray(tags[field.key]) && tags[field.key].includes(d); + return Array.isArray(tags[field.key]) && tags[field.key].includes(d2); } - return Array.isArray(tags[d]); + return Array.isArray(tags[d2]); } - radios.property("checked", function(d) { - return isOptionChecked(d) && (field.key || field.options.filter(isOptionChecked).length === 1); + radios.property("checked", function(d2) { + return isOptionChecked(d2) && (field.key || field.options.filter(isOptionChecked).length === 1); }); - labels.classed("active", function(d) { + labels.classed("active", function(d2) { if (field.key) { - return Array.isArray(tags[field.key]) && tags[field.key].includes(d) || tags[field.key] === d; + return Array.isArray(tags[field.key]) && tags[field.key].includes(d2) || tags[field.key] === d2; } - return Array.isArray(tags[d]) && tags[d].some((v) => typeof v === "string" && v.toLowerCase() !== "no") || !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no"); - }).classed("mixed", isMixed).attr("title", function(d) { - return isMixed(d) ? _t("inspector.unshared_value_tooltip") : null; + return Array.isArray(tags[d2]) && tags[d2].some((v2) => typeof v2 === "string" && v2.toLowerCase() !== "no") || !!(typeof tags[d2] === "string" && tags[d2].toLowerCase() !== "no"); + }).classed("mixed", isMixed).attr("title", function(d2) { + return isMixed(d2) ? _t("inspector.unshared_value_tooltip") : null; }); var selection2 = radios.filter(function() { return this.checked; @@ -59627,19 +64565,19 @@ ${content} radio.isAllowed = function() { return _entityIDs.length === 1; }; - return utilRebind(radio, dispatch10, "on"); + return utilRebind(radio, dispatch14, "on"); } // modules/ui/fields/restrictions.js function uiFieldRestrictions(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var breathe = behaviorBreathe(context); corePreferences("turn-restriction-via-way", null); var storedViaWay = corePreferences("turn-restriction-via-way0"); var storedDistance = corePreferences("turn-restriction-distance"); var _maxViaWay = storedViaWay !== null ? +storedViaWay : 0; var _maxDistance = storedDistance ? +storedDistance : 30; - var _initialized2 = false; + var _initialized3 = false; var _parent = select_default2(null); var _container = select_default2(null); var _oldTurns; @@ -59654,9 +64592,11 @@ ${content} _graph = context.graph(); _intersection = osmIntersection(_graph, _vertexID, _maxDistance); } - var isOK = _intersection && _intersection.vertices.length && _intersection.vertices.filter(function(vertex) { + var isOK = _intersection && _intersection.vertices.length && // has vertices + _intersection.vertices.filter(function(vertex) { return vertex.id === _vertexID; - }).length && _intersection.ways.length > 2 && _intersection.ways.filter(function(way) { + }).length && _intersection.ways.length > 2 && // has more than 2 ways + _intersection.ways.filter(function(way) { return way.__to; }).length > 1; select_default2(selection2.node().parentNode).classed("hide", !isOK); @@ -59711,31 +64651,31 @@ ${content} var filter2 = utilFunctor(true); var projection2 = geoRawMercator(); var sdims = utilGetDimensions(context.container().select(".sidebar")); - var d = [sdims[0] - 50, 370]; - var c = geoVecScale(d, 0.5); - var z = 22; - projection2.scale(geoZoomToScale(z)); + var d2 = [sdims[0] - 50, 370]; + var c2 = geoVecScale(d2, 0.5); + var z2 = 22; + projection2.scale(geoZoomToScale(z2)); var extent = geoExtent(); - for (var i2 = 0; i2 < _intersection.vertices.length; i2++) { - extent._extend(_intersection.vertices[i2].extent()); + for (var i3 = 0; i3 < _intersection.vertices.length; i3++) { + extent._extend(_intersection.vertices[i3].extent()); } var padTop = 35; if (_intersection.vertices.length > 1) { - var hPadding = Math.min(160, Math.max(110, d[0] * 0.4)); + var hPadding = Math.min(160, Math.max(110, d2[0] * 0.4)); var vPadding = 160; var tl = projection2([extent[0][0], extent[1][1]]); var br = projection2([extent[1][0], extent[0][1]]); - var hFactor = (br[0] - tl[0]) / (d[0] - hPadding); - var vFactor = (br[1] - tl[1]) / (d[1] - vPadding - padTop); + var hFactor = (br[0] - tl[0]) / (d2[0] - hPadding); + var vFactor = (br[1] - tl[1]) / (d2[1] - vPadding - padTop); var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2; var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2; - z = z - Math.max(hZoomDiff, vZoomDiff); - projection2.scale(geoZoomToScale(z)); + z2 = z2 - Math.max(hZoomDiff, vZoomDiff); + projection2.scale(geoZoomToScale(z2)); } var extentCenter = projection2(extent.center()); extentCenter[1] = extentCenter[1] - padTop / 2; - projection2.translate(geoVecSubtract(c, extentCenter)).clipExtent([[0, 0], d]); - var drawLayers = svgLayers(projection2, context).only(["osm", "touch"]).dimensions(d); + projection2.translate(geoVecSubtract(c2, extentCenter)).clipExtent([[0, 0], d2]); + var drawLayers = svgLayers(projection2, context).only(["osm", "touch"]).dimensions(d2); var drawVertices = svgVertices(projection2, context); var drawLines = svgLines(projection2, context); var drawTurns = svgTurns(projection2, context); @@ -59743,14 +64683,14 @@ ${content} selection2.call(drawLayers); var surface = selection2.selectAll(".surface").classed("tr", true); if (firstTime) { - _initialized2 = true; + _initialized3 = true; surface.call(breathe); } if (_fromWayID && !vgraph.hasEntity(_fromWayID)) { _fromWayID = null; _oldTurns = null; } - surface.call(utilSetDimensions, d).call(drawVertices, vgraph, _intersection.vertices, filter2, extent, z).call(drawLines, vgraph, _intersection.ways, filter2).call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay)); + surface.call(utilSetDimensions, d2).call(drawVertices, vgraph, _intersection.vertices, filter2, extent, z2).call(drawLines, vgraph, _intersection.ways, filter2).call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay)); surface.on("click.restrictions", click).on("mouseover.restrictions", mouseover); surface.selectAll(".selected").classed("selected", false); surface.selectAll(".related").classed("related", false); @@ -59776,7 +64716,7 @@ ${content} _oldTurns = null; redraw(); } else if (datum2 instanceof osmTurn) { - var actions, extraActions, turns, i3; + var actions, extraActions, turns, i4; var restrictionType = osmInferRestriction(vgraph, datum2, projection2); if (datum2.restrictionID && !datum2.direct) { return; @@ -59788,12 +64728,12 @@ ${content} turns = _intersection.turns(_fromWayID, 2); extraActions = []; _oldTurns = []; - for (i3 = 0; i3 < turns.length; i3++) { - var turn = turns[i3]; + for (i4 = 0; i4 < turns.length; i4++) { + var turn = turns[i4]; if (seen[turn.restrictionID]) continue; if (turn.direct && turn.path[1] === datum2.path[1]) { - seen[turns[i3].restrictionID] = true; + seen[turns[i4].restrictionID] = true; turn.restrictionType = osmInferRestriction(vgraph, turn, projection2); _oldTurns.push(turn); extraActions.push(actionUnrestrictTurn(turn)); @@ -59806,9 +64746,9 @@ ${content} } else if (datum2.restrictionID) { turns = _oldTurns || []; extraActions = []; - for (i3 = 0; i3 < turns.length; i3++) { - if (turns[i3].key !== datum2.key) { - extraActions.push(actionRestrictTurn(turns[i3], turns[i3].restrictionType)); + for (i4 = 0; i4 < turns.length; i4++) { + if (turns[i4].key !== datum2.key) { + extraActions.push(actionRestrictTurn(turns[i4], turns[i4].restrictionType)); } } _oldTurns = null; @@ -59823,8 +64763,8 @@ ${content} ]); } context.perform.apply(context, actions); - var s = surface.selectAll("." + datum2.key); - datum2 = s.empty() ? null : s.datum(); + var s2 = surface.selectAll("." + datum2.key); + datum2 = s2.empty() ? null : s2.datum(); updateHints(datum2); } else { _fromWayID = null; @@ -59854,8 +64794,8 @@ ${content} surface.selectAll("." + wayID).classed("related", true); if (wayID) { var turns = _intersection.turns(wayID, _maxViaWay); - for (var i3 = 0; i3 < turns.length; i3++) { - var turn = turns[i3]; + for (var i4 = 0; i4 < turns.length; i4++) { + var turn = turns[i4]; var ids = [turn.to.way]; var klass = turn.no ? "restrict" : turn.only ? "only" : "allow"; if (turn.only || turns.length === 1) { @@ -59872,8 +64812,8 @@ ${content} function updateHints(datum2) { var help = _container.selectAll(".restriction-help").html(""); var placeholders = {}; - ["from", "via", "to"].forEach(function(k) { - placeholders[k] = { html: '' + _t("restriction.help." + k) + "" }; + ["from", "via", "to"].forEach(function(k2) { + placeholders[k2] = { html: '' + _t("restriction.help." + k2) + "" }; }); var entity = datum2 && datum2.properties && datum2.properties.entity; if (entity) { @@ -59919,9 +64859,9 @@ ${content} })); if (datum2.via.ways && datum2.via.ways.length) { var names = []; - for (var i3 = 0; i3 < datum2.via.ways.length; i3++) { + for (var i4 = 0; i4 < datum2.via.ways.length; i4++) { var prev = names[names.length - 1]; - var curr = displayName(datum2.via.ways[i3], vgraph); + var curr = displayName(datum2.via.ways[i4], vgraph); if (!prev || curr !== prev) { names.push(curr); } @@ -59958,6 +64898,7 @@ ${content} var opts; if (isImperial) { var distToFeet = { + // imprecise conversion for prettier display 20: 70, 25: 85, 30: 100, @@ -59983,8 +64924,8 @@ ${content} var entity = graph.entity(entityID); var name = utilDisplayName(entity) || ""; var matched = _mainPresetIndex.match(entity, graph); - var type3 = matched && matched.name() || utilDisplayType(entity.id); - return name || type3; + var type2 = matched && matched.name() || utilDisplayType(entity.id); + return name || type2; } restrictions.entityIDs = function(val) { _intersection = null; @@ -59997,53 +64938,58 @@ ${content} restrictions.focus = function() { }; restrictions.off = function(selection2) { - if (!_initialized2) + if (!_initialized3) return; selection2.selectAll(".surface").call(breathe.off).on("click.restrictions", null).on("mouseover.restrictions", null); select_default2(window).on("resize.restrictions", null); }; - return utilRebind(restrictions, dispatch10, "on"); + return utilRebind(restrictions, dispatch14, "on"); } uiFieldRestrictions.supportsMultiselection = false; // modules/ui/fields/textarea.js function uiFieldTextarea(field, context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var input = select_default2(null); + var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()).silent(field.usage === "changeset" && field.key === "comment"); var _tags; function textarea(selection2) { var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]); - wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2); + wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).style("position", "relative").merge(wrap2); input = wrap2.selectAll("textarea").data([0]); input = input.enter().append("textarea").attr("id", field.domId).call(utilNoAuto).on("input", change(true)).on("blur", change()).on("change", change()).merge(input); - } - function change(onInput) { - return function() { - var val = utilGetSetValue(input); - if (!onInput) - val = context.cleanTagValue(val); - if (!val && Array.isArray(_tags[field.key])) - return; - var t = {}; - t[field.key] = val || void 0; - dispatch10.call("change", this, t, onInput); - }; + wrap2.call(_lengthIndicator); + function change(onInput) { + return function() { + var val = utilGetSetValue(input); + if (!onInput) + val = context.cleanTagValue(val); + if (!val && Array.isArray(_tags[field.key])) + return; + var t2 = {}; + t2[field.key] = val || void 0; + dispatch14.call("change", this, t2, onInput); + }; + } } textarea.tags = function(tags) { _tags = tags; var isMixed = Array.isArray(tags[field.key]); utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed); + if (!isMixed) { + _lengthIndicator.update(tags[field.key]); + } }; textarea.focus = function() { input.node().focus(); }; - return utilRebind(textarea, dispatch10, "on"); + return utilRebind(textarea, dispatch14, "on"); } // modules/ui/fields/wikidata.js function uiFieldWikidata(field, context) { var wikidata = services.wikidata; - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var _selection = select_default2(null); var _searchInput = select_default2(null); var _qid = null; @@ -60069,9 +65015,9 @@ ${content} }).on("blur", function() { setLabelForEntity(); }).call(combobox.fetcher(fetchWikidataItems)); - combobox.on("accept", function(d) { - if (d) { - _qid = d.id; + combobox.on("accept", function(d2) { + if (d2) { + _qid = d2.id; change(); } }).on("cancel", function() { @@ -60086,11 +65032,11 @@ ${content} _searchInput = searchRow.select("input"); var wikidataProperties = ["description", "identifier"]; var items = list.selectAll("li.labeled-input").data(wikidataProperties); - var enter = items.enter().append("li").attr("class", function(d) { - return "labeled-input preset-wikidata-" + d; + var enter = items.enter().append("li").attr("class", function(d2) { + return "labeled-input preset-wikidata-" + d2; }); - enter.append("span").attr("class", "label").html(function(d) { - return _t.html("wikidata." + d); + enter.append("span").attr("class", "label").html(function(d2) { + return _t.html("wikidata." + d2); }); enter.append("input").attr("type", "text").call(utilNoAuto).classed("disabled", "true").attr("readonly", "true"); enter.append("button").attr("class", "form-field-button").attr("title", _t("icons.copy")).call(svgIcon("#iD-operation-copy")).on("click", function(d3_event) { @@ -60099,19 +65045,22 @@ ${content} document.execCommand("copy"); }); } - function fetchWikidataItems(q, callback) { - if (!q && _hintKey) { - for (var i2 in _entityIDs) { - var entity = context.hasEntity(_entityIDs[i2]); + function fetchWikidataItems(q2, callback) { + if (!q2 && _hintKey) { + for (var i3 in _entityIDs) { + var entity = context.hasEntity(_entityIDs[i3]); if (entity.tags[_hintKey]) { - q = entity.tags[_hintKey]; + q2 = entity.tags[_hintKey]; break; } } } - wikidata.itemsForSearchQuery(q, function(err, data) { - if (err) + wikidata.itemsForSearchQuery(q2, function(err, data) { + if (err) { + if (err !== "No query") + console.error(err); return; + } var result = data.map(function(item) { return { id: item.id, @@ -60128,7 +65077,7 @@ ${content} function change() { var syncTags = {}; syncTags[field.key] = _qid; - dispatch10.call("change", this, syncTags); + dispatch14.call("change", this, syncTags); var initGraph = context.graph(); var initEntityIDs = _entityIDs; wikidata.entityByQID(_qid, function(err, entity) { @@ -60153,8 +65102,8 @@ ${content} var newWikipediaValue; if (_wikipediaKey) { var foundPreferred; - for (var i2 in langs) { - var lang = langs[i2]; + for (var i3 in langs) { + var lang = langs[i3]; var siteID = lang.replace("-", "_") + "wiki"; if (entity.sitelinks[siteID]) { foundPreferred = true; @@ -60263,8 +65212,8 @@ ${content} if (langKeys.length === 0) return ""; var langs = wikidata.languagesToQuery(); - for (var i2 in langs) { - var lang = langs[i2]; + for (var i3 in langs) { + var lang = langs[i3]; var valueObj = propObj[lang]; if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value; @@ -60280,12 +65229,12 @@ ${content} wiki.focus = function() { _searchInput.node().focus(); }; - return utilRebind(wiki, dispatch10, "on"); + return utilRebind(wiki, dispatch14, "on"); } // modules/ui/fields/wikipedia.js function uiFieldWikipedia(field, context) { - const dispatch10 = dispatch_default("change"); + const dispatch14 = dispatch_default("change"); const wikipedia = services.wikipedia; const wikidata = services.wikidata; let _langInput = select_default2(null); @@ -60294,25 +65243,25 @@ ${content} let _entityIDs; let _tags; let _dataWikipedia = []; - _mainFileFetcher.get("wmf_sitematrix").then((d) => { - _dataWikipedia = d; + _mainFileFetcher.get("wmf_sitematrix").then((d2) => { + _dataWikipedia = d2; if (_tags) updateForTags(_tags); }).catch(() => { }); const langCombo = uiCombobox(context, "wikipedia-lang").fetcher((value, callback) => { - const v = value.toLowerCase(); + const v2 = value.toLowerCase(); callback( - _dataWikipedia.filter((d) => { - return d[0].toLowerCase().indexOf(v) >= 0 || d[1].toLowerCase().indexOf(v) >= 0 || d[2].toLowerCase().indexOf(v) >= 0; - }).map((d) => ({ value: d[1] })) + _dataWikipedia.filter((d2) => { + return d2[0].toLowerCase().indexOf(v2) >= 0 || d2[1].toLowerCase().indexOf(v2) >= 0 || d2[2].toLowerCase().indexOf(v2) >= 0; + }).map((d2) => ({ value: d2[1] })) ); }); const titleCombo = uiCombobox(context, "wikipedia-title").fetcher((value, callback) => { if (!value) { value = ""; - for (let i2 in _entityIDs) { - let entity = context.hasEntity(_entityIDs[i2]); + for (let i3 in _entityIDs) { + let entity = context.hasEntity(_entityIDs[i3]); if (entity.tags.name) { value = entity.tags.name; break; @@ -60321,7 +65270,7 @@ ${content} } const searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions; searchfn(language()[2], value, (query, data) => { - callback(data.map((d) => ({ value: d }))); + callback(data.map((d2) => ({ value: d2 }))); }); }); function wiki(selection2) { @@ -60351,19 +65300,19 @@ ${content} } function defaultLanguageInfo(skipEnglishFallback) { const langCode = _mainLocalizer.languageCode().toLowerCase(); - for (let i2 in _dataWikipedia) { - let d = _dataWikipedia[i2]; - if (d[2] === langCode) - return d; + for (let i3 in _dataWikipedia) { + let d2 = _dataWikipedia[i3]; + if (d2[2] === langCode) + return d2; } return skipEnglishFallback ? ["", "", ""] : ["English", "English", "en"]; } function language(skipEnglishFallback) { const value = utilGetSetValue(_langInput).toLowerCase(); - for (let i2 in _dataWikipedia) { - let d = _dataWikipedia[i2]; - if (d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value) - return d; + for (let i3 in _dataWikipedia) { + let d2 = _dataWikipedia[i3]; + if (d2[0].toLowerCase() === value || d2[1].toLowerCase() === value || d2[2] === value) + return d2; } return defaultLanguageInfo(skipEnglishFallback); } @@ -60373,15 +65322,15 @@ ${content} } function change(skipWikidata) { let value = utilGetSetValue(_titleInput); - const m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/); - const langInfo = m && _dataWikipedia.find((d) => m[1] === d[2]); + const m2 = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/); + const langInfo = m2 && _dataWikipedia.find((d2) => m2[1] === d2[2]); let syncTags = {}; if (langInfo) { const nativeLangName = langInfo[1]; - value = decodeURIComponent(m[2]).replace(/_/g, " "); - if (m[3]) { + value = decodeURIComponent(m2[2]).replace(/_/g, " "); + if (m2[3]) { let anchor; - anchor = decodeURIComponent(m[3]); + anchor = decodeURIComponent(m2[3]); value += "#" + anchor.replace(/_/g, " "); } value = value.slice(0, 1).toUpperCase() + value.slice(1); @@ -60393,7 +65342,7 @@ ${content} } else { syncTags.wikipedia = void 0; } - dispatch10.call("change", this, syncTags); + dispatch14.call("change", this, syncTags); if (skipWikidata || !value || !language()[2]) return; const initGraph = context.graph(); @@ -60433,11 +65382,11 @@ ${content} }; function updateForTags(tags) { const value = typeof tags[field.key] === "string" ? tags[field.key] : ""; - const m = value.match(/([^:]+):([^#]+)(?:#(.+))?/); - const tagLang = m && m[1]; - const tagArticleTitle = m && m[2]; - let anchor = m && m[3]; - const tagLangInfo = tagLang && _dataWikipedia.find((d) => tagLang === d[2]); + const m2 = value.match(/([^:]+):([^#]+)(?:#(.+))?/); + const tagLang = m2 && m2[1]; + const tagArticleTitle = m2 && m2[2]; + let anchor = m2 && m2[3]; + const tagLangInfo = tagLang && _dataWikipedia.find((d2) => tagLang === d2[2]); if (tagLangInfo) { const nativeLangName = tagLangInfo[1]; utilGetSetValue(_langInput, nativeLangName); @@ -60445,7 +65394,7 @@ ${content} if (anchor) { try { anchor = encodeURIComponent(anchor.replace(/ /g, "_")).replace(/%/g, "."); - } catch (e) { + } catch (e3) { anchor = anchor.replace(/ /g, "_"); } } @@ -60457,7 +65406,10 @@ ${content} const defaultLangInfo = defaultLanguageInfo(); _wikiURL = `https://${defaultLangInfo[2]}.wikipedia.org/w/index.php?fulltext=1&search=${value}`; } else { - const shownOrDefaultLangInfo = language(true); + const shownOrDefaultLangInfo = language( + true + /* skipEnglishFallback */ + ); utilGetSetValue(_langInput, shownOrDefaultLangInfo[1]); _wikiURL = ""; } @@ -60472,7 +65424,7 @@ ${content} wiki.focus = () => { _titleInput.node().focus(); }; - return utilRebind(wiki, dispatch10, "on"); + return utilRebind(wiki, dispatch14, "on"); } uiFieldWikipedia.supportsMultiselection = false; @@ -60481,9 +65433,12 @@ ${content} access: uiFieldAccess, address: uiFieldAddress, check: uiFieldCheck, + colour: uiFieldText, combo: uiFieldCombo, - cycleway: uiFieldCycleway, + cycleway: uiFieldDirectionalCombo, + date: uiFieldText, defaultCheck: uiFieldCheck, + directionalCombo: uiFieldDirectionalCombo, email: uiFieldText, identifier: uiFieldText, lanes: uiFieldLanes, @@ -60517,7 +65472,7 @@ ${content} revert: true, info: true }, options2); - var dispatch10 = dispatch_default("change", "revert"); + var dispatch14 = dispatch_default("change", "revert"); var field = Object.assign({}, presetField2); field.domId = utilUniqueDomId("form-field-" + field.safeid); var _show = options2.show; @@ -60532,13 +65487,12 @@ ${content} } var _locked = false; var _lockedTip = uiTooltip().title(() => _t.append("inspector.lock.suggestion", { label: field.title })).placement("bottom"); - field.keys = field.keys || [field.key]; if (_show && !field.impl) { createField(); } function createField() { - field.impl = uiFields[field.type](field, context).on("change", function(t, onInput) { - dispatch10.call("change", field, t, onInput); + field.impl = uiFields[field.type](field, context).on("change", function(t2, onInput) { + dispatch14.call("change", field, t2, onInput); }); if (entityIDs) { field.entityIDs = entityIDs; @@ -60547,19 +65501,26 @@ ${content} } } } + function allKeys() { + let keys2 = field.keys || [field.key]; + if (field.type === "directionalCombo" && field.key) { + keys2 = keys2.concat(field.key); + } + return keys2; + } function isModified() { if (!entityIDs || !entityIDs.length) return false; return entityIDs.some(function(entityID) { var original = context.graph().base().entities[entityID]; var latest = context.graph().entity(entityID); - return field.keys.some(function(key) { + return allKeys().some(function(key) { return original ? latest.tags[key] !== original.tags[key] : latest.tags[key]; }); }); } function tagsContainFieldKey() { - return field.keys.some(function(key) { + return allKeys().some(function(key) { if (field.type === "multiCombo") { for (var tagKey in _tags) { if (tagKey.indexOf(key) === 0) { @@ -60571,36 +65532,36 @@ ${content} return _tags[key] !== void 0; }); } - function revert(d3_event, d) { + function revert(d3_event, d2) { d3_event.stopPropagation(); d3_event.preventDefault(); if (!entityIDs || _locked) return; - dispatch10.call("revert", d, d.keys); + dispatch14.call("revert", d2, allKeys()); } - function remove2(d3_event, d) { + function remove2(d3_event, d2) { d3_event.stopPropagation(); d3_event.preventDefault(); if (_locked) return; - var t = {}; - d.keys.forEach(function(key) { - t[key] = void 0; + var t2 = {}; + allKeys().forEach(function(key) { + t2[key] = void 0; }); - dispatch10.call("change", d, t); + dispatch14.call("change", d2, t2); } field.render = function(selection2) { var container = selection2.selectAll(".form-field").data([field]); - var enter = container.enter().append("div").attr("class", function(d) { - return "form-field form-field-" + d.safeid; + var enter = container.enter().append("div").attr("class", function(d2) { + return "form-field form-field-" + d2.safeid; }).classed("nowrap", !options2.wrap); if (options2.wrap) { - var labelEnter = enter.append("label").attr("class", "field-label").attr("for", function(d) { - return d.domId; + var labelEnter = enter.append("label").attr("class", "field-label").attr("for", function(d2) { + return d2.domId; }); var textEnter = labelEnter.append("span").attr("class", "label-text"); - textEnter.append("span").attr("class", "label-textvalue").each(function(d) { - d.label()(select_default2(this)); + textEnter.append("span").attr("class", "label-textvalue").each(function(d2) { + d2.label()(select_default2(this)); }); textEnter.append("span").attr("class", "label-textannotation"); if (options2.remove) { @@ -60613,9 +65574,9 @@ ${content} container = container.merge(enter); container.select(".field-label > .remove-icon").on("click", remove2); container.select(".field-label > .modified-icon").on("click", revert); - container.each(function(d) { + container.each(function(d2) { var selection3 = select_default2(this); - if (!d.impl) { + if (!d2.impl) { createField(); } var reference, help; @@ -60623,23 +65584,27 @@ ${content} help = uiFieldHelp(context, "restrictions"); } if (options2.wrap && options2.info) { - var referenceKey = d.key || ""; - if (d.type === "multiCombo") { + var referenceKey = d2.key || ""; + if (d2.type === "multiCombo") { referenceKey = referenceKey.replace(/:$/, ""); } - reference = uiTagReference(d.reference || { key: referenceKey }, context); + var referenceOptions = d2.reference || { + key: referenceKey, + value: _tags[referenceKey] + }; + reference = uiTagReference(referenceOptions, context); if (_state === "hover") { reference.showing(false); } } - selection3.call(d.impl); + selection3.call(d2.impl); if (help) { selection3.call(help.body).select(".field-label").call(help.button); } if (reference) { selection3.call(reference.body).select(".field-label").call(reference.button); } - d.impl.tags(_tags); + d2.impl.tags(_tags); }); container.classed("locked", _locked).classed("modified", isModified()).classed("present", tagsContainFieldKey()); var annotation = container.selectAll(".field-label .label-textannotation"); @@ -60678,9 +65643,9 @@ ${content} createField(); } if (field.default && field.key && _tags[field.key] !== field.default) { - var t = {}; - t[field.key] = field.default; - dispatch10.call("change", this, t); + var t2 = {}; + t2[field.key] = field.default; + dispatch14.call("change", this, t2); } }; field.isShown = function() { @@ -60694,12 +65659,13 @@ ${content} })) return false; if (entityIDs && _entityExtent && field.locationSetID) { - var validLocations = _mainLocations.locationsAt(_entityExtent.center()); - if (!validLocations[field.locationSetID]) + var validHere = _sharedLocationManager.locationSetsAt(_entityExtent.center()); + if (!validHere[field.locationSetID]) return false; } var prerequisiteTag = field.prerequisiteTag; - if (entityIDs && !tagsContainFieldKey() && prerequisiteTag) { + if (entityIDs && !tagsContainFieldKey() && // ignore tagging prerequisites if a value is already present + prerequisiteTag) { if (!entityIDs.every(function(entityID) { var entity = context.graph().entity(entityID); if (prerequisiteTag.key) { @@ -60727,7 +65693,7 @@ ${content} field.impl.focus(); } }; - return utilRebind(field, dispatch10, "on"); + return utilRebind(field, dispatch14, "on"); } // modules/ui/form_fields.js @@ -60749,16 +65715,16 @@ ${content} }); var container = selection2.selectAll(".form-fields-container").data([0]); container = container.enter().append("div").attr("class", "form-fields-container " + (_klass || "")).merge(container); - var fields = container.selectAll(".wrap-form-field").data(shown, function(d) { - return d.id + (d.entityIDs ? d.entityIDs.join() : ""); + var fields = container.selectAll(".wrap-form-field").data(shown, function(d2) { + return d2.id + (d2.entityIDs ? d2.entityIDs.join() : ""); }); fields.exit().remove(); - var enter = fields.enter().append("div").attr("class", function(d) { - return "wrap-form-field wrap-form-field-" + d.safeid; + var enter = fields.enter().append("div").attr("class", function(d2) { + return "wrap-form-field wrap-form-field-" + d2.safeid; }); fields = fields.merge(enter); - fields.order().each(function(d) { - select_default2(this).call(d.render); + fields.order().each(function(d2) { + select_default2(this).call(d2.render); }); var titles = []; var moreFields = notShown.map(function(field) { @@ -60787,10 +65753,10 @@ ${content} input.exit().remove(); input = input.enter().append("input").attr("class", "value").attr("type", "text").attr("placeholder", placeholder).call(utilNoAuto).merge(input); input.call(utilGetSetValue, "").call( - moreCombo.data(moreFields).on("accept", function(d) { - if (!d) + moreCombo.data(moreFields).on("accept", function(d2) { + if (!d2) return; - var field = d.field; + var field = d2.field; field.show(); selection2.call(formFields); field.focus(); @@ -60824,7 +65790,7 @@ ${content} // modules/ui/changeset_editor.js function uiChangesetEditor(context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var formFields = uiFormFields(context); var commentCombo = uiCombobox(context, "comment").caseSensitive(true); var _fieldsArr; @@ -60844,8 +65810,8 @@ ${content} uiField(context, presets.field("hashtags"), null, { show: false, revert: false }) ]; _fieldsArr.forEach(function(field) { - field.on("change", function(t, onInput) { - dispatch10.call("change", field, void 0, t, onInput); + field.on("change", function(t2, onInput) { + dispatch14.call("change", field, void 0, t2, onInput); }); }); } @@ -60876,29 +65842,51 @@ ${content} }); } } - var hasGoogle = _tags.comment.match(/google/i); - var commentWarning = selection2.select(".form-field-comment").selectAll(".comment-warning").data(hasGoogle ? [0] : []); + const warnings = []; + if (_tags.comment.match(/google/i)) { + warnings.push({ + id: 'contains "google"', + msg: _t.append("commit.google_warning"), + link: _t("commit.google_warning_link") + }); + } + const maxChars = context.maxCharsForTagValue(); + const strLen = utilUnicodeCharsCount(utilCleanOsmString(_tags.comment, Number.POSITIVE_INFINITY)); + if (strLen > maxChars || false) { + warnings.push({ + id: "message too long", + msg: _t.append("commit.changeset_comment_length_warning", { maxChars }) + }); + } + var commentWarning = selection2.select(".form-field-comment").selectAll(".comment-warning").data(warnings, (d2) => d2.id); commentWarning.exit().transition().duration(200).style("opacity", 0).remove(); - var commentEnter = commentWarning.enter().insert("div", ".tag-reference-body").attr("class", "field-warning comment-warning").style("opacity", 0); - commentEnter.append("a").attr("target", "_blank").call(svgIcon("#iD-icon-alert", "inline")).attr("href", _t("commit.google_warning_link")).append("span").call(_t.append("commit.google_warning")); + var commentEnter = commentWarning.enter().insert("div", ".comment-warning").attr("class", "comment-warning field-warning").style("opacity", 0); + commentEnter.call(svgIcon("#iD-icon-alert", "inline")).append("span"); commentEnter.transition().duration(200).style("opacity", 1); + commentWarning.merge(commentEnter).selectAll("div > span").text("").each(function(d2) { + let selection3 = select_default2(this); + if (d2.link) { + selection3 = selection3.append("a").attr("target", "_blank").attr("href", d2.link); + } + selection3.call(d2.msg); + }); } - changesetEditor.tags = function(_) { + changesetEditor.tags = function(_2) { if (!arguments.length) return _tags; - _tags = _; + _tags = _2; return changesetEditor; }; - changesetEditor.changesetID = function(_) { + changesetEditor.changesetID = function(_2) { if (!arguments.length) return _changesetID; - if (_changesetID === _) + if (_changesetID === _2) return changesetEditor; - _changesetID = _; + _changesetID = _2; _fieldsArr = null; return changesetEditor; }; - return utilRebind(changesetEditor, dispatch10, "on"); + return utilRebind(changesetEditor, dispatch14, "on"); } // modules/ui/commit.js @@ -60935,7 +65923,10 @@ ${content} } function createObjTree(oParentNode, nVerb, bFreeze, bNesteAttr) { var nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2); - var sProp, vContent, nLength = 0, sCollectedTxt = "", vResult = bHighVerb ? {} : true; + var sProp, vContent, nLength = 0, sCollectedTxt = "", vResult = bHighVerb ? {} : ( + /* put here the default value for empty nodes: */ + true + ); if (bChildren) { for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) { oNode = oParentNode.childNodes.item(nItem); @@ -61030,7 +66021,10 @@ ${content} } } this.build = function(oXMLParent, nVerbosity, bFreeze, bNesteAttributes) { - var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : 1; + var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : ( + /* put here the default verbosity level: */ + 1 + ); return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3); }; this.unbuild = function(oObjTree) { @@ -61046,8 +66040,8 @@ ${content} // modules/ui/sections/changes.js function uiSectionChanges(context) { var _discardTags = {}; - _mainFileFetcher.get("discarded").then(function(d) { - _discardTags = d; + _mainFileFetcher.get("discarded").then(function(d2) { + _discardTags = d2; }).catch(function() { }); var section = uiSection("changes-list", context).label(function() { @@ -61065,18 +66059,18 @@ ${content} var items = container.select("ul").selectAll("li").data(summary); var itemsEnter = items.enter().append("li").attr("class", "change-item"); var buttons = itemsEnter.append("button").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click); - buttons.each(function(d) { - select_default2(this).call(svgIcon("#iD-icon-" + d.entity.geometry(d.graph), "pre-text " + d.changeType)); + buttons.each(function(d2) { + select_default2(this).call(svgIcon("#iD-icon-" + d2.entity.geometry(d2.graph), "pre-text " + d2.changeType)); }); - buttons.append("span").attr("class", "change-type").html(function(d) { - return _t.html("commit." + d.changeType) + " "; + buttons.append("span").attr("class", "change-type").html(function(d2) { + return _t.html("commit." + d2.changeType) + " "; }); - buttons.append("strong").attr("class", "entity-type").text(function(d) { - var matched = _mainPresetIndex.match(d.entity, d.graph); - return matched && matched.name() || utilDisplayType(d.entity.id); + buttons.append("strong").attr("class", "entity-type").text(function(d2) { + var matched = _mainPresetIndex.match(d2.entity, d2.graph); + return matched && matched.name() || utilDisplayType(d2.entity.id); }); - buttons.append("span").attr("class", "entity-name").text(function(d) { - var name = utilDisplayName(d.entity) || "", string = ""; + buttons.append("span").attr("class", "entity-name").text(function(d2) { + var name = utilDisplayName(d2.entity) || "", string = ""; if (name !== "") { string += ":"; } @@ -61092,10 +66086,10 @@ ${content} var linkEnter = container.selectAll(".download-changes").data([0]).enter().append("a").attr("class", "download-changes"); linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName); linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("commit.download_changes")); - function mouseover(d) { - if (d.entity) { + function mouseover(d2) { + if (d2.entity) { context.surface().selectAll( - utilEntityOrMemberSelector([d.entity.id], context.graph()) + utilEntityOrMemberSelector([d2.entity.id], context.graph()) ).classed("hover", true); } } @@ -61132,37 +66126,37 @@ ${content} containerEnter.append("h3").call(severity === "warning" ? _t.append("commit.warnings") : _t.append("commit.errors")); containerEnter.append("ul").attr("class", "changeset-list"); container = containerEnter.merge(container); - var items = container.select("ul").selectAll("li").data(issues, function(d) { - return d.key; + var items = container.select("ul").selectAll("li").data(issues, function(d2) { + return d2.key; }); items.exit().remove(); var itemsEnter = items.enter().append("li").attr("class", issueItem); - var buttons = itemsEnter.append("button").on("mouseover", function(d3_event, d) { - if (d.entityIds) { + var buttons = itemsEnter.append("button").on("mouseover", function(d3_event, d2) { + if (d2.entityIds) { context.surface().selectAll( utilEntityOrMemberSelector( - d.entityIds, + d2.entityIds, context.graph() ) ).classed("hover", true); } }).on("mouseout", function() { context.surface().selectAll(".hover").classed("hover", false); - }).on("click", function(d3_event, d) { - context.validator().focusIssue(d); + }).on("click", function(d3_event, d2) { + context.validator().focusIssue(d2); }); buttons.call(svgIcon("#iD-icon-alert", "pre-text")); buttons.append("strong").attr("class", "issue-message"); - buttons.filter(function(d) { - return d.tooltip; + buttons.filter(function(d2) { + return d2.tooltip; }).call( - uiTooltip().title(function(d) { - return d.tooltip; + uiTooltip().title(function(d2) { + return d2.tooltip; }).placement("top") ); items = itemsEnter.merge(items); - items.selectAll(".issue-message").text("").each(function(d) { - return d.message(context)(select_default2(this)); + items.selectAll(".issue-message").text("").each(function(d2) { + return d2.message(context)(select_default2(this)); }); } } @@ -61186,7 +66180,7 @@ ${content} ]; var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g; function uiCommit(context) { - var dispatch10 = dispatch_default("cancel"); + var dispatch14 = dispatch_default("cancel"); var _userDetails2; var _selection; var changesetEditor = uiChangesetEditor(context).on("change", changeTags); @@ -61318,7 +66312,7 @@ ${content} var headerTitle = header.enter().append("div").attr("class", "header fillL"); headerTitle.append("div").append("h2").call(_t.append("commit.title")); headerTitle.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() { - dispatch10.call("cancel", this); + dispatch14.call("cancel", this); }).call(svgIcon("#iD-icon-close")); var body = selection2.selectAll(".body").data([0]); body = body.enter().append("div").attr("class", "body").merge(body); @@ -61367,7 +66361,7 @@ ${content} var uploadBlockerTooltipText = getUploadBlockerMessage(); buttonSection = buttonSection.merge(buttonEnter); buttonSection.selectAll(".cancel-button").on("click.cancel", function() { - dispatch10.call("cancel", this); + dispatch14.call("cancel", this); }); buttonSection.selectAll(".save-button").classed("disabled", uploadBlockerTooltipText !== null).on("click.save", function() { if (!select_default2(this).classed("disabled")) { @@ -61411,7 +66405,7 @@ ${content} } return null; } - function changeTags(_, changed, onInput) { + function changeTags(_2, changed, onInput) { if (changed.hasOwnProperty("comment")) { if (changed.comment === void 0) { changed.comment = ""; @@ -61456,11 +66450,11 @@ ${content} return matches || []; } function hashtagHashtags() { - var matches = (tags.hashtags || "").split(/[,;\s]+/).map(function(s) { - if (s[0] !== "#") { - s = "#" + s; + var matches = (tags.hashtags || "").split(/[,;\s]+/).map(function(s2) { + if (s2[0] !== "#") { + s2 = "#" + s2; } - var matched = s.match(hashtagRegex); + var matched = s2.match(hashtagRegex); return matched && matched[0]; }).filter(Boolean); return matches || []; @@ -61475,17 +66469,17 @@ ${content} } function updateChangeset(changed, onInput) { var tags = Object.assign({}, context.changeset.tags); - Object.keys(changed).forEach(function(k) { - var v = changed[k]; - k = context.cleanTagKey(k); - if (readOnlyTags.indexOf(k) !== -1) + Object.keys(changed).forEach(function(k2) { + var v2 = changed[k2]; + k2 = context.cleanTagKey(k2); + if (readOnlyTags.indexOf(k2) !== -1) return; - if (v === void 0) { - delete tags[k]; + if (v2 === void 0) { + delete tags[k2]; } else if (onInput) { - tags[k] = v; + tags[k2] = v2; } else { - tags[k] = context.cleanTagValue(v); + tags[k2] = context.cleanTagValue(v2); } }); if (!onInput) { @@ -61503,18 +66497,18 @@ ${content} var changesetsCount = parseInt(_userDetails2.changesets_count, 10) + 1; tags.changesets_count = String(changesetsCount); if (changesetsCount <= 100) { - var s; - s = corePreferences("walkthrough_completed"); - if (s) { - tags["ideditor:walkthrough_completed"] = s; + var s2; + s2 = corePreferences("walkthrough_completed"); + if (s2) { + tags["ideditor:walkthrough_completed"] = s2; } - s = corePreferences("walkthrough_progress"); - if (s) { - tags["ideditor:walkthrough_progress"] = s; + s2 = corePreferences("walkthrough_progress"); + if (s2) { + tags["ideditor:walkthrough_progress"] = s2; } - s = corePreferences("walkthrough_started"); - if (s) { - tags["ideditor:walkthrough_started"] = s; + s2 = corePreferences("walkthrough_started"); + if (s2) { + tags["ideditor:walkthrough_started"] = s2; } } } else { @@ -61527,7 +66521,7 @@ ${content} commit.reset = function() { context.changeset = null; }; - return utilRebind(commit, dispatch10, "on"); + return utilRebind(commit, dispatch14, "on"); } // modules/ui/confirm.js @@ -61549,7 +66543,7 @@ ${content} // modules/ui/conflicts.js function uiConflicts(context) { - var dispatch10 = dispatch_default("cancel", "save"); + var dispatch14 = dispatch_default("cancel", "save"); var keybinding = utilKeybinding("conflicts"); var _origChanges; var _conflictList; @@ -61562,11 +66556,11 @@ ${content} } function tryAgain() { keybindingOff(); - dispatch10.call("save"); + dispatch14.call("save"); } function cancel() { keybindingOff(); - dispatch10.call("cancel"); + dispatch14.call("cancel"); } function conflicts(selection2) { keybindingOn(); @@ -61603,61 +66597,61 @@ ${content} conflict.exit().remove(); var conflictEnter = conflict.enter().append("div").attr("class", "conflict"); conflictEnter.append("h4").attr("class", "conflict-count").call(_t.append("save.conflict.count", { num: index + 1, total: _conflictList.length })); - conflictEnter.append("a").attr("class", "conflict-description").attr("href", "#").text(function(d) { - return d.name; - }).on("click", function(d3_event, d) { + conflictEnter.append("a").attr("class", "conflict-description").attr("href", "#").text(function(d2) { + return d2.name; + }).on("click", function(d3_event, d2) { d3_event.preventDefault(); - zoomToEntity(d.id); + zoomToEntity(d2.id); }); var details = conflictEnter.append("div").attr("class", "conflict-detail-container"); - details.append("ul").attr("class", "conflict-detail-list").selectAll("li").data(function(d) { - return d.details || []; - }).enter().append("li").attr("class", "conflict-detail-item").html(function(d) { - return d; + details.append("ul").attr("class", "conflict-detail-list").selectAll("li").data(function(d2) { + return d2.details || []; + }).enter().append("li").attr("class", "conflict-detail-item").html(function(d2) { + return d2; }); details.append("div").attr("class", "conflict-choices").call(addChoices); - details.append("div").attr("class", "conflict-nav-buttons joined cf").selectAll("button").data(["previous", "next"]).enter().append("button").attr("class", "conflict-nav-button action col6").attr("disabled", function(d, i2) { - return i2 === 0 && index === 0 || i2 === 1 && index === _conflictList.length - 1 || null; - }).on("click", function(d3_event, d) { + details.append("div").attr("class", "conflict-nav-buttons joined cf").selectAll("button").data(["previous", "next"]).enter().append("button").attr("class", "conflict-nav-button action col6").attr("disabled", function(d2, i3) { + return i3 === 0 && index === 0 || i3 === 1 && index === _conflictList.length - 1 || null; + }).on("click", function(d3_event, d2) { d3_event.preventDefault(); var container = parent.selectAll(".conflict-container"); - var sign2 = d === "previous" ? -1 : 1; + var sign2 = d2 === "previous" ? -1 : 1; container.selectAll(".conflict").remove(); container.call(showConflict, index + sign2); - }).call(function(d) { - _t.append("save.conflict." + d)(select_default2(this)); + }).each(function(d2) { + _t.append("save.conflict." + d2)(select_default2(this)); }); } function addChoices(selection2) { - var choices = selection2.append("ul").attr("class", "layer-list").selectAll("li").data(function(d) { - return d.choices || []; + var choices = selection2.append("ul").attr("class", "layer-list").selectAll("li").data(function(d2) { + return d2.choices || []; }); var choicesEnter = choices.enter().append("li").attr("class", "layer"); var labelEnter = choicesEnter.append("label"); - labelEnter.append("input").attr("type", "radio").attr("name", function(d) { - return d.id; - }).on("change", function(d3_event, d) { + labelEnter.append("input").attr("type", "radio").attr("name", function(d2) { + return d2.id; + }).on("change", function(d3_event, d2) { var ul = this.parentNode.parentNode.parentNode; - ul.__data__.chosen = d.id; - choose(d3_event, ul, d); + ul.__data__.chosen = d2.id; + choose(d3_event, ul, d2); }); - labelEnter.append("span").text(function(d) { - return d.text; + labelEnter.append("span").text(function(d2) { + return d2.text; }); - choicesEnter.merge(choices).each(function(d) { + choicesEnter.merge(choices).each(function(d2) { var ul = this.parentNode; - if (ul.__data__.chosen === d.id) { - choose(null, ul, d); + if (ul.__data__.chosen === d2.id) { + choose(null, ul, d2); } }); } function choose(d3_event, ul, datum2) { if (d3_event) d3_event.preventDefault(); - select_default2(ul).selectAll("li").classed("active", function(d) { - return d === datum2; - }).selectAll("input").property("checked", function(d) { - return d === datum2; + select_default2(ul).selectAll("li").classed("active", function(d2) { + return d2 === datum2; + }).selectAll("input").property("checked", function(d2) { + return d2 === datum2; }); var extent = geoExtent(); var entity; @@ -61682,16 +66676,16 @@ ${content} context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true); } } - conflicts.conflictList = function(_) { + conflicts.conflictList = function(_2) { if (!arguments.length) return _conflictList; - _conflictList = _; + _conflictList = _2; return conflicts; }; - conflicts.origChanges = function(_) { + conflicts.origChanges = function(_2) { if (!arguments.length) return _origChanges; - _origChanges = _; + _origChanges = _2; return conflicts; }; conflicts.shownEntityIds = function() { @@ -61700,7 +66694,7 @@ ${content} } return []; }; - return utilRebind(conflicts, dispatch10, "on"); + return utilRebind(conflicts, dispatch14, "on"); } // modules/ui/entity_editor.js @@ -61729,42 +66723,42 @@ ${content} } function makeActiveIssue(issueID) { _activeIssueID = issueID; - section.selection().selectAll(".issue-container").classed("active", function(d) { - return d.id === _activeIssueID; + section.selection().selectAll(".issue-container").classed("active", function(d2) { + return d2.id === _activeIssueID; }); } function renderDisclosureContent(selection2) { selection2.classed("grouped-items-area", true); _activeIssueID = _issues.length > 0 ? _issues[0].id : null; - var containers = selection2.selectAll(".issue-container").data(_issues, function(d) { - return d.key; + var containers = selection2.selectAll(".issue-container").data(_issues, function(d2) { + return d2.key; }); containers.exit().remove(); var containersEnter = containers.enter().append("div").attr("class", "issue-container"); - var itemsEnter = containersEnter.append("div").attr("class", function(d) { - return "issue severity-" + d.severity; - }).on("mouseover.highlight", function(d3_event, d) { - var ids = d.entityIds.filter(function(e) { - return _entityIDs.indexOf(e) === -1; + var itemsEnter = containersEnter.append("div").attr("class", function(d2) { + return "issue severity-" + d2.severity; + }).on("mouseover.highlight", function(d3_event, d2) { + var ids = d2.entityIds.filter(function(e3) { + return _entityIDs.indexOf(e3) === -1; }); utilHighlightEntities(ids, true, context); - }).on("mouseout.highlight", function(d3_event, d) { - var ids = d.entityIds.filter(function(e) { - return _entityIDs.indexOf(e) === -1; + }).on("mouseout.highlight", function(d3_event, d2) { + var ids = d2.entityIds.filter(function(e3) { + return _entityIDs.indexOf(e3) === -1; }); utilHighlightEntities(ids, false, context); }); var labelsEnter = itemsEnter.append("div").attr("class", "issue-label"); - var textEnter = labelsEnter.append("button").attr("class", "issue-text").on("click", function(d3_event, d) { - makeActiveIssue(d.id); - var extent = d.extent(context.graph()); + var textEnter = labelsEnter.append("button").attr("class", "issue-text").on("click", function(d3_event, d2) { + makeActiveIssue(d2.id); + var extent = d2.extent(context.graph()); if (extent) { var setZoom = Math.max(context.map().zoom(), 19); context.map().unobscuredCenterZoomEase(extent.center(), setZoom); } }); - textEnter.each(function(d) { - var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error"); + textEnter.each(function(d2) { + var iconName = "#iD-icon-" + (d2.severity === "warning" ? "alert" : "error"); select_default2(this).call(svgIcon(iconName, "issue-icon")); }); textEnter.append("span").attr("class", "issue-message"); @@ -61789,64 +66783,64 @@ ${content} } }); itemsEnter.append("ul").attr("class", "issue-fix-list"); - containersEnter.append("div").attr("class", "issue-info" + (_expanded ? " expanded" : "")).style("max-height", _expanded ? null : "0").style("opacity", _expanded ? "1" : "0").each(function(d) { - if (typeof d.reference === "function") { - select_default2(this).call(d.reference); + containersEnter.append("div").attr("class", "issue-info" + (_expanded ? " expanded" : "")).style("max-height", _expanded ? null : "0").style("opacity", _expanded ? "1" : "0").each(function(d2) { + if (typeof d2.reference === "function") { + select_default2(this).call(d2.reference); } else { select_default2(this).call(_t.append("inspector.no_documentation_key")); } }); - containers = containers.merge(containersEnter).classed("active", function(d) { - return d.id === _activeIssueID; + containers = containers.merge(containersEnter).classed("active", function(d2) { + return d2.id === _activeIssueID; }); - containers.selectAll(".issue-message").text("").each(function(d) { - return d.message(context)(select_default2(this)); + containers.selectAll(".issue-message").text("").each(function(d2) { + return d2.message(context)(select_default2(this)); }); var fixLists = containers.selectAll(".issue-fix-list"); - var fixes = fixLists.selectAll(".issue-fix-item").data(function(d) { - return d.fixes ? d.fixes(context) : []; + var fixes = fixLists.selectAll(".issue-fix-item").data(function(d2) { + return d2.fixes ? d2.fixes(context) : []; }, function(fix) { return fix.id; }); fixes.exit().remove(); var fixesEnter = fixes.enter().append("li").attr("class", "issue-fix-item"); - var buttons = fixesEnter.append("button").on("click", function(d3_event, d) { - if (select_default2(this).attr("disabled") || !d.onClick) + var buttons = fixesEnter.append("button").on("click", function(d3_event, d2) { + if (select_default2(this).attr("disabled") || !d2.onClick) return; - if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1e3) + if (d2.issue.dateLastRanFix && /* @__PURE__ */ new Date() - d2.issue.dateLastRanFix < 1e3) return; - d.issue.dateLastRanFix = new Date(); - utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context); + d2.issue.dateLastRanFix = /* @__PURE__ */ new Date(); + utilHighlightEntities(d2.issue.entityIds.concat(d2.entityIds), false, context); new Promise(function(resolve, reject) { - d.onClick(context, resolve, reject); - if (d.onClick.length <= 1) { + d2.onClick(context, resolve, reject); + if (d2.onClick.length <= 1) { resolve(); } }).then(function() { context.validator().validate(); }); - }).on("mouseover.highlight", function(d3_event, d) { - utilHighlightEntities(d.entityIds, true, context); - }).on("mouseout.highlight", function(d3_event, d) { - utilHighlightEntities(d.entityIds, false, context); + }).on("mouseover.highlight", function(d3_event, d2) { + utilHighlightEntities(d2.entityIds, true, context); + }).on("mouseout.highlight", function(d3_event, d2) { + utilHighlightEntities(d2.entityIds, false, context); }); - buttons.each(function(d) { - var iconName = d.icon || "iD-icon-wrench"; + buttons.each(function(d2) { + var iconName = d2.icon || "iD-icon-wrench"; if (iconName.startsWith("maki")) { iconName += "-15"; } select_default2(this).call(svgIcon("#" + iconName, "fix-icon")); }); - buttons.append("span").attr("class", "fix-message").each(function(d) { - return d.title(select_default2(this)); + buttons.append("span").attr("class", "fix-message").each(function(d2) { + return d2.title(select_default2(this)); }); - fixesEnter.merge(fixes).selectAll("button").classed("actionable", function(d) { - return d.onClick; - }).attr("disabled", function(d) { - return d.onClick ? null : "true"; - }).attr("title", function(d) { - if (d.disabledReason) { - return d.disabledReason; + fixesEnter.merge(fixes).selectAll("button").classed("actionable", function(d2) { + return d2.onClick; + }).attr("disabled", function(d2) { + return d2.onClick ? null : "true"; + }).attr("title", function(d2) { + if (d2.disabledReason) { + return d2.disabledReason; } return null; }); @@ -61871,11 +66865,11 @@ ${content} function presetIcon(selection2) { selection2.each(render); } - function getIcon(p, geom) { - if (p.isFallback && p.isFallback()) - return geom === "vertex" ? "" : "iD-icon-" + p.id; - if (p.icon) - return p.icon; + function getIcon(p2, geom) { + if (p2.isFallback && p2.isFallback()) + return geom === "vertex" ? "" : "iD-icon-" + p2.id; + if (p2.icon) + return p2.icon; if (geom === "line") return "iD-other-line"; if (geom === "vertex") @@ -61886,17 +66880,17 @@ ${content} let pointBorder = container.selectAll(".preset-icon-point-border").data(drawPoint ? [0] : []); pointBorder.exit().remove(); let pointBorderEnter = pointBorder.enter(); - const w = 40; - const h = 40; - pointBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-point-border").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("path").attr("transform", "translate(11.5, 8)").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"); + const w2 = 40; + const h2 = 40; + pointBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-point-border").attr("width", w2).attr("height", h2).attr("viewBox", `0 0 ${w2} ${h2}`).append("path").attr("transform", "translate(11.5, 8)").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"); pointBorder = pointBorderEnter.merge(pointBorder); } function renderCategoryBorder(container, category) { let categoryBorder = container.selectAll(".preset-icon-category-border").data(category ? [0] : []); categoryBorder.exit().remove(); let categoryBorderEnter = categoryBorder.enter(); - const d = 60; - let svgEnter = categoryBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-category-border").attr("width", d).attr("height", d).attr("viewBox", `0 0 ${d} ${d}`); + const d2 = 60; + let svgEnter = categoryBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-category-border").attr("width", d2).attr("height", d2).attr("viewBox", `0 0 ${d2} ${d2}`); svgEnter.append("path").attr("class", "area").attr("d", "M9.5,7.5 L25.5,7.5 L28.5,12.5 L49.5,12.5 C51.709139,12.5 53.5,14.290861 53.5,16.5 L53.5,43.5 C53.5,45.709139 51.709139,47.5 49.5,47.5 L10.5,47.5 C8.290861,47.5 6.5,45.709139 6.5,43.5 L6.5,12.5 L9.5,7.5 Z"); categoryBorder = categoryBorderEnter.merge(categoryBorder); if (category) { @@ -61907,33 +66901,33 @@ ${content} let vertexFill = container.selectAll(".preset-icon-fill-vertex").data(drawVertex ? [0] : []); vertexFill.exit().remove(); let vertexFillEnter = vertexFill.enter(); - const w = 60; - const h = 60; - const d = 40; - vertexFillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-vertex").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("circle").attr("cx", w / 2).attr("cy", h / 2).attr("r", d / 2); + const w2 = 60; + const h2 = 60; + const d2 = 40; + vertexFillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-vertex").attr("width", w2).attr("height", h2).attr("viewBox", `0 0 ${w2} ${h2}`).append("circle").attr("cx", w2 / 2).attr("cy", h2 / 2).attr("r", d2 / 2); vertexFill = vertexFillEnter.merge(vertexFill); } function renderSquareFill(container, drawArea, tagClasses) { let fill = container.selectAll(".preset-icon-fill-area").data(drawArea ? [0] : []); fill.exit().remove(); let fillEnter = fill.enter(); - const d = 60; - const w = d; - const h = d; - const l = d * 2 / 3; - const c1 = (w - l) / 2; - const c2 = c1 + l; - fillEnter = fillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-area").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`); + const d2 = 60; + const w2 = d2; + const h2 = d2; + const l2 = d2 * 2 / 3; + const c1 = (w2 - l2) / 2; + const c2 = c1 + l2; + fillEnter = fillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-area").attr("width", w2).attr("height", h2).attr("viewBox", `0 0 ${w2} ${h2}`); ["fill", "stroke"].forEach((klass) => { fillEnter.append("path").attr("d", `M${c1} ${c1} L${c1} ${c2} L${c2} ${c2} L${c2} ${c1} Z`).attr("class", `area ${klass}`); }); const rVertex = 2.5; - [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach((point) => { - fillEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", rVertex); + [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach((point2) => { + fillEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rVertex); }); const rMidpoint = 1.25; - [[c1, w / 2], [c2, w / 2], [h / 2, c1], [h / 2, c2]].forEach((point) => { - fillEnter.append("circle").attr("class", "midpoint").attr("cx", point[0]).attr("cy", point[1]).attr("r", rMidpoint); + [[c1, w2 / 2], [c2, w2 / 2], [h2 / 2, c1], [h2 / 2, c2]].forEach((point2) => { + fillEnter.append("circle").attr("class", "midpoint").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rMidpoint); }); fill = fillEnter.merge(fill); fill.selectAll("path.stroke").attr("class", `area stroke ${tagClasses}`); @@ -61943,58 +66937,58 @@ ${content} let line = container.selectAll(".preset-icon-line").data(drawLine ? [0] : []); line.exit().remove(); let lineEnter = line.enter(); - const d = 60; - const w = d; - const h = d; - const y = Math.round(d * 0.72); - const l = Math.round(d * 0.6); - const r = 2.5; - const x12 = (w - l) / 2; - const x2 = x12 + l; - lineEnter = lineEnter.append("svg").attr("class", "preset-icon-line").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`); + const d2 = 60; + const w2 = d2; + const h2 = d2; + const y2 = Math.round(d2 * 0.72); + const l2 = Math.round(d2 * 0.6); + const r2 = 2.5; + const x12 = (w2 - l2) / 2; + const x2 = x12 + l2; + lineEnter = lineEnter.append("svg").attr("class", "preset-icon-line").attr("width", w2).attr("height", h2).attr("viewBox", `0 0 ${w2} ${h2}`); ["casing", "stroke"].forEach((klass) => { - lineEnter.append("path").attr("d", `M${x12} ${y} L${x2} ${y}`).attr("class", `line ${klass}`); + lineEnter.append("path").attr("d", `M${x12} ${y2} L${x2} ${y2}`).attr("class", `line ${klass}`); }); - [[x12 - 1, y], [x2 + 1, y]].forEach((point) => { - lineEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", r); + [[x12 - 1, y2], [x2 + 1, y2]].forEach((point2) => { + lineEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r2); }); line = lineEnter.merge(line); line.selectAll("path.stroke").attr("class", `line stroke ${tagClasses}`); line.selectAll("path.casing").attr("class", `line casing ${tagClasses}`); } - function renderRoute(container, drawRoute, p) { + function renderRoute(container, drawRoute, p2) { let route = container.selectAll(".preset-icon-route").data(drawRoute ? [0] : []); route.exit().remove(); let routeEnter = route.enter(); - const d = 60; - const w = d; - const h = d; - const y12 = Math.round(d * 0.8); - const y2 = Math.round(d * 0.68); - const l = Math.round(d * 0.6); - const r = 2; - const x12 = (w - l) / 2; - const x2 = x12 + l / 3; - const x3 = x2 + l / 3; - const x4 = x3 + l / 3; - routeEnter = routeEnter.append("svg").attr("class", "preset-icon-route").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`); + const d2 = 60; + const w2 = d2; + const h2 = d2; + const y12 = Math.round(d2 * 0.8); + const y2 = Math.round(d2 * 0.68); + const l2 = Math.round(d2 * 0.6); + const r2 = 2; + const x12 = (w2 - l2) / 2; + const x2 = x12 + l2 / 3; + const x3 = x2 + l2 / 3; + const x4 = x3 + l2 / 3; + routeEnter = routeEnter.append("svg").attr("class", "preset-icon-route").attr("width", w2).attr("height", h2).attr("viewBox", `0 0 ${w2} ${h2}`); ["casing", "stroke"].forEach((klass) => { routeEnter.append("path").attr("d", `M${x12} ${y12} L${x2} ${y2}`).attr("class", `segment0 line ${klass}`); routeEnter.append("path").attr("d", `M${x2} ${y2} L${x3} ${y12}`).attr("class", `segment1 line ${klass}`); routeEnter.append("path").attr("d", `M${x3} ${y12} L${x4} ${y2}`).attr("class", `segment2 line ${klass}`); }); - [[x12, y12], [x2, y2], [x3, y12], [x4, y2]].forEach((point) => { - routeEnter.append("circle").attr("class", "vertex").attr("cx", point[0]).attr("cy", point[1]).attr("r", r); + [[x12, y12], [x2, y2], [x3, y12], [x4, y2]].forEach((point2) => { + routeEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r2); }); route = routeEnter.merge(route); if (drawRoute) { - let routeType = p.tags.type === "waterway" ? "waterway" : p.tags.route; + let routeType = p2.tags.type === "waterway" ? "waterway" : p2.tags.route; const segmentPresetIDs = routeSegments[routeType]; - for (let i2 in segmentPresetIDs) { - const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i2]); + for (let i3 in segmentPresetIDs) { + const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i3]); const segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, ""); - route.selectAll(`path.stroke.segment${i2}`).attr("class", `segment${i2} line stroke ${segmentTagClasses}`); - route.selectAll(`path.casing.segment${i2}`).attr("class", `segment${i2} line casing ${segmentTagClasses}`); + route.selectAll(`path.stroke.segment${i3}`).attr("class", `segment${i3} line stroke ${segmentTagClasses}`); + route.selectAll(`path.casing.segment${i3}`).attr("class", `segment${i3} line casing ${segmentTagClasses}`); } } } @@ -62002,7 +66996,8 @@ ${content} const isMaki = picon && /^maki-/.test(picon); const isTemaki = picon && /^temaki-/.test(picon); const isFa = picon && /^fa[srb]-/.test(picon); - const isiDIcon = picon && !(isMaki || isTemaki || isFa); + const isR\u00F6ntgen = picon && /^roentgen-/.test(picon); + const isiDIcon = picon && !(isMaki || isTemaki || isFa || isR\u00F6ntgen); let icon2 = container.selectAll(".preset-icon").data(picon ? [0] : []); icon2.exit().remove(); icon2 = icon2.enter().append("div").attr("class", "preset-icon").call(svgIcon("")).merge(icon2); @@ -62038,26 +67033,26 @@ ${content} waterway: ["waterway/stream", "waterway/stream", "waterway/stream"] }; function render() { - let p = _preset.apply(this, arguments); + let p2 = _preset.apply(this, arguments); let geom = _geometry ? _geometry.apply(this, arguments) : null; - if (geom === "relation" && p.tags && (p.tags.type === "route" && p.tags.route && routeSegments[p.tags.route] || p.tags.type === "waterway")) { + if (geom === "relation" && p2.tags && (p2.tags.type === "route" && p2.tags.route && routeSegments[p2.tags.route] || p2.tags.type === "waterway")) { geom = "route"; } const showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true"; - const isFallback = p.isFallback && p.isFallback(); - const imageURL = showThirdPartyIcons === "true" && p.imageURL; - const picon = getIcon(p, geom); - const isCategory = !p.setTags; + const isFallback = p2.isFallback && p2.isFallback(); + const imageURL = showThirdPartyIcons === "true" && p2.imageURL; + const picon = getIcon(p2, geom); + const isCategory = !p2.setTags; const drawPoint = false; const drawVertex = picon !== null && geom === "vertex"; const drawLine = picon && geom === "line" && !isFallback && !isCategory; const drawArea = picon && geom === "area" && !isFallback && !isCategory; const drawRoute = picon && geom === "route"; const isFramed = drawVertex || drawArea || drawLine || drawRoute || isCategory; - let tags = !isCategory ? p.setTags({}, geom) : {}; - for (let k in tags) { - if (tags[k] === "*") { - tags[k] = "yes"; + let tags = !isCategory ? p2.setTags({}, geom) : {}; + for (let k2 in tags) { + if (tags[k2] === "*") { + tags[k2] = "yes"; } } let tagClasses = svgTagClasses().getClassesString(tags, ""); @@ -62065,12 +67060,12 @@ ${content} let container = selection2.selectAll(".preset-icon-container").data([0]); container = container.enter().append("div").attr("class", "preset-icon-container").merge(container); container.classed("showing-img", !!imageURL).classed("fallback", isFallback); - renderCategoryBorder(container, isCategory && p); + renderCategoryBorder(container, isCategory && p2); renderPointBorder(container, drawPoint); renderCircleFill(container, drawVertex); renderSquareFill(container, drawArea, tagClasses); renderLine(container, drawLine, tagClasses); - renderRoute(container, drawRoute, p); + renderRoute(container, drawRoute, p2); renderSvgIcon(container, picon, geom, isFramed, isCategory, tagClasses); renderImageIcon(container, imageURL); } @@ -62091,7 +67086,7 @@ ${content} // modules/ui/sections/feature_type.js function uiSectionFeatureType(context) { - var dispatch10 = dispatch_default("choose"); + var dispatch14 = dispatch_default("choose"); var _entityIDs = []; var _presets = []; var _tagReference; @@ -62113,7 +67108,7 @@ ${content} tagReferenceBodyWrap.style("display", _presets.length === 1 ? null : "none").call(_tagReference.body); } selection2.selectAll(".preset-reset").on("click", function() { - dispatch10.call("choose", this, _presets); + dispatch14.call("choose", this, _presets); }).on("pointerdown pointerup mousedown mouseup", function(d3_event) { d3_event.preventDefault(); d3_event.stopPropagation(); @@ -62127,10 +67122,10 @@ ${content} _presets[0].subtitleLabel() ].filter(Boolean) : [_t.append("inspector.multiple_types")]; var label = selection2.select(".label-inner"); - var nameparts = label.selectAll(".namepart").data(names, (d) => d.stringId); + var nameparts = label.selectAll(".namepart").data(names, (d2) => d2.stringId); nameparts.exit().remove(); - nameparts.enter().append("div").attr("class", "namepart").text("").each(function(d) { - d(select_default2(this)); + nameparts.enter().append("div").attr("class", "namepart").text("").each(function(d2) { + d2(select_default2(this)); }); } section.entityIDs = function(val) { @@ -62152,8 +67147,8 @@ ${content} }; function entityGeometries() { var counts = {}; - for (var i2 in _entityIDs) { - var geometry = context.graph().geometry(_entityIDs[i2]); + for (var i3 in _entityIDs) { + var geometry = context.graph().geometry(_entityIDs[i3]); if (!counts[geometry]) counts[geometry] = 0; counts[geometry] += 1; @@ -62162,13 +67157,13 @@ ${content} return counts[geom2] - counts[geom1]; }); } - return utilRebind(section, dispatch10, "on"); + return utilRebind(section, dispatch14, "on"); } // modules/ui/sections/preset_fields.js function uiSectionPresetFields(context) { var section = uiSection("preset-fields", context).label(() => _t.append("inspector.fields")).disclosureContent(renderDisclosureContent); - var dispatch10 = dispatch_default("change", "revert"); + var dispatch14 = dispatch_default("change", "revert"); var formFields = uiFormFields(context); var _state; var _fieldsArr; @@ -62182,13 +67177,17 @@ ${content} geoms[graph.entity(entityID).geometry(graph)] = true; return geoms; }, {})); + const loc = _entityIDs.reduce(function(extent, entityID) { + var entity = context.graph().entity(entityID); + return extent.extend(entity.extent(context.graph())); + }, geoExtent()).center(); var presetsManager = _mainPresetIndex; var allFields = []; var allMoreFields = []; var sharedTotalFields; _presets.forEach(function(preset) { - var fields = preset.fields(); - var moreFields = preset.moreFields(); + var fields = preset.fields(loc); + var moreFields = preset.moreFields(loc); allFields = utilArrayUnion(allFields, fields); allMoreFields = utilArrayUnion(allMoreFields, moreFields); if (!sharedTotalFields) { @@ -62231,10 +67230,10 @@ ${content} } }); _fieldsArr.forEach(function(field) { - field.on("change", function(t, onInput) { - dispatch10.call("change", field, _entityIDs, t, onInput); - }).on("revert", function(keys) { - dispatch10.call("revert", field, keys); + field.on("change", function(t2, onInput) { + dispatch14.call("change", field, _entityIDs, t2, onInput); + }).on("revert", function(keys2) { + dispatch14.call("revert", field, keys2); }); }); } @@ -62244,11 +67243,6 @@ ${content} selection2.call( formFields.fieldsArr(_fieldsArr).state(_state).klass("grouped-items-area") ); - selection2.selectAll(".wrap-form-field input").on("keydown", function(d3_event) { - if (d3_event.keyCode === 13 && context.container().select(".combobox").empty()) { - context.enter(modeBrowse(context)); - } - }); } section.presets = function(val) { if (!arguments.length) @@ -62280,7 +67274,7 @@ ${content} } return section; }; - return utilRebind(section, dispatch10, "on"); + return utilRebind(section, dispatch14, "on"); } // modules/ui/sections/raw_member_editor.js @@ -62294,43 +67288,43 @@ ${content} var entity = context.hasEntity(_entityIDs[0]); if (!entity) return ""; - var gt = entity.members.length > _maxMembers ? ">" : ""; - var count = gt + entity.members.slice(0, _maxMembers).length; + var gt2 = entity.members.length > _maxMembers ? ">" : ""; + var count = gt2 + entity.members.slice(0, _maxMembers).length; return _t.append("inspector.title_count", { title: _t("inspector.members"), count }); }).disclosureContent(renderDisclosureContent); var taginfo = services.taginfo; var _entityIDs; var _maxMembers = 1e3; - function downloadMember(d3_event, d) { + function downloadMember(d3_event, d2) { d3_event.preventDefault(); select_default2(this.parentNode).classed("tag-reference-loading", true); - context.loadEntity(d.id, function() { + context.loadEntity(d2.id, function() { section.reRender(); }); } - function zoomToMember(d3_event, d) { + function zoomToMember(d3_event, d2) { d3_event.preventDefault(); - var entity = context.entity(d.id); + var entity = context.entity(d2.id); context.map().zoomToEase(entity); - utilHighlightEntities([d.id], true, context); + utilHighlightEntities([d2.id], true, context); } - function selectMember(d3_event, d) { + function selectMember(d3_event, d2) { d3_event.preventDefault(); - utilHighlightEntities([d.id], false, context); - var entity = context.entity(d.id); + utilHighlightEntities([d2.id], false, context); + var entity = context.entity(d2.id); var mapExtent = context.map().extent(); if (!entity.intersects(mapExtent, context.graph())) { context.map().zoomToEase(entity); } - context.enter(modeSelect(context, [d.id])); + context.enter(modeSelect(context, [d2.id])); } - function changeRole(d3_event, d) { - var oldRole = d.role; + function changeRole(d3_event, d2) { + var oldRole = d2.role; var newRole = context.cleanRelationRole(select_default2(this).property("value")); if (oldRole !== newRole) { - var member = { id: d.id, type: d.type, role: newRole }; + var member = { id: d2.id, type: d2.type, role: newRole }; context.perform( - actionChangeMember(d.relation.id, member, d.index), + actionChangeMember(d2.relation.id, member, d2.index), _t("operations.change_role.annotation", { n: 1 }) @@ -62338,15 +67332,15 @@ ${content} context.validator().validate(); } } - function deleteMember(d3_event, d) { - utilHighlightEntities([d.id], false, context); + function deleteMember(d3_event, d2) { + utilHighlightEntities([d2.id], false, context); context.perform( - actionDeleteMember(d.relation.id, d.index), + actionDeleteMember(d2.relation.id, d2.index), _t("operations.delete_member.annotation", { n: 1 }) ); - if (!context.hasEntity(d.relation.id)) { + if (!context.hasEntity(d2.relation.id)) { context.enter(modeBrowse(context)); } else { context.validator().validate(); @@ -62369,49 +67363,49 @@ ${content} }); var list = selection2.selectAll(".member-list").data([0]); list = list.enter().append("ul").attr("class", "member-list").merge(list); - var items = list.selectAll("li").data(memberships, function(d) { - return osmEntity.key(d.relation) + "," + d.index + "," + (d.member ? osmEntity.key(d.member) : "incomplete"); + var items = list.selectAll("li").data(memberships, function(d2) { + return osmEntity.key(d2.relation) + "," + d2.index + "," + (d2.member ? osmEntity.key(d2.member) : "incomplete"); }); items.exit().each(unbind).remove(); - var itemsEnter = items.enter().append("li").attr("class", "member-row form-field").classed("member-incomplete", function(d) { - return !d.member; + var itemsEnter = items.enter().append("li").attr("class", "member-row form-field").classed("member-incomplete", function(d2) { + return !d2.member; }); - itemsEnter.each(function(d) { + itemsEnter.each(function(d2) { var item = select_default2(this); - var label = item.append("label").attr("class", "field-label").attr("for", d.domId); - if (d.member) { + var label = item.append("label").attr("class", "field-label").attr("for", d2.domId); + if (d2.member) { item.on("mouseover", function() { - utilHighlightEntities([d.id], true, context); + utilHighlightEntities([d2.id], true, context); }).on("mouseout", function() { - utilHighlightEntities([d.id], false, context); + utilHighlightEntities([d2.id], false, context); }); var labelLink = label.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectMember); - labelLink.append("span").attr("class", "member-entity-type").text(function(d2) { - var matched = _mainPresetIndex.match(d2.member, context.graph()); - return matched && matched.name() || utilDisplayType(d2.member.id); + labelLink.append("span").attr("class", "member-entity-type").text(function(d4) { + var matched = _mainPresetIndex.match(d4.member, context.graph()); + return matched && matched.name() || utilDisplayType(d4.member.id); }); - labelLink.append("span").attr("class", "member-entity-name").text(function(d2) { - return utilDisplayName(d2.member); + labelLink.append("span").attr("class", "member-entity-name").text(function(d4) { + return utilDisplayName(d4.member); }); label.append("button").attr("title", _t("icons.remove")).attr("class", "remove member-delete").call(svgIcon("#iD-operation-delete")); label.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToMember); } else { var labelText = label.append("span").attr("class", "label-text"); - labelText.append("span").attr("class", "member-entity-type").call(_t.append("inspector." + d.type, { id: d.id })); - labelText.append("span").attr("class", "member-entity-name").call(_t.append("inspector.incomplete", { id: d.id })); + labelText.append("span").attr("class", "member-entity-type").call(_t.append("inspector." + d2.type, { id: d2.id })); + labelText.append("span").attr("class", "member-entity-name").call(_t.append("inspector.incomplete", { id: d2.id })); label.append("button").attr("class", "member-download").attr("title", _t("icons.download")).call(svgIcon("#iD-icon-load")).on("click", downloadMember); } }); var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member"); - wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) { - return d.domId; + wrapEnter.append("input").attr("class", "member-role").attr("id", function(d2) { + return d2.domId; }).property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto); if (taginfo) { wrapEnter.each(bindTypeahead); } items = items.merge(itemsEnter).order(); - items.select("input.member-role").property("value", function(d) { - return d.role; + items.select("input.member-role").property("value", function(d2) { + return d2.role; }).on("blur", changeRole).on("change", changeRole); items.select("button.member-delete").on("click", deleteMember); var dragOrigin, targetIndex; @@ -62423,8 +67417,9 @@ ${content} }; targetIndex = null; }).on("drag", function(d3_event) { - var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y; - if (!select_default2(this).classed("dragging") && Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) + var x2 = d3_event.x - dragOrigin.x, y2 = d3_event.y - dragOrigin.y; + if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold + Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2)) <= 5) return; var index = items.nodes().indexOf(this); select_default2(this).classed("dragging", true); @@ -62432,7 +67427,7 @@ ${content} selection2.selectAll("li.member-row").style("transform", function(d2, index2) { var node = select_default2(this).node(); if (index === index2) { - return "translate(" + x + "px, " + y + "px)"; + return "translate(" + x2 + "px, " + y2 + "px)"; } else if (index2 > index && d3_event.y > node.offsetTop) { if (targetIndex === null || index2 > targetIndex) { targetIndex = index2; @@ -62446,7 +67441,7 @@ ${content} } return null; }); - }).on("end", function(d3_event, d) { + }).on("end", function(d3_event, d2) { if (!select_default2(this).classed("dragging")) return; var index = items.nodes().indexOf(this); @@ -62454,25 +67449,25 @@ ${content} selection2.selectAll("li.member-row").style("transform", null); if (targetIndex !== null) { context.perform( - actionMoveMember(d.relation.id, index, targetIndex), + actionMoveMember(d2.relation.id, index, targetIndex), _t("operations.reorder_members.annotation") ); context.validator().validate(); } }) ); - function bindTypeahead(d) { + function bindTypeahead(d2) { var row = select_default2(this); var role = row.selectAll("input.member-role"); var origValue = role.property("value"); function sort(value, data) { var sameletter = []; var other = []; - for (var i2 = 0; i2 < data.length; i2++) { - if (data[i2].value.substring(0, value.length) === value) { - sameletter.push(data[i2]); + for (var i3 = 0; i3 < data.length; i3++) { + if (data[i3].value.substring(0, value.length) === value) { + sameletter.push(data[i3]); } else { - other.push(data[i2]); + other.push(data[i3]); } } return sameletter.concat(other); @@ -62480,11 +67475,11 @@ ${content} role.call( uiCombobox(context, "member-role").fetcher(function(role2, callback) { var geometry; - if (d.member) { - geometry = context.graph().geometry(d.member.id); - } else if (d.type === "relation") { + if (d2.member) { + geometry = context.graph().geometry(d2.member.id); + } else if (d2.type === "relation") { geometry = "relation"; - } else if (d.type === "way") { + } else if (d2.type === "way") { geometry = "line"; } else { geometry = "point"; @@ -62521,9 +67516,9 @@ ${content} // modules/actions/delete_members.js function actionDeleteMembers(relationId, memberIndexes) { return function(graph) { - memberIndexes.sort((a, b) => b - a); - for (var i2 in memberIndexes) { - graph = actionDeleteMember(relationId, memberIndexes[i2])(graph); + memberIndexes.sort((a2, b2) => b2 - a2); + for (var i3 in memberIndexes) { + graph = actionDeleteMember(relationId, memberIndexes[i3])(graph); } return graph; }; @@ -62535,17 +67530,17 @@ ${content} return _entityIDs && _entityIDs.length; }).label(function() { var parents = getSharedParentRelations(); - var gt = parents.length > _maxMemberships ? ">" : ""; - var count = gt + parents.slice(0, _maxMemberships).length; + var gt2 = parents.length > _maxMemberships ? ">" : ""; + var count = gt2 + parents.slice(0, _maxMemberships).length; return _t.append("inspector.title_count", { title: _t("inspector.relations"), count }); }).disclosureContent(renderDisclosureContent); var taginfo = services.taginfo; - var nearbyCombo = uiCombobox(context, "parent-relation").minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function(d3_event, d) { - if (d.relation) - utilHighlightEntities([d.relation.id], true, context); - }).itemsMouseLeave(function(d3_event, d) { - if (d.relation) - utilHighlightEntities([d.relation.id], false, context); + var nearbyCombo = uiCombobox(context, "parent-relation").minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function(d3_event, d2) { + if (d2.relation) + utilHighlightEntities([d2.relation.id], true, context); + }).itemsMouseLeave(function(d3_event, d2) { + if (d2.relation) + utilHighlightEntities([d2.relation.id], false, context); }); var _inChange = false; var _entityIDs = []; @@ -62553,11 +67548,11 @@ ${content} var _maxMemberships = 1e3; function getSharedParentRelations() { var parents = []; - for (var i2 = 0; i2 < _entityIDs.length; i2++) { - var entity = context.graph().hasEntity(_entityIDs[i2]); + for (var i3 = 0; i3 < _entityIDs.length; i3++) { + var entity = context.graph().hasEntity(_entityIDs[i3]); if (!entity) continue; - if (i2 === 0) { + if (i3 === 0) { parents = context.graph().parentRelations(entity); } else { parents = utilArrayIntersection(parents, context.graph().parentRelations(entity)); @@ -62571,9 +67566,9 @@ ${content} var memberships = []; var relations = getSharedParentRelations().slice(0, _maxMemberships); var isMultiselect = _entityIDs.length > 1; - var i2, relation, membership, index, member, indexedMember; - for (i2 = 0; i2 < relations.length; i2++) { - relation = relations[i2]; + var i3, relation, membership, index, member, indexedMember; + for (i3 = 0; i3 < relations.length; i3++) { + relation = relations[i3]; membership = { relation, members: [], @@ -62609,26 +67604,26 @@ ${content} }); return memberships; } - function selectRelation(d3_event, d) { + function selectRelation(d3_event, d2) { d3_event.preventDefault(); - utilHighlightEntities([d.relation.id], false, context); - context.enter(modeSelect(context, [d.relation.id])); + utilHighlightEntities([d2.relation.id], false, context); + context.enter(modeSelect(context, [d2.relation.id])); } - function zoomToRelation(d3_event, d) { + function zoomToRelation(d3_event, d2) { d3_event.preventDefault(); - var entity = context.entity(d.relation.id); + var entity = context.entity(d2.relation.id); context.map().zoomToEase(entity); - utilHighlightEntities([d.relation.id], true, context); + utilHighlightEntities([d2.relation.id], true, context); } - function changeRole(d3_event, d) { - if (d === 0) + function changeRole(d3_event, d2) { + if (d2 === 0) return; if (_inChange) return; var newRole = context.cleanRelationRole(select_default2(this).property("value")); - if (!newRole.trim() && typeof d.role !== "string") + if (!newRole.trim() && typeof d2.role !== "string") return; - var membersToUpdate = d.members.filter(function(member) { + var membersToUpdate = d2.members.filter(function(member) { return member.role !== newRole; }); if (membersToUpdate.length) { @@ -62638,7 +67633,7 @@ ${content} membersToUpdate.forEach(function(member) { var newMember = Object.assign({}, member, { role: newRole }); delete newMember.index; - graph = actionChangeMember(d.relation.id, newMember, member.index)(graph); + graph = actionChangeMember(d2.relation.id, newMember, member.index)(graph); }); return graph; }, @@ -62650,21 +67645,21 @@ ${content} } _inChange = false; } - function addMembership(d, role) { + function addMembership(d2, role) { this.blur(); _showBlank = false; function actionAddMembers(relationId, ids, role2) { return function(graph) { - for (var i2 in ids) { - var member = { id: ids[i2], type: graph.entity(ids[i2]).type, role: role2 }; + for (var i3 in ids) { + var member = { id: ids[i3], type: graph.entity(ids[i3]).type, role: role2 }; graph = actionAddMember(relationId, member)(graph); } return graph; }; } - if (d.relation) { + if (d2.relation) { context.perform( - actionAddMembers(d.relation.id, _entityIDs, role), + actionAddMembers(d2.relation.id, _entityIDs, role), _t("operations.add_member.annotation", { n: _entityIDs.length }) @@ -62680,23 +67675,23 @@ ${content} context.enter(modeSelect(context, [relation.id]).newFeature(true)); } } - function deleteMembership(d3_event, d) { + function deleteMembership(d3_event, d2) { this.blur(); - if (d === 0) + if (d2 === 0) return; - utilHighlightEntities([d.relation.id], false, context); - var indexes = d.members.map(function(member) { + utilHighlightEntities([d2.relation.id], false, context); + var indexes = d2.members.map(function(member) { return member.index; }); context.perform( - actionDeleteMembers(d.relation.id, indexes), + actionDeleteMembers(d2.relation.id, indexes), _t("operations.delete_member.annotation", { n: _entityIDs.length }) ); context.validator().validate(); } - function fetchNearbyRelations(q, callback) { + function fetchNearbyRelations(q2, callback) { var newRelation = { relation: null, value: _t("inspector.new_relation"), @@ -62711,7 +67706,7 @@ ${content} var entityName = utilDisplayName(entity) || ""; return presetName + " " + entityName; } - var explicitRelation = q && context.hasEntity(q.toLowerCase()); + var explicitRelation = q2 && context.hasEntity(q2.toLowerCase()); if (explicitRelation && explicitRelation.type === "relation" && explicitRelation.id !== entityID) { result.push({ relation: explicitRelation, @@ -62722,15 +67717,15 @@ ${content} if (entity.type !== "relation" || entity.id === entityID) return; var value = baseDisplayLabel(entity); - if (q && (value + " " + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1) + if (q2 && (value + " " + entity.id).toLowerCase().indexOf(q2.toLowerCase()) === -1) return; result.push({ relation: entity, value }); }); - result.sort(function(a, b) { - return osmRelation.creationOrder(a.relation, b.relation); + result.sort(function(a2, b2) { + return osmRelation.creationOrder(a2.relation, b2.relation); }); - var dupeGroups = Object.values(utilArrayGroupBy(result, "value")).filter(function(v) { - return v.length > 1; + var dupeGroups = Object.values(utilArrayGroupBy(result, "value")).filter(function(v2) { + return v2.length > 1; }); dupeGroups.forEach(function(group) { group.forEach(function(obj) { @@ -62748,40 +67743,40 @@ ${content} var memberships = getMemberships(); var list = selection2.selectAll(".member-list").data([0]); list = list.enter().append("ul").attr("class", "member-list").merge(list); - var items = list.selectAll("li.member-row-normal").data(memberships, function(d) { - return d.hash; + var items = list.selectAll("li.member-row-normal").data(memberships, function(d2) { + return d2.hash; }); items.exit().each(unbind).remove(); var itemsEnter = items.enter().append("li").attr("class", "member-row member-row-normal form-field"); - itemsEnter.on("mouseover", function(d3_event, d) { - utilHighlightEntities([d.relation.id], true, context); - }).on("mouseout", function(d3_event, d) { - utilHighlightEntities([d.relation.id], false, context); + itemsEnter.on("mouseover", function(d3_event, d2) { + utilHighlightEntities([d2.relation.id], true, context); + }).on("mouseout", function(d3_event, d2) { + utilHighlightEntities([d2.relation.id], false, context); }); - var labelEnter = itemsEnter.append("label").attr("class", "field-label").attr("for", function(d) { - return d.domId; + var labelEnter = itemsEnter.append("label").attr("class", "field-label").attr("for", function(d2) { + return d2.domId; }); var labelLink = labelEnter.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectRelation); - labelLink.append("span").attr("class", "member-entity-type").text(function(d) { - var matched = _mainPresetIndex.match(d.relation, context.graph()); + labelLink.append("span").attr("class", "member-entity-type").text(function(d2) { + var matched = _mainPresetIndex.match(d2.relation, context.graph()); return matched && matched.name() || _t.html("inspector.relation"); }); - labelLink.append("span").attr("class", "member-entity-name").text(function(d) { - return utilDisplayName(d.relation); + labelLink.append("span").attr("class", "member-entity-name").text(function(d2) { + return utilDisplayName(d2.relation); }); labelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", deleteMembership); labelEnter.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToRelation); var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member"); - wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) { - return d.domId; - }).property("type", "text").property("value", function(d) { - return typeof d.role === "string" ? d.role : ""; - }).attr("title", function(d) { - return Array.isArray(d.role) ? d.role.filter(Boolean).join("\n") : d.role; - }).attr("placeholder", function(d) { - return Array.isArray(d.role) ? _t("inspector.multiple_roles") : _t("inspector.role"); - }).classed("mixed", function(d) { - return Array.isArray(d.role); + wrapEnter.append("input").attr("class", "member-role").attr("id", function(d2) { + return d2.domId; + }).property("type", "text").property("value", function(d2) { + return typeof d2.role === "string" ? d2.role : ""; + }).attr("title", function(d2) { + return Array.isArray(d2.role) ? d2.role.filter(Boolean).join("\n") : d2.role; + }).attr("placeholder", function(d2) { + return Array.isArray(d2.role) ? _t("inspector.multiple_roles") : _t("inspector.role"); + }).classed("mixed", function(d2) { + return Array.isArray(d2.role); }).call(utilNoAuto).on("blur", changeRole).on("change", changeRole); if (taginfo) { wrapEnter.each(bindTypeahead); @@ -62813,40 +67808,40 @@ ${content} section.reRender(); list.selectAll(".member-entity-input").node().focus(); }); - function acceptEntity(d) { - if (!d) { + function acceptEntity(d2) { + if (!d2) { cancelEntity(); return; } - if (d.relation) - utilHighlightEntities([d.relation.id], false, context); + if (d2.relation) + utilHighlightEntities([d2.relation.id], false, context); var role = context.cleanRelationRole(list.selectAll(".member-row-new .member-role").property("value")); - addMembership(d, role); + addMembership(d2, role); } function cancelEntity() { var input = newMembership.selectAll(".member-entity-input"); input.property("value", ""); context.surface().selectAll(".highlighted").classed("highlighted", false); } - function bindTypeahead(d) { + function bindTypeahead(d2) { var row = select_default2(this); var role = row.selectAll("input.member-role"); var origValue = role.property("value"); function sort(value, data) { var sameletter = []; var other = []; - for (var i2 = 0; i2 < data.length; i2++) { - if (data[i2].value.substring(0, value.length) === value) { - sameletter.push(data[i2]); + for (var i3 = 0; i3 < data.length; i3++) { + if (data[i3].value.substring(0, value.length) === value) { + sameletter.push(data[i3]); } else { - other.push(data[i2]); + other.push(data[i3]); } } return sameletter.concat(other); } role.call( uiCombobox(context, "member-role").fetcher(function(role2, callback) { - var rtype = d.relation.tags.type; + var rtype = d2.relation.tags.type; taginfo.roles({ debounce: true, rtype: rtype || "", @@ -62914,11 +67909,11 @@ ${content} }).filter(Boolean); var items = list.selectAll(".feature-list-item").data(entities, osmEntity.key); items.exit().remove(); - var enter = items.enter().append("li").attr("class", "feature-list-item").each(function(d) { + var enter = items.enter().append("li").attr("class", "feature-list-item").each(function(d2) { select_default2(this).on("mouseover", function() { - utilHighlightEntities([d.id], true, context); + utilHighlightEntities([d2.id], true, context); }).on("mouseout", function() { - utilHighlightEntities([d.id], false, context); + utilHighlightEntities([d2.id], false, context); }); }); var label = enter.append("button").attr("class", "label").on("click", selectEntity); @@ -62934,8 +67929,8 @@ ${content} items.selectAll(".entity-type").text(function(entity) { return _mainPresetIndex.match(entity, context.graph()).name(); }); - items.selectAll(".entity-name").text(function(d) { - var entity = context.entity(d.id); + items.selectAll(".entity-name").text(function(d2) { + var entity = context.entity(d2.id); return utilDisplayName(entity); }); } @@ -62944,7 +67939,7 @@ ${content} // modules/ui/entity_editor.js function uiEntityEditor(context) { - var dispatch10 = dispatch_default("choose"); + var dispatch14 = dispatch_default("choose"); var _state = "select"; var _coalesceChanges = false; var _modified = false; @@ -62958,7 +67953,7 @@ ${content} var header = selection2.selectAll(".header").data([0]); var headerEnter = header.enter().append("div").attr("class", "header fillL"); var direction = _mainLocalizer.textDirection() === "rtl" ? "forward" : "backward"; - headerEnter.append("button").attr("class", "preset-reset preset-choose").attr("title", _t(`icons.${direction}`)).call(svgIcon(`#iD-icon-${direction}`)); + headerEnter.append("button").attr("class", "preset-reset preset-choose").attr("title", _t("inspector.back_tooltip")).call(svgIcon(`#iD-icon-${direction}`)); headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() { context.enter(modeBrowse(context)); }).call(svgIcon(_modified ? "#iD-icon-apply" : "#iD-icon-close")); @@ -62966,7 +67961,7 @@ ${content} header = header.merge(headerEnter); header.selectAll("h2").text("").call(_entityIDs.length === 1 ? _t.append("inspector.edit") : _t.append("inspector.edit_features")); header.selectAll(".preset-reset").on("click", function() { - dispatch10.call("choose", this, _activePresets); + dispatch14.call("choose", this, _activePresets); }); var body = selection2.selectAll(".inspector-body").data([0]); var bodyEnter = body.enter().append("div").attr("class", "entity-editor inspector-body sep-top"); @@ -62975,7 +67970,7 @@ ${content} _sections = [ uiSectionSelectionList(context), uiSectionFeatureType(context).on("choose", function(presets) { - dispatch10.call("choose", this, presets); + dispatch14.call("choose", this, presets); }), uiSectionEntityIssues(context), uiSectionPresetFields(context).on("change", changeTags).on("revert", revertTags), @@ -63023,18 +68018,22 @@ ${content} } function changeTags(entityIDs, changed, onInput) { var actions = []; - for (var i2 in entityIDs) { - var entityID = entityIDs[i2]; + for (var i3 in entityIDs) { + var entityID = entityIDs[i3]; var entity = context.entity(entityID); var tags = Object.assign({}, entity.tags); - for (var k in changed) { - if (!k) - continue; - var v = changed[k]; - if (typeof v === "object") { - tags[k] = tags[v.oldKey]; - } else if (v !== void 0 || tags.hasOwnProperty(k)) { - tags[k] = v; + if (typeof changed === "function") { + tags = changed(tags); + } else { + for (var k2 in changed) { + if (!k2) + continue; + var v2 = changed[k2]; + if (typeof v2 === "object") { + tags[k2] = tags[v2.oldKey]; + } else if (v2 !== void 0 || tags.hasOwnProperty(k2)) { + tags[k2] = v2; + } } } if (!onInput) { @@ -63063,24 +68062,24 @@ ${content} context.validator().validate(); } } - function revertTags(keys) { + function revertTags(keys2) { var actions = []; - for (var i2 in _entityIDs) { - var entityID = _entityIDs[i2]; + for (var i3 in _entityIDs) { + var entityID = _entityIDs[i3]; var original = context.graph().base().entities[entityID]; var changed = {}; - for (var j2 in keys) { - var key = keys[j2]; + for (var j3 in keys2) { + var key = keys2[j3]; changed[key] = original ? original.tags[key] : void 0; } var entity = context.entity(entityID); var tags = Object.assign({}, entity.tags); - for (var k in changed) { - if (!k) + for (var k2 in changed) { + if (!k2) continue; - var v = changed[k]; - if (v !== void 0 || tags.hasOwnProperty(k)) { - tags[k] = v; + var v2 = changed[k2]; + if (v2 !== void 0 || tags.hasOwnProperty(k2)) { + tags[k2] = v2; } } tags = utilCleanTags(tags); @@ -63137,8 +68136,8 @@ ${content} function loadActivePresets(isForNewSelection) { var graph = context.graph(); var counts = {}; - for (var i2 in _entityIDs) { - var entity = graph.hasEntity(_entityIDs[i2]); + for (var i3 in _entityIDs) { + var entity = graph.hasEntity(_entityIDs[i3]); if (!entity) return; var match = _mainPresetIndex.match(entity, graph); @@ -63166,7 +68165,7 @@ ${content} } return entityEditor; }; - return utilRebind(entityEditor, dispatch10, "on"); + return utilRebind(entityEditor, dispatch14, "on"); } // modules/ui/feature_list.js @@ -63197,8 +68196,9 @@ ${content} } } function keypress(d3_event) { - var q = search.property("value"), items = list.selectAll(".feature-list-item"); - if (d3_event.keyCode === 13 && q.length && items.size()) { + var q2 = search.property("value"), items = list.selectAll(".feature-list-item"); + if (d3_event.keyCode === 13 && // ↩ Return + q2.length && items.size()) { click(d3_event, items.datum()); } } @@ -63210,21 +68210,21 @@ ${content} search.property("value", ""); drawList(); } - function mapDrawn(e) { - if (e.full) { + function mapDrawn(e3) { + if (e3.full) { drawList(); } } - function features2() { + function features() { var result = []; var graph = context.graph(); var visibleCenter = context.map().extent().center(); - var q = search.property("value").toLowerCase(); - if (!q) + var q2 = search.property("value").toLowerCase(); + if (!q2) return result; - var locationMatch = sexagesimal.pair(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/); + var locationMatch = sexagesimal.pair(q2.toUpperCase()) || q2.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/); if (locationMatch) { - var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])]; + var loc = [Number(locationMatch[0]), Number(locationMatch[1])]; result.push({ id: -1, geometry: "point", @@ -63233,7 +68233,7 @@ ${content} location: loc }); } - var idMatch = !locationMatch && q.match(/(?:^|\W)(node|way|relation|[nwr])\W?0*([1-9]\d*)(?:\W|$)/i); + var idMatch = !locationMatch && q2.match(/(?:^|\W)(node|way|relation|[nwr])\W{0,2}0*([1-9]\d*)(?:\W|$)/i); if (idMatch) { var elemType = idMatch[1].charAt(0); var elemId = idMatch[2]; @@ -63251,77 +68251,77 @@ ${content} if (!entity) continue; var name = utilDisplayName(entity) || ""; - if (name.toLowerCase().indexOf(q) < 0) + if (name.toLowerCase().indexOf(q2) < 0) continue; var matched = _mainPresetIndex.match(entity, graph); - var type3 = matched && matched.name() || utilDisplayType(entity.id); + var type2 = matched && matched.name() || utilDisplayType(entity.id); var extent = entity.extent(graph); var distance = extent ? geoSphericalDistance(visibleCenter, extent.center()) : 0; localResults.push({ id: entity.id, entity, geometry: entity.geometry(graph), - type: type3, + type: type2, name, distance }); if (localResults.length > 100) break; } - localResults = localResults.sort(function byDistance(a, b) { - return a.distance - b.distance; + localResults = localResults.sort(function byDistance(a2, b2) { + return a2.distance - b2.distance; }); result = result.concat(localResults); - (_geocodeResults || []).forEach(function(d) { - if (d.osm_type && d.osm_id) { - var id3 = osmEntity.id.fromOSM(d.osm_type, d.osm_id); + (_geocodeResults || []).forEach(function(d2) { + if (d2.osm_type && d2.osm_id) { + var id3 = osmEntity.id.fromOSM(d2.osm_type, d2.osm_id); var tags = {}; - tags[d.class] = d.type; - var attrs = { id: id3, type: d.osm_type, tags }; - if (d.osm_type === "way") { + tags[d2.class] = d2.type; + var attrs = { id: id3, type: d2.osm_type, tags }; + if (d2.osm_type === "way") { attrs.nodes = ["a", "a"]; } var tempEntity = osmEntity(attrs); var tempGraph = coreGraph([tempEntity]); var matched2 = _mainPresetIndex.match(tempEntity, tempGraph); - var type4 = matched2 && matched2.name() || utilDisplayType(id3); + var type3 = matched2 && matched2.name() || utilDisplayType(id3); result.push({ id: tempEntity.id, geometry: tempEntity.geometry(tempGraph), - type: type4, - name: d.display_name, + type: type3, + name: d2.display_name, extent: new geoExtent( - [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])], - [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])] + [Number(d2.boundingbox[3]), Number(d2.boundingbox[0])], + [Number(d2.boundingbox[2]), Number(d2.boundingbox[1])] ) }); } }); - if (q.match(/^[0-9]+$/)) { + if (q2.match(/^[0-9]+$/)) { result.push({ - id: "n" + q, + id: "n" + q2, geometry: "point", type: _t("inspector.node"), - name: q + name: q2 }); result.push({ - id: "w" + q, + id: "w" + q2, geometry: "line", type: _t("inspector.way"), - name: q + name: q2 }); result.push({ - id: "r" + q, + id: "r" + q2, geometry: "relation", type: _t("inspector.relation"), - name: q + name: q2 }); } return result; } function drawList() { var value = search.property("value"); - var results = features2(); + var results = features(); list.classed("filtered", value.length); var resultsIndicator = list.selectAll(".no-results-item").data([0]).enter().append("button").property("disabled", true).attr("class", "no-results-item").call(svgIcon("#iD-icon-alert", "pre-text")); resultsIndicator.append("span").attr("class", "entity-name"); @@ -63332,44 +68332,44 @@ ${content} list.selectAll(".no-results-item").style("display", value.length && !results.length ? "block" : "none"); list.selectAll(".geocode-item").style("display", value && _geocodeResults === void 0 ? "block" : "none"); list.selectAll(".feature-list-item").data([-1]).remove(); - var items = list.selectAll(".feature-list-item").data(results, function(d) { - return d.id; + var items = list.selectAll(".feature-list-item").data(results, function(d2) { + return d2.id; }); var enter = items.enter().insert("button", ".geocode-item").attr("class", "feature-list-item").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click); var label = enter.append("div").attr("class", "label"); - label.each(function(d) { - select_default2(this).call(svgIcon("#iD-icon-" + d.geometry, "pre-text")); + label.each(function(d2) { + select_default2(this).call(svgIcon("#iD-icon-" + d2.geometry, "pre-text")); }); - label.append("span").attr("class", "entity-type").text(function(d) { - return d.type; + label.append("span").attr("class", "entity-type").text(function(d2) { + return d2.type; }); - label.append("span").attr("class", "entity-name").text(function(d) { - return d.name; + label.append("span").attr("class", "entity-name").text(function(d2) { + return d2.name; }); enter.style("opacity", 0).transition().style("opacity", 1); items.order(); items.exit().remove(); } - function mouseover(d3_event, d) { - if (d.id === -1) + function mouseover(d3_event, d2) { + if (d2.id === -1) return; - utilHighlightEntities([d.id], true, context); + utilHighlightEntities([d2.id], true, context); } - function mouseout(d3_event, d) { - if (d.id === -1) + function mouseout(d3_event, d2) { + if (d2.id === -1) return; - utilHighlightEntities([d.id], false, context); + utilHighlightEntities([d2.id], false, context); } - function click(d3_event, d) { + function click(d3_event, d2) { d3_event.preventDefault(); - if (d.location) { - context.map().centerZoomEase([d.location[1], d.location[0]], 19); - } else if (d.entity) { - utilHighlightEntities([d.id], false, context); - context.enter(modeSelect(context, [d.entity.id])); - context.map().zoomToEase(d.entity); + if (d2.location) { + context.map().centerZoomEase([d2.location[1], d2.location[0]], 19); + } else if (d2.entity) { + utilHighlightEntities([d2.id], false, context); + context.enter(modeSelect(context, [d2.entity.id])); + context.map().zoomToEase(d2.entity); } else { - context.zoomToEntity(d.id); + context.zoomToEntity(d2.id); } } function geocoderSearch() { @@ -63388,35 +68388,35 @@ ${content} function issueComments(selection2) { let comments = selection2.selectAll(".comments-container").data([0]); comments = comments.enter().append("div").attr("class", "comments-container").merge(comments); - services.improveOSM.getComments(_qaItem).then((d) => { - if (!d.comments) + services.improveOSM.getComments(_qaItem).then((d2) => { + if (!d2.comments) return; - const commentEnter = comments.selectAll(".comment").data(d.comments).enter().append("div").attr("class", "comment"); + const commentEnter = comments.selectAll(".comment").data(d2.comments).enter().append("div").attr("class", "comment"); commentEnter.append("div").attr("class", "comment-avatar").call(svgIcon("#iD-icon-avatar", "comment-avatar-icon")); const mainEnter = commentEnter.append("div").attr("class", "comment-main"); const metadataEnter = mainEnter.append("div").attr("class", "comment-metadata"); - metadataEnter.append("div").attr("class", "comment-author").each(function(d2) { + metadataEnter.append("div").attr("class", "comment-author").each(function(d4) { const osm = services.osm; let selection3 = select_default2(this); - if (osm && d2.username) { - selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d2.username)).attr("target", "_blank"); + if (osm && d4.username) { + selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d4.username)).attr("target", "_blank"); } - selection3.text((d4) => d4.username); + selection3.text((d5) => d5.username); }); - metadataEnter.append("div").attr("class", "comment-date").html((d2) => _t.html("note.status.commented", { when: localeDateString2(d2.timestamp) })); - mainEnter.append("div").attr("class", "comment-text").append("p").text((d2) => d2.text); + metadataEnter.append("div").attr("class", "comment-date").html((d4) => _t.html("note.status.commented", { when: localeDateString2(d4.timestamp) })); + mainEnter.append("div").attr("class", "comment-text").append("p").text((d4) => d4.text); }).catch((err) => { console.log(err); }); } - function localeDateString2(s) { - if (!s) + function localeDateString2(s2) { + if (!s2) return null; const options2 = { day: "numeric", month: "short", year: "numeric" }; - const d = new Date(s * 1e3); - if (isNaN(d.getTime())) + const d2 = new Date(s2 * 1e3); + if (isNaN(d2.getTime())) return null; - return d.toLocaleDateString(_mainLocalizer.localeCode(), options2); + return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2); } issueComments.issue = function(val) { if (!arguments.length) @@ -63430,18 +68430,18 @@ ${content} // modules/ui/improveOSM_details.js function uiImproveOsmDetails(context) { let _qaItem; - function issueDetail(d) { - if (d.desc) - return d.desc; - const issueKey = d.issueKey; - d.replacements = d.replacements || {}; - d.replacements.default = { html: _t.html("inspector.unknown") }; - return _t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements); + function issueDetail(d2) { + if (d2.desc) + return d2.desc; + const issueKey = d2.issueKey; + d2.replacements = d2.replacements || {}; + d2.replacements.default = { html: _t.html("inspector.unknown") }; + return _t.html(`QA.improveOSM.error_types.${issueKey}.description`, d2.replacements); } function improveOsmDetails(selection2) { const details = selection2.selectAll(".error-details").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); details.exit().remove(); const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container"); @@ -63473,7 +68473,7 @@ ${content} context.loadEntity(entityID, (err, result) => { if (err) return; - const entity2 = result.data.find((e) => e.id === entityID); + const entity2 = result.data.find((e3) => e3.id === entityID); if (entity2) context.enter(modeSelect(context, [entityID])); }); @@ -63505,22 +68505,22 @@ ${content} // modules/ui/improveOSM_header.js function uiImproveOsmHeader() { let _qaItem; - function issueTitle(d) { - const issueKey = d.issueKey; - d.replacements = d.replacements || {}; - d.replacements.default = { html: _t.html("inspector.unknown") }; - return _t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements); + function issueTitle(d2) { + const issueKey = d2.issueKey; + d2.replacements = d2.replacements || {}; + d2.replacements.default = { html: _t.html("inspector.unknown") }; + return _t.html(`QA.improveOSM.error_types.${issueKey}.title`, d2.replacements); } function improveOsmHeader(selection2) { const header = selection2.selectAll(".qa-header").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); header.exit().remove(); const headerEnter = header.enter().append("div").attr("class", "qa-header"); - const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); + const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d2) => d2.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d2) => `preset-icon-28 qaItem ${d2.service} itemId-${d2.id} itemType-${d2.itemType}`); svgEnter.append("polygon").attr("fill", "currentColor").attr("class", "qaItem-fill").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"); - svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : ""); + svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d2) => d2.icon ? "#" + d2.icon : ""); headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle); } improveOsmHeader.issue = function(val) { @@ -63534,7 +68534,7 @@ ${content} // modules/ui/improveOSM_editor.js function uiImproveOsmEditor(context) { - const dispatch10 = dispatch_default("change"); + const dispatch14 = dispatch_default("change"); const qaDetails = uiImproveOsmDetails(context); const qaComments = uiImproveOsmComments(context); const qaHeader = uiImproveOsmHeader(context); @@ -63553,12 +68553,12 @@ ${content} const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment); let saveSection = selection2.selectAll(".qa-save").data( isShown ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); saveSection.exit().remove(); const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf"); saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("note.newComment")); - saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput); + saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d2) => d2.newComment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput); saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons); function changeInput() { const input = select_default2(this); @@ -63576,40 +68576,40 @@ ${content} } function qaSaveButtons(selection2) { const isSelected = _qaItem && _qaItem.id === context.selectedErrorID(); - let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id); + let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d2) => d2.status + d2.id); buttonSection.exit().remove(); const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons"); buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment")); buttonEnter.append("button").attr("class", "button close-button action"); buttonEnter.append("button").attr("class", "button ignore-button action"); buttonSection = buttonSection.merge(buttonEnter); - buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) { + buttonSection.select(".comment-button").attr("disabled", (d2) => d2.newComment ? null : true).on("click.comment", function(d3_event, d2) { this.blur(); const qaService = services.improveOSM; if (qaService) { - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); - buttonSection.select(".close-button").html((d) => { - const andComment = d.newComment ? "_comment" : ""; + buttonSection.select(".close-button").html((d2) => { + const andComment = d2.newComment ? "_comment" : ""; return _t.html(`QA.keepRight.close${andComment}`); - }).on("click.close", function(d3_event, d) { + }).on("click.close", function(d3_event, d2) { this.blur(); const qaService = services.improveOSM; if (qaService) { - d.newStatus = "SOLVED"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "SOLVED"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); - buttonSection.select(".ignore-button").html((d) => { - const andComment = d.newComment ? "_comment" : ""; + buttonSection.select(".ignore-button").html((d2) => { + const andComment = d2.newComment ? "_comment" : ""; return _t.html(`QA.keepRight.ignore${andComment}`); - }).on("click.ignore", function(d3_event, d) { + }).on("click.ignore", function(d3_event, d2) { this.blur(); const qaService = services.improveOSM; if (qaService) { - d.newStatus = "INVALID"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "INVALID"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); } @@ -63619,12 +68619,12 @@ ${content} _qaItem = val; return improveOsmEditor; }; - return utilRebind(improveOsmEditor, dispatch10, "on"); + return utilRebind(improveOsmEditor, dispatch14, "on"); } // modules/ui/preset_list.js function uiPresetList(context) { - var dispatch10 = dispatch_default("cancel", "choose"); + var dispatch14 = dispatch_default("cancel", "choose"); var _entityIDs; var _currLoc; var _currentPresets; @@ -63637,8 +68637,8 @@ ${content} var messagewrap = selection2.append("div").attr("class", "header fillL"); var message = messagewrap.append("h2").call(_t.append("inspector.choose")); var direction = _mainLocalizer.textDirection() === "rtl" ? "backward" : "forward"; - messagewrap.append("button").attr("class", "preset-choose").attr("title", direction).on("click", function() { - dispatch10.call("cancel", this); + messagewrap.append("button").attr("class", "preset-choose").attr("title", _entityIDs.length === 1 ? _t("inspector.edit") : _t("inspector.edit_features")).on("click", function() { + dispatch14.call("cancel", this); }).call(svgIcon(`#iD-icon-${direction}`)); function initialKeydown(d3_event) { if (search.property("value").length === 0 && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) { @@ -63655,7 +68655,8 @@ ${content} } } function keydown(d3_event) { - if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"] && search.node().selectionStart === search.property("value").length) { + if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"] && // if insertion point is at the end of the string + search.node().selectionStart === search.property("value").length) { d3_event.preventDefault(); d3_event.stopPropagation(); var buttons = list.selectAll(".preset-list-button"); @@ -63665,9 +68666,10 @@ ${content} } function keypress(d3_event) { var value = search.property("value"); - if (d3_event.keyCode === 13 && value.length) { - list.selectAll(".preset-list-item:first-child").each(function(d) { - d.choose.call(this); + if (d3_event.keyCode === 13 && // ↩ Return + value.length) { + list.selectAll(".preset-list-item:first-child").each(function(d2) { + d2.choose.call(this); }); } } @@ -63719,8 +68721,8 @@ ${content} } return collection2; }, []); - var items = list.selectAll(".preset-list-item").data(collection, function(d) { - return d.preset.id; + var items = list.selectAll(".preset-list-item").data(collection, function(d2) { + return d2.preset.id; }); items.order(); items.exit().remove(); @@ -63840,8 +68842,8 @@ ${content} preset.nameLabel(), preset.subtitleLabel() ].filter(Boolean); - label.selectAll(".namepart").data(nameparts, (d) => d.stringId).enter().append("div").attr("class", "namepart").text("").each(function(d) { - d(select_default2(this)); + label.selectAll(".namepart").data(nameparts, (d2) => d2.stringId).enter().append("div").attr("class", "namepart").text("").each(function(d2) { + d2(select_default2(this)); }); wrap2.call(item.reference.button); selection2.call(item.reference.body); @@ -63854,8 +68856,8 @@ ${content} } context.perform( function(graph) { - for (var i2 in _entityIDs) { - var entityID = _entityIDs[i2]; + for (var i3 in _entityIDs) { + var entityID = _entityIDs[i3]; var oldPreset = _mainPresetIndex.match(graph.entity(entityID), graph); graph = actionChangePreset(entityID, oldPreset, preset)(graph); } @@ -63864,7 +68866,7 @@ ${content} _t("operations.change_tags.annotation") ); context.validator().validate(); - dispatch10.call("choose", this, preset); + dispatch14.call("choose", this, preset); }; item.help = function(d3_event) { d3_event.stopPropagation(); @@ -63882,8 +68884,8 @@ ${content} button.call(uiTooltip().destroyAny); button.each(function(item, index) { var hiddenPresetFeaturesId; - for (var i2 in geometries) { - hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i2]); + for (var i3 in geometries) { + hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i3]); if (hiddenPresetFeaturesId) break; } @@ -63931,8 +68933,8 @@ ${content} }; function entityGeometries() { var counts = {}; - for (var i2 in _entityIDs) { - var entityID = _entityIDs[i2]; + for (var i3 in _entityIDs) { + var entityID = _entityIDs[i3]; var entity = context.entity(entityID); var geometry = entity.geometry(context.graph()); if (geometry === "vertex" && entity.isOnAddressLine(context.graph())) { @@ -63946,7 +68948,7 @@ ${content} return counts[geom2] - counts[geom1]; }); } - return utilRebind(presetList, dispatch10, "on"); + return utilRebind(presetList, dispatch14, "on"); } // modules/ui/view_on_osm.js @@ -63960,17 +68962,17 @@ ${content} url = context.connection().noteURL(_what); } var data = !_what || _what.isNew() ? [] : [_what]; - var link2 = selection2.selectAll(".view-on-osm").data(data, function(d) { - return d.id; + var link2 = selection2.selectAll(".view-on-osm").data(data, function(d2) { + return d2.id; }); link2.exit().remove(); var linkEnter = link2.enter().append("a").attr("class", "view-on-osm").attr("target", "_blank").attr("href", url).call(svgIcon("#iD-icon-out-link", "inline")); linkEnter.append("span").call(_t.append("inspector.view_on_osm")); } - viewOnOSM.what = function(_) { + viewOnOSM.what = function(_2) { if (!arguments.length) return _what; - _what = _; + _what = _2; return viewOnOSM; }; return viewOnOSM; @@ -64088,10 +69090,10 @@ ${content} // modules/ui/keepRight_details.js function uiKeepRightDetails(context) { let _qaItem; - function issueDetail(d) { - const { itemType, parentIssueType } = d; + function issueDetail(d2) { + const { itemType, parentIssueType } = d2; const unknown = { html: _t.html("inspector.unknown") }; - let replacements = d.replacements || {}; + let replacements = d2.replacements || {}; replacements.default = unknown; if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) { return _t.html(`QA.keepRight.errorTypes.${itemType}.description`, replacements); @@ -64102,7 +69104,7 @@ ${content} function keepRightDetails(selection2) { const details = selection2.selectAll(".error-details").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); details.exit().remove(); const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container"); @@ -64134,7 +69136,7 @@ ${content} context.loadEntity(entityID, (err, result) => { if (err) return; - const entity2 = result.data.find((e) => e.id === entityID); + const entity2 = result.data.find((e3) => e3.id === entityID); if (entity2) context.enter(modeSelect(context, [entityID])); }); @@ -64166,10 +69168,10 @@ ${content} // modules/ui/keepRight_header.js function uiKeepRightHeader() { let _qaItem; - function issueTitle(d) { - const { itemType, parentIssueType } = d; + function issueTitle(d2) { + const { itemType, parentIssueType } = d2; const unknown = _t.html("inspector.unknown"); - let replacements = d.replacements || {}; + let replacements = d2.replacements || {}; replacements.default = { html: unknown }; if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) { return _t.html(`QA.keepRight.errorTypes.${itemType}.title`, replacements); @@ -64180,12 +69182,12 @@ ${content} function keepRightHeader(selection2) { const header = selection2.selectAll(".qa-header").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); header.exit().remove(); const headerEnter = header.enter().append("div").attr("class", "qa-header"); - const iconEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0); - iconEnter.append("div").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`).call(svgIcon("#iD-icon-bolt", "qaItem-fill")); + const iconEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d2) => d2.id < 0); + iconEnter.append("div").attr("class", (d2) => `preset-icon-28 qaItem ${d2.service} itemId-${d2.id} itemType-${d2.parentIssueType}`).call(svgIcon("#iD-icon-bolt", "qaItem-fill")); headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle); } keepRightHeader.issue = function(val) { @@ -64207,7 +69209,7 @@ ${content} } const link2 = selection2.selectAll(".view-on-keepRight").data(url ? [url] : []); link2.exit().remove(); - const linkEnter = link2.enter().append("a").attr("class", "view-on-keepRight").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline")); + const linkEnter = link2.enter().append("a").attr("class", "view-on-keepRight").attr("target", "_blank").attr("rel", "noopener").attr("href", (d2) => d2).call(svgIcon("#iD-icon-out-link", "inline")); linkEnter.append("span").call(_t.append("inspector.view_on_keepRight")); } viewOnKeepRight.what = function(val) { @@ -64221,7 +69223,7 @@ ${content} // modules/ui/keepRight_editor.js function uiKeepRightEditor(context) { - const dispatch10 = dispatch_default("change"); + const dispatch14 = dispatch_default("change"); const qaDetails = uiKeepRightDetails(context); const qaHeader = uiKeepRightHeader(context); let _qaItem; @@ -64241,12 +69243,12 @@ ${content} const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment); let saveSection = selection2.selectAll(".qa-save").data( isShown ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); saveSection.exit().remove(); const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf"); saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("QA.keepRight.comment")); - saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment || d.comment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput); + saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d2) => d2.newComment || d2.comment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput); saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons); function changeInput() { const input = select_default2(this); @@ -64264,40 +69266,40 @@ ${content} } function qaSaveButtons(selection2) { const isSelected = _qaItem && _qaItem.id === context.selectedErrorID(); - let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id); + let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d2) => d2.status + d2.id); buttonSection.exit().remove(); const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons"); buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment")); buttonEnter.append("button").attr("class", "button close-button action"); buttonEnter.append("button").attr("class", "button ignore-button action"); buttonSection = buttonSection.merge(buttonEnter); - buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) { + buttonSection.select(".comment-button").attr("disabled", (d2) => d2.newComment ? null : true).on("click.comment", function(d3_event, d2) { this.blur(); const qaService = services.keepRight; if (qaService) { - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); - buttonSection.select(".close-button").html((d) => { - const andComment = d.newComment ? "_comment" : ""; + buttonSection.select(".close-button").html((d2) => { + const andComment = d2.newComment ? "_comment" : ""; return _t.html(`QA.keepRight.close${andComment}`); - }).on("click.close", function(d3_event, d) { + }).on("click.close", function(d3_event, d2) { this.blur(); const qaService = services.keepRight; if (qaService) { - d.newStatus = "ignore_t"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "ignore_t"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); - buttonSection.select(".ignore-button").html((d) => { - const andComment = d.newComment ? "_comment" : ""; + buttonSection.select(".ignore-button").html((d2) => { + const andComment = d2.newComment ? "_comment" : ""; return _t.html(`QA.keepRight.ignore${andComment}`); - }).on("click.ignore", function(d3_event, d) { + }).on("click.ignore", function(d3_event, d2) { this.blur(); const qaService = services.keepRight; if (qaService) { - d.newStatus = "ignore"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "ignore"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); } @@ -64307,7 +69309,7 @@ ${content} _qaItem = val; return keepRightEditor; }; - return utilRebind(keepRightEditor, dispatch10, "on"); + return utilRebind(keepRightEditor, dispatch14, "on"); } // modules/ui/lasso.js @@ -64322,20 +69324,20 @@ ${content} } function draw() { if (polygon2) { - polygon2.data([lasso.coordinates]).attr("d", function(d) { - return "M" + d.join(" L") + " Z"; + polygon2.data([lasso.coordinates]).attr("d", function(d2) { + return "M" + d2.join(" L") + " Z"; }); } } lasso.extent = function() { - return lasso.coordinates.reduce(function(extent, point) { - return extent.extend(geoExtent(point)); + return lasso.coordinates.reduce(function(extent, point2) { + return extent.extend(geoExtent(point2)); }, geoExtent()); }; - lasso.p = function(_) { + lasso.p = function(_2) { if (!arguments.length) return lasso; - lasso.coordinates.push(_); + lasso.coordinates.push(_2); draw(); return lasso; }; @@ -64359,28 +69361,28 @@ ${content} var comments = selection2.selectAll(".comments-container").data([0]); comments = comments.enter().append("div").attr("class", "comments-container").merge(comments); var commentEnter = comments.selectAll(".comment").data(_note.comments).enter().append("div").attr("class", "comment"); - commentEnter.append("div").attr("class", function(d) { - return "comment-avatar user-" + d.uid; + commentEnter.append("div").attr("class", function(d2) { + return "comment-avatar user-" + d2.uid; }).call(svgIcon("#iD-icon-avatar", "comment-avatar-icon")); var mainEnter = commentEnter.append("div").attr("class", "comment-main"); var metadataEnter = mainEnter.append("div").attr("class", "comment-metadata"); - metadataEnter.append("div").attr("class", "comment-author").each(function(d) { + metadataEnter.append("div").attr("class", "comment-author").each(function(d2) { var selection3 = select_default2(this); var osm = services.osm; - if (osm && d.user) { - selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d.user)).attr("target", "_blank"); + if (osm && d2.user) { + selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d2.user)).attr("target", "_blank"); } - if (d.user) { - selection3.text(d.user); + if (d2.user) { + selection3.text(d2.user); } else { selection3.call(_t.append("note.anonymous")); } }); - metadataEnter.append("div").attr("class", "comment-date").html(function(d) { - return _t.html("note.status." + d.action, { when: localeDateString2(d.date) }); + metadataEnter.append("div").attr("class", "comment-date").html(function(d2) { + return _t.html("note.status." + d2.action, { when: localeDateString2(d2.date) }); }); - mainEnter.append("div").attr("class", "comment-text").html(function(d) { - return d.html; + mainEnter.append("div").attr("class", "comment-text").html(function(d2) { + return d2.html; }).selectAll("a").attr("rel", "noopener nofollow").attr("target", "_blank"); comments.call(replaceAvatars); } @@ -64390,9 +69392,9 @@ ${content} if (showThirdPartyIcons !== "true" || !osm) return; var uids = {}; - _note.comments.forEach(function(d) { - if (d.uid) - uids[d.uid] = true; + _note.comments.forEach(function(d2) { + if (d2.uid) + uids[d2.uid] = true; }); Object.keys(uids).forEach(function(uid) { osm.loadUser(uid, function(err, user) { @@ -64402,15 +69404,15 @@ ${content} }); }); } - function localeDateString2(s) { - if (!s) + function localeDateString2(s2) { + if (!s2) return null; var options2 = { day: "numeric", month: "short", year: "numeric" }; - s = s.replace(/-/g, "/"); - var d = new Date(s); - if (isNaN(d.getTime())) + s2 = s2.replace(/-/g, "/"); + var d2 = new Date(s2); + if (isNaN(d2.getTime())) return null; - return d.toLocaleDateString(_mainLocalizer.localeCode(), options2); + return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2); } noteComments.note = function(val) { if (!arguments.length) @@ -64427,34 +69429,34 @@ ${content} function noteHeader(selection2) { var header = selection2.selectAll(".note-header").data( _note ? [_note] : [], - function(d) { - return d.status + d.id; + function(d2) { + return d2.status + d2.id; } ); header.exit().remove(); var headerEnter = header.enter().append("div").attr("class", "note-header"); - var iconEnter = headerEnter.append("div").attr("class", function(d) { - return "note-header-icon " + d.status; - }).classed("new", function(d) { - return d.id < 0; + var iconEnter = headerEnter.append("div").attr("class", function(d2) { + return "note-header-icon " + d2.status; + }).classed("new", function(d2) { + return d2.id < 0; }); iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-note", "note-fill")); - iconEnter.each(function(d) { + iconEnter.each(function(d2) { var statusIcon; - if (d.id < 0) { + if (d2.id < 0) { statusIcon = "#iD-icon-plus"; - } else if (d.status === "open") { + } else if (d2.status === "open") { statusIcon = "#iD-icon-close"; } else { statusIcon = "#iD-icon-apply"; } iconEnter.append("div").attr("class", "note-icon-annotation").attr("title", _t("icons.close")).call(svgIcon(statusIcon, "icon-annotation")); }); - headerEnter.append("div").attr("class", "note-header-label").html(function(d) { + headerEnter.append("div").attr("class", "note-header-label").html(function(d2) { if (_note.isNew()) { return _t.html("note.new"); } - return _t.html("note.note") + " " + d.id + " " + (d.status === "closed" ? _t.html("note.closed") : ""); + return _t.html("note.note") + " " + d2.id + " " + (d2.status === "closed" ? _t.html("note.closed") : ""); }); } noteHeader.note = function(val) { @@ -64476,8 +69478,8 @@ ${content} } var link2 = selection2.selectAll(".note-report").data(url ? [url] : []); link2.exit().remove(); - var linkEnter = link2.enter().append("a").attr("class", "note-report").attr("target", "_blank").attr("href", function(d) { - return d; + var linkEnter = link2.enter().append("a").attr("class", "note-report").attr("target", "_blank").attr("href", function(d2) { + return d2; }).call(svgIcon("#iD-icon-out-link", "inline")); linkEnter.append("span").call(_t.append("note.report")); } @@ -64492,7 +69494,7 @@ ${content} // modules/ui/note_editor.js function uiNoteEditor(context) { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var noteComments = uiNoteComments(context); var noteHeader = uiNoteHeader(); var _note; @@ -64519,23 +69521,24 @@ ${content} } function noteSaveSection(selection2) { var isSelected = _note && _note.id === context.selectedNoteID(); - var noteSave = selection2.selectAll(".note-save").data(isSelected ? [_note] : [], function(d) { - return d.status + d.id; + var noteSave = selection2.selectAll(".note-save").data(isSelected ? [_note] : [], function(d2) { + return d2.status + d2.id; }); noteSave.exit().remove(); var noteSaveEnter = noteSave.enter().append("div").attr("class", "note-save save-section cf"); noteSaveEnter.append("h4").attr("class", ".note-save-header").html(function() { return _note.isNew() ? _t.html("note.newDescription") : _t.html("note.newComment"); }); - var commentTextarea = noteSaveEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("note.inputPlaceholder")).attr("maxlength", 1e3).property("value", function(d) { - return d.newComment; + var commentTextarea = noteSaveEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("note.inputPlaceholder")).attr("maxlength", 1e3).property("value", function(d2) { + return d2.newComment; }).call(utilNoAuto).on("keydown.note-input", keydown).on("input.note-input", changeInput).on("blur.note-input", changeInput); if (!commentTextarea.empty() && _newNote) { commentTextarea.node().focus(); } noteSave = noteSaveEnter.merge(noteSave).call(userDetails).call(noteSaveButtons); function keydown(d3_event) { - if (!(d3_event.keyCode === 13 && d3_event.metaKey)) + if (!(d3_event.keyCode === 13 && // ↩ Return + d3_event.metaKey)) return; var osm = services.osm; if (!osm) @@ -64603,8 +69606,8 @@ ${content} var osm = services.osm; var hasAuth = osm && osm.authenticated(); var isSelected = _note && _note.id === context.selectedNoteID(); - var buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_note] : [], function(d) { - return d.status + d.id; + var buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_note] : [], function(d2) { + return d2.status + d2.id; }); buttonSection.exit().remove(); var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons"); @@ -64618,50 +69621,50 @@ ${content} buttonSection = buttonSection.merge(buttonEnter); buttonSection.select(".cancel-button").on("click.cancel", clickCancel); buttonSection.select(".save-button").attr("disabled", isSaveDisabled).on("click.save", clickSave); - buttonSection.select(".status-button").attr("disabled", hasAuth ? null : true).html(function(d) { - var action = d.status === "open" ? "close" : "open"; - var andComment = d.newComment ? "_comment" : ""; + buttonSection.select(".status-button").attr("disabled", hasAuth ? null : true).html(function(d2) { + var action = d2.status === "open" ? "close" : "open"; + var andComment = d2.newComment ? "_comment" : ""; return _t.html("note." + action + andComment); }).on("click.status", clickStatus); buttonSection.select(".comment-button").attr("disabled", isSaveDisabled).on("click.comment", clickComment); - function isSaveDisabled(d) { - return hasAuth && d.status === "open" && d.newComment ? null : true; + function isSaveDisabled(d2) { + return hasAuth && d2.status === "open" && d2.newComment ? null : true; } } - function clickCancel(d3_event, d) { + function clickCancel(d3_event, d2) { this.blur(); var osm = services.osm; if (osm) { - osm.removeNote(d); + osm.removeNote(d2); } context.enter(modeBrowse(context)); - dispatch10.call("change"); + dispatch14.call("change"); } - function clickSave(d3_event, d) { + function clickSave(d3_event, d2) { this.blur(); var osm = services.osm; if (osm) { - osm.postNoteCreate(d, function(err, note) { - dispatch10.call("change", note); + osm.postNoteCreate(d2, function(err, note) { + dispatch14.call("change", note); }); } } - function clickStatus(d3_event, d) { + function clickStatus(d3_event, d2) { this.blur(); var osm = services.osm; if (osm) { - var setStatus = d.status === "open" ? "closed" : "open"; - osm.postNoteUpdate(d, setStatus, function(err, note) { - dispatch10.call("change", note); + var setStatus = d2.status === "open" ? "closed" : "open"; + osm.postNoteUpdate(d2, setStatus, function(err, note) { + dispatch14.call("change", note); }); } } - function clickComment(d3_event, d) { + function clickComment(d3_event, d2) { this.blur(); var osm = services.osm; if (osm) { - osm.postNoteUpdate(d, d.status, function(err, note) { - dispatch10.call("change", note); + osm.postNoteUpdate(d2, d2.status, function(err, note) { + dispatch14.call("change", note); }); } } @@ -64677,12 +69680,12 @@ ${content} _newNote = val; return noteEditor; }; - return utilRebind(noteEditor, dispatch10, "on"); + return utilRebind(noteEditor, dispatch14, "on"); } // modules/ui/source_switch.js function uiSourceSwitch(context) { - var keys; + var keys2; function click(d3_event) { d3_event.preventDefault(); var osm = context.connection(); @@ -64698,15 +69701,15 @@ ${content} context.history().clearSaved(); context.flush(); select_default2(this).html(isLive ? _t.html("source_switch.live") : _t.html("source_switch.dev")).classed("live", isLive).classed("chip", isLive); - osm.switch(isLive ? keys[0] : keys[1]); + osm.switch(isLive ? keys2[0] : keys2[1]); } var sourceSwitch = function(selection2) { selection2.append("a").attr("href", "#").call(_t.append("source_switch.live")).attr("class", "live chip").on("click", click); }; - sourceSwitch.keys = function(_) { + sourceSwitch.keys = function(_2) { if (!arguments.length) - return keys; - keys = _; + return keys2; + keys2 = _2; return sourceSwitch; }; return sourceSwitch; @@ -64735,12 +69738,12 @@ ${content} let thirdPartyIconsEnter = selection2.select(".privacy-options-list").selectAll(".privacy-third-party-icons-item").data([corePreferences("preferences.privacy.thirdpartyicons") || "true"]).enter().append("li").attr("class", "privacy-third-party-icons-item").append("label").call( uiTooltip().title(() => _t.append("preferences.privacy.third_party_icons.tooltip")).placement("bottom") ); - thirdPartyIconsEnter.append("input").attr("type", "checkbox").on("change", (d3_event, d) => { + thirdPartyIconsEnter.append("input").attr("type", "checkbox").on("change", (d3_event, d2) => { d3_event.preventDefault(); - corePreferences("preferences.privacy.thirdpartyicons", d === "true" ? "false" : "true"); + corePreferences("preferences.privacy.thirdpartyicons", d2 === "true" ? "false" : "true"); }); thirdPartyIconsEnter.append("span").call(_t.append("preferences.privacy.third_party_icons.description")); - selection2.selectAll(".privacy-third-party-icons-item").classed("active", (d) => d === "true").select("input").property("checked", (d) => d === "true"); + selection2.selectAll(".privacy-third-party-icons-item").classed("active", (d2) => d2 === "true").select("input").property("checked", (d2) => d2 === "true"); selection2.selectAll(".privacy-link").data([0]).enter().append("div").attr("class", "privacy-link").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/release/PRIVACY.md").append("span").call(_t.append("preferences.privacy.privacy_link")); } corePreferences.onChange("preferences.privacy.thirdpartyicons", section.reRender); @@ -64840,23 +69843,23 @@ ${content} } // node_modules/osm-community-index/lib/simplify.js - var import_diacritics3 = __toESM(require_diacritics(), 1); - function simplify2(str2) { + var import_diacritics2 = __toESM(require_diacritics(), 1); + function simplify(str2) { if (typeof str2 !== "string") return ""; - return import_diacritics3.default.remove( - str2.replace(/&/g, "and").replace(/İ/ig, "i").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\u200b-\u200f\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\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase() + return import_diacritics2.default.remove( + str2.replace(/&/g, "and").replace(/(İ|i̇)/ig, "i").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\u2000-\u206f\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e7f\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\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase() ); } // node_modules/osm-community-index/lib/resolve_strings.js - function resolveStrings(item, defaults2, localizerFn) { + function resolveStrings(item, defaults, localizerFn) { let itemStrings = Object.assign({}, item.strings); - let defaultStrings = Object.assign({}, defaults2[item.type]); + let defaultStrings = Object.assign({}, defaults[item.type]); const anyToken = new RegExp(/(\{\w+\})/, "gi"); if (localizerFn) { if (itemStrings.community) { - const communityID = simplify2(itemStrings.community); + const communityID = simplify(itemStrings.community); itemStrings.community = localizerFn(`_communities.${communityID}`); } ["name", "description", "extendedDescription"].forEach((prop) => { @@ -64891,10 +69894,10 @@ ${content} resolved.descriptionHTML = resolve(itemStrings.description || defaultStrings.description, true); resolved.extendedDescriptionHTML = resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription, true); return resolved; - function resolve(s, addLinks) { - if (!s) + function resolve(s2, addLinks) { + if (!s2) return void 0; - let result = s; + let result = s2; for (let key in replacements) { const token = `{${key}}`; const regex = new RegExp(token, "g"); @@ -64931,7 +69934,7 @@ ${content} var _oci = null; function uiSuccess(context) { const MAXEVENTS = 2; - const dispatch10 = dispatch_default("cancel"); + const dispatch14 = dispatch_default("cancel"); let _changeset2; let _location; ensureOSMCommunityIndex(); @@ -64945,11 +69948,11 @@ ${content} if (_oci) return _oci; if (vals[0] && Array.isArray(vals[0].features)) { - _mainLocations.mergeCustomGeoJSON(vals[0]); + _sharedLocationManager.mergeCustomGeoJSON(vals[0]); } let ociResources = Object.values(vals[1].resources); if (ociResources.length) { - return _mainLocations.mergeLocationSets(ociResources).then(() => { + return _sharedLocationManager.mergeLocationSets(ociResources).then(() => { _oci = { resources: ociResources, defaults: vals[2].defaults @@ -64959,6 +69962,7 @@ ${content} } else { _oci = { resources: [], + // no resources? defaults: vals[2].defaults }; return _oci; @@ -64980,7 +69984,7 @@ ${content} function success(selection2) { let header = selection2.append("div").attr("class", "header fillL"); header.append("h2").call(_t.append("success.just_edited")); - header.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => dispatch10.call("cancel")).call(svgIcon("#iD-icon-close")); + header.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => dispatch14.call("cancel")).call(svgIcon("#iD-icon-close")); let body = selection2.append("div").attr("class", "body save-success fillL"); let summary = body.append("div").attr("class", "save-summary"); summary.append("h3").call(_t.append("success.thank_you" + (_location ? "_location" : ""), { where: _location })); @@ -64999,10 +70003,10 @@ ${content} })); ensureOSMCommunityIndex().then((oci) => { const loc = context.map().center(); - const validLocations = _mainLocations.locationsAt(loc); + const validHere = _sharedLocationManager.locationSetsAt(loc); let communities = []; oci.resources.forEach((resource) => { - let area = validLocations[resource.locationSetID]; + let area = validHere[resource.locationSetID]; if (!area) return; const localizer = (stringID) => _t.html(`community.${stringID}`); @@ -65013,8 +70017,8 @@ ${content} resource }); }); - communities.sort((a, b) => a.area - b.area || b.order - a.order); - body.call(showCommunityLinks, communities.map((c) => c.resource)); + communities.sort((a2, b2) => a2.area - b2.area || b2.order - a2.order); + body.call(showCommunityLinks, communities.map((c2) => c2.resource)); }); } function showCommunityLinks(selection2, resources) { @@ -65023,44 +70027,44 @@ ${content} let table = communityLinks.append("table").attr("class", "community-table"); let row = table.selectAll(".community-row").data(resources); let rowEnter = row.enter().append("tr").attr("class", "community-row"); - rowEnter.append("td").attr("class", "cell-icon community-icon").append("a").attr("target", "_blank").attr("href", (d) => d.resolved.url).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", (d) => `#community-${d.type}`); + rowEnter.append("td").attr("class", "cell-icon community-icon").append("a").attr("target", "_blank").attr("href", (d2) => d2.resolved.url).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", (d2) => `#community-${d2.type}`); let communityDetail = rowEnter.append("td").attr("class", "cell-detail community-detail"); communityDetail.each(showCommunityDetails); communityLinks.append("div").attr("class", "community-missing").call(_t.append("success.missing")).append("a").attr("class", "link-out").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmlab/osm-community-index/issues").append("span").call(_t.append("success.tell_us")); } - function showCommunityDetails(d) { + function showCommunityDetails(d2) { let selection2 = select_default2(this); - let communityID = d.id; - selection2.append("div").attr("class", "community-name").html(d.resolved.nameHTML); - selection2.append("div").attr("class", "community-description").html(d.resolved.descriptionHTML); - if (d.resolved.extendedDescriptionHTML || d.languageCodes && d.languageCodes.length) { + let communityID = d2.id; + selection2.append("div").attr("class", "community-name").html(d2.resolved.nameHTML); + selection2.append("div").attr("class", "community-description").html(d2.resolved.descriptionHTML); + if (d2.resolved.extendedDescriptionHTML || d2.languageCodes && d2.languageCodes.length) { selection2.append("div").call( - uiDisclosure(context, `community-more-${d.id}`, false).expanded(false).updatePreference(false).label(() => _t.append("success.more")).content(showMore) + uiDisclosure(context, `community-more-${d2.id}`, false).expanded(false).updatePreference(false).label(() => _t.append("success.more")).content(showMore) ); } - let nextEvents = (d.events || []).map((event) => { + let nextEvents = (d2.events || []).map((event) => { event.date = parseEventDate(event.when); return event; }).filter((event) => { - const t = event.date.getTime(); - const now3 = new Date().setHours(0, 0, 0, 0); - return !isNaN(t) && t >= now3; - }).sort((a, b) => { - return a.date < b.date ? -1 : a.date > b.date ? 1 : 0; + const t2 = event.date.getTime(); + const now3 = (/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0); + return !isNaN(t2) && t2 >= now3; + }).sort((a2, b2) => { + return a2.date < b2.date ? -1 : a2.date > b2.date ? 1 : 0; }).slice(0, MAXEVENTS); if (nextEvents.length) { selection2.append("div").call( - uiDisclosure(context, `community-events-${d.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.events")).content(showNextEvents) + uiDisclosure(context, `community-events-${d2.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.events")).content(showNextEvents) ).select(".hide-toggle").append("span").attr("class", "badge-text").text(nextEvents.length); } function showMore(selection3) { let more = selection3.selectAll(".community-more").data([0]); let moreEnter = more.enter().append("div").attr("class", "community-more"); - if (d.resolved.extendedDescriptionHTML) { - moreEnter.append("div").attr("class", "community-extended-description").html(d.resolved.extendedDescriptionHTML); + if (d2.resolved.extendedDescriptionHTML) { + moreEnter.append("div").attr("class", "community-extended-description").html(d2.resolved.extendedDescriptionHTML); } - if (d.languageCodes && d.languageCodes.length) { - const languageList = d.languageCodes.map((code) => _mainLocalizer.languageName(code)).join(", "); + if (d2.languageCodes && d2.languageCodes.length) { + const languageList = d2.languageCodes.map((code) => _mainLocalizer.languageName(code)).join(", "); moreEnter.append("div").attr("class", "community-languages").call(_t.append("success.languages", { languages: languageList })); } } @@ -65068,32 +70072,32 @@ ${content} let events = selection3.append("div").attr("class", "community-events"); let item = events.selectAll(".community-event").data(nextEvents); let itemEnter = item.enter().append("div").attr("class", "community-event"); - itemEnter.append("div").attr("class", "community-event-name").append("a").attr("target", "_blank").attr("href", (d2) => d2.url).text((d2) => { - let name = d2.name; - if (d2.i18n && d2.id) { - name = _t(`community.${communityID}.events.${d2.id}.name`, { default: name }); + itemEnter.append("div").attr("class", "community-event-name").append("a").attr("target", "_blank").attr("href", (d4) => d4.url).text((d4) => { + let name = d4.name; + if (d4.i18n && d4.id) { + name = _t(`community.${communityID}.events.${d4.id}.name`, { default: name }); } return name; }); - itemEnter.append("div").attr("class", "community-event-when").text((d2) => { + itemEnter.append("div").attr("class", "community-event-when").text((d4) => { let options2 = { weekday: "short", day: "numeric", month: "short", year: "numeric" }; - if (d2.date.getHours() || d2.date.getMinutes()) { + if (d4.date.getHours() || d4.date.getMinutes()) { options2.hour = "numeric"; options2.minute = "numeric"; } - return d2.date.toLocaleString(_mainLocalizer.localeCode(), options2); + return d4.date.toLocaleString(_mainLocalizer.localeCode(), options2); }); - itemEnter.append("div").attr("class", "community-event-where").text((d2) => { - let where = d2.where; - if (d2.i18n && d2.id) { - where = _t(`community.${communityID}.events.${d2.id}.where`, { default: where }); + itemEnter.append("div").attr("class", "community-event-where").text((d4) => { + let where = d4.where; + if (d4.i18n && d4.id) { + where = _t(`community.${communityID}.events.${d4.id}.where`, { default: where }); } return where; }); - itemEnter.append("div").attr("class", "community-event-description").text((d2) => { - let description = d2.description; - if (d2.i18n && d2.id) { - description = _t(`community.${communityID}.events.${d2.id}.description`, { default: description }); + itemEnter.append("div").attr("class", "community-event-description").text((d4) => { + let description = d4.description; + if (d4.i18n && d4.id) { + description = _t(`community.${communityID}.events.${d4.id}.description`, { default: description }); } return description; }); @@ -65111,7 +70115,7 @@ ${content} _location = val; return success; }; - return utilRebind(success, dispatch10, "on"); + return utilRebind(success, dispatch14, "on"); } // modules/ui/version.js @@ -65190,29 +70194,29 @@ ${content} context.map().zoomOutFurther(); } return function(selection2) { - var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function(d) { - if (d.disabled()) { - return d.disabledTitle; + var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function(d2) { + if (d2.disabled()) { + return d2.disabledTitle; } - return d.title; - }).keys(function(d) { - return [d.key]; + return d2.title; + }).keys(function(d2) { + return [d2.key]; }); var lastPointerUpType; - var buttons = selection2.selectAll("button").data(zooms).enter().append("button").attr("class", function(d) { - return d.id; + var buttons = selection2.selectAll("button").data(zooms).enter().append("button").attr("class", function(d2) { + return d2.id; }).on("pointerup.editor", function(d3_event) { lastPointerUpType = d3_event.pointerType; - }).on("click.editor", function(d3_event, d) { - if (!d.disabled()) { - d.action(d3_event); + }).on("click.editor", function(d3_event, d2) { + if (!d2.disabled()) { + d2.action(d3_event); } else if (lastPointerUpType === "touch" || lastPointerUpType === "pen") { - context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass("disabled").label(d.disabledTitle)(); + context.ui().flash.duration(2e3).iconName("#" + d2.icon).iconClass("disabled").label(d2.disabledTitle)(); } lastPointerUpType = null; }).call(tooltipBehavior); - buttons.each(function(d) { - select_default2(this).call(svgIcon("#" + d.icon, "light")); + buttons.each(function(d2) { + select_default2(this).call(svgIcon("#" + d2.icon, "light")); }); utilKeybinding.plusKeys.forEach(function(key) { context.keybinding().on([key], zoomIn); @@ -65223,8 +70227,8 @@ ${content} context.keybinding().on([uiCmd("\u2325" + key)], zoomOutFurther); }); function updateButtonStates() { - buttons.classed("disabled", function(d) { - return d.disabled(); + buttons.classed("disabled", function(d2) { + return d2.disabled(); }).each(function() { var selection3 = select_default2(this); if (!selection3.select(".tooltip.in").empty()) { @@ -65240,17 +70244,22 @@ ${content} // modules/ui/sections/raw_tag_editor.js function uiSectionRawTagEditor(id2, context) { var section = uiSection(id2, context).classes("raw-tag-editor").label(function() { - var count = Object.keys(_tags).filter(function(d) { - return d; + var count = Object.keys(_tags).filter(function(d2) { + return d2; }).length; return _t.append("inspector.title_count", { title: _t("inspector.tags"), count }); }).expandedByDefault(false).disclosureContent(renderDisclosureContent); var taginfo = services.taginfo; - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); var availableViews = [ { id: "list", icon: "#fas-th-list" }, { id: "text", icon: "#fas-i-cursor" } ]; + let _discardTags = {}; + _mainFileFetcher.get("discarded").then((d2) => { + _discardTags = d2; + }).catch(() => { + }); var _tagView = corePreferences("raw-tag-editor-view") || "list"; var _readOnlyTags = []; var _orderedKeys = []; @@ -65270,11 +70279,11 @@ ${content} }); var all = Object.keys(_tags).sort(); var missingKeys = utilArrayDifference(all, _orderedKeys); - for (var i2 in missingKeys) { - _orderedKeys.push(missingKeys[i2]); + for (var i3 in missingKeys) { + _orderedKeys.push(missingKeys[i3]); } - var rowData = _orderedKeys.map(function(key, i3) { - return { index: i3, key, value: _tags[key] }; + var rowData = _orderedKeys.map(function(key, i4) { + return { index: i4, key, value: _tags[key] }; }); if (!rowData.length || _showBlank) { _showBlank = false; @@ -65283,27 +70292,27 @@ ${content} var options2 = wrap2.selectAll(".raw-tag-options").data([0]); options2.exit().remove(); var optionsEnter = options2.enter().insert("div", ":first-child").attr("class", "raw-tag-options").attr("role", "tablist"); - var optionEnter = optionsEnter.selectAll(".raw-tag-option").data(availableViews, function(d) { - return d.id; + var optionEnter = optionsEnter.selectAll(".raw-tag-option").data(availableViews, function(d2) { + return d2.id; }).enter(); - optionEnter.append("button").attr("class", function(d) { - return "raw-tag-option raw-tag-option-" + d.id + (_tagView === d.id ? " selected" : ""); - }).attr("aria-selected", function(d) { - return _tagView === d.id; - }).attr("role", "tab").attr("title", function(d) { - return _t("icons." + d.id); - }).on("click", function(d3_event, d) { - _tagView = d.id; - corePreferences("raw-tag-editor-view", d.id); + optionEnter.append("button").attr("class", function(d2) { + return "raw-tag-option raw-tag-option-" + d2.id + (_tagView === d2.id ? " selected" : ""); + }).attr("aria-selected", function(d2) { + return _tagView === d2.id; + }).attr("role", "tab").attr("title", function(d2) { + return _t("icons." + d2.id); + }).on("click", function(d3_event, d2) { + _tagView = d2.id; + corePreferences("raw-tag-editor-view", d2.id); wrap2.selectAll(".raw-tag-option").classed("selected", function(datum2) { - return datum2 === d; + return datum2 === d2; }).attr("aria-selected", function(datum2) { - return datum2 === d; + return datum2 === d2; }); - wrap2.selectAll(".tag-text").classed("hide", d.id !== "text").each(setTextareaHeight); - wrap2.selectAll(".tag-list, .add-row").classed("hide", d.id !== "list"); - }).each(function(d) { - select_default2(this).call(svgIcon(d.icon)); + wrap2.selectAll(".tag-text").classed("hide", d2.id !== "text").each(setTextareaHeight); + wrap2.selectAll(".tag-list, .add-row").classed("hide", d2.id !== "list"); + }).each(function(d2) { + select_default2(this).call(svgIcon(d2.icon)); }); var textData = rowsToText(rowData); var textarea = wrap2.selectAll(".tag-text").data([0]); @@ -65315,8 +70324,8 @@ ${content} addRowEnter.append("button").attr("class", "add-tag").attr("aria-label", _t("inspector.add_to_tag")).call(svgIcon("#iD-icon-plus", "light")).call(uiTooltip().title(() => _t.append("inspector.add_to_tag")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left")).on("click", addTag); addRowEnter.append("div").attr("class", "space-value"); addRowEnter.append("div").attr("class", "space-buttons"); - var items = list.selectAll(".tag-row").data(rowData, function(d) { - return d.key; + var items = list.selectAll(".tag-row").data(rowData, function(d2) { + return d2.key; }); items.exit().each(unbind).remove(); var itemsEnter = items.enter().append("li").attr("class", "tag-row").classed("readonly", isReadOnly); @@ -65324,19 +70333,19 @@ ${content} innerWrap.append("div").attr("class", "key-wrap").append("input").property("type", "text").attr("class", "key").call(utilNoAuto).on("focus", interacted).on("blur", keyChange).on("change", keyChange); innerWrap.append("div").attr("class", "value-wrap").append("input").property("type", "text").attr("class", "value").call(utilNoAuto).on("focus", interacted).on("blur", valueChange).on("change", valueChange).on("keydown.push-more", pushMore); innerWrap.append("button").attr("class", "form-field-button remove").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")); - items = items.merge(itemsEnter).sort(function(a, b) { - return a.index - b.index; + items = items.merge(itemsEnter).sort(function(a2, b2) { + return a2.index - b2.index; }); - items.each(function(d) { + items.each(function(d2) { var row = select_default2(this); var key = row.select("input.key"); var value = row.select("input.value"); if (_entityIDs && taginfo && _state !== "hover") { bindTypeahead(key, value); } - var referenceOptions = { key: d.key }; - if (typeof d.value === "string") { - referenceOptions.value = d.value; + var referenceOptions = { key: d2.key }; + if (typeof d2.value === "string") { + referenceOptions.value = d2.value; } var reference = uiTagReference(referenceOptions, context); if (_state === "hover") { @@ -65346,29 +70355,37 @@ ${content} row.call(reference.body); row.select("button.remove"); }); - items.selectAll("input.key").attr("title", function(d) { - return d.key; - }).call(utilGetSetValue, function(d) { - return d.key; - }).attr("readonly", function(d) { - return isReadOnly(d) || null; - }); - items.selectAll("input.value").attr("title", function(d) { - return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : d.value; - }).classed("mixed", function(d) { - return Array.isArray(d.value); - }).attr("placeholder", function(d) { - return typeof d.value === "string" ? null : _t("inspector.multiple_values"); - }).call(utilGetSetValue, function(d) { - return typeof d.value === "string" ? d.value : ""; - }).attr("readonly", function(d) { - return isReadOnly(d) || null; - }); - items.selectAll("button.remove").on(("PointerEvent" in window ? "pointer" : "mouse") + "down", removeTag); - } - function isReadOnly(d) { - for (var i2 = 0; i2 < _readOnlyTags.length; i2++) { - if (d.key.match(_readOnlyTags[i2]) !== null) { + items.selectAll("input.key").attr("title", function(d2) { + return d2.key; + }).call(utilGetSetValue, function(d2) { + return d2.key; + }).attr("readonly", function(d2) { + return isReadOnly(d2) || null; + }); + items.selectAll("input.value").attr("title", function(d2) { + return Array.isArray(d2.value) ? d2.value.filter(Boolean).join("\n") : d2.value; + }).classed("mixed", function(d2) { + return Array.isArray(d2.value); + }).attr("placeholder", function(d2) { + return typeof d2.value === "string" ? null : _t("inspector.multiple_values"); + }).call(utilGetSetValue, function(d2) { + return typeof d2.value === "string" ? d2.value : ""; + }).attr("readonly", function(d2) { + return isReadOnly(d2) || null; + }); + items.selectAll("button.remove").on( + ("PointerEvent" in window ? "pointer" : "mouse") + "down", + // 'click' fires too late - #5878 + (d3_event, d2) => { + if (d3_event.button !== 0) + return; + removeTag(d3_event, d2); + } + ); + } + function isReadOnly(d2) { + for (var i3 = 0; i3 < _readOnlyTags.length; i3++) { + if (d2.key.match(_readOnlyTags[i3]) !== null) { return true; } } @@ -65383,19 +70400,19 @@ ${content} var lineHeight = 20; selection2.style("height", lineCount * lineHeight + "px"); } - function stringify3(s) { - return JSON.stringify(s).slice(1, -1); + function stringify3(s2) { + return JSON.stringify(s2).slice(1, -1); } - function unstringify(s) { + function unstringify(s2) { var leading = ""; var trailing = ""; - if (s.length < 1 || s.charAt(0) !== '"') { + if (s2.length < 1 || s2.charAt(0) !== '"') { leading = '"'; } - if (s.length < 2 || s.charAt(s.length - 1) !== '"' || s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === "\\") { + if (s2.length < 2 || s2.charAt(s2.length - 1) !== '"' || s2.charAt(s2.length - 1) === '"' && s2.charAt(s2.length - 2) === "\\") { trailing = '"'; } - return JSON.parse(leading + s + trailing); + return JSON.parse(leading + s2 + trailing); } function rowsToText(rows) { var str2 = rows.filter(function(row) { @@ -65416,11 +70433,11 @@ ${content} var newText = this.value.trim(); var newTags = {}; newText.split("\n").forEach(function(row) { - var m = row.match(/^\s*([^=]+)=(.*)$/); - if (m !== null) { - var k = context.cleanTagKey(unstringify(m[1].trim())); - var v = context.cleanTagValue(unstringify(m[2].trim())); - newTags[k] = v; + var m2 = row.match(/^\s*([^=]+)=(.*)$/); + if (m2 !== null) { + var k2 = context.cleanTagKey(unstringify(m2[1].trim())); + var v2 = context.cleanTagValue(unstringify(m2[2].trim())); + newTags[k2] = v2; } }); var tagDiff = utilTagDiff(_tags, newTags); @@ -65475,9 +70492,7 @@ ${content} query: value2 }, function(err, data) { if (!err) { - var filtered = data.filter(function(d) { - return _tags[d.value] === void 0; - }); + const filtered = data.filter((d2) => _tags[d2.value] === void 0).filter((d2) => !(d2.value in _discardTags)).filter((d2) => d2.value.toLowerCase().includes(value2.toLowerCase())); callback(sort(value2, filtered)); } }); @@ -65489,18 +70504,20 @@ ${content} geometry, query: value2 }, function(err, data) { - if (!err) - callback(sort(value2, data)); + if (!err) { + const filtered = data.filter((d2) => d2.value.toLowerCase().includes(value2.toLowerCase())); + callback(sort(value2, filtered)); + } }); - })); + }).caseSensitive(allowUpperCaseTagValues.test(utilGetSetValue(key)))); function sort(value2, data) { var sameletter = []; var other = []; - for (var i2 = 0; i2 < data.length; i2++) { - if (data[i2].value.substring(0, value2.length) === value2) { - sameletter.push(data[i2]); + for (var i3 = 0; i3 < data.length; i3++) { + if (data[i3].value.substring(0, value2.length) === value2) { + sameletter.push(data[i3]); } else { - other.push(data[i2]); + other.push(data[i3]); } } return sameletter.concat(other); @@ -65511,10 +70528,10 @@ ${content} row.selectAll("input.key").call(uiCombobox.off, context); row.selectAll("input.value").call(uiCombobox.off, context); } - function keyChange(d3_event, d) { + function keyChange(d3_event, d2) { if (select_default2(this).attr("readonly")) return; - var kOld = d.key; + var kOld = d2.key; if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === void 0) return; var kNew = context.cleanTagKey(this.value.trim()); @@ -65524,8 +70541,8 @@ ${content} } if (kNew && kNew !== kOld && _tags[kNew] !== void 0) { this.value = kOld; - section.selection().selectAll(".tag-list input.value").each(function(d2) { - if (d2.key === kNew) { + section.selection().selectAll(".tag-list input.value").each(function(d4) { + if (d4.key === kNew) { var input = select_default2(this).node(); input.focus(); input.select(); @@ -65549,33 +70566,33 @@ ${content} var existingKeyIndex = _orderedKeys.indexOf(kOld); if (existingKeyIndex !== -1) _orderedKeys[existingKeyIndex] = kNew; - d.key = kNew; + d2.key = kNew; this.value = kNew; scheduleChange(); } - function valueChange(d3_event, d) { - if (isReadOnly(d)) + function valueChange(d3_event, d2) { + if (isReadOnly(d2)) return; - if (typeof d.value !== "string" && !this.value) + if (typeof d2.value !== "string" && !this.value) return; - if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === void 0) + if (_pendingChange && _pendingChange.hasOwnProperty(d2.key) && _pendingChange[d2.key] === void 0) return; _pendingChange = _pendingChange || {}; - _pendingChange[d.key] = context.cleanTagValue(this.value); + _pendingChange[d2.key] = context.cleanTagValue(this.value); scheduleChange(); } - function removeTag(d3_event, d) { - if (isReadOnly(d)) + function removeTag(d3_event, d2) { + if (isReadOnly(d2)) return; - if (d.key === "") { + if (d2.key === "") { _showBlank = false; section.reRender(); } else { _orderedKeys = _orderedKeys.filter(function(key) { - return key !== d.key; + return key !== d2.key; }); _pendingChange = _pendingChange || {}; - _pendingChange[d.key] = void 0; + _pendingChange[d2.key] = void 0; scheduleChange(); } } @@ -65591,7 +70608,7 @@ ${content} window.setTimeout(function() { if (!_pendingChange) return; - dispatch10.call("change", this, entityIDs, _pendingChange); + dispatch14.call("change", this, entityIDs, _pendingChange); _pendingChange = null; }, 10); } @@ -65636,7 +70653,7 @@ ${content} _readOnlyTags = val; return section; }; - return utilRebind(section, dispatch10, "on"); + return utilRebind(section, dispatch14, "on"); } // modules/ui/data_editor.js @@ -65672,48 +70689,48 @@ ${content} // modules/ui/osmose_details.js function uiOsmoseDetails(context) { let _qaItem; - function issueString(d, type3) { - if (!d) + function issueString(d2, type2) { + if (!d2) return ""; - const s = services.osmose.getStrings(d.itemType); - return type3 in s ? s[type3] : ""; + const s2 = services.osmose.getStrings(d2.itemType); + return type2 in s2 ? s2[type2] : ""; } function osmoseDetails(selection2) { const details = selection2.selectAll(".error-details").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); details.exit().remove(); const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container"); if (issueString(_qaItem, "detail")) { const div = detailsEnter.append("div").attr("class", "qa-details-subsection"); div.append("h4").call(_t.append("QA.keepRight.detail_description")); - div.append("p").attr("class", "qa-details-description-text").html((d) => issueString(d, "detail")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); + div.append("p").attr("class", "qa-details-description-text").html((d2) => issueString(d2, "detail")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); } const detailsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection"); const elemsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection"); if (issueString(_qaItem, "fix")) { const div = detailsEnter.append("div").attr("class", "qa-details-subsection"); div.append("h4").call(_t.append("QA.osmose.fix_title")); - div.append("p").html((d) => issueString(d, "fix")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); + div.append("p").html((d2) => issueString(d2, "fix")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); } if (issueString(_qaItem, "trap")) { const div = detailsEnter.append("div").attr("class", "qa-details-subsection"); div.append("h4").call(_t.append("QA.osmose.trap_title")); - div.append("p").html((d) => issueString(d, "trap")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); + div.append("p").html((d2) => issueString(d2, "trap")).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); } const thisItem = _qaItem; - services.osmose.loadIssueDetail(_qaItem).then((d) => { - if (!d.elems || d.elems.length === 0) + services.osmose.loadIssueDetail(_qaItem).then((d2) => { + if (!d2.elems || d2.elems.length === 0) return; if (context.selectedErrorID() !== thisItem.id && context.container().selectAll(`.qaItem.osmose.hover.itemId-${thisItem.id}`).empty()) return; - if (d.detail) { + if (d2.detail) { detailsDiv.append("h4").call(_t.append("QA.osmose.detail_title")); - detailsDiv.append("p").html((d2) => d2.detail).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); + detailsDiv.append("p").html((d4) => d4.detail).selectAll("a").attr("rel", "noopener").attr("target", "_blank"); } elemsDiv.append("h4").call(_t.append("QA.osmose.elems_title")); - elemsDiv.append("ul").selectAll("li").data(d.elems).enter().append("li").append("a").attr("href", "#").attr("class", "error_entity_link").text((d2) => d2).each(function() { + elemsDiv.append("ul").selectAll("li").data(d2.elems).enter().append("li").append("a").attr("href", "#").attr("class", "error_entity_link").text((d4) => d4).each(function() { const link2 = select_default2(this); const entityID = this.textContent; const entity = context.hasEntity(entityID); @@ -65728,14 +70745,14 @@ ${content} if (!osmlayer.enabled()) { osmlayer.enabled(true); } - context.map().centerZoom(d.loc, 20); + context.map().centerZoom(d2.loc, 20); if (entity) { context.enter(modeSelect(context, [entityID])); } else { context.loadEntity(entityID, (err, result) => { if (err) return; - const entity2 = result.data.find((e) => e.id === entityID); + const entity2 = result.data.find((e3) => e3.id === entityID); if (entity2) context.enter(modeSelect(context, [entityID])); }); @@ -65752,7 +70769,7 @@ ${content} } } }); - context.features().forceVisible(d.elems); + context.features().forceVisible(d2.elems); context.map().pan([0, 0]); }).catch((err) => { console.log(err); @@ -65770,23 +70787,23 @@ ${content} // modules/ui/osmose_header.js function uiOsmoseHeader() { let _qaItem; - function issueTitle(d) { + function issueTitle(d2) { const unknown = _t("inspector.unknown"); - if (!d) + if (!d2) return unknown; - const s = services.osmose.getStrings(d.itemType); - return "title" in s ? s.title : unknown; + const s2 = services.osmose.getStrings(d2.itemType); + return "title" in s2 ? s2.title : unknown; } function osmoseHeader(selection2) { const header = selection2.selectAll(".qa-header").data( _qaItem ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); header.exit().remove(); const headerEnter = header.enter().append("div").attr("class", "qa-header"); - const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); - svgEnter.append("polygon").attr("fill", (d) => services.osmose.getColor(d.item)).attr("class", "qaItem-fill").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"); - svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : ""); + const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d2) => d2.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d2) => `preset-icon-28 qaItem ${d2.service} itemId-${d2.id} itemType-${d2.itemType}`); + svgEnter.append("polygon").attr("fill", (d2) => services.osmose.getColor(d2.item)).attr("class", "qaItem-fill").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"); + svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d2) => d2.icon ? "#" + d2.icon : ""); headerEnter.append("div").attr("class", "qa-header-label").text(issueTitle); } osmoseHeader.issue = function(val) { @@ -65808,7 +70825,7 @@ ${content} } const link2 = selection2.selectAll(".view-on-osmose").data(url ? [url] : []); link2.exit().remove(); - const linkEnter = link2.enter().append("a").attr("class", "view-on-osmose").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline")); + const linkEnter = link2.enter().append("a").attr("class", "view-on-osmose").attr("target", "_blank").attr("rel", "noopener").attr("href", (d2) => d2).call(svgIcon("#iD-icon-out-link", "inline")); linkEnter.append("span").call(_t.append("inspector.view_on_osmose")); } viewOnOsmose.what = function(val) { @@ -65822,7 +70839,7 @@ ${content} // modules/ui/osmose_editor.js function uiOsmoseEditor(context) { - const dispatch10 = dispatch_default("change"); + const dispatch14 = dispatch_default("change"); const qaDetails = uiOsmoseDetails(context); const qaHeader = uiOsmoseHeader(context); let _qaItem; @@ -65843,7 +70860,7 @@ ${content} const isShown = _qaItem && isSelected; let saveSection = selection2.selectAll(".qa-save").data( isShown ? [_qaItem] : [], - (d) => `${d.id}-${d.status || 0}` + (d2) => `${d2.id}-${d2.status || 0}` ); saveSection.exit().remove(); const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf"); @@ -65851,26 +70868,26 @@ ${content} } function qaSaveButtons(selection2) { const isSelected = _qaItem && _qaItem.id === context.selectedErrorID(); - let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id); + let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d2) => d2.status + d2.id); buttonSection.exit().remove(); const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons"); buttonEnter.append("button").attr("class", "button close-button action"); buttonEnter.append("button").attr("class", "button ignore-button action"); buttonSection = buttonSection.merge(buttonEnter); - buttonSection.select(".close-button").call(_t.append("QA.keepRight.close")).on("click.close", function(d3_event, d) { + buttonSection.select(".close-button").call(_t.append("QA.keepRight.close")).on("click.close", function(d3_event, d2) { this.blur(); const qaService = services.osmose; if (qaService) { - d.newStatus = "done"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "done"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); - buttonSection.select(".ignore-button").call(_t.append("QA.keepRight.ignore")).on("click.ignore", function(d3_event, d) { + buttonSection.select(".ignore-button").call(_t.append("QA.keepRight.ignore")).on("click.ignore", function(d3_event, d2) { this.blur(); const qaService = services.osmose; if (qaService) { - d.newStatus = "false"; - qaService.postUpdate(d, (err, item) => dispatch10.call("change", item)); + d2.newStatus = "false"; + qaService.postUpdate(d2, (err, item) => dispatch14.call("change", item)); } }); } @@ -65880,7 +70897,7 @@ ${content} _qaItem = val; return osmoseEditor; }; - return utilRebind(osmoseEditor, dispatch10, "on"); + return utilRebind(osmoseEditor, dispatch14, "on"); } // modules/ui/sidebar.js @@ -65932,8 +70949,8 @@ ${content} var isRTL = _mainLocalizer.textDirection() === "rtl"; var scaleX = isRTL ? 0 : 1; var xMarginProperty = isRTL ? "margin-right" : "margin-left"; - var x = containerLocGetter(d3_event)[0] - dragOffset; - sidebarWidth = isRTL ? containerWidth - x : x; + var x2 = containerLocGetter(d3_event)[0] - dragOffset; + sidebarWidth = isRTL ? containerWidth - x2 : x2; var isCollapsed = selection2.classed("collapsed"); var shouldCollapse = sidebarWidth < minWidth; selection2.classed("collapsed", shouldCollapse); @@ -66003,8 +71020,8 @@ ${content} } else { errEditor = improveOsmEditor; } - context.container().selectAll(".qaItem." + datum2.service).classed("hover", function(d) { - return d.id === datum2.id; + context.container().selectAll(".qaItem." + datum2.service).classed("hover", function(d2) { + return d2.id === datum2.id; }); sidebar.show(errEditor.error(datum2)); selection2.selectAll(".sidebar-component").classed("inspector-hover", true); @@ -66101,9 +71118,9 @@ ${content} selection2.classed("collapsed", isCollapsing); } selection2.transition().style(xMarginProperty, endMargin + "px").tween("panner", function() { - var i2 = number_default(startMargin, endMargin); - return function(t) { - var dx = lastMargin - Math.round(i2(t)); + var i3 = number_default(startMargin, endMargin); + return function(t2) { + var dx = lastMargin - Math.round(i3(t2)); lastMargin = lastMargin - dx; context.ui().onResize(moveMap ? void 0 : [dx * scaleX, 0]); }; @@ -66183,9 +71200,12 @@ ${content} function modeAddArea(context, mode) { mode.id = "add-area"; var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode); - var defaultTags = { area: "yes" }; - if (mode.preset) - defaultTags = mode.preset.setTags(defaultTags, "area"); + function defaultTags(loc) { + var defaultTags2 = { area: "yes" }; + if (mode.preset) + defaultTags2 = mode.preset.setTags(defaultTags2, "area", false, loc); + return defaultTags2; + } function actionClose(wayId) { return function(graph) { return graph.replace(graph.entity(wayId).close()); @@ -66194,7 +71214,7 @@ ${content} function start2(loc) { var startGraph = context.graph(); var node = osmNode({ loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), actionAddEntity(way), @@ -66206,7 +71226,7 @@ ${content} function startFromWay(loc, edge) { var startGraph = context.graph(); var node = osmNode({ loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), actionAddEntity(way), @@ -66218,7 +71238,7 @@ ${content} } function startFromNode(node) { var startGraph = context.graph(); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(node.loc) }); context.perform( actionAddEntity(way), actionAddVertex(way.id, node.id), @@ -66239,13 +71259,16 @@ ${content} function modeAddLine(context, mode) { mode.id = "add-line"; var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode); - var defaultTags = {}; - if (mode.preset) - defaultTags = mode.preset.setTags(defaultTags, "line"); + function defaultTags(loc) { + var defaultTags2 = {}; + if (mode.preset) + defaultTags2 = mode.preset.setTags(defaultTags2, "line", false, loc); + return defaultTags2; + } function start2(loc) { var startGraph = context.graph(); var node = osmNode({ loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), actionAddEntity(way), @@ -66256,7 +71279,7 @@ ${content} function startFromWay(loc, edge) { var startGraph = context.graph(); var node = osmNode({ loc }); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(loc) }); context.perform( actionAddEntity(node), actionAddEntity(way), @@ -66267,7 +71290,7 @@ ${content} } function startFromNode(node) { var startGraph = context.graph(); - var way = osmWay({ tags: defaultTags }); + var way = osmWay({ tags: defaultTags(node.loc) }); context.perform( actionAddEntity(way), actionAddVertex(way.id, node.id) @@ -66287,11 +71310,14 @@ ${content} function modeAddPoint(context, mode) { mode.id = "add-point"; var behavior = behaviorDraw(context).on("click", add).on("clickWay", addWay).on("clickNode", addNode).on("cancel", cancel).on("finish", cancel); - var defaultTags = {}; - if (mode.preset) - defaultTags = mode.preset.setTags(defaultTags, "point"); + function defaultTags(loc) { + var defaultTags2 = {}; + if (mode.preset) + defaultTags2 = mode.preset.setTags(defaultTags2, "point", false, loc); + return defaultTags2; + } function add(loc) { - var node = osmNode({ loc, tags: defaultTags }); + var node = osmNode({ loc, tags: defaultTags(loc) }); context.perform( actionAddEntity(node), _t("operations.add.annotation.point") @@ -66299,7 +71325,7 @@ ${content} enterSelectMode(node); } function addWay(loc, edge) { - var node = osmNode({ tags: defaultTags }); + var node = osmNode({ tags: defaultTags(loc) }); context.perform( actionAddMidpoint({ loc, edge }, node), _t("operations.add.annotation.vertex") @@ -66312,13 +71338,14 @@ ${content} ); } function addNode(node) { - if (Object.keys(defaultTags).length === 0) { + const _defaultTags = defaultTags(node.loc); + if (Object.keys(_defaultTags).length === 0) { enterSelectMode(node); return; } var tags = Object.assign({}, node.tags); - for (var key in defaultTags) { - tags[key] = defaultTags[key]; + for (var key in _defaultTags) { + tags[key] = _defaultTags[key]; } context.perform( actionChangeTags(node.id, tags), @@ -66504,8 +71531,8 @@ ${content} var message = selection2.select(".modal-section.message-text"); var items = message.selectAll(".error-container").data(data); var enter = items.enter().append("div").attr("class", "error-container"); - enter.append("a").attr("class", "error-description").attr("href", "#").classed("hide-toggle", true).text(function(d) { - return d.msg || _t("save.unknown_error_details"); + enter.append("a").attr("class", "error-description").attr("href", "#").classed("hide-toggle", true).text(function(d2) { + return d2.msg || _t("save.unknown_error_details"); }).on("click", function(d3_event) { d3_event.preventDefault(); var error = select_default2(this); @@ -66515,10 +71542,10 @@ ${content} error.classed("expanded", !exp2); }); var details = enter.append("div").attr("class", "error-detail-container").style("display", "none"); - details.append("ul").attr("class", "error-detail-list").selectAll("li").data(function(d) { - return d.details || []; - }).enter().append("li").attr("class", "error-detail-item").text(function(d) { - return d; + details.append("ul").attr("class", "error-detail-list").selectAll("li").data(function(d2) { + return d2.details || []; + }).enter().append("li").attr("class", "error-detail-item").text(function(d2) { + return d2; }); items.exit().remove(); } @@ -66747,32 +71774,32 @@ ${content} context.on("enter.modes", update); update(); function update() { - var buttons = wrap2.selectAll("button.add-button").data(modes, function(d) { - return d.id; + var buttons = wrap2.selectAll("button.add-button").data(modes, function(d2) { + return d2.id; }); buttons.exit().remove(); - var buttonsEnter = buttons.enter().append("button").attr("class", function(d) { - return d.id + " add-button bar-button"; - }).on("click.mode-buttons", function(d3_event, d) { - if (!enabled(d)) + var buttonsEnter = buttons.enter().append("button").attr("class", function(d2) { + return d2.id + " add-button bar-button"; + }).on("click.mode-buttons", function(d3_event, d2) { + if (!enabled(d2)) return; var currMode = context.mode().id; if (/^draw/.test(currMode)) return; - if (d.id === currMode) { + if (d2.id === currMode) { context.enter(modeBrowse(context)); } else { - context.enter(d); + context.enter(d2); } }).call( - uiTooltip().placement("bottom").title(function(d) { - return d.description; - }).keys(function(d) { - return [d.key]; + uiTooltip().placement("bottom").title(function(d2) { + return d2.description; + }).keys(function(d2) { + return [d2.key]; }).scrollContainer(context.container().select(".top-toolbar")) ); - buttonsEnter.each(function(d) { - select_default2(this).call(svgIcon("#iD-icon-" + d.button)); + buttonsEnter.each(function(d2) { + select_default2(this).call(svgIcon("#iD-icon-" + d2.button)); }); buttonsEnter.append("span").attr("class", "label").text("").each(function(mode) { mode.title(select_default2(this)); @@ -66780,14 +71807,14 @@ ${content} if (buttons.enter().size() || buttons.exit().size()) { context.ui().checkOverflow(".top-toolbar", true); } - buttons = buttons.merge(buttonsEnter).attr("aria-disabled", function(d) { - return !enabled(d); - }).classed("disabled", function(d) { - return !enabled(d); - }).attr("aria-pressed", function(d) { - return context.mode() && context.mode().button === d.button; - }).classed("active", function(d) { - return context.mode() && context.mode().button === d.button; + buttons = buttons.merge(buttonsEnter).attr("aria-disabled", function(d2) { + return !enabled(d2); + }).classed("disabled", function(d2) { + return !enabled(d2); + }).attr("aria-pressed", function(d2) { + return context.mode() && context.mode().button === d2.button; + }).classed("active", function(d2) { + return context.mode() && context.mode().button === d2.button; }); } }; @@ -66829,32 +71856,32 @@ ${content} function update() { var showNotes = notesEnabled(); var data = showNotes ? [mode] : []; - var buttons = selection2.selectAll("button.add-button").data(data, function(d) { - return d.id; + var buttons = selection2.selectAll("button.add-button").data(data, function(d2) { + return d2.id; }); buttons.exit().remove(); - var buttonsEnter = buttons.enter().append("button").attr("class", function(d) { - return d.id + " add-button bar-button"; - }).on("click.notes", function(d3_event, d) { + var buttonsEnter = buttons.enter().append("button").attr("class", function(d2) { + return d2.id + " add-button bar-button"; + }).on("click.notes", function(d3_event, d2) { if (!enabled()) return; var currMode = context.mode().id; if (/^draw/.test(currMode)) return; - if (d.id === currMode) { + if (d2.id === currMode) { context.enter(modeBrowse(context)); } else { - context.enter(d); + context.enter(d2); } }).call( - uiTooltip().placement("bottom").title(function(d) { - return d.description; - }).keys(function(d) { - return [d.key]; + uiTooltip().placement("bottom").title(function(d2) { + return d2.description; + }).keys(function(d2) { + return [d2.key]; }).scrollContainer(context.container().select(".top-toolbar")) ); - buttonsEnter.each(function(d) { - select_default2(this).call(svgIcon(d.icon || "#iD-icon-" + d.button)); + buttonsEnter.each(function(d2) { + select_default2(this).call(svgIcon(d2.icon || "#iD-icon-" + d2.button)); }); if (buttons.enter().size() || buttons.exit().size()) { context.ui().checkOverflow(".top-toolbar", true); @@ -66863,10 +71890,10 @@ ${content} return !enabled(); }).attr("aria-disabled", function() { return !enabled(); - }).classed("active", function(d) { - return context.mode() && context.mode().button === d.button; - }).attr("aria-pressed", function(d) { - return context.mode() && context.mode().button === d.button; + }).classed("active", function(d2) { + return context.mode() && context.mode().button === d2.button; + }).attr("aria-pressed", function(d2) { + return context.mode() && context.mode().button === d2.button; }); } }; @@ -67006,33 +72033,36 @@ ${content} icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "undo" : "redo") }]; function editable() { - return context.mode() && context.mode().id !== "save" && context.map().editableDataEnabled(true); + return context.mode() && context.mode().id !== "save" && context.map().editableDataEnabled( + true + /* ignore min zoom */ + ); } tool.render = function(selection2) { - var tooltipBehavior = uiTooltip().placement("bottom").title(function(d) { - return d.annotation() ? _t.append(d.id + ".tooltip", { action: d.annotation() }) : _t.append(d.id + ".nothing"); - }).keys(function(d) { - return [d.cmd]; + var tooltipBehavior = uiTooltip().placement("bottom").title(function(d2) { + return d2.annotation() ? _t.append(d2.id + ".tooltip", { action: d2.annotation() }) : _t.append(d2.id + ".nothing"); + }).keys(function(d2) { + return [d2.cmd]; }).scrollContainer(context.container().select(".top-toolbar")); var lastPointerUpType; - var buttons = selection2.selectAll("button").data(commands).enter().append("button").attr("class", function(d) { - return "disabled " + d.id + "-button bar-button"; + var buttons = selection2.selectAll("button").data(commands).enter().append("button").attr("class", function(d2) { + return "disabled " + d2.id + "-button bar-button"; }).on("pointerup", function(d3_event) { lastPointerUpType = d3_event.pointerType; - }).on("click", function(d3_event, d) { + }).on("click", function(d3_event, d2) { d3_event.preventDefault(); - var annotation = d.annotation(); + var annotation = d2.annotation(); if (editable() && annotation) { - d.action(); + d2.action(); } if (editable() && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) { - var label = annotation ? _t.append(d.id + ".tooltip", { action: annotation }) : _t.append(d.id + ".nothing"); - context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass(annotation ? "" : "disabled").label(label)(); + var label = annotation ? _t.append(d2.id + ".tooltip", { action: annotation }) : _t.append(d2.id + ".nothing"); + context.ui().flash.duration(2e3).iconName("#" + d2.icon).iconClass(annotation ? "" : "disabled").label(label)(); } lastPointerUpType = null; }).call(tooltipBehavior); - buttons.each(function(d) { - select_default2(this).call(svgIcon("#" + d.icon)); + buttons.each(function(d2) { + select_default2(this).call(svgIcon("#" + d2.icon)); }); context.keybinding().on(commands[0].cmd, function(d3_event) { d3_event.preventDefault(); @@ -67051,8 +72081,8 @@ ${content} }); context.on("enter.undo_redo", update); function update() { - buttons.classed("disabled", function(d) { - return !editable() || !d.annotation(); + buttons.classed("disabled", function(d2) { + return !editable() || !d2.annotation(); }).each(function() { var selection3 = select_default2(this); if (!selection3.select(".tooltip.in").empty()) { @@ -67097,28 +72127,28 @@ ${content} tools = tools.concat([notes, "spacer"]); } tools = tools.concat([undoRedo, save]); - var toolbarItems = bar.selectAll(".toolbar-item").data(tools, function(d) { - return d.id || d; + var toolbarItems = bar.selectAll(".toolbar-item").data(tools, function(d2) { + return d2.id || d2; }); - toolbarItems.exit().each(function(d) { - if (d.uninstall) { - d.uninstall(); + toolbarItems.exit().each(function(d2) { + if (d2.uninstall) { + d2.uninstall(); } }).remove(); - var itemsEnter = toolbarItems.enter().append("div").attr("class", function(d) { - var classes = "toolbar-item " + (d.id || d).replace("_", "-"); - if (d.klass) - classes += " " + d.klass; + var itemsEnter = toolbarItems.enter().append("div").attr("class", function(d2) { + var classes = "toolbar-item " + (d2.id || d2).replace("_", "-"); + if (d2.klass) + classes += " " + d2.klass; return classes; }); - var actionableItems = itemsEnter.filter(function(d) { - return d !== "spacer"; + var actionableItems = itemsEnter.filter(function(d2) { + return d2 !== "spacer"; }); - actionableItems.append("div").attr("class", "item-content").each(function(d) { - select_default2(this).call(d.render, bar); + actionableItems.append("div").attr("class", "item-content").each(function(d2) { + select_default2(this).call(d2.render, bar); }); - actionableItems.append("div").attr("class", "item-label").each(function(d) { - d.label(select_default2(this)); + actionableItems.append("div").attr("class", "item-label").each(function(d2) { + d2.label(select_default2(this)); }); } } @@ -67261,14 +72291,14 @@ ${content} saturation: 1, sharpness: 1 }; - function clamp3(x, min3, max3) { - return Math.max(min3, Math.min(x, max3)); + function clamp3(x2, min3, max3) { + return Math.max(min3, Math.min(x2, max3)); } - function updateValue(d, val) { + function updateValue(d2, val) { val = clamp3(val, _minVal, _maxVal); - _options[d] = val; - context.background()[d](val); - if (d === "brightness") { + _options[d2] = val; + context.background()[d2](val); + if (d2 === "brightness") { corePreferences("background-opacity", val); } section.reRender(); @@ -67276,48 +72306,48 @@ ${content} function renderDisclosureContent(selection2) { var container = selection2.selectAll(".display-options-container").data([0]); var containerEnter = container.enter().append("div").attr("class", "display-options-container controls-list"); - var slidersEnter = containerEnter.selectAll(".display-control").data(_sliders).enter().append("label").attr("class", function(d) { - return "display-control display-control-" + d; + var slidersEnter = containerEnter.selectAll(".display-control").data(_sliders).enter().append("label").attr("class", function(d2) { + return "display-control display-control-" + d2; }); - slidersEnter.html(function(d) { - return _t.html("background." + d); - }).append("span").attr("class", function(d) { - return "display-option-value display-option-value-" + d; + slidersEnter.html(function(d2) { + return _t.html("background." + d2); + }).append("span").attr("class", function(d2) { + return "display-option-value display-option-value-" + d2; }); var sildersControlEnter = slidersEnter.append("div").attr("class", "control-wrap"); - sildersControlEnter.append("input").attr("class", function(d) { - return "display-option-input display-option-input-" + d; - }).attr("type", "range").attr("min", _minVal).attr("max", _maxVal).attr("step", "0.05").on("input", function(d3_event, d) { + sildersControlEnter.append("input").attr("class", function(d2) { + return "display-option-input display-option-input-" + d2; + }).attr("type", "range").attr("min", _minVal).attr("max", _maxVal).attr("step", "0.05").on("input", function(d3_event, d2) { var val = select_default2(this).property("value"); if (!val && d3_event && d3_event.target) { val = d3_event.target.value; } - updateValue(d, val); + updateValue(d2, val); }); - sildersControlEnter.append("button").attr("title", function(d) { - return `${_t("background.reset")} ${_t("background." + d)}`; - }).attr("class", function(d) { - return "display-option-reset display-option-reset-" + d; - }).on("click", function(d3_event, d) { + sildersControlEnter.append("button").attr("title", function(d2) { + return `${_t("background.reset")} ${_t("background." + d2)}`; + }).attr("class", function(d2) { + return "display-option-reset display-option-reset-" + d2; + }).on("click", function(d3_event, d2) { if (d3_event.button !== 0) return; - updateValue(d, 1); + updateValue(d2, 1); }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo"))); containerEnter.append("a").attr("class", "display-option-resetlink").attr("role", "button").attr("href", "#").call(_t.append("background.reset_all")).on("click", function(d3_event) { d3_event.preventDefault(); - for (var i2 = 0; i2 < _sliders.length; i2++) { - updateValue(_sliders[i2], 1); + for (var i3 = 0; i3 < _sliders.length; i3++) { + updateValue(_sliders[i3], 1); } }); container = containerEnter.merge(container); - container.selectAll(".display-option-input").property("value", function(d) { - return _options[d]; + container.selectAll(".display-option-input").property("value", function(d2) { + return _options[d2]; }); - container.selectAll(".display-option-value").text(function(d) { - return Math.floor(_options[d] * 100) + "%"; + container.selectAll(".display-option-value").text(function(d2) { + return Math.floor(_options[d2] * 100) + "%"; }); - container.selectAll(".display-option-reset").classed("disabled", function(d) { - return _options[d] === 1; + container.selectAll(".display-option-reset").classed("disabled", function(d2) { + return _options[d2] === 1; }); if (containerEnter.size() && _options.brightness !== 1) { context.background().brightness(_options.brightness); @@ -67328,7 +72358,7 @@ ${content} // modules/ui/settings/custom_background.js function uiSettingsCustomBackground() { - var dispatch10 = dispatch_default("change"); + var dispatch14 = dispatch_default("change"); function render(selection2) { var _origSettings = { template: corePreferences("background-custom-template") @@ -67378,10 +72408,10 @@ ${content} corePreferences("background-custom-template", _currSettings.template); this.blur(); modal.close(); - dispatch10.call("change", this, _currSettings); + dispatch14.call("change", this, _currSettings); } } - return utilRebind(render, dispatch10, "on"); + return utilRebind(render, dispatch14, "on"); } // modules/ui/sections/background_list.js @@ -67422,86 +72452,86 @@ ${content} }); locPanelLabelEnter.append("span").call(_t.append("background.location_panel.description")); selection2.selectAll(".imagery-faq").data([0]).enter().append("div").attr("class", "imagery-faq").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/develop/FAQ.md#how-can-i-report-an-issue-with-background-imagery").append("span").call(_t.append("background.imagery_problem_faq")); - _backgroundList.call(drawListItems, "radio", function(d3_event, d) { - chooseBackground(d); - }, function(d) { - return !d.isHidden() && !d.overlay; + _backgroundList.call(drawListItems, "radio", function(d3_event, d2) { + chooseBackground(d2); + }, function(d2) { + return !d2.isHidden() && !d2.overlay; }); } function setTooltips(selection2) { - selection2.each(function(d, i2, nodes) { + selection2.each(function(d2, i3, nodes) { var item = select_default2(this).select("label"); var span = item.select("span"); - var placement = i2 < nodes.length / 2 ? "bottom" : "top"; - var description = d.description(); + var placement = i3 < nodes.length / 2 ? "bottom" : "top"; + var hasDescription = d2.hasDescription(); var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth"); item.call(uiTooltip().destroyAny); - if (d.id === previousBackgroundID()) { + if (d2.id === previousBackgroundID()) { item.call( uiTooltip().placement(placement).title(() => _t.append("background.switch")).keys([uiCmd("\u2318" + _t("background.key"))]) ); - } else if (description || isOverflowing) { + } else if (hasDescription || isOverflowing) { item.call( - uiTooltip().placement(placement).title(() => description || d.label()) + uiTooltip().placement(placement).title(() => hasDescription ? d2.description() : d2.label()) ); } }); } - function drawListItems(layerList, type3, change, filter2) { - var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2).sort(function(a, b) { - return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0; + function drawListItems(layerList, type2, change, filter2) { + var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2).sort(function(a2, b2) { + return a2.best() && !b2.best() ? -1 : b2.best() && !a2.best() ? 1 : descending(a2.area(), b2.area()) || ascending(a2.name(), b2.name()) || 0; }); - var layerLinks = layerList.selectAll("li").data(sources, function(d, i2) { - return d.id + "---" + i2; + var layerLinks = layerList.selectAll("li").data(sources, function(d2, i3) { + return d2.id + "---" + i3; }); layerLinks.exit().remove(); - var enter = layerLinks.enter().append("li").classed("layer-custom", function(d) { - return d.id === "custom"; - }).classed("best", function(d) { - return d.best(); + var enter = layerLinks.enter().append("li").classed("layer-custom", function(d2) { + return d2.id === "custom"; + }).classed("best", function(d2) { + return d2.best(); }); var label = enter.append("label"); - label.append("input").attr("type", type3).attr("name", "background-layer").attr("value", function(d) { - return d.id; + label.append("input").attr("type", type2).attr("name", "background-layer").attr("value", function(d2) { + return d2.id; }).on("change", change); - label.append("span").each(function(d) { - d.label()(select_default2(this)); + label.append("span").each(function(d2) { + d2.label()(select_default2(this)); }); - enter.filter(function(d) { - return d.id === "custom"; + enter.filter(function(d2) { + return d2.id === "custom"; }).append("button").attr("class", "layer-browse").call( uiTooltip().title(() => _t.append("settings.custom_background.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") ).on("click", function(d3_event) { d3_event.preventDefault(); editCustom(); }).call(svgIcon("#iD-icon-more")); - enter.filter(function(d) { - return d.best(); + enter.filter(function(d2) { + return d2.best(); }).append("div").attr("class", "best").call( uiTooltip().title(() => _t.append("background.best_imagery")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") ).append("span").text("\u2605"); layerList.call(updateLayerSelections); } function updateLayerSelections(selection2) { - function active(d) { - return context.background().showsLayer(d); + function active(d2) { + return context.background().showsLayer(d2); } - selection2.selectAll("li").classed("active", active).classed("switch", function(d) { - return d.id === previousBackgroundID(); + selection2.selectAll("li").classed("active", active).classed("switch", function(d2) { + return d2.id === previousBackgroundID(); }).call(setTooltips).selectAll("input").property("checked", active); } - function chooseBackground(d) { - if (d.id === "custom" && !d.template()) { + function chooseBackground(d2) { + if (d2.id === "custom" && !d2.template()) { return editCustom(); } var previousBackground = context.background().baseLayerSource(); corePreferences("background-last-used-toggle", previousBackground.id); - corePreferences("background-last-used", d.id); - context.background().baseLayerSource(d); + corePreferences("background-last-used", d2.id); + context.background().baseLayerSource(d2); } - function customChanged(d) { - if (d && d.template) { - _customSource.template(d.template); + function customChanged(d2) { + if (d2 && d2.template) { + _customSource.template(d2.template); chooseBackground(_customSource); } else { _customSource.template(""); @@ -67535,34 +72565,34 @@ ${content} ]; function updateValue() { var meters = geoOffsetToMeters(context.background().offset()); - var x = +meters[0].toFixed(2); - var y = +meters[1].toFixed(2); - context.container().selectAll(".nudge-inner-rect").select("input").classed("error", false).property("value", x + ", " + y); + var x2 = +meters[0].toFixed(2); + var y2 = +meters[1].toFixed(2); + context.container().selectAll(".nudge-inner-rect").select("input").classed("error", false).property("value", x2 + ", " + y2); context.container().selectAll(".nudge-reset").classed("disabled", function() { - return x === 0 && y === 0; + return x2 === 0 && y2 === 0; }); } function resetOffset() { context.background().offset([0, 0]); updateValue(); } - function nudge(d) { - context.background().nudge(d, context.map().zoom()); + function nudge(d2) { + context.background().nudge(d2, context.map().zoom()); updateValue(); } function inputOffset() { var input = select_default2(this); - var d = input.node().value; - if (d === "") + var d2 = input.node().value; + if (d2 === "") return resetOffset(); - d = d.replace(/;/g, ",").split(",").map(function(n2) { - return !isNaN(n2) && n2; + d2 = d2.replace(/;/g, ",").split(",").map(function(n3) { + return !isNaN(n3) && n3; }); - if (d.length !== 2 || !d[0] || !d[1]) { + if (d2.length !== 2 || !d2[0] || !d2[1]) { input.classed("error", true); return; } - context.background().offset(geoMetersToOffset(d)); + context.background().offset(geoMetersToOffset(d2)); updateValue(); } function dragOffset(d3_event) { @@ -67579,12 +72609,12 @@ ${content} if (pointerId !== (d3_event2.pointerId || "mouse")) return; var latest = [d3_event2.clientX, d3_event2.clientY]; - var d = [ + var d2 = [ -(origin[0] - latest[0]) / 4, -(origin[1] - latest[1]) / 4 ]; origin = latest; - nudge(d); + nudge(d2); } function pointerup(d3_event2) { if (pointerId !== (d3_event2.pointerId || "mouse")) @@ -67602,12 +72632,12 @@ ${content} var nudgeWrapEnter = containerEnter.append("div").attr("class", "nudge-controls-wrap"); var nudgeEnter = nudgeWrapEnter.append("div").attr("class", "nudge-outer-rect").on(_pointerPrefix + "down", dragOffset); nudgeEnter.append("div").attr("class", "nudge-inner-rect").append("input").attr("type", "text").attr("aria-label", _t("background.offset_label")).on("change", inputOffset); - nudgeWrapEnter.append("div").selectAll("button").data(_directions).enter().append("button").attr("title", function(d) { - return _t(`background.nudge.${d[0]}`); - }).attr("class", function(d) { - return d[0] + " nudge"; - }).on("click", function(d3_event, d) { - nudge(d[1]); + nudgeWrapEnter.append("div").selectAll("button").data(_directions).enter().append("button").attr("title", function(d2) { + return _t(`background.nudge.${d2[0]}`); + }).attr("class", function(d2) { + return d2[0] + " nudge"; + }).on("click", function(d3_event, d2) { + nudge(d2[1]); }); nudgeWrapEnter.append("button").attr("title", _t("background.reset")).attr("class", "nudge-reset disabled").on("click", function(d3_event) { d3_event.preventDefault(); @@ -67624,55 +72654,55 @@ ${content} var section = uiSection("overlay-list", context).label(() => _t.append("background.overlays")).disclosureContent(renderDisclosureContent); var _overlayList = select_default2(null); function setTooltips(selection2) { - selection2.each(function(d, i2, nodes) { + selection2.each(function(d2, i3, nodes) { var item = select_default2(this).select("label"); var span = item.select("span"); - var placement = i2 < nodes.length / 2 ? "bottom" : "top"; - var description = d.description(); + var placement = i3 < nodes.length / 2 ? "bottom" : "top"; + var description = d2.description(); var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth"); item.call(uiTooltip().destroyAny); if (description || isOverflowing) { item.call( - uiTooltip().placement(placement).title(() => description || d.name()) + uiTooltip().placement(placement).title(() => description || d2.name()) ); } }); } function updateLayerSelections(selection2) { - function active(d) { - return context.background().showsLayer(d); + function active(d2) { + return context.background().showsLayer(d2); } selection2.selectAll("li").classed("active", active).call(setTooltips).selectAll("input").property("checked", active); } - function chooseOverlay(d3_event, d) { + function chooseOverlay(d3_event, d2) { d3_event.preventDefault(); - context.background().toggleOverlayLayer(d); + context.background().toggleOverlayLayer(d2); _overlayList.call(updateLayerSelections); document.activeElement.blur(); } - function drawListItems(layerList, type3, change, filter2) { + function drawListItems(layerList, type2, change, filter2) { var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2); - var layerLinks = layerList.selectAll("li").data(sources, function(d) { - return d.name(); + var layerLinks = layerList.selectAll("li").data(sources, function(d2) { + return d2.name(); }); layerLinks.exit().remove(); var enter = layerLinks.enter().append("li"); var label = enter.append("label"); - label.append("input").attr("type", type3).attr("name", "layers").on("change", change); - label.append("span").each(function(d) { - d.label()(select_default2(this)); + label.append("input").attr("type", type2).attr("name", "layers").on("change", change); + label.append("span").each(function(d2) { + d2.label()(select_default2(this)); }); layerList.selectAll("li").sort(sortSources); layerList.call(updateLayerSelections); - function sortSources(a, b) { - return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0; + function sortSources(a2, b2) { + return a2.best() && !b2.best() ? -1 : b2.best() && !a2.best() ? 1 : descending(a2.area(), b2.area()) || ascending(a2.name(), b2.name()) || 0; } } function renderDisclosureContent(selection2) { var container = selection2.selectAll(".layer-overlay-list").data([0]); _overlayList = container.enter().append("ul").attr("class", "layer-list layer-overlay-list").attr("dir", "auto").merge(container); - _overlayList.call(drawListItems, "checkbox", chooseOverlay, function(d) { - return !d.isHidden() && d.overlay; + _overlayList.call(drawListItems, "checkbox", chooseOverlay, function(d2) { + return !d2.isHidden() && d2.overlay; }); } context.map().on( @@ -67706,6 +72736,7 @@ ${content} "before_start", "open_source_h", "open_source", + "open_source_attribution", "open_source_help" ]], ["overview", [ @@ -67953,14 +72984,14 @@ ${content} }); var helpPane = uiPane("help", context).key(_t("help.key")).label(_t.append("help.title")).description(_t.append("help.title")).iconName("iD-icon-help"); helpPane.renderContent = function(content) { - function clickHelp(d, i2) { + function clickHelp(d2, i3) { var rtl = _mainLocalizer.textDirection() === "rtl"; content.property("scrollTop", 0); - helpPane.selection().select(".pane-heading h2").html(d.title); - body.html(d.content); + helpPane.selection().select(".pane-heading h2").html(d2.title); + body.html(d2.content); body.selectAll("a").attr("target", "_blank"); - menuItems.classed("selected", function(m) { - return m.title === d.title; + menuItems.classed("selected", function(m2) { + return m2.title === d2.title; }); nav.html(""); if (rtl) { @@ -67969,21 +73000,21 @@ ${content} nav.call(drawPrevious).call(drawNext); } function drawNext(selection2) { - if (i2 < docs.length - 1) { + if (i3 < docs.length - 1) { var nextLink = selection2.append("a").attr("href", "#").attr("class", "next").on("click", function(d3_event) { d3_event.preventDefault(); - clickHelp(docs[i2 + 1], i2 + 1); + clickHelp(docs[i3 + 1], i3 + 1); }); - nextLink.append("span").html(docs[i2 + 1].title).call(svgIcon(rtl ? "#iD-icon-backward" : "#iD-icon-forward", "inline")); + nextLink.append("span").html(docs[i3 + 1].title).call(svgIcon(rtl ? "#iD-icon-backward" : "#iD-icon-forward", "inline")); } } function drawPrevious(selection2) { - if (i2 > 0) { + if (i3 > 0) { var prevLink = selection2.append("a").attr("href", "#").attr("class", "previous").on("click", function(d3_event) { d3_event.preventDefault(); - clickHelp(docs[i2 - 1], i2 - 1); + clickHelp(docs[i3 - 1], i3 - 1); }); - prevLink.call(svgIcon(rtl ? "#iD-icon-forward" : "#iD-icon-backward", "inline")).append("span").html(docs[i2 - 1].title); + prevLink.call(svgIcon(rtl ? "#iD-icon-forward" : "#iD-icon-backward", "inline")).append("span").html(docs[i3 - 1].title); } } } @@ -67999,11 +73030,11 @@ ${content} context.container().call(context.ui().shortcuts, true); } var toc = content.append("ul").attr("class", "toc"); - var menuItems = toc.selectAll("li").data(docs).enter().append("li").append("a").attr("role", "button").attr("href", "#").html(function(d) { - return d.title; - }).on("click", function(d3_event, d) { + var menuItems = toc.selectAll("li").data(docs).enter().append("li").append("a").attr("role", "button").attr("href", "#").html(function(d2) { + return d2.title; + }).on("click", function(d3_event, d2) { d3_event.preventDefault(); - clickHelp(d, docs.indexOf(d)); + clickHelp(d2, docs.indexOf(d2)); }); var shortcuts = toc.append("li").attr("class", "shortcuts").call( uiTooltip().title(() => _t.append("shortcuts.tooltip")).keys(["?"]).placement("top") @@ -68047,8 +73078,8 @@ ${content} var extent = issue.extent(graph); var dist = extent ? geoSphericalDistance(center, extent.center()) : 0; return Object.assign(issue, { dist }); - }).sort(function byDistance(a, b) { - return a.dist - b.dist; + }).sort(function byDistance(a2, b2) { + return a2.dist - b2.dist; }); issues = issues.slice(0, 1e3); selection2.call(drawIssuesList, issues); @@ -68056,29 +73087,29 @@ ${content} function drawIssuesList(selection2, issues) { var list = selection2.selectAll(".issues-list").data([0]); list = list.enter().append("ul").attr("class", "layer-list issues-list " + severity + "s-list").merge(list); - var items = list.selectAll("li").data(issues, function(d) { - return d.key; + var items = list.selectAll("li").data(issues, function(d2) { + return d2.key; }); items.exit().remove(); - var itemsEnter = items.enter().append("li").attr("class", function(d) { - return "issue severity-" + d.severity; + var itemsEnter = items.enter().append("li").attr("class", function(d2) { + return "issue severity-" + d2.severity; }); - var labelsEnter = itemsEnter.append("button").attr("class", "issue-label").on("click", function(d3_event, d) { - context.validator().focusIssue(d); - }).on("mouseover", function(d3_event, d) { - utilHighlightEntities(d.entityIds, true, context); - }).on("mouseout", function(d3_event, d) { - utilHighlightEntities(d.entityIds, false, context); + var labelsEnter = itemsEnter.append("button").attr("class", "issue-label").on("click", function(d3_event, d2) { + context.validator().focusIssue(d2); + }).on("mouseover", function(d3_event, d2) { + utilHighlightEntities(d2.entityIds, true, context); + }).on("mouseout", function(d3_event, d2) { + utilHighlightEntities(d2.entityIds, false, context); }); var textEnter = labelsEnter.append("span").attr("class", "issue-text"); - textEnter.append("span").attr("class", "issue-icon").each(function(d) { - var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error"); + textEnter.append("span").attr("class", "issue-icon").each(function(d2) { + var iconName = "#iD-icon-" + (d2.severity === "warning" ? "alert" : "error"); select_default2(this).call(svgIcon(iconName)); }); textEnter.append("span").attr("class", "issue-message"); items = items.merge(itemsEnter).order(); - items.selectAll(".issue-message").text("").each(function(d) { - return d.message(context)(select_default2(this)); + items.selectAll(".issue-message").text("").each(function(d2) { + return d2.message(context)(select_default2(this)); }); } context.validator().on("validated.uiSectionValidationIssues" + id2, function() { @@ -68111,44 +73142,46 @@ ${content} { key: "what", values: ["edited", "all"] }, { key: "where", values: ["visible", "all"] } ]; - var options2 = container.selectAll(".issues-option").data(data, function(d) { - return d.key; + var options2 = container.selectAll(".issues-option").data(data, function(d2) { + return d2.key; }); - var optionsEnter = options2.enter().append("div").attr("class", function(d) { - return "issues-option issues-option-" + d.key; + var optionsEnter = options2.enter().append("div").attr("class", function(d2) { + return "issues-option issues-option-" + d2.key; }); - optionsEnter.append("div").attr("class", "issues-option-title").html(function(d) { - return _t.html("issues.options." + d.key + ".title"); + optionsEnter.append("div").attr("class", "issues-option-title").html(function(d2) { + return _t.html("issues.options." + d2.key + ".title"); }); - var valuesEnter = optionsEnter.selectAll("label").data(function(d) { - return d.values.map(function(val) { - return { value: val, key: d.key }; + var valuesEnter = optionsEnter.selectAll("label").data(function(d2) { + return d2.values.map(function(val) { + return { value: val, key: d2.key }; }); }).enter().append("label"); - valuesEnter.append("input").attr("type", "radio").attr("name", function(d) { - return "issues-option-" + d.key; - }).attr("value", function(d) { - return d.value; - }).property("checked", function(d) { - return getOptions()[d.key] === d.value; - }).on("change", function(d3_event, d) { - updateOptionValue(d3_event, d.key, d.value); + valuesEnter.append("input").attr("type", "radio").attr("name", function(d2) { + return "issues-option-" + d2.key; + }).attr("value", function(d2) { + return d2.value; + }).property("checked", function(d2) { + return getOptions()[d2.key] === d2.value; + }).on("change", function(d3_event, d2) { + updateOptionValue(d3_event, d2.key, d2.value); }); - valuesEnter.append("span").html(function(d) { - return _t.html("issues.options." + d.key + "." + d.value); + valuesEnter.append("span").html(function(d2) { + return _t.html("issues.options." + d2.key + "." + d2.value); }); } function getOptions() { return { what: corePreferences("validate-what") || "edited", + // 'all', 'edited' where: corePreferences("validate-where") || "all" + // 'all', 'visible' }; } - function updateOptionValue(d3_event, d, val) { + function updateOptionValue(d3_event, d2, val) { if (!val && d3_event && d3_event.target) { val = d3_event.target.value; } - corePreferences("validate-" + d, val); + corePreferences("validate-" + d2, val); context.validator().validate(); } return section; @@ -68181,25 +73214,25 @@ ${content} container = container.merge(containerEnter); container.selectAll(".issue-rules-list").call(drawListItems, _ruleKeys, "checkbox", "rule", toggleRule, isRuleEnabled); } - function drawListItems(selection2, data, type3, name, change, active) { + function drawListItems(selection2, data, type2, name, change, active) { var items = selection2.selectAll("li").data(data); items.exit().remove(); var enter = items.enter().append("li"); if (name === "rule") { enter.call( - uiTooltip().title(function(d) { - return _t.append("issues." + d + ".tip"); + uiTooltip().title(function(d2) { + return _t.append("issues." + d2 + ".tip"); }).placement("top") ); } var label = enter.append("label"); - label.append("input").attr("type", type3).attr("name", name).on("change", change); - label.append("span").html(function(d) { + label.append("input").attr("type", type2).attr("name", name).on("change", change); + label.append("span").html(function(d2) { var params = {}; - if (d === "unsquare_way") { + if (d2 === "unsquare_way") { params.val = { html: '' }; } - return _t.html("issues." + d + ".title", params); + return _t.html("issues." + d2 + ".title", params); }); items = items.merge(enter); items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false); @@ -68223,7 +73256,7 @@ ${content} function changeSquare() { var input = select_default2(this); var degStr = utilGetSetValue(input).trim(); - var degNum = parseFloat(degStr, 10); + var degNum = Number(degStr); if (!isFinite(degNum)) { degNum = DEFAULTSQUARE; } else if (degNum > MAXSQUARE) { @@ -68237,11 +73270,11 @@ ${content} corePreferences("validate-square-degrees", degStr); context.validator().revalidateUnsquare(); } - function isRuleEnabled(d) { - return context.validator().isRuleEnabled(d); + function isRuleEnabled(d2) { + return context.validator().isRuleEnabled(d2); } - function toggleRule(d3_event, d) { - context.validator().toggleRule(d); + function toggleRule(d3_event, d2) { + context.validator().toggleRule(d2); } context.validator().on("validated.uiSectionValidationRules", function() { window.requestIdleCallback(section.reRender); @@ -68288,12 +73321,12 @@ ${content} function setNoIssuesText(selection2) { var opts = getOptions(); function checkForHiddenIssues(cases) { - for (var type3 in cases) { - var hiddenOpts = cases[type3]; + for (var type2 in cases) { + var hiddenOpts = cases[type2]; var hiddenIssues = context.validator().getIssues(hiddenOpts); if (hiddenIssues.length) { selection2.select(".box .details").html("").call(_t.append( - "issues.no_issues.hidden_issues." + type3, + "issues.no_issues.hidden_issues." + type2, { count: hiddenIssues.length.toString() } )); return; @@ -68336,16 +73369,706 @@ ${content} ignored_issues: { what: "all", where: "all", includeIgnored: "only" } }); } - if (opts.what === "edited" && context.history().difference().summary().length === 0) { - messageType = "no_edits"; + if (opts.what === "edited" && context.history().difference().summary().length === 0) { + messageType = "no_edits"; + } + selection2.select(".box .message").html("").call(_t.append("issues.no_issues.message." + messageType)); + } + context.validator().on("validated.uiSectionValidationStatus", function() { + window.requestIdleCallback(section.reRender); + }); + context.map().on( + "move.uiSectionValidationStatus", + debounce_default(function() { + window.requestIdleCallback(section.reRender); + }, 1e3) + ); + return section; + } + + // modules/ui/panes/issues.js + function uiPaneIssues(context) { + var issuesPane = uiPane("issues", context).key(_t("issues.key")).label(_t.append("issues.title")).description(_t.append("issues.title")).iconName("iD-icon-alert").sections([ + uiSectionValidationOptions(context), + uiSectionValidationStatus(context), + uiSectionValidationIssues("issues-errors", "error", context), + uiSectionValidationIssues("issues-warnings", "warning", context), + uiSectionValidationRules(context) + ]); + return issuesPane; + } + + // modules/ui/settings/custom_data.js + function uiSettingsCustomData(context) { + var dispatch14 = dispatch_default("change"); + function render(selection2) { + var dataLayer = context.layers().layer("data"); + var _origSettings = { + fileList: dataLayer && dataLayer.fileList() || null, + url: corePreferences("settings-custom-data-url") + }; + var _currSettings = { + fileList: dataLayer && dataLayer.fileList() || null + // url: prefs('settings-custom-data-url') + }; + var modal = uiConfirm(selection2).okButton(); + modal.classed("settings-modal settings-custom-data", true); + modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_data.header")); + var textSection = modal.select(".modal-section.message-text"); + textSection.append("pre").attr("class", "instructions-file").call(_t.append("settings.custom_data.file.instructions")); + textSection.append("input").attr("class", "field-file").attr("type", "file").attr("accept", ".gpx,.kml,.geojson,.json,application/gpx+xml,application/vnd.google-earth.kml+xml,application/geo+json,application/json").property("files", _currSettings.fileList).on("change", function(d3_event) { + var files = d3_event.target.files; + if (files && files.length) { + _currSettings.url = ""; + textSection.select(".field-url").property("value", ""); + _currSettings.fileList = files; + } else { + _currSettings.fileList = null; + } + }); + textSection.append("h4").call(_t.append("settings.custom_data.or")); + textSection.append("pre").attr("class", "instructions-url").call(_t.append("settings.custom_data.url.instructions")); + textSection.append("textarea").attr("class", "field-url").attr("placeholder", _t("settings.custom_data.url.placeholder")).call(utilNoAuto).property("value", _currSettings.url); + var buttonSection = modal.select(".modal-section.buttons"); + buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel")); + buttonSection.select(".cancel-button").on("click.cancel", clickCancel); + buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave); + function isSaveDisabled() { + return null; + } + function clickCancel() { + textSection.select(".field-url").property("value", _origSettings.url); + corePreferences("settings-custom-data-url", _origSettings.url); + this.blur(); + modal.close(); + } + function clickSave() { + _currSettings.url = textSection.select(".field-url").property("value").trim(); + if (_currSettings.url) { + _currSettings.fileList = null; + } + if (_currSettings.fileList) { + _currSettings.url = ""; + } + corePreferences("settings-custom-data-url", _currSettings.url); + this.blur(); + modal.close(); + dispatch14.call("change", this, _currSettings); + } + } + return utilRebind(render, dispatch14, "on"); + } + + // modules/ui/sections/data_layers.js + function uiSectionDataLayers(context) { + var settingsCustomData = uiSettingsCustomData(context).on("change", customChanged); + var layers = context.layers(); + var section = uiSection("data-layers", context).label(() => _t.append("map_data.data_layers")).disclosureContent(renderDisclosureContent); + function renderDisclosureContent(selection2) { + var container = selection2.selectAll(".data-layer-container").data([0]); + container.enter().append("div").attr("class", "data-layer-container").merge(container).call(drawOsmItems).call(drawQAItems).call(drawCustomDataItems).call(drawVectorItems).call(drawPanelItems); + } + function showsLayer(which) { + var layer = layers.layer(which); + if (layer) { + return layer.enabled(); + } + return false; + } + function setLayer(which, enabled) { + var mode = context.mode(); + if (mode && /^draw/.test(mode.id)) + return; + var layer = layers.layer(which); + if (layer) { + layer.enabled(enabled); + if (!enabled && (which === "osm" || which === "notes")) { + context.enter(modeBrowse(context)); + } + } + } + function toggleLayer(which) { + setLayer(which, !showsLayer(which)); + } + function drawOsmItems(selection2) { + var osmKeys = ["osm", "notes"]; + var osmLayers = layers.all().filter(function(obj) { + return osmKeys.indexOf(obj.id) !== -1; + }); + var ul = selection2.selectAll(".layer-list-osm").data([0]); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-osm").merge(ul); + var li = ul.selectAll(".list-item").data(osmLayers); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", function(d2) { + return "list-item list-item-" + d2.id; + }); + var labelEnter = liEnter.append("label").each(function(d2) { + if (d2.id === "osm") { + select_default2(this).call( + uiTooltip().title(() => _t.append("map_data.layers." + d2.id + ".tooltip")).keys([uiCmd("\u2325" + _t("area_fill.wireframe.key"))]).placement("bottom") + ); + } else { + select_default2(this).call( + uiTooltip().title(() => _t.append("map_data.layers." + d2.id + ".tooltip")).placement("bottom") + ); + } + }); + labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d2) { + toggleLayer(d2.id); + }); + labelEnter.append("span").html(function(d2) { + return _t.html("map_data.layers." + d2.id + ".title"); + }); + li.merge(liEnter).classed("active", function(d2) { + return d2.layer.enabled(); + }).selectAll("input").property("checked", function(d2) { + return d2.layer.enabled(); + }); + } + function drawQAItems(selection2) { + var qaKeys = ["keepRight", "improveOSM", "osmose"]; + var qaLayers = layers.all().filter(function(obj) { + return qaKeys.indexOf(obj.id) !== -1; + }); + var ul = selection2.selectAll(".layer-list-qa").data([0]); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-qa").merge(ul); + var li = ul.selectAll(".list-item").data(qaLayers); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", function(d2) { + return "list-item list-item-" + d2.id; + }); + var labelEnter = liEnter.append("label").each(function(d2) { + select_default2(this).call( + uiTooltip().title(() => _t.append("map_data.layers." + d2.id + ".tooltip")).placement("bottom") + ); + }); + labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d2) { + toggleLayer(d2.id); + }); + labelEnter.append("span").each(function(d2) { + _t.append("map_data.layers." + d2.id + ".title")(select_default2(this)); + }); + li.merge(liEnter).classed("active", function(d2) { + return d2.layer.enabled(); + }).selectAll("input").property("checked", function(d2) { + return d2.layer.enabled(); + }); + } + function drawVectorItems(selection2) { + var dataLayer = layers.layer("data"); + var vtData = [ + { + name: "Detroit Neighborhoods/Parks", + src: "neighborhoods-parks", + tooltip: "Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.", + 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" + }, + { + name: "Detroit Composite POIs", + src: "composite-poi", + tooltip: "Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.", + 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" + }, + { + name: "Detroit All-The-Places POIs", + src: "alltheplaces-poi", + tooltip: "Public domain business location data created by web scrapers.", + 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" + } + ]; + var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]); + var showVectorItems = context.map().zoom() > 9 && detroit.contains(context.map().center()); + var container = selection2.selectAll(".vectortile-container").data(showVectorItems ? [0] : []); + container.exit().remove(); + var containerEnter = container.enter().append("div").attr("class", "vectortile-container"); + containerEnter.append("h4").attr("class", "vectortile-header").text("Detroit Vector Tiles (Beta)"); + containerEnter.append("ul").attr("class", "layer-list layer-list-vectortile"); + containerEnter.append("div").attr("class", "vectortile-footer").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmus/detroit-mapping-challenge").append("span").text("About these layers"); + container = container.merge(containerEnter); + var ul = container.selectAll(".layer-list-vectortile"); + var li = ul.selectAll(".list-item").data(vtData); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", function(d2) { + return "list-item list-item-" + d2.src; + }); + var labelEnter = liEnter.append("label").each(function(d2) { + select_default2(this).call( + uiTooltip().title(d2.tooltip).placement("top") + ); + }); + labelEnter.append("input").attr("type", "radio").attr("name", "vectortile").on("change", selectVTLayer); + labelEnter.append("span").text(function(d2) { + return d2.name; + }); + li.merge(liEnter).classed("active", isVTLayerSelected).selectAll("input").property("checked", isVTLayerSelected); + function isVTLayerSelected(d2) { + return dataLayer && dataLayer.template() === d2.template; + } + function selectVTLayer(d3_event, d2) { + corePreferences("settings-custom-data-url", d2.template); + if (dataLayer) { + dataLayer.template(d2.template, d2.src); + dataLayer.enabled(true); + } + } + } + function drawCustomDataItems(selection2) { + var dataLayer = layers.layer("data"); + var hasData = dataLayer && dataLayer.hasData(); + var showsData = hasData && dataLayer.enabled(); + var ul = selection2.selectAll(".layer-list-data").data(dataLayer ? [0] : []); + ul.exit().remove(); + var ulEnter = ul.enter().append("ul").attr("class", "layer-list layer-list-data"); + var liEnter = ulEnter.append("li").attr("class", "list-item-data"); + var labelEnter = liEnter.append("label").call( + uiTooltip().title(() => _t.append("map_data.layers.custom.tooltip")).placement("top") + ); + labelEnter.append("input").attr("type", "checkbox").on("change", function() { + toggleLayer("data"); + }); + labelEnter.append("span").call(_t.append("map_data.layers.custom.title")); + liEnter.append("button").attr("class", "open-data-options").call( + uiTooltip().title(() => _t.append("settings.custom_data.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") + ).on("click", function(d3_event) { + d3_event.preventDefault(); + editCustom(); + }).call(svgIcon("#iD-icon-more")); + liEnter.append("button").attr("class", "zoom-to-data").call( + uiTooltip().title(() => _t.append("map_data.layers.custom.zoom")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") + ).on("click", function(d3_event) { + if (select_default2(this).classed("disabled")) + return; + d3_event.preventDefault(); + d3_event.stopPropagation(); + dataLayer.fitZoom(); + }).call(svgIcon("#iD-icon-framed-dot", "monochrome")); + ul = ul.merge(ulEnter); + ul.selectAll(".list-item-data").classed("active", showsData).selectAll("label").classed("deemphasize", !hasData).selectAll("input").property("disabled", !hasData).property("checked", showsData); + ul.selectAll("button.zoom-to-data").classed("disabled", !hasData); + } + function editCustom() { + context.container().call(settingsCustomData); + } + function customChanged(d2) { + var dataLayer = layers.layer("data"); + if (d2 && d2.url) { + dataLayer.url(d2.url); + } else if (d2 && d2.fileList) { + dataLayer.fileList(d2.fileList); + } + } + function drawPanelItems(selection2) { + var panelsListEnter = selection2.selectAll(".md-extras-list").data([0]).enter().append("ul").attr("class", "layer-list md-extras-list"); + var historyPanelLabelEnter = panelsListEnter.append("li").attr("class", "history-panel-toggle-item").append("label").call( + uiTooltip().title(() => _t.append("map_data.history_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.history.key"))]).placement("top") + ); + historyPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) { + d3_event.preventDefault(); + context.ui().info.toggle("history"); + }); + historyPanelLabelEnter.append("span").call(_t.append("map_data.history_panel.title")); + var measurementPanelLabelEnter = panelsListEnter.append("li").attr("class", "measurement-panel-toggle-item").append("label").call( + uiTooltip().title(() => _t.append("map_data.measurement_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.measurement.key"))]).placement("top") + ); + measurementPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) { + d3_event.preventDefault(); + context.ui().info.toggle("measurement"); + }); + measurementPanelLabelEnter.append("span").call(_t.append("map_data.measurement_panel.title")); + } + context.layers().on("change.uiSectionDataLayers", section.reRender); + context.map().on( + "move.uiSectionDataLayers", + debounce_default(function() { + window.requestIdleCallback(section.reRender); + }, 1e3) + ); + return section; + } + + // modules/ui/sections/map_features.js + function uiSectionMapFeatures(context) { + var _features = context.features().keys(); + var section = uiSection("map-features", context).label(() => _t.append("map_data.map_features")).disclosureContent(renderDisclosureContent).expandedByDefault(false); + function renderDisclosureContent(selection2) { + var container = selection2.selectAll(".layer-feature-list-container").data([0]); + var containerEnter = container.enter().append("div").attr("class", "layer-feature-list-container"); + containerEnter.append("ul").attr("class", "layer-list layer-feature-list"); + var footer = containerEnter.append("div").attr("class", "feature-list-links section-footer"); + footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) { + d3_event.preventDefault(); + context.features().disableAll(); + }); + footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) { + d3_event.preventDefault(); + context.features().enableAll(); + }); + container = container.merge(containerEnter); + container.selectAll(".layer-feature-list").call(drawListItems, _features, "checkbox", "feature", clickFeature, showsFeature); + } + function drawListItems(selection2, data, type2, name, change, active) { + var items = selection2.selectAll("li").data(data); + items.exit().remove(); + var enter = items.enter().append("li").call( + uiTooltip().title(function(d2) { + var tip = _t.append(name + "." + d2 + ".tooltip"); + if (autoHiddenFeature(d2)) { + var msg = showsLayer("osm") ? _t.append("map_data.autohidden") : _t.append("map_data.osmhidden"); + return (selection3) => { + selection3.call(tip); + selection3.append("div").call(msg); + }; + } + return tip; + }).placement("top") + ); + var label = enter.append("label"); + label.append("input").attr("type", type2).attr("name", name).on("change", change); + label.append("span").html(function(d2) { + return _t.html(name + "." + d2 + ".description"); + }); + items = items.merge(enter); + items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", autoHiddenFeature); + } + function autoHiddenFeature(d2) { + return context.features().autoHidden(d2); + } + function showsFeature(d2) { + return context.features().enabled(d2); + } + function clickFeature(d3_event, d2) { + context.features().toggle(d2); + } + function showsLayer(id2) { + var layer = context.layers().layer(id2); + return layer && layer.enabled(); + } + context.features().on("change.map_features", section.reRender); + return section; + } + + // modules/ui/sections/map_style_options.js + function uiSectionMapStyleOptions(context) { + var section = uiSection("fill-area", context).label(() => _t.append("map_data.style_options")).disclosureContent(renderDisclosureContent).expandedByDefault(false); + function renderDisclosureContent(selection2) { + var container = selection2.selectAll(".layer-fill-list").data([0]); + container.enter().append("ul").attr("class", "layer-list layer-fill-list").merge(container).call(drawListItems, context.map().areaFillOptions, "radio", "area_fill", setFill, isActiveFill); + var container2 = selection2.selectAll(".layer-visual-diff-list").data([0]); + container2.enter().append("ul").attr("class", "layer-list layer-visual-diff-list").merge(container2).call(drawListItems, ["highlight_edits"], "checkbox", "visual_diff", toggleHighlightEdited, function() { + return context.surface().classed("highlight-edited"); + }); + } + function drawListItems(selection2, data, type2, name, change, active) { + var items = selection2.selectAll("li").data(data); + items.exit().remove(); + var enter = items.enter().append("li").call( + uiTooltip().title(function(d2) { + return _t.append(name + "." + d2 + ".tooltip"); + }).keys(function(d2) { + var key = d2 === "wireframe" ? _t("area_fill.wireframe.key") : null; + if (d2 === "highlight_edits") + key = _t("map_data.highlight_edits.key"); + return key ? [key] : null; + }).placement("top") + ); + var label = enter.append("label"); + label.append("input").attr("type", type2).attr("name", name).on("change", change); + label.append("span").html(function(d2) { + return _t.html(name + "." + d2 + ".description"); + }); + items = items.merge(enter); + items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false); + } + function isActiveFill(d2) { + return context.map().activeAreaFill() === d2; + } + function toggleHighlightEdited(d3_event) { + d3_event.preventDefault(); + context.map().toggleHighlightEdited(); + } + function setFill(d3_event, d2) { + context.map().activeAreaFill(d2); + } + context.map().on("changeHighlighting.ui_style, changeAreaFill.ui_style", section.reRender); + return section; + } + + // modules/ui/settings/local_photos.js + function uiSettingsLocalPhotos(context) { + var dispatch14 = dispatch_default("change"); + var photoLayer = context.layers().layer("local-photos"); + var modal; + function render(selection2) { + modal = uiConfirm(selection2).okButton(); + modal.classed("settings-modal settings-local-photos", true); + modal.select(".modal-section.header").append("h3").call(_t.append("local_photos.header")); + modal.select(".modal-section.message-text").append("div").classed("local-photos", true); + var instructionsSection = modal.select(".modal-section.message-text .local-photos").append("div").classed("instructions", true); + instructionsSection.append("p").classed("instructions-local-photos", true).call(_t.append("local_photos.file.instructions")); + instructionsSection.append("input").classed("field-file", true).attr("type", "file").attr("multiple", "multiple").attr("accept", ".jpg,.jpeg,.png,image/png,image/jpeg").style("visibility", "hidden").attr("id", "local-photo-files").on("change", function(d3_event) { + var files = d3_event.target.files; + if (files && files.length) { + photoList.select("ul").append("li").classed("placeholder", true).append("div"); + dispatch14.call("change", this, files); + } + d3_event.target.value = null; + }); + instructionsSection.append("label").attr("for", "local-photo-files").classed("button", true).call(_t.append("local_photos.file.label")); + const photoList = modal.select(".modal-section.message-text .local-photos").append("div").append("div").classed("list-local-photos", true); + photoList.append("ul"); + updatePhotoList(photoList.select("ul")); + context.layers().on("change", () => updatePhotoList(photoList.select("ul"))); + } + function updatePhotoList(container) { + function locationUnavailable(d2) { + return !(isArray_default(d2.loc) && isNumber_default(d2.loc[0]) && isNumber_default(d2.loc[1])); + } + container.selectAll("li.placeholder").remove(); + let selection2 = container.selectAll("li").data(photoLayer.getPhotos() ?? [], (d2) => d2.id); + selection2.exit().remove(); + const selectionEnter = selection2.enter().append("li"); + selectionEnter.append("span").classed("filename", true); + selectionEnter.append("button").classed("form-field-button zoom-to-data", true).attr("title", _t("local_photos.zoom_single")).call(svgIcon("#iD-icon-framed-dot")); + selectionEnter.append("button").classed("form-field-button no-geolocation", true).call(svgIcon("#iD-icon-alert")).call( + uiTooltip().title(() => _t.append("local_photos.no_geolocation.tooltip")).placement("left") + ); + selectionEnter.append("button").classed("form-field-button remove", true).attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")); + selection2 = selection2.merge(selectionEnter); + selection2.classed("invalid", locationUnavailable); + selection2.select("span.filename").text((d2) => d2.name).attr("title", (d2) => d2.name); + selection2.select("span.filename").on("click", (d3_event, d2) => { + photoLayer.openPhoto(d3_event, d2, false); + }); + selection2.select("button.zoom-to-data").on("click", (d3_event, d2) => { + photoLayer.openPhoto(d3_event, d2, true); + }); + selection2.select("button.remove").on("click", (d3_event, d2) => { + photoLayer.removePhoto(d2.id); + updatePhotoList(container); + }); + } + return utilRebind(render, dispatch14, "on"); + } + + // modules/ui/sections/photo_overlays.js + function uiSectionPhotoOverlays(context) { + var settingsLocalPhotos = uiSettingsLocalPhotos(context).on("change", localPhotosChanged); + var layers = context.layers(); + var section = uiSection("photo-overlays", context).label(() => _t.append("photo_overlays.title")).disclosureContent(renderDisclosureContent).expandedByDefault(false); + function renderDisclosureContent(selection2) { + var container = selection2.selectAll(".photo-overlay-container").data([0]); + container.enter().append("div").attr("class", "photo-overlay-container").merge(container).call(drawPhotoItems).call(drawPhotoTypeItems).call(drawDateFilter).call(drawUsernameFilter).call(drawLocalPhotos); + } + function drawPhotoItems(selection2) { + var photoKeys = context.photos().overlayLayerIDs(); + var photoLayers = layers.all().filter(function(obj) { + return photoKeys.indexOf(obj.id) !== -1; + }); + var data = photoLayers.filter(function(obj) { + if (!obj.layer.supported()) + return false; + if (layerEnabled(obj)) + return true; + if (typeof obj.layer.validHere === "function") { + return obj.layer.validHere(context.map().extent(), context.map().zoom()); + } + return true; + }); + function layerSupported(d2) { + return d2.layer && d2.layer.supported(); + } + function layerEnabled(d2) { + return layerSupported(d2) && d2.layer.enabled(); + } + function layerRendered(d2) { + return d2.layer.rendered?.(context.map().zoom()) ?? true; + } + var ul = selection2.selectAll(".layer-list-photos").data([0]); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photos").merge(ul); + var li = ul.selectAll(".list-item-photos").data(data); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", function(d2) { + var classes = "list-item-photos list-item-" + d2.id; + if (d2.id === "mapillary-signs" || d2.id === "mapillary-map-features") { + classes += " indented"; + } + return classes; + }); + var labelEnter = liEnter.append("label").each(function(d2) { + var titleID; + if (d2.id === "mapillary-signs") + titleID = "mapillary.signs.tooltip"; + else if (d2.id === "mapillary") + titleID = "mapillary_images.tooltip"; + else if (d2.id === "kartaview") + titleID = "kartaview_images.tooltip"; + else + titleID = d2.id.replace(/-/g, "_") + ".tooltip"; + select_default2(this).call( + uiTooltip().title(() => { + if (!layerRendered(d2)) { + return _t.append("street_side.minzoom_tooltip"); + } else { + return _t.append(titleID); + } + }).placement("top") + ); + }); + labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d2) { + toggleLayer(d2.id); + }); + labelEnter.append("span").html(function(d2) { + var id2 = d2.id; + if (id2 === "mapillary-signs") + id2 = "photo_overlays.traffic_signs"; + return _t.html(id2.replace(/-/g, "_") + ".title"); + }); + li.merge(liEnter).classed("active", layerEnabled).selectAll("input").property("disabled", (d2) => !layerRendered(d2)).property("checked", layerEnabled); + } + function drawPhotoTypeItems(selection2) { + var data = context.photos().allPhotoTypes(); + function typeEnabled(d2) { + return context.photos().showsPhotoType(d2); + } + var ul = selection2.selectAll(".layer-list-photo-types").data([0]); + ul.exit().remove(); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photo-types").merge(ul); + var li = ul.selectAll(".list-item-photo-types").data(context.photos().shouldFilterByPhotoType() ? data : []); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", function(d2) { + return "list-item-photo-types list-item-" + d2; + }); + var labelEnter = liEnter.append("label").each(function(d2) { + select_default2(this).call( + uiTooltip().title(() => _t.append("photo_overlays.photo_type." + d2 + ".tooltip")).placement("top") + ); + }); + labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d2) { + context.photos().togglePhotoType(d2); + }); + labelEnter.append("span").html(function(d2) { + return _t.html("photo_overlays.photo_type." + d2 + ".title"); + }); + li.merge(liEnter).classed("active", typeEnabled).selectAll("input").property("checked", typeEnabled); + } + function drawDateFilter(selection2) { + var data = context.photos().dateFilters(); + function filterEnabled(d2) { + return context.photos().dateFilterValue(d2); + } + var ul = selection2.selectAll(".layer-list-date-filter").data([0]); + ul.exit().remove(); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-date-filter").merge(ul); + var li = ul.selectAll(".list-item-date-filter").data(context.photos().shouldFilterByDate() ? data : []); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", "list-item-date-filter"); + var labelEnter = liEnter.append("label").each(function(d2) { + select_default2(this).call( + uiTooltip().title(() => _t.append("photo_overlays.date_filter." + d2 + ".tooltip")).placement("top") + ); + }); + labelEnter.append("span").each(function(d2) { + _t.append("photo_overlays.date_filter." + d2 + ".title")(select_default2(this)); + }); + labelEnter.append("input").attr("type", "date").attr("class", "list-item-input").attr("placeholder", _t("units.year_month_day")).call(utilNoAuto).each(function(d2) { + utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d2) || ""); + }).on("change", function(d3_event, d2) { + var value = utilGetSetValue(select_default2(this)).trim(); + context.photos().setDateFilter(d2, value, true); + li.selectAll("input").each(function(d4) { + utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d4) || ""); + }); + }); + li = li.merge(liEnter).classed("active", filterEnabled); + } + function drawUsernameFilter(selection2) { + function filterEnabled() { + return context.photos().usernames(); + } + var ul = selection2.selectAll(".layer-list-username-filter").data([0]); + ul.exit().remove(); + ul = ul.enter().append("ul").attr("class", "layer-list layer-list-username-filter").merge(ul); + var li = ul.selectAll(".list-item-username-filter").data(context.photos().shouldFilterByUsername() ? ["username-filter"] : []); + li.exit().remove(); + var liEnter = li.enter().append("li").attr("class", "list-item-username-filter"); + var labelEnter = liEnter.append("label").each(function() { + select_default2(this).call( + uiTooltip().title(() => _t.append("photo_overlays.username_filter.tooltip")).placement("top") + ); + }); + labelEnter.append("span").call(_t.append("photo_overlays.username_filter.title")); + labelEnter.append("input").attr("type", "text").attr("class", "list-item-input").call(utilNoAuto).property("value", usernameValue).on("change", function() { + var value = select_default2(this).property("value"); + context.photos().setUsernameFilter(value, true); + select_default2(this).property("value", usernameValue); + }); + li.merge(liEnter).classed("active", filterEnabled); + function usernameValue() { + var usernames = context.photos().usernames(); + if (usernames) + return usernames.join("; "); + return usernames; } - selection2.select(".box .message").html("").call(_t.append("issues.no_issues.message." + messageType)); } - context.validator().on("validated.uiSectionValidationStatus", function() { - window.requestIdleCallback(section.reRender); - }); + function toggleLayer(which) { + setLayer(which, !showsLayer(which)); + } + function showsLayer(which) { + var layer = layers.layer(which); + if (layer) { + return layer.enabled(); + } + return false; + } + function setLayer(which, enabled) { + var layer = layers.layer(which); + if (layer) { + layer.enabled(enabled); + } + } + function drawLocalPhotos(selection2) { + var photoLayer = layers.layer("local-photos"); + var hasData = photoLayer && photoLayer.hasData(); + var showsData = hasData && photoLayer.enabled(); + var ul = selection2.selectAll(".layer-list-local-photos").data(photoLayer ? [0] : []); + ul.exit().remove(); + var ulEnter = ul.enter().append("ul").attr("class", "layer-list layer-list-local-photos"); + var localPhotosEnter = ulEnter.append("li").attr("class", "list-item-local-photos"); + var localPhotosLabelEnter = localPhotosEnter.append("label").call(uiTooltip().title(() => _t.append("local_photos.tooltip"))); + localPhotosLabelEnter.append("input").attr("type", "checkbox").on("change", function() { + toggleLayer("local-photos"); + }); + localPhotosLabelEnter.call(_t.append("local_photos.header")); + localPhotosEnter.append("button").attr("class", "open-data-options").call( + uiTooltip().title(() => _t.append("local_photos.tooltip_edit")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") + ).on("click", function(d3_event) { + d3_event.preventDefault(); + editLocalPhotos(); + }).call(svgIcon("#iD-icon-more")); + localPhotosEnter.append("button").attr("class", "zoom-to-data").call( + uiTooltip().title(() => _t.append("local_photos.zoom")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left") + ).on("click", function(d3_event) { + if (select_default2(this).classed("disabled")) + return; + d3_event.preventDefault(); + d3_event.stopPropagation(); + photoLayer.fitZoom(); + }).call(svgIcon("#iD-icon-framed-dot", "monochrome")); + ul = ul.merge(ulEnter); + ul.selectAll(".list-item-local-photos").classed("active", showsData).selectAll("label").classed("deemphasize", !hasData).selectAll("input").property("disabled", !hasData).property("checked", showsData); + ul.selectAll("button.zoom-to-data").classed("disabled", !hasData); + } + function editLocalPhotos() { + context.container().call(settingsLocalPhotos); + } + function localPhotosChanged(d2) { + var localPhotosLayer = layers.layer("local-photos"); + localPhotosLayer.fileList(d2); + } + context.layers().on("change.uiSectionPhotoOverlays", section.reRender); + context.photos().on("change.uiSectionPhotoOverlays", section.reRender); context.map().on( - "move.uiSectionValidationStatus", + "move.photo_overlays", debounce_default(function() { window.requestIdleCallback(section.reRender); }, 1e3) @@ -68353,1338 +74076,1588 @@ ${content} return section; } - // modules/ui/panes/issues.js - function uiPaneIssues(context) { - var issuesPane = uiPane("issues", context).key(_t("issues.key")).label(_t.append("issues.title")).description(_t.append("issues.title")).iconName("iD-icon-alert").sections([ - uiSectionValidationOptions(context), - uiSectionValidationStatus(context), - uiSectionValidationIssues("issues-errors", "error", context), - uiSectionValidationIssues("issues-warnings", "warning", context), - uiSectionValidationRules(context) + // modules/ui/panes/map_data.js + function uiPaneMapData(context) { + var mapDataPane = uiPane("map-data", context).key(_t("map_data.key")).label(_t.append("map_data.title")).description(_t.append("map_data.description")).iconName("iD-icon-data").sections([ + uiSectionDataLayers(context), + uiSectionPhotoOverlays(context), + uiSectionMapStyleOptions(context), + uiSectionMapFeatures(context) ]); - return issuesPane; + return mapDataPane; } - // modules/ui/settings/custom_data.js - function uiSettingsCustomData(context) { - var dispatch10 = dispatch_default("change"); - function render(selection2) { - var dataLayer = context.layers().layer("data"); - var _origSettings = { - fileList: dataLayer && dataLayer.fileList() || null, - url: corePreferences("settings-custom-data-url") - }; - var _currSettings = { - fileList: dataLayer && dataLayer.fileList() || null, - url: corePreferences("settings-custom-data-url") - }; - var modal = uiConfirm(selection2).okButton(); - modal.classed("settings-modal settings-custom-data", true); - modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_data.header")); - var textSection = modal.select(".modal-section.message-text"); - textSection.append("pre").attr("class", "instructions-file").call(_t.append("settings.custom_data.file.instructions")); - textSection.append("input").attr("class", "field-file").attr("type", "file").attr("accept", ".gpx,.kml,.geojson,.json,application/gpx+xml,application/vnd.google-earth.kml+xml,application/geo+json,application/json").property("files", _currSettings.fileList).on("change", function(d3_event) { - var files = d3_event.target.files; - if (files && files.length) { - _currSettings.url = ""; - textSection.select(".field-url").property("value", ""); - _currSettings.fileList = files; - } else { - _currSettings.fileList = null; + // modules/ui/panes/preferences.js + function uiPanePreferences(context) { + let preferencesPane = uiPane("preferences", context).key(_t("preferences.key")).label(_t.append("preferences.title")).description(_t.append("preferences.description")).iconName("fas-user-cog").sections([ + uiSectionPrivacy(context) + ]); + return preferencesPane; + } + + // modules/ui/init.js + function uiInit(context) { + var _initCounter = 0; + var _needWidth = {}; + var _lastPointerType; + function render(container) { + container.on("click.ui", function(d3_event) { + if (d3_event.button !== 0) + return; + if (!d3_event.composedPath) + return; + var isOkayTarget = d3_event.composedPath().some(function(node) { + return node.nodeType === 1 && // clicking focuses it and/or changes a value + (node.nodeName === "INPUT" || // clicking