clone

an offline map explorer where each world, from a game map to a city's open data, ships as one .atlas file

fix: work out the hovered row from where the pointer is

Dami committed 840322b
Marking the reveal stale on scroll did not hold: a trackpad emits pointer
movement alongside the scroll it causes, so the flag was cleared in the same
breath it was set, and the row the pointer had left went on offering an action.

Which row is under the pointer is now worked out from the pointer's position
rather than read from :hover, and recomputed when the list scrolls. The answer
comes from the same place either way, so a list moving under a still cursor
settles on the row actually beneath it instead of the one that used to be.
commit
840322bd5838fa00dcc8b461e2b5be2bd8a3f7ac
parent
5db5eebc2aedcc627e8f584db867dff7a5d50e56
author
Dami <dami.etoile@gmail.com>
4 files changed, +31 -18
Massets/app.css2+-
Massets/app.js2+-
Mfrontend/app.css12+++++------
Mfrontend/app.js33++++++++++++++++++++++--------
M assets/app.css +1 -1
@@ -1 +1 @@
1-:root,:host{--ol-background-color: white;--ol-accent-background-color: #F5F5F5;--ol-subtle-background-color: rgba(128, 128, 128, .25);--ol-partial-background-color: rgba(255, 255, 255, .75);--ol-foreground-color: #333333;--ol-subtle-foreground-color: #666666;--ol-brand-color: #00AAFF}.ol-box{box-sizing:border-box;border-radius:2px;border:1.5px solid var(--ol-background-color);background-color:var(--ol-partial-background-color)}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;text-align:center;margin:1px;will-change:contents,width;transition:all .25s}.ol-scale-bar{position:absolute;bottom:8px;left:8px}.ol-scale-bar-inner{display:flex}.ol-scale-step-marker{width:1px;height:15px;background-color:var(--ol-foreground-color);float:right;z-index:10}.ol-scale-step-text{position:absolute;bottom:-5px;font-size:10px;z-index:11;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-text{position:absolute;font-size:12px;text-align:center;bottom:25px;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-singlebar{position:relative;height:10px;z-index:9;box-sizing:border-box;border:1px solid var(--ol-foreground-color)}.ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.ol-unsupported{display:none}.ol-viewport,.ol-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-viewport canvas{all:unset;overflow:hidden}.ol-viewport{touch-action:pan-x pan-y}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;user-select:text}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:var(--ol-subtle-background-color);border-radius:4px}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}.ol-control button{display:block;margin:1px;padding:0;color:var(--ol-subtle-foreground-color);font-weight:700;text-decoration:none;font-size:inherit;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:var(--ol-background-color);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:hover,.ol-control button:focus{text-decoration:none;outline:1px solid var(--ol-subtle-foreground-color);color:var(--ol-foreground-color)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);display:flex;flex-flow:row-reverse;align-items:center}.ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.ol-attribution ul{margin:0;padding:1px .5em;color:var(--ol-foreground-color);text-shadow:0 0 2px var(--ol-background-color);font-size:12px}.ol-attribution li{display:inline;list-style:none}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button{flex-shrink:0}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:block}.ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.ol-overviewmap-box{border:1.5px dotted var(--ol-subtle-foreground-color)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move}.ol-overviewmap .ol-viewport:hover{cursor:pointer}:root{color-scheme:dark;--bg: #111310;--panel: #171a16;--panel-raised: #1e211c;--line: rgba(236, 240, 218, .11);--line-strong: rgba(236, 240, 218, .2);--text: #eef0e4;--muted: #93988b;--accent: #d6f36b;--accent-dark: #202a0e;--topbar: 72px;--sidebar: 330px;--pin-overlay-size: 28px;--text-overlay-size: 14px;--zone-overlay-size: 14px;--icon-outset-color: rgba(255, 255, 255, .96);--icon-outset: drop-shadow(1px 0 0 var(--icon-outset-color)) drop-shadow(-1px 0 0 var(--icon-outset-color)) drop-shadow(0 1px 0 var(--icon-outset-color)) drop-shadow(0 -1px 0 var(--icon-outset-color)) drop-shadow(0 2px 2px rgba(0, 0, 0, .9));font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none}*{box-sizing:border-box}html,body{width:100%;height:100%;margin:0;overflow:hidden;background:var(--bg);color:var(--text);-webkit-user-select:none;user-select:none}button,input,select{font:inherit}button{color:inherit}input{-webkit-user-select:text;user-select:text}.app-shell{display:grid;grid-template-columns:var(--sidebar) 1fr;grid-template-rows:var(--topbar) minmax(0,1fr);width:100%;height:100%}.topbar{position:relative;z-index:20;grid-column:1 / -1;display:grid;grid-template-columns:var(--sidebar) minmax(0,1fr) auto;align-items:center;border-bottom:1px solid var(--line);background:#131512f5;box-shadow:0 8px 30px #0000002e}.brand{display:flex;align-items:center;gap:12px;height:100%;padding:0 24px;border-right:1px solid var(--line)}.brand-mark{display:grid;width:35px;height:35px;place-items:center;color:var(--accent)}.brand-mark svg{width:100%;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7}.brand strong,.brand small{display:block}.brand strong{font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:16px;letter-spacing:.2em;line-height:1}.brand small{margin-top:5px;color:var(--muted);font-size:10px;letter-spacing:.08em;text-transform:uppercase}.map-pickers{display:flex;align-items:center;gap:7px;min-width:0;padding:0 18px}.map-pickers label{display:flex;min-width:0;align-items:center;gap:7px;color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.map-pickers select{max-width:230px;height:37px;padding:0 32px 0 12px;border:1px solid var(--line);border-radius:8px;outline:none;background:var(--panel-raised);color:var(--text);font-size:13px;font-weight:600;letter-spacing:normal;text-transform:none}.map-pickers select:focus{border-color:#d6f36b99}.map-pickers select:disabled{border-color:transparent;background:#ffffff06;color:#9ca193;cursor:default;opacity:1}#variant-field[hidden]{display:none}.icon-button{display:grid;width:40px;height:40px;padding:10px;place-items:center;border:1px solid var(--line);border-radius:8px;background:var(--panel-raised)}.icon-button svg{fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:1.8}.mobile-legend{display:none;margin-right:16px}.app-shell.sidebar-collapsed{grid-template-columns:0 minmax(0,1fr)}.app-shell.sidebar-collapsed .sidebar{display:none}.app-shell.sidebar-collapsed .topbar{grid-template-columns:auto minmax(0,1fr) auto}.sidebar{position:relative;z-index:10;display:flex;grid-column:1;grid-row:2;min-height:0;flex-direction:column;border-right:1px solid var(--line);background:linear-gradient(180deg,rgba(214,243,107,.025),transparent 22%),var(--panel)}.sidebar-heading{padding:25px 22px 18px}.eyebrow{margin:0 0 8px;color:var(--accent);font-size:9px;font-weight:800;letter-spacing:.2em}.sidebar-heading h1{display:-webkit-box;overflow:hidden;margin:0;font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:27px;font-weight:700;letter-spacing:-.025em;line-height:1.05;-webkit-box-orient:vertical;-webkit-line-clamp:2}.sidebar-heading .map-name{overflow:hidden;margin:8px 0 0;color:#cdd1c3;font-size:14px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.sidebar-heading #map-meta{margin:5px 0 0;color:var(--muted);font-size:11px}.search-wrap{position:relative;display:flex;align-items:center;margin:0 17px 16px}.search-wrap svg{position:absolute;left:12px;width:16px;fill:none;stroke:var(--muted);stroke-linecap:round;stroke-width:1.7}.search-wrap input{width:100%;height:42px;padding:0 45px 0 37px;border:1px solid var(--line);border-radius:8px;outline:none;background:#11140f;color:var(--text);font-size:13px}.search-wrap input::placeholder{color:#757a6e}.search-wrap input:focus{border-color:#d6f36b80;box-shadow:0 0 0 3px #d6f36b0f}.search-wrap kbd{position:absolute;right:9px;padding:3px 5px;border:1px solid var(--line);border-radius:4px;background:var(--panel-raised);color:var(--muted);font-family:inherit;font-size:9px}.search-results{z-index:5;overflow:auto;max-height:238px;margin:-8px 17px 14px;border:1px solid var(--line);border-radius:8px;background:#11140f;box-shadow:0 15px 35px #00000052}.search-result{display:grid;width:100%;grid-template-columns:22px 1fr;gap:10px;padding:10px 11px;border:0;border-bottom:1px solid var(--line);background:transparent;text-align:left;cursor:pointer}.search-result:last-child{border-bottom:0}.search-result:hover{background:#ffffff0a}.search-result .result-dot{display:grid;width:20px;height:20px;margin-top:1px;place-items:center;border-radius:50%;background:var(--pin-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--pin-color) 18%,transparent);color:#fff;font-size:7px;font-weight:900}.search-result strong,.search-result small{display:block}.search-result strong{overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.search-result small,.search-empty{margin-top:3px;color:var(--muted);font-size:10px}.search-empty{padding:13px}.legend-toolbar{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.legend-toolbar div{display:flex;gap:5px;align-items:center}.legend-toolbar button{padding:0;border:0;background:none;color:var(--muted);font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;cursor:pointer}.legend-toolbar button:hover{color:var(--accent)}.layers{overflow-x:hidden;overflow-y:auto;min-height:0;flex:1;padding-bottom:12px;scrollbar-color:#44483e transparent;scrollbar-width:thin}.layer-section{border-bottom:1px solid var(--line)}.layer-section[hidden]{display:none}.legend .layer-section:last-child{border-bottom:0}.layer-header{display:flex;align-items:center;gap:10px;padding:8px 16px 8px 12px}.layer-title{display:flex;min-width:0;flex:1;align-items:center;gap:7px;padding:4px 0;border:0;background:transparent;color:#c8ccbd;font-size:10px;font-weight:800;letter-spacing:.12em;text-align:left;text-transform:uppercase;cursor:pointer}.layer-title:hover{color:var(--text)}.layer-title>span:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layer-chevron{display:grid;width:13px;height:13px;flex:none;place-items:center;color:#6b7163;transform:rotate(90deg);transition:transform .14s ease}.layer-section.is-collapsed .layer-chevron{transform:rotate(0)}.layer-chevron svg{width:12px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.4}.layer-count{color:var(--muted);font-size:9px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:0}.only-button{padding:0;border:0;opacity:0;background:none;color:var(--accent);font-size:9px;font-weight:700;letter-spacing:.1em;text-align:right;text-transform:uppercase;cursor:pointer;transition:opacity .11s ease}.layers:not(.hover-stale) .category-row:hover .only-button,.layers:not(.hover-stale) .layer-header:hover .only-button,.only-button:focus-visible{opacity:1}.only-button:hover{text-decoration:underline;text-underline-offset:2px}.solo-chip{overflow:hidden;max-width:160px;padding:0;border:0;background:none;color:var(--accent);font-size:9px;font-weight:700;letter-spacing:.06em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;cursor:pointer}.solo-chip[hidden]{display:none}.solo-chip:after{margin-left:6px;content:"\d7";opacity:.8}.solo-chip:hover{text-decoration:underline;text-underline-offset:2px}.layer-switch{position:relative;display:grid;width:15px;height:15px;flex:none;place-items:center;cursor:pointer}.layer-switch input{position:absolute;width:1px;height:1px;opacity:0}.layer-switch>span{width:9px;height:9px;border:1px solid #6b7163;transition:background .14s ease,border-color .14s ease}.layer-switch:hover>span{border-color:var(--accent)}.layer-switch:has(input:checked)>span{border-color:var(--accent);background:var(--accent)}.layer-switch:has(input:focus-visible)>span{outline:1px solid var(--accent);outline-offset:2px}.layer-section.is-collapsed .category-toggles,.layer-section.is-collapsed .zone-list{display:none}.text-symbol{display:grid;width:22px;height:22px;flex:none;place-items:center;color:var(--pin-color);font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:11px;font-weight:900;letter-spacing:-.04em}.zone-index-item{--zone-depth: 0;display:grid;width:100%;align-items:center;grid-template-columns:10px minmax(0,1fr);gap:8px;min-height:26px;padding:0 4px 0 calc(4px + var(--zone-depth) * 13px);border:0;border-radius:3px;background:transparent;color:#9aa093;font-size:11px;font-weight:600;text-align:left;cursor:pointer}.zone-index-item:hover,.zone-index-item:focus-visible{outline:none;background:#ffffff0a;color:var(--text)}.zone-index-item.is-current{background:#ffffff0e;color:#f0f2e8}.zone-index-item.is-highlighted{color:#fff}#zone-index.has-highlights .zone-index-item:not(.is-highlighted):not(.is-current){opacity:.5}.zone-index-item>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zone-index-marker{width:8px;height:8px;border:1px solid color-mix(in srgb,var(--zone-color) 78%,white);border-radius:2px;background:color-mix(in srgb,var(--zone-color) 18%,transparent)}.zone-index-item.is-highlighted .zone-index-marker{border-color:#fff;background:var(--zone-color);box-shadow:0 0 7px color-mix(in srgb,var(--zone-color) 65%,transparent)}.category-toggles{padding:2px 14px 10px}.category-row{display:grid;width:100%;align-items:center;grid-template-columns:22px minmax(0,1fr) 34px 46px;gap:8px;min-height:26px;padding:0 4px;border-radius:3px;color:#7d8275;cursor:pointer;-webkit-user-select:none;user-select:none}.category-row:hover{background:#ffffff0a;color:var(--text)}.category-row:has(input:checked){color:#d8dccf}.category-row input{position:absolute;width:1px;height:1px;opacity:0}.category-row:has(input:focus-visible){outline:1px solid var(--accent);outline-offset:-1px}.category-row:not(:has(input:checked)) .category-icon,.category-row:not(:has(input:checked)) .text-symbol{opacity:.32}.category-icon{display:grid;width:22px;height:22px;flex:none;place-items:center;border:0;background:transparent;color:var(--pin-color);font-size:9px;font-weight:900;text-transform:uppercase}.category-icon.has-source-icon:before,.result-dot.has-source-icon:before,#detail-dot.has-source-icon:before,.pin.has-source-icon:after{display:block;background:var(--pin-icon) center / contain no-repeat;content:"";filter:var(--icon-outset)}.category-icon.has-source-icon:before{width:14px;height:14px;filter:var(--icon-outset)}.result-dot.has-source-icon,#detail-dot.has-source-icon{border-radius:0;background:transparent;box-shadow:none}.result-dot.has-source-icon:before{width:16px;height:16px}.category-name{overflow:hidden;font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.category-count{color:#6f7568;font-size:10px;font-variant-numeric:tabular-nums;text-align:right}.sidebar-footer{display:flex;align-items:center;gap:7px;min-height:44px;padding:0 18px;border-top:1px solid var(--line);color:var(--muted);font-size:9px;letter-spacing:.06em;text-transform:uppercase}.live-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 7px #d6f36b99}.map-panel{position:relative;grid-column:2;grid-row:2;min-width:0;min-height:0;background:#0c0e0c}.map{position:absolute;inset:0;overflow:hidden;outline:none;background:radial-gradient(circle at 50% 50%,rgba(102,111,86,.13),transparent 56%),#0b0d0b;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none}.map .ol-viewport{position:absolute;inset:0}.map .ol-layer canvas{display:block}.map .ol-viewport.is-dragging{cursor:grabbing}.map:after{position:absolute;z-index:2;inset:0;background:linear-gradient(90deg,rgba(5,7,5,.36),transparent 7%,transparent 93%,rgba(5,7,5,.25)),linear-gradient(180deg,rgba(5,7,5,.2),transparent 10%,transparent 92%,rgba(5,7,5,.35));content:"";pointer-events:none}.map-loading{position:absolute;z-index:10;top:50%;left:50%;display:grid;min-width:235px;padding:24px;place-items:center;border:1px solid var(--line);border-radius:12px;background:#141713eb;box-shadow:0 20px 60px #0006;text-align:center;transform:translate(-50%,-50%);transition:opacity .18s ease}.map-loading[hidden]{display:none}.map-loading strong{margin-top:12px;font-size:13px}.map-loading small{margin-top:5px;color:var(--muted);font-size:10px}.spinner{width:25px;height:25px;border:2px solid rgba(214,243,107,.18);border-top-color:var(--accent);border-radius:50%;animation:spin .75s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.map-corner{position:absolute;z-index:7;right:17px;bottom:17px;display:flex;flex-direction:column;align-items:flex-end;gap:10px;pointer-events:none}.map-corner>*{pointer-events:auto}.overview{position:relative;overflow:hidden;border:1px solid var(--line-strong);border-radius:8px;background:#161915e6;box-shadow:0 6px 25px #00000047;cursor:crosshair;line-height:0}.overview[hidden]{display:none}.overview canvas{display:block;opacity:.85}.overview-viewport{position:absolute;border:1px solid var(--accent);border-radius:2px;background:#d6f36b24;pointer-events:none}.zoom-controls{position:absolute;z-index:7;top:17px;right:17px;display:grid;overflow:hidden;width:38px;border:1px solid var(--line-strong);border-radius:8px;background:#161915e6;box-shadow:0 6px 25px #00000038}.zoom-controls button{display:grid;width:38px;height:37px;padding:0;place-items:center;border:0;border-bottom:1px solid var(--line);background:transparent;font-size:20px;cursor:pointer}.zoom-controls button:last-child{border-bottom:0}.zoom-controls button:hover{background:#ffffff0f;color:var(--accent)}.grid-navigator{position:absolute;z-index:8;top:17px;right:67px;display:flex;overflow:hidden;align-items:stretch;border:1px solid var(--line-strong);border-radius:8px;background:#161915f0;box-shadow:0 6px 25px #00000038}.grid-navigator[hidden]{display:none}.grid-navigator button{width:36px;padding:0;border:0;border-right:1px solid var(--line);background:transparent;color:var(--muted);font-size:17px;cursor:pointer}.grid-navigator button:hover{color:var(--accent)}.grid-navigator label{display:flex;height:36px;align-items:center;gap:7px;padding:0 9px;color:var(--muted);font-size:8px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.grid-navigator input{width:74px;padding:4px 6px;border:1px solid #3c4137;border-radius:4px;outline:none;background:#0e110d;color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:lowercase;-webkit-user-select:text;user-select:text}.grid-navigator input:focus{border-color:#d6f36bad}.map-hint{position:relative;display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--line);border-radius:6px;background:#0f110ec2;color:#eef0e49e;font-size:9px;letter-spacing:.08em;text-transform:uppercase;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.map-hint i{width:2px;height:2px;border-radius:50%;background:currentColor}.pin-detail{position:absolute;z-index:9;right:68px;bottom:17px;width:min(360px,calc(100% - 100px));max-height:min(500px,calc(100% - 40px));overflow:auto;padding:20px;border:1px solid var(--line-strong);border-radius:11px;background:#151814f5;box-shadow:0 18px 55px #00000073;-webkit-user-select:text;user-select:text;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.pin-detail[hidden]{display:none}.detail-close{position:absolute;top:10px;right:11px;width:29px;height:29px;padding:0;border:0;border-radius:6px;background:#ffffff0a;color:var(--muted);font-size:21px;cursor:pointer}.detail-close:hover{color:var(--text)}.detail-category{display:flex;align-items:center;gap:7px;padding-right:30px;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.detail-category #detail-dot{display:grid;width:20px;height:20px;flex:0 0 20px;place-items:center;border-radius:50%;background:var(--pin-color);color:#fff;font-size:7px;letter-spacing:0}#detail-dot.has-source-icon:before{width:16px;height:16px}.pin-detail h2{margin:10px 0 11px;font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:22px;line-height:1.12}.pin-detail>p{margin:0;color:#b9bdb0;font-size:12px;line-height:1.55;white-space:pre-line}.detail-links{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:12px}.detail-links[hidden]{display:none}.detail-link{overflow:hidden;max-width:100%;padding:0;border:0;background:none;color:var(--accent);font-size:11px;font-weight:600;text-decoration:underline;text-overflow:ellipsis;text-underline-offset:3px;white-space:nowrap;cursor:pointer}.detail-link:hover{color:var(--text)}.pin-detail dl{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:17px 0 0;padding-top:13px;border-top:1px solid var(--line)}.pin-detail dl div{min-width:0}.pin-detail dt{color:#71766a;font-size:8px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.pin-detail dd{overflow:hidden;margin:4px 0 0;color:#c6cabd;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;text-overflow:ellipsis;white-space:nowrap}.fatal-error{position:fixed;z-index:100;inset:50% auto auto 50%;width:min(460px,calc(100% - 40px));padding:24px;border:1px solid #7e3f3f;border-radius:12px;background:#261919;box-shadow:0 25px 80px #00000080;transform:translate(-50%,-50%);-webkit-user-select:text;user-select:text}.fatal-error[hidden]{display:none}.fatal-error p{margin:8px 0 0;color:#c8aaaa;font-size:13px}@media(max-width:980px){:root{--sidebar: 300px}.map-pickers label>span{display:none}.map-pickers select{max-width:190px}}@media(max-width:760px){:root{--topbar: 64px}.app-shell{grid-template-columns:1fr}.topbar{grid-template-columns:auto minmax(0,1fr) auto}.brand{padding:0 15px;border-right:0}.brand small{display:none}.map-pickers{justify-content:center;padding:0 7px}.map-pickers select{max-width:135px;height:35px;padding-left:8px;font-size:11px}.mobile-legend{display:grid}.sidebar{position:fixed;z-index:30;top:var(--topbar);bottom:0;left:0;width:min(330px,calc(100% - 42px));box-shadow:18px 0 50px #00000073;transform:translate(-102%);transition:transform .18s ease}.sidebar.is-open{transform:translate(0)}.map-panel{grid-column:1}.pin-detail{right:14px;bottom:55px;width:calc(100% - 28px)}}1+:root,:host{--ol-background-color: white;--ol-accent-background-color: #F5F5F5;--ol-subtle-background-color: rgba(128, 128, 128, .25);--ol-partial-background-color: rgba(255, 255, 255, .75);--ol-foreground-color: #333333;--ol-subtle-foreground-color: #666666;--ol-brand-color: #00AAFF}.ol-box{box-sizing:border-box;border-radius:2px;border:1.5px solid var(--ol-background-color);background-color:var(--ol-partial-background-color)}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;text-align:center;margin:1px;will-change:contents,width;transition:all .25s}.ol-scale-bar{position:absolute;bottom:8px;left:8px}.ol-scale-bar-inner{display:flex}.ol-scale-step-marker{width:1px;height:15px;background-color:var(--ol-foreground-color);float:right;z-index:10}.ol-scale-step-text{position:absolute;bottom:-5px;font-size:10px;z-index:11;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-text{position:absolute;font-size:12px;text-align:center;bottom:25px;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-singlebar{position:relative;height:10px;z-index:9;box-sizing:border-box;border:1px solid var(--ol-foreground-color)}.ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.ol-unsupported{display:none}.ol-viewport,.ol-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-viewport canvas{all:unset;overflow:hidden}.ol-viewport{touch-action:pan-x pan-y}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;user-select:text}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:var(--ol-subtle-background-color);border-radius:4px}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}.ol-control button{display:block;margin:1px;padding:0;color:var(--ol-subtle-foreground-color);font-weight:700;text-decoration:none;font-size:inherit;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:var(--ol-background-color);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:hover,.ol-control button:focus{text-decoration:none;outline:1px solid var(--ol-subtle-foreground-color);color:var(--ol-foreground-color)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);display:flex;flex-flow:row-reverse;align-items:center}.ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.ol-attribution ul{margin:0;padding:1px .5em;color:var(--ol-foreground-color);text-shadow:0 0 2px var(--ol-background-color);font-size:12px}.ol-attribution li{display:inline;list-style:none}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button{flex-shrink:0}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:block}.ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.ol-overviewmap-box{border:1.5px dotted var(--ol-subtle-foreground-color)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move}.ol-overviewmap .ol-viewport:hover{cursor:pointer}:root{color-scheme:dark;--bg: #111310;--panel: #171a16;--panel-raised: #1e211c;--line: rgba(236, 240, 218, .11);--line-strong: rgba(236, 240, 218, .2);--text: #eef0e4;--muted: #93988b;--accent: #d6f36b;--accent-dark: #202a0e;--topbar: 72px;--sidebar: 330px;--pin-overlay-size: 28px;--text-overlay-size: 14px;--zone-overlay-size: 14px;--icon-outset-color: rgba(255, 255, 255, .96);--icon-outset: drop-shadow(1px 0 0 var(--icon-outset-color)) drop-shadow(-1px 0 0 var(--icon-outset-color)) drop-shadow(0 1px 0 var(--icon-outset-color)) drop-shadow(0 -1px 0 var(--icon-outset-color)) drop-shadow(0 2px 2px rgba(0, 0, 0, .9));font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none}*{box-sizing:border-box}html,body{width:100%;height:100%;margin:0;overflow:hidden;background:var(--bg);color:var(--text);-webkit-user-select:none;user-select:none}button,input,select{font:inherit}button{color:inherit}input{-webkit-user-select:text;user-select:text}.app-shell{display:grid;grid-template-columns:var(--sidebar) 1fr;grid-template-rows:var(--topbar) minmax(0,1fr);width:100%;height:100%}.topbar{position:relative;z-index:20;grid-column:1 / -1;display:grid;grid-template-columns:var(--sidebar) minmax(0,1fr) auto;align-items:center;border-bottom:1px solid var(--line);background:#131512f5;box-shadow:0 8px 30px #0000002e}.brand{display:flex;align-items:center;gap:12px;height:100%;padding:0 24px;border-right:1px solid var(--line)}.brand-mark{display:grid;width:35px;height:35px;place-items:center;color:var(--accent)}.brand-mark svg{width:100%;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.7}.brand strong,.brand small{display:block}.brand strong{font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:16px;letter-spacing:.2em;line-height:1}.brand small{margin-top:5px;color:var(--muted);font-size:10px;letter-spacing:.08em;text-transform:uppercase}.map-pickers{display:flex;align-items:center;gap:7px;min-width:0;padding:0 18px}.map-pickers label{display:flex;min-width:0;align-items:center;gap:7px;color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.map-pickers select{max-width:230px;height:37px;padding:0 32px 0 12px;border:1px solid var(--line);border-radius:8px;outline:none;background:var(--panel-raised);color:var(--text);font-size:13px;font-weight:600;letter-spacing:normal;text-transform:none}.map-pickers select:focus{border-color:#d6f36b99}.map-pickers select:disabled{border-color:transparent;background:#ffffff06;color:#9ca193;cursor:default;opacity:1}#variant-field[hidden]{display:none}.icon-button{display:grid;width:40px;height:40px;padding:10px;place-items:center;border:1px solid var(--line);border-radius:8px;background:var(--panel-raised)}.icon-button svg{fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:1.8}.mobile-legend{display:none;margin-right:16px}.app-shell.sidebar-collapsed{grid-template-columns:0 minmax(0,1fr)}.app-shell.sidebar-collapsed .sidebar{display:none}.app-shell.sidebar-collapsed .topbar{grid-template-columns:auto minmax(0,1fr) auto}.sidebar{position:relative;z-index:10;display:flex;grid-column:1;grid-row:2;min-height:0;flex-direction:column;border-right:1px solid var(--line);background:linear-gradient(180deg,rgba(214,243,107,.025),transparent 22%),var(--panel)}.sidebar-heading{padding:25px 22px 18px}.eyebrow{margin:0 0 8px;color:var(--accent);font-size:9px;font-weight:800;letter-spacing:.2em}.sidebar-heading h1{display:-webkit-box;overflow:hidden;margin:0;font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:27px;font-weight:700;letter-spacing:-.025em;line-height:1.05;-webkit-box-orient:vertical;-webkit-line-clamp:2}.sidebar-heading .map-name{overflow:hidden;margin:8px 0 0;color:#cdd1c3;font-size:14px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.sidebar-heading #map-meta{margin:5px 0 0;color:var(--muted);font-size:11px}.search-wrap{position:relative;display:flex;align-items:center;margin:0 17px 16px}.search-wrap svg{position:absolute;left:12px;width:16px;fill:none;stroke:var(--muted);stroke-linecap:round;stroke-width:1.7}.search-wrap input{width:100%;height:42px;padding:0 45px 0 37px;border:1px solid var(--line);border-radius:8px;outline:none;background:#11140f;color:var(--text);font-size:13px}.search-wrap input::placeholder{color:#757a6e}.search-wrap input:focus{border-color:#d6f36b80;box-shadow:0 0 0 3px #d6f36b0f}.search-wrap kbd{position:absolute;right:9px;padding:3px 5px;border:1px solid var(--line);border-radius:4px;background:var(--panel-raised);color:var(--muted);font-family:inherit;font-size:9px}.search-results{z-index:5;overflow:auto;max-height:238px;margin:-8px 17px 14px;border:1px solid var(--line);border-radius:8px;background:#11140f;box-shadow:0 15px 35px #00000052}.search-result{display:grid;width:100%;grid-template-columns:22px 1fr;gap:10px;padding:10px 11px;border:0;border-bottom:1px solid var(--line);background:transparent;text-align:left;cursor:pointer}.search-result:last-child{border-bottom:0}.search-result:hover{background:#ffffff0a}.search-result .result-dot{display:grid;width:20px;height:20px;margin-top:1px;place-items:center;border-radius:50%;background:var(--pin-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--pin-color) 18%,transparent);color:#fff;font-size:7px;font-weight:900}.search-result strong,.search-result small{display:block}.search-result strong{overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.search-result small,.search-empty{margin-top:3px;color:var(--muted);font-size:10px}.search-empty{padding:13px}.legend-toolbar{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.legend-toolbar div{display:flex;gap:5px;align-items:center}.legend-toolbar button{padding:0;border:0;background:none;color:var(--muted);font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;cursor:pointer}.legend-toolbar button:hover{color:var(--accent)}.layers{overflow-x:hidden;overflow-y:auto;min-height:0;flex:1;padding-bottom:12px;scrollbar-color:#44483e transparent;scrollbar-width:thin}.layer-section{border-bottom:1px solid var(--line)}.layer-section[hidden]{display:none}.legend .layer-section:last-child{border-bottom:0}.layer-header{display:flex;align-items:center;gap:10px;padding:8px 16px 8px 12px}.layer-title{display:flex;min-width:0;flex:1;align-items:center;gap:7px;padding:4px 0;border:0;background:transparent;color:#c8ccbd;font-size:10px;font-weight:800;letter-spacing:.12em;text-align:left;text-transform:uppercase;cursor:pointer}.layer-title:hover{color:var(--text)}.layer-title>span:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layer-chevron{display:grid;width:13px;height:13px;flex:none;place-items:center;color:#6b7163;transform:rotate(90deg);transition:transform .14s ease}.layer-section.is-collapsed .layer-chevron{transform:rotate(0)}.layer-chevron svg{width:12px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.4}.layer-count{color:var(--muted);font-size:9px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:0}.only-button{padding:0;border:0;opacity:0;background:none;color:var(--accent);font-size:9px;font-weight:700;letter-spacing:.1em;text-align:right;text-transform:uppercase;cursor:pointer;transition:opacity .11s ease}.category-row.is-hovered .only-button,.layer-header.is-hovered .only-button,.only-button:focus-visible{opacity:1}.only-button:hover{text-decoration:underline;text-underline-offset:2px}.solo-chip{overflow:hidden;max-width:160px;padding:0;border:0;background:none;color:var(--accent);font-size:9px;font-weight:700;letter-spacing:.06em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap;cursor:pointer}.solo-chip[hidden]{display:none}.solo-chip:after{margin-left:6px;content:"\d7";opacity:.8}.solo-chip:hover{text-decoration:underline;text-underline-offset:2px}.layer-switch{position:relative;display:grid;width:15px;height:15px;flex:none;place-items:center;cursor:pointer}.layer-switch input{position:absolute;width:1px;height:1px;opacity:0}.layer-switch>span{width:9px;height:9px;border:1px solid #6b7163;transition:background .14s ease,border-color .14s ease}.layer-switch:hover>span{border-color:var(--accent)}.layer-switch:has(input:checked)>span{border-color:var(--accent);background:var(--accent)}.layer-switch:has(input:focus-visible)>span{outline:1px solid var(--accent);outline-offset:2px}.layer-section.is-collapsed .category-toggles,.layer-section.is-collapsed .zone-list{display:none}.text-symbol{display:grid;width:22px;height:22px;flex:none;place-items:center;color:var(--pin-color);font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:11px;font-weight:900;letter-spacing:-.04em}.zone-index-item{--zone-depth: 0;display:grid;width:100%;align-items:center;grid-template-columns:10px minmax(0,1fr);gap:8px;min-height:26px;padding:0 4px 0 calc(4px + var(--zone-depth) * 13px);border:0;border-radius:3px;background:transparent;color:#9aa093;font-size:11px;font-weight:600;text-align:left;cursor:pointer}.zone-index-item:hover,.zone-index-item:focus-visible{outline:none;background:#ffffff0a;color:var(--text)}.zone-index-item.is-current{background:#ffffff0e;color:#f0f2e8}.zone-index-item.is-highlighted{color:#fff}#zone-index.has-highlights .zone-index-item:not(.is-highlighted):not(.is-current){opacity:.5}.zone-index-item>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zone-index-marker{width:8px;height:8px;border:1px solid color-mix(in srgb,var(--zone-color) 78%,white);border-radius:2px;background:color-mix(in srgb,var(--zone-color) 18%,transparent)}.zone-index-item.is-highlighted .zone-index-marker{border-color:#fff;background:var(--zone-color);box-shadow:0 0 7px color-mix(in srgb,var(--zone-color) 65%,transparent)}.category-toggles{padding:2px 14px 10px}.category-row{display:grid;width:100%;align-items:center;grid-template-columns:22px minmax(0,1fr) 34px 46px;gap:8px;min-height:26px;padding:0 4px;border-radius:3px;color:#7d8275;cursor:pointer;-webkit-user-select:none;user-select:none}.category-row.is-hovered{background:#ffffff0a;color:var(--text)}.category-row:has(input:checked){color:#d8dccf}.category-row input{position:absolute;width:1px;height:1px;opacity:0}.category-row:has(input:focus-visible){outline:1px solid var(--accent);outline-offset:-1px}.category-row:not(:has(input:checked)) .category-icon,.category-row:not(:has(input:checked)) .text-symbol{opacity:.32}.category-icon{display:grid;width:22px;height:22px;flex:none;place-items:center;border:0;background:transparent;color:var(--pin-color);font-size:9px;font-weight:900;text-transform:uppercase}.category-icon.has-source-icon:before,.result-dot.has-source-icon:before,#detail-dot.has-source-icon:before,.pin.has-source-icon:after{display:block;background:var(--pin-icon) center / contain no-repeat;content:"";filter:var(--icon-outset)}.category-icon.has-source-icon:before{width:14px;height:14px;filter:var(--icon-outset)}.result-dot.has-source-icon,#detail-dot.has-source-icon{border-radius:0;background:transparent;box-shadow:none}.result-dot.has-source-icon:before{width:16px;height:16px}.category-name{overflow:hidden;font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.category-count{color:#6f7568;font-size:10px;font-variant-numeric:tabular-nums;text-align:right}.sidebar-footer{display:flex;align-items:center;gap:7px;min-height:44px;padding:0 18px;border-top:1px solid var(--line);color:var(--muted);font-size:9px;letter-spacing:.06em;text-transform:uppercase}.live-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 7px #d6f36b99}.map-panel{position:relative;grid-column:2;grid-row:2;min-width:0;min-height:0;background:#0c0e0c}.map{position:absolute;inset:0;overflow:hidden;outline:none;background:radial-gradient(circle at 50% 50%,rgba(102,111,86,.13),transparent 56%),#0b0d0b;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none}.map .ol-viewport{position:absolute;inset:0}.map .ol-layer canvas{display:block}.map .ol-viewport.is-dragging{cursor:grabbing}.map:after{position:absolute;z-index:2;inset:0;background:linear-gradient(90deg,rgba(5,7,5,.36),transparent 7%,transparent 93%,rgba(5,7,5,.25)),linear-gradient(180deg,rgba(5,7,5,.2),transparent 10%,transparent 92%,rgba(5,7,5,.35));content:"";pointer-events:none}.map-loading{position:absolute;z-index:10;top:50%;left:50%;display:grid;min-width:235px;padding:24px;place-items:center;border:1px solid var(--line);border-radius:12px;background:#141713eb;box-shadow:0 20px 60px #0006;text-align:center;transform:translate(-50%,-50%);transition:opacity .18s ease}.map-loading[hidden]{display:none}.map-loading strong{margin-top:12px;font-size:13px}.map-loading small{margin-top:5px;color:var(--muted);font-size:10px}.spinner{width:25px;height:25px;border:2px solid rgba(214,243,107,.18);border-top-color:var(--accent);border-radius:50%;animation:spin .75s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.map-corner{position:absolute;z-index:7;right:17px;bottom:17px;display:flex;flex-direction:column;align-items:flex-end;gap:10px;pointer-events:none}.map-corner>*{pointer-events:auto}.overview{position:relative;overflow:hidden;border:1px solid var(--line-strong);border-radius:8px;background:#161915e6;box-shadow:0 6px 25px #00000047;cursor:crosshair;line-height:0}.overview[hidden]{display:none}.overview canvas{display:block;opacity:.85}.overview-viewport{position:absolute;border:1px solid var(--accent);border-radius:2px;background:#d6f36b24;pointer-events:none}.zoom-controls{position:absolute;z-index:7;top:17px;right:17px;display:grid;overflow:hidden;width:38px;border:1px solid var(--line-strong);border-radius:8px;background:#161915e6;box-shadow:0 6px 25px #00000038}.zoom-controls button{display:grid;width:38px;height:37px;padding:0;place-items:center;border:0;border-bottom:1px solid var(--line);background:transparent;font-size:20px;cursor:pointer}.zoom-controls button:last-child{border-bottom:0}.zoom-controls button:hover{background:#ffffff0f;color:var(--accent)}.grid-navigator{position:absolute;z-index:8;top:17px;right:67px;display:flex;overflow:hidden;align-items:stretch;border:1px solid var(--line-strong);border-radius:8px;background:#161915f0;box-shadow:0 6px 25px #00000038}.grid-navigator[hidden]{display:none}.grid-navigator button{width:36px;padding:0;border:0;border-right:1px solid var(--line);background:transparent;color:var(--muted);font-size:17px;cursor:pointer}.grid-navigator button:hover{color:var(--accent)}.grid-navigator label{display:flex;height:36px;align-items:center;gap:7px;padding:0 9px;color:var(--muted);font-size:8px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.grid-navigator input{width:74px;padding:4px 6px;border:1px solid #3c4137;border-radius:4px;outline:none;background:#0e110d;color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:lowercase;-webkit-user-select:text;user-select:text}.grid-navigator input:focus{border-color:#d6f36bad}.map-hint{position:relative;display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--line);border-radius:6px;background:#0f110ec2;color:#eef0e49e;font-size:9px;letter-spacing:.08em;text-transform:uppercase;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.map-hint i{width:2px;height:2px;border-radius:50%;background:currentColor}.pin-detail{position:absolute;z-index:9;right:68px;bottom:17px;width:min(360px,calc(100% - 100px));max-height:min(500px,calc(100% - 40px));overflow:auto;padding:20px;border:1px solid var(--line-strong);border-radius:11px;background:#151814f5;box-shadow:0 18px 55px #00000073;-webkit-user-select:text;user-select:text;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.pin-detail[hidden]{display:none}.detail-close{position:absolute;top:10px;right:11px;width:29px;height:29px;padding:0;border:0;border-radius:6px;background:#ffffff0a;color:var(--muted);font-size:21px;cursor:pointer}.detail-close:hover{color:var(--text)}.detail-category{display:flex;align-items:center;gap:7px;padding-right:30px;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.detail-category #detail-dot{display:grid;width:20px;height:20px;flex:0 0 20px;place-items:center;border-radius:50%;background:var(--pin-color);color:#fff;font-size:7px;letter-spacing:0}#detail-dot.has-source-icon:before{width:16px;height:16px}.pin-detail h2{margin:10px 0 11px;font-family:Arial Narrow,Roboto Condensed,sans-serif;font-size:22px;line-height:1.12}.pin-detail>p{margin:0;color:#b9bdb0;font-size:12px;line-height:1.55;white-space:pre-line}.detail-links{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:12px}.detail-links[hidden]{display:none}.detail-link{overflow:hidden;max-width:100%;padding:0;border:0;background:none;color:var(--accent);font-size:11px;font-weight:600;text-decoration:underline;text-overflow:ellipsis;text-underline-offset:3px;white-space:nowrap;cursor:pointer}.detail-link:hover{color:var(--text)}.pin-detail dl{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:17px 0 0;padding-top:13px;border-top:1px solid var(--line)}.pin-detail dl div{min-width:0}.pin-detail dt{color:#71766a;font-size:8px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.pin-detail dd{overflow:hidden;margin:4px 0 0;color:#c6cabd;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;text-overflow:ellipsis;white-space:nowrap}.fatal-error{position:fixed;z-index:100;inset:50% auto auto 50%;width:min(460px,calc(100% - 40px));padding:24px;border:1px solid #7e3f3f;border-radius:12px;background:#261919;box-shadow:0 25px 80px #00000080;transform:translate(-50%,-50%);-webkit-user-select:text;user-select:text}.fatal-error[hidden]{display:none}.fatal-error p{margin:8px 0 0;color:#c8aaaa;font-size:13px}@media(max-width:980px){:root{--sidebar: 300px}.map-pickers label>span{display:none}.map-pickers select{max-width:190px}}@media(max-width:760px){:root{--topbar: 64px}.app-shell{grid-template-columns:1fr}.topbar{grid-template-columns:auto minmax(0,1fr) auto}.brand{padding:0 15px;border-right:0}.brand small{display:none}.map-pickers{justify-content:center;padding:0 7px}.map-pickers select{max-width:135px;height:35px;padding-left:8px;font-size:11px}.mobile-legend{display:grid}.sidebar{position:fixed;z-index:30;top:var(--topbar);bottom:0;left:0;width:min(330px,calc(100% - 42px));box-shadow:18px 0 50px #00000073;transform:translate(-102%);transition:transform .18s ease}.sidebar.is-open{transform:translate(0)}.map-panel{grid-column:1}.pin-detail{right:14px;bottom:55px;width:calc(100% - 28px)}}
M assets/app.js +1 -1
@@ -4,6 +4,6 @@
44 `,""),n.push(t,""),n}function Fm(n,t,e){return e%2===0&&(n+=t),n}var Oc=class{constructor(t,e,i,r,s){this.overlaps=i,this.pixelRatio=e,this.resolution=t,this.alignAndScaleFill_,this.instructions=r.instructions,this.coordinates=r.coordinates,this.coordinateCache_={},this.renderedTransform_=Lt(),this.hitDetectionInstructions=r.hitDetectionInstructions,this.pixelCoordinates_=null,this.viewRotation_=0,this.fillStates=r.fillStates||{},this.strokeStates=r.strokeStates||{},this.textStates=r.textStates||{},this.widths_={},this.labels_={},this.zIndexContext_=s?new Eo:null}getZIndexContext(){return this.zIndexContext_}createLabel(t,e,i,r){let s=t+e+i+r;if(this.labels_[s])return this.labels_[s];let o=r?this.strokeStates[r]:null,a=i?this.fillStates[i]:null,l=this.textStates[e],h=this.pixelRatio,c=[l.scale[0]*h,l.scale[1]*h],u=l.justify?Br[l.justify]:Pc(Array.isArray(t)?t[0]:t,l.textAlign||Ii),f=r&&o.lineWidth?o.lineWidth:0,g=Array.isArray(t)?t:String(t).split(`55 `).reduce(Dm,[]),{width:p,height:_,widths:m,heights:x,lineWidths:E}=Dd(l,g),C=p+f,y=[],w=(C+2)*c[0],S=(_+f)*c[1],A={width:w<0?Math.floor(w):Math.ceil(w),height:S<0?Math.floor(S):Math.ceil(S),contextInstructions:y};(c[0]!=1||c[1]!=1)&&y.push("scale",c),r&&(y.push("strokeStyle",o.strokeStyle),y.push("lineWidth",f),y.push("lineCap",o.lineCap),y.push("lineJoin",o.lineJoin),y.push("miterLimit",o.miterLimit),y.push("setLineDash",[o.lineDash]),y.push("lineDashOffset",o.lineDashOffset)),i&&y.push("fillStyle",a.fillStyle),y.push("textBaseline","middle"),y.push("textAlign","center");let R=.5-u,T=u*C+R*f,I=[],z=[],G=0,F=0,V=0,lt=0,M;for(let X=0,O=g.length;X<O;X+=2){let $=g[X];if($===`66 `){F+=G,G=0,T=u*C+R*f,++lt;continue}let N=g[X+1]||l.font;N!==M&&(r&&I.push("font",N),i&&z.push("font",N),M=N),G=Math.max(G,x[V]);let tt=[$,T+R*m[V]+u*(m[V]-E[lt]),.5*(f+G)+F];T+=m[V],r&&I.push("strokeText",tt),i&&z.push("fillText",tt),++V}return Array.prototype.push.apply(y,I),Array.prototype.push.apply(y,z),this.labels_[s]=A,A}replayTextBackground_(t,e,i,r,s,o,a){t.beginPath(),t.moveTo.apply(t,e),t.lineTo.apply(t,i),t.lineTo.apply(t,r),t.lineTo.apply(t,s),t.lineTo.apply(t,e),o&&(this.alignAndScaleFill_=o[2],t.fillStyle=o[1],this.fill_(t)),a&&(this.setStrokeStyle_(t,a),t.stroke())}calculateImageOrLabelDimensions_(t,e,i,r,s,o,a,l,h,c,u,f,g,p,_,m){a*=f[0],l*=f[1];let x=i-a,E=r-l,C=s+h>t?t-h:s,y=o+c>e?e-c:o,w=p[3]+C*f[0]+p[1],S=p[0]+y*f[1]+p[2],A=x-p[3],R=E-p[0];(_||u!==0)&&(Li[0]=A,Ai[0]=A,Li[1]=R,ci[1]=R,ci[0]=A+w,hi[0]=ci[0],hi[1]=R+S,Ai[1]=hi[1]);let T;return u!==0?(T=kt(Lt(),i,r,1,1,u,-i,-r),dt(T,Li),dt(T,ci),dt(T,hi),dt(T,Ai),Jt(Math.min(Li[0],ci[0],hi[0],Ai[0]),Math.min(Li[1],ci[1],hi[1],Ai[1]),Math.max(Li[0],ci[0],hi[0],Ai[0]),Math.max(Li[1],ci[1],hi[1],Ai[1]),Vn)):Jt(Math.min(A,A+w),Math.min(R,R+S),Math.max(A,A+w),Math.max(R,R+S),Vn),g&&(x=Math.round(x),E=Math.round(E)),{drawImageX:x,drawImageY:E,drawImageW:C,drawImageH:y,originX:h,originY:c,declutterBox:{minX:Vn[0],minY:Vn[1],maxX:Vn[2],maxY:Vn[3],value:m},canvasTransform:T,scale:f}}replayImageOrLabel_(t,e,i,r,s,o,a){let l=!!(o||a),h=r.declutterBox,c=a?a[2]*r.scale[0]/2:0;return h.minX-c<=e[0]&&h.maxX+c>=0&&h.minY-c<=e[1]&&h.maxY+c>=0&&(l&&this.replayTextBackground_(t,Li,ci,hi,Ai,o,a),Fd(t,r.canvasTransform,s,i,r.originX,r.originY,r.drawImageW,r.drawImageH,r.drawImageX,r.drawImageY,r.scale)),!0}fill_(t){let e=this.alignAndScaleFill_;if(e){let i=dt(this.renderedTransform_,[0,0]),r=512*this.pixelRatio;t.save(),t.translate(i[0]%r,i[1]%r),e!==1&&t.scale(e,e)}t.fill(),e&&t.restore()}setStrokeStyle_(t,e){t.strokeStyle=e[1],e[1]&&(t.lineWidth=e[2],t.lineCap=e[3],t.lineJoin=e[4],t.miterLimit=e[5],t.lineDashOffset=e[7],t.setLineDash(e[6]))}drawLabelWithPointPlacement_(t,e,i,r){let s=this.textStates[e],o=this.createLabel(t,e,r,i),a=this.strokeStates[i],l=this.pixelRatio,h=Pc(Array.isArray(t)?t[0]:t,s.textAlign||Ii),c=Br[s.textBaseline||on],u=a&&a.lineWidth?a.lineWidth:0,f=o.width/l-2*s.scale[0],g=h*f+2*(.5-h)*u,p=c*o.height/l+2*(.5-c)*u;return{label:o,anchorX:g,anchorY:p}}execute_(t,e,i,r,s,o,a,l){let h=this.zIndexContext_,c;this.pixelCoordinates_&&zt(i,this.renderedTransform_)?c=this.pixelCoordinates_:(this.pixelCoordinates_||(this.pixelCoordinates_=[]),c=Vt(this.coordinates,0,this.coordinates.length,2,i,this.pixelCoordinates_),xu(this.renderedTransform_,i));let u=0,f=r.length,g=0,p,_=[],m,x,E,C,y,w,S,A,R,T,I,z,G,F=0,V=0,lt=this.coordinateCache_,M=this.viewRotation_,X=Math.round(Math.atan2(-i[1],i[0])*1e12)/1e12,O={context:t,pixelRatio:this.pixelRatio,resolution:this.resolution,rotation:M},$=this.instructions!=r||this.overlaps?0:200,N,tt,it,wt;for(;u<f;){let L=r[u];switch(L[0]){case D.BEGIN_GEOMETRY:N=L[1],wt=L[3],N.getGeometry()?a!==void 0&&!ht(a,wt.getExtent())?u=L[2]+1:++u:u=L[2],h&&(h.zIndex=L[4]);break;case D.BEGIN_PATH:F>$&&(this.fill_(t),F=0),V>$&&(t.stroke(),V=0),!F&&!V&&(t.beginPath(),y=NaN,w=NaN),++u;break;case D.CIRCLE:g=L[1],E=L[2]??0;let Ct=c[g],ot=c[g+1],Re=c[g+2]-E,Ni=c[g+3]-E,ne=Re-Ct,Qn=Ni-ot,Jr=Math.sqrt(ne*ne+Qn*Qn);t.moveTo(Ct+Jr,ot),t.arc(Ct,ot,Jr,0,2*Math.PI,!0),++u;break;case D.CLOSE_PATH:t.closePath(),++u;break;case D.CUSTOM:g=L[1],p=L[2];let Gi=L[3],Xi=L[4],gn=L[5];O.geometry=Gi,O.feature=N,u in lt||(lt[u]=[]);let Ze=lt[u];gn?gn(c,g,p,2,Ze):(Ze[0]=c[g],Ze[1]=c[g+1],Ze.length=2),h&&(h.zIndex=L[6]),Xi(Ze,O),++u;break;case D.DRAW_IMAGE:g=L[1],p=L[2],R=L[3],m=L[4],x=L[5];let pn=L[6],tr=L[7],er=L[8],Qr=L[9],ui=L[10],ir=L[11],Eg=L[12],ts=L[13];C=L[14]||"declutter";let nr=L[15];if(!R&&L.length>=20){T=L[19],I=L[20],z=L[21],G=L[22];let vt=this.drawLabelWithPointPlacement_(T,I,z,G);R=vt.label,L[3]=R;let Se=L[23];m=(vt.anchorX-Se)*this.pixelRatio,L[4]=m;let re=L[24];x=(vt.anchorY-re)*this.pixelRatio,L[5]=x,pn=R.height,L[6]=pn,ts=R.width,L[13]=ts}let Go;L.length>25&&(Go=L[25]);let Xo,es,is;L.length>17?(Xo=L[16],es=L[17],is=L[18]):(Xo=ni,es=null,is=null),ui&&X?ir+=M:!ui&&!X&&(ir-=M);let wg=0;for(;g<p;g+=2){if(Go&&Go[wg++]<ts/this.pixelRatio)continue;let vt=this.calculateImageOrLabelDimensions_(R.width,R.height,c[g],c[g+1],ts,pn,m,x,er,Qr,ir,Eg,s,Xo,!!es||!!is,N),Se=[t,e,R,vt,tr,es,is];if(l){let re,Te,se;if(nr){let gt=p-g;if(!nr[gt]){nr[gt]={args:Se,declutterMode:C};continue}let Ut=nr[gt];re=Ut.args,Te=Ut.declutterMode,delete nr[gt],se=Rf(re)}let Be,Ve;if(re&&(Te!=="declutter"||!l.collides(se))&&(Be=!0),(C!=="declutter"||!l.collides(vt.declutterBox))&&(Ve=!0),Te==="declutter"&&C==="declutter"){let gt=Be&&Ve;Be=gt,Ve=gt}Be&&(Te!=="none"&&l.insert(se),this.replayImageOrLabel_.apply(this,re)),Ve&&(C!=="none"&&l.insert(vt.declutterBox),this.replayImageOrLabel_.apply(this,Se))}else this.replayImageOrLabel_.apply(this,Se)}++u;break;case D.DRAW_CHARS:let mh=L[1],_h=L[2],Wo=L[3],Cg=L[4];G=L[5];let vg=L[6],xh=L[7],yh=L[8];z=L[9];let Yo=L[10];T=L[11],Array.isArray(T)&&(T=T.reduce(Fm,"")),I=L[12];let Eh=[L[13],L[13]];C=L[14]||"declutter";let bg=L[15],wh=L[16],Uo=this.textStates[I],rr=Uo.font,sr=[Uo.scale[0]*xh,Uo.scale[1]*xh],or;rr in this.widths_?or=this.widths_[rr]:(or={},this.widths_[rr]=or);let Ch=vf(c,mh,_h,2),vh=Math.abs(sr[0])*Dl(rr,T,or);if(Cg||vh<=Ch){let vt=this.textStates[I].textAlign,Se=(Ch-vh)*Pc(T,vt),re=bf(c,mh,_h,2,T,Se,vg,Math.abs(sr[0]),Dl,rr,or,X?0:this.viewRotation_,bg);t:if(re){let Te=[],se,Be,Ve,gt,Ut;if(z)for(se=0,Be=re.length;se<Be;++se){Ut=re[se],Ve=Ut[4],gt=this.createLabel(Ve,I,"",z),m=Ut[2]+(sr[0]<0?-Yo:Yo)-wh,x=Wo*gt.height+(.5-Wo)*2*Yo*sr[1]/sr[0]-yh;let je=this.calculateImageOrLabelDimensions_(gt.width,gt.height,Ut[0],Ut[1],gt.width,gt.height,m,x,0,0,Ut[3],Eh,!1,ni,!1,N);if(l&&C==="declutter"&&l.collides(je.declutterBox))break t;Te.push([t,e,gt,je,1,null,null])}if(G)for(se=0,Be=re.length;se<Be;++se){Ut=re[se],Ve=Ut[4],gt=this.createLabel(Ve,I,G,""),m=Ut[2]-wh,x=Wo*gt.height-yh;let je=this.calculateImageOrLabelDimensions_(gt.width,gt.height,Ut[0],Ut[1],gt.width,gt.height,m,x,0,0,Ut[3],Eh,!1,ni,!1,N);if(l&&C==="declutter"&&l.collides(je.declutterBox))break t;Te.push([t,e,gt,je,1,null,null])}l&&C!=="none"&&l.load(Te.map(Rf));for(let je=0,Rg=Te.length;je<Rg;++je)this.replayImageOrLabel_.apply(this,Te[je])}}++u;break;case D.END_GEOMETRY:if(o!==void 0){N=L[1];let vt=o(N,wt,C);if(vt)return vt}++u;break;case D.FILL:$?F++:this.fill_(t),++u;break;case D.MOVE_TO_LINE_TO:g=L[1],p=L[2],E=L[3];let Wi,ar,ns;if(E){let Se=(L[4]??!1)||Math.abs(c[g]-c[p-2])<1e-6&&Math.abs(c[g+1]-c[p-1])<1e-6;vo(c,g,p,2,E,Se,_),bo(_,2,Se),Wi=_,ar=0,ns=Wi.length}else Wi=c,ar=g,ns=p;tt=Wi[ar],it=Wi[ar+1],t.moveTo(tt,it),y=tt+.5|0,w=it+.5|0;for(let vt=ar+2;vt<ns;vt+=2)tt=Wi[vt],it=Wi[vt+1],S=tt+.5|0,A=it+.5|0,(vt==ns-2||S!==y||A!==w)&&(t.lineTo(tt,it),y=S,w=A);++u;break;case D.SET_FILL_STYLE:this.alignAndScaleFill_=L[2],F?(this.fill_(t),F=0,V&&(t.stroke(),V=0)):V&&L[1]&&(t.stroke(),V=0),t.fillStyle=L[1],++u;break;case D.SET_STROKE_STYLE:F&&L[1]&&(this.fill_(t),F=0),V&&(t.stroke(),V=0),this.setStrokeStyle_(t,L),++u;break;case D.STROKE:$?V++:t.stroke(),++u;break;default:++u;break}}F&&this.fill_(t),V&&t.stroke()}execute(t,e,i,r,s,o){this.viewRotation_=r,this.execute_(t,e,i,this.instructions,s,void 0,void 0,o)}executeHitDetection(t,e,i,r,s){return this.viewRotation_=i,this.execute_(t,[t.canvas.width,t.canvas.height],e,this.hitDetectionInstructions,!0,r,s)}},Tf=Oc;var Mi=["Polygon","Circle","LineString","Image","Text","Default"],Fc=["Image","Text"],If=Mi.filter(n=>!Fc.includes(n)),Lf=!1,Af=!1;function zm(){let n=0,t=i=>{let r=nt(1,1,null,{willReadFrequently:i}),s=0,o=performance.now();for(;performance.now()-o<50;++s)r.fillStyle=`rgba(255,0,${s%256},1)`,r.fillRect(0,0,1,1),r.getImageData(0,0,1,1);return n=s>n?s:n,s};Lf={[t(!0)]:!0,[t(!1)]:!1,[t(void 0)]:void 0}[n],Af=!0}var Dc=class{constructor(t,e,i,r,s,o,a){this.maxExtent_=t,this.overlaps_=r,this.pixelRatio_=i,this.resolution_=e,this.renderBuffer_=o,this.executorsByZIndex_={},this.hitDetectionContext_=null,this.hitDetectionTransform_=Lt(),this.renderedContext_=null,this.deferredZIndexContexts_={},this.createExecutors_(s,a)}clip(t,e){let i=this.getClipCoords(e);t.beginPath(),t.moveTo(i[0],i[1]),t.lineTo(i[2],i[3]),t.lineTo(i[4],i[5]),t.lineTo(i[6],i[7]),t.clip()}createExecutors_(t,e){for(let i in t){let r=this.executorsByZIndex_[i];r===void 0&&(r={},this.executorsByZIndex_[i]=r);let s=t[i];for(let o in s){let a=s[o];r[o]=new Tf(this.resolution_,this.pixelRatio_,this.overlaps_,a,e)}}}hasExecutors(t){for(let e in this.executorsByZIndex_){let i=this.executorsByZIndex_[e];for(let r=0,s=t.length;r<s;++r)if(t[r]in i)return!0}return!1}forEachFeatureAtCoordinate(t,e,i,r,s,o){Af===!1&&zm(),r=Math.round(r);let a=r*2+1,l=kt(this.hitDetectionTransform_,r+.5,r+.5,1/e,-1/e,-i,-t[0],-t[1]),h=!this.hitDetectionContext_;h&&(this.hitDetectionContext_=nt(a,a,null,{willReadFrequently:Lf}));let c=this.hitDetectionContext_;c.canvas.width!==a||c.canvas.height!==a?(c.canvas.width=a,c.canvas.height=a):h||c.clearRect(0,0,a,a);let u;this.renderBuffer_!==void 0&&(u=ut(),Bi(u,t),En(u,e*(this.renderBuffer_+r),u));let f=Nm(r),g;function p(w,S,A){let R=c.getImageData(0,0,a,a).data;for(let T=0,I=f.length;T<I;T++)if(R[f[T]]>0){if(!o||A==="none"||g!=="Image"&&g!=="Text"||o.includes(w)){let z=(f[T]-3)/4,G=r-z%a,F=r-(z/a|0),V=s(w,S,G*G+F*F);if(V)return V}c.clearRect(0,0,a,a);break}}let _=Object.keys(this.executorsByZIndex_).map(Number);_.sort(Zt);let m,x,E,C,y;for(m=_.length-1;m>=0;--m){let w=_[m].toString();for(E=this.executorsByZIndex_[w],x=Mi.length-1;x>=0;--x)if(g=Mi[x],C=E[g],C!==void 0&&(y=C.executeHitDetection(c,l,i,p,u),y))return y}}getClipCoords(t){let e=this.maxExtent_;if(!e)return null;let i=e[0],r=e[1],s=e[2],o=e[3],a=[i,r,i,o,s,o,s,r];return Vt(a,0,8,2,t,a),a}isEmpty(){return de(this.executorsByZIndex_)}execute(t,e,i,r,s,o,a){let l=Object.keys(this.executorsByZIndex_).map(Number);l.sort(a?Rh:Zt),o=o||Mi;let h=Mi.length;for(let c=0,u=l.length;c<u;++c){let f=l[c].toString(),g=this.executorsByZIndex_[f];for(let p=0,_=o.length;p<_;++p){let m=o[p],x=g[m];if(x!==void 0){let E=a===null?void 0:x.getZIndexContext(),C=E?E.getContext():t,y=this.maxExtent_&&m!=="Image"&&m!=="Text";if(y&&(C.save(),this.clip(C,i)),!E||m==="Text"||m==="Image"?x.execute(C,e,i,r,s,a):E.pushFunction(w=>x.execute(w,e,i,r,s,a)),y&&C.restore(),E){E.offset();let w=l[c]*h+Mi.indexOf(m);this.deferredZIndexContexts_[w]||(this.deferredZIndexContexts_[w]=[]),this.deferredZIndexContexts_[w].push(E)}}}}this.renderedContext_=t}getDeferredZIndexContexts(){return this.deferredZIndexContexts_}getRenderedContext(){return this.renderedContext_}renderDeferred(){let t=this.deferredZIndexContexts_,e=Object.keys(t).map(Number).sort(Zt);for(let i=0,r=e.length;i<r;++i)t[e[i]].forEach(s=>{s.draw(this.renderedContext_),s.clear()}),t[e[i]].length=0}},kc={};function Nm(n){if(kc[n]!==void 0)return kc[n];let t=n*2+1,e=n*n,i=new Array(e+1);for(let s=0;s<=n;++s)for(let o=0;o<=n;++o){let a=s*s+o*o;if(a>e)break;let l=i[a];l||(l=[],i[a]=l),l.push(((n+s)*t+(n+o))*4+3),s>0&&l.push(((n-s)*t+(n+o))*4+3),o>0&&(l.push(((n+s)*t+(n-o))*4+3),s>0&&l.push(((n-s)*t+(n-o))*4+3))}let r=[];for(let s=0,o=i.length;s<o;++s)i[s]&&r.push(...i[s]);return kc[n]=r,r}var Mf=Dc;var zc=class extends Co{constructor(t,e,i,r,s,o,a){super(),this.context_=t,this.pixelRatio_=e,this.extent_=i,this.transform_=r,this.transformRotation_=r?Ui(Math.atan2(r[1],r[0]),10):0,this.viewRotation_=s,this.squaredTolerance_=o,this.userTransform_=a,this.contextFillState_=null,this.contextStrokeState_=null,this.contextTextState_=null,this.fillState_=null,this.strokeState_=null,this.image_=null,this.imageAnchorX_=0,this.imageAnchorY_=0,this.imageHeight_=0,this.imageOpacity_=0,this.imageOriginX_=0,this.imageOriginY_=0,this.imageRotateWithView_=!1,this.imageRotation_=0,this.imageScale_=[0,0],this.imageWidth_=0,this.text_="",this.textOffsetX_=0,this.textOffsetY_=0,this.textRotateWithView_=!1,this.textRotation_=0,this.textScale_=[0,0],this.textFillState_=null,this.textStrokeState_=null,this.textState_=null,this.pixelCoordinates_=[],this.tmpLocalTransform_=Lt()}drawImages_(t,e,i,r){if(!this.image_)return;let s=Vt(t,e,i,r,this.transform_,this.pixelCoordinates_),o=this.context_,a=this.tmpLocalTransform_,l=o.globalAlpha;this.imageOpacity_!=1&&(o.globalAlpha=l*this.imageOpacity_);let h=this.imageRotation_;this.transformRotation_===0&&(h-=this.viewRotation_),this.imageRotateWithView_&&(h+=this.viewRotation_);for(let c=0,u=s.length;c<u;c+=2){let f=s[c]-this.imageAnchorX_,g=s[c+1]-this.imageAnchorY_;if(h!==0||this.imageScale_[0]!=1||this.imageScale_[1]!=1){let p=f+this.imageAnchorX_,_=g+this.imageAnchorY_;kt(a,p,_,1,1,h,-p,-_),o.save(),o.transform.apply(o,a),o.translate(p,_),o.scale(this.imageScale_[0],this.imageScale_[1]),o.drawImage(this.image_,this.imageOriginX_,this.imageOriginY_,this.imageWidth_,this.imageHeight_,-this.imageAnchorX_,-this.imageAnchorY_,this.imageWidth_,this.imageHeight_),o.restore()}else o.drawImage(this.image_,this.imageOriginX_,this.imageOriginY_,this.imageWidth_,this.imageHeight_,f,g,this.imageWidth_,this.imageHeight_)}this.imageOpacity_!=1&&(o.globalAlpha=l)}drawText_(t,e,i,r){if(!this.textState_||this.text_==="")return;this.textFillState_&&this.setContextFillState_(this.textFillState_),this.textStrokeState_&&this.setContextStrokeState_(this.textStrokeState_),this.setContextTextState_(this.textState_);let s=Vt(t,e,i,r,this.transform_,this.pixelCoordinates_),o=this.context_,a=this.textRotation_;for(this.transformRotation_===0&&(a-=this.viewRotation_),this.textRotateWithView_&&(a+=this.viewRotation_);e<i;e+=r){let l=s[e]+this.textOffsetX_,h=s[e+1]+this.textOffsetY_;a!==0||this.textScale_[0]!=1||this.textScale_[1]!=1?(o.save(),o.translate(l-this.textOffsetX_,h-this.textOffsetY_),o.rotate(a),o.translate(this.textOffsetX_,this.textOffsetY_),o.scale(this.textScale_[0],this.textScale_[1]),this.textStrokeState_&&o.strokeText(this.text_,0,0),this.textFillState_&&o.fillText(this.text_,0,0),o.restore()):(this.textStrokeState_&&o.strokeText(this.text_,l,h),this.textFillState_&&o.fillText(this.text_,l,h))}}moveToLineTo_(t,e,i,r,s,o){let a=this.context_,l=Vt(t,e,i,r,this.transform_,this.pixelCoordinates_);if(Math.abs(o)>0){let c=l.length,u=s||Math.abs(l[0]-l[c-2])<1e-6&&Math.abs(l[1]-l[c-1])<1e-6;l=vo(l,0,c,2,o,u,l),bo(l,2,u)}a.moveTo(l[0],l[1]);let h=l.length;s&&(h-=2);for(let c=2;c<h;c+=2)a.lineTo(l[c],l[c+1]);return s&&a.closePath(),i}drawRings_(t,e,i,r,s){for(let o=0,a=i.length;o<a;++o)e=this.moveToLineTo_(t,e,i[o],r,!0,s);return e}drawCircle(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),!!ht(this.extent_,t.getExtent())){if(this.fillState_||this.strokeState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);let e=Su(t,this.transform_,this.pixelCoordinates_),i=e[2]-e[0],r=e[3]-e[1],s=Math.sqrt(i*i+r*r),o=this.context_;o.beginPath(),o.arc(e[0],e[1],s,0,2*Math.PI),this.fillState_&&o.fill(),this.strokeState_&&o.stroke()}this.text_!==""&&this.drawText_(t.getCenter(),0,2,2)}}setStyle(t){this.setFillStrokeStyle(t.getFill(),t.getStroke()),this.setImageStyle(t.getImage()),this.setTextStyle(t.getText())}setTransform(t){this.transform_=t}drawGeometry(t){switch(t.getType()){case"Point":this.drawPoint(t);break;case"LineString":this.drawLineString(t);break;case"Polygon":this.drawPolygon(t);break;case"MultiPoint":this.drawMultiPoint(t);break;case"MultiLineString":this.drawMultiLineString(t);break;case"MultiPolygon":this.drawMultiPolygon(t);break;case"GeometryCollection":this.drawGeometryCollection(t);break;case"Circle":this.drawCircle(t);break;default:}}drawFeature(t,e){let i=e.getGeometryFunction()(t);i&&(this.setStyle(e),this.drawGeometry(i))}drawGeometryCollection(t){let e=t.getGeometriesArray();for(let i=0,r=e.length;i<r;++i)this.drawGeometry(e[i])}drawPoint(t){this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_));let e=t.getFlatCoordinates(),i=t.getStride();this.image_&&this.drawImages_(e,0,e.length,i),this.text_!==""&&this.drawText_(e,0,e.length,i)}drawMultiPoint(t){this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_));let e=t.getFlatCoordinates(),i=t.getStride();this.image_&&this.drawImages_(e,0,e.length,i),this.text_!==""&&this.drawText_(e,0,e.length,i)}drawLineString(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),!!ht(this.extent_,t.getExtent())){if(this.strokeState_){this.setContextStrokeState_(this.strokeState_);let e=this.context_,i=t.getFlatCoordinates();e.beginPath(),this.moveToLineTo_(i,0,i.length,t.getStride(),!1,this.strokeState_.strokeOffset),e.stroke()}if(this.text_!==""){let e=t.getFlatMidpoint();this.drawText_(e,0,2,2)}}}drawMultiLineString(t){this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_));let e=t.getExtent();if(ht(this.extent_,e)){if(this.strokeState_){this.setContextStrokeState_(this.strokeState_);let i=this.context_,r=t.getFlatCoordinates(),s=0,o=t.getEnds(),a=t.getStride();i.beginPath();for(let l=0,h=o.length;l<h;++l)s=this.moveToLineTo_(r,s,o[l],a,!1,this.strokeState_.strokeOffset);i.stroke()}if(this.text_!==""){let i=t.getFlatMidpoints();this.drawText_(i,0,i.length,2)}}}drawPolygon(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),!!ht(this.extent_,t.getExtent())){if(this.strokeState_||this.fillState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);let e=this.context_;e.beginPath(),this.drawRings_(t.getOrientedFlatCoordinates(),0,t.getEnds(),t.getStride(),this.strokeState_?.strokeOffset),this.fillState_&&e.fill(),this.strokeState_&&e.stroke()}if(this.text_!==""){let e=t.getFlatInteriorPoint();this.drawText_(e,0,2,2)}}}drawMultiPolygon(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),!!ht(this.extent_,t.getExtent())){if(this.strokeState_||this.fillState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);let e=this.context_,i=t.getOrientedFlatCoordinates(),r=0,s=t.getEndss(),o=t.getStride();e.beginPath();for(let a=0,l=s.length;a<l;++a){let h=s[a];r=this.drawRings_(i,r,h,o,this.strokeState_?.strokeOffset)}this.fillState_&&e.fill(),this.strokeState_&&e.stroke()}if(this.text_!==""){let e=t.getFlatInteriorPoints();this.drawText_(e,0,e.length,2)}}}setContextFillState_(t){let e=this.context_,i=this.contextFillState_;i?i.fillStyle!=t.fillStyle&&(i.fillStyle=t.fillStyle,e.fillStyle=t.fillStyle):(e.fillStyle=t.fillStyle,this.contextFillState_={fillStyle:t.fillStyle})}setContextStrokeState_(t){let e=this.context_,i=this.contextStrokeState_;i?(i.lineCap!=t.lineCap&&(i.lineCap=t.lineCap,e.lineCap=t.lineCap),zt(i.lineDash,t.lineDash)||e.setLineDash(i.lineDash=t.lineDash),i.lineDashOffset!=t.lineDashOffset&&(i.lineDashOffset=t.lineDashOffset,e.lineDashOffset=t.lineDashOffset),i.lineJoin!=t.lineJoin&&(i.lineJoin=t.lineJoin,e.lineJoin=t.lineJoin),i.lineWidth!=t.lineWidth&&(i.lineWidth=t.lineWidth,e.lineWidth=t.lineWidth),i.miterLimit!=t.miterLimit&&(i.miterLimit=t.miterLimit,e.miterLimit=t.miterLimit),i.strokeStyle!=t.strokeStyle&&(i.strokeStyle=t.strokeStyle,e.strokeStyle=t.strokeStyle)):(e.lineCap=t.lineCap,e.setLineDash(t.lineDash),e.lineDashOffset=t.lineDashOffset,e.lineJoin=t.lineJoin,e.lineWidth=t.lineWidth,e.miterLimit=t.miterLimit,e.strokeStyle=t.strokeStyle,this.contextStrokeState_={lineCap:t.lineCap,lineDash:t.lineDash,lineDashOffset:t.lineDashOffset,lineJoin:t.lineJoin,lineWidth:t.lineWidth,miterLimit:t.miterLimit,strokeStyle:t.strokeStyle})}setContextTextState_(t){let e=this.context_,i=this.contextTextState_,r=t.textAlign?t.textAlign:Ii;i?(i.font!=t.font&&(i.font=t.font,e.font=t.font),i.textAlign!=r&&(i.textAlign=r,e.textAlign=r),i.textBaseline!=t.textBaseline&&(i.textBaseline=t.textBaseline,e.textBaseline=t.textBaseline)):(e.font=t.font,e.textAlign=r,e.textBaseline=t.textBaseline,this.contextTextState_={font:t.font,textAlign:r,textBaseline:t.textBaseline})}setFillStrokeStyle(t,e){if(!t)this.fillState_=null;else{let i=t.getColor();this.fillState_={fillStyle:jt(i||St)}}if(!e)this.strokeState_=null;else{let i=e.getColor(),r=e.getLineCap(),s=e.getLineDash(),o=e.getLineDashOffset(),a=e.getLineJoin(),l=e.getWidth(),h=e.getMiterLimit(),c=s||Ht,u=e.getOffset();this.strokeState_={lineCap:r!==void 0?r:Ge,lineDash:this.pixelRatio_===1?c:c.map(f=>f*this.pixelRatio_),lineDashOffset:(o||qt)*this.pixelRatio_,lineJoin:a!==void 0?a:Xe,lineWidth:(l!==void 0?l:ri)*this.pixelRatio_,miterLimit:h!==void 0?h:ii,strokeStyle:jt(i||Yt),strokeOffset:(u??0)*this.pixelRatio_}}}setImageStyle(t){let e;if(!t||!(e=t.getSize())){this.image_=null;return}let i=t.getPixelRatio(this.pixelRatio_),r=t.getAnchor(),s=t.getOrigin();this.image_=t.getImage(this.pixelRatio_),this.imageAnchorX_=r[0]*i,this.imageAnchorY_=r[1]*i,this.imageHeight_=e[1]*i,this.imageOpacity_=t.getOpacity(),this.imageOriginX_=s[0],this.imageOriginY_=s[1],this.imageRotateWithView_=t.getRotateWithView(),this.imageRotation_=t.getRotation();let o=t.getScaleArray();this.imageScale_=[o[0]*this.pixelRatio_/i,o[1]*this.pixelRatio_/i],this.imageWidth_=e[0]*i}setTextStyle(t){if(!t)this.text_="";else{let e=t.getFill();if(!e)this.textFillState_=null;else{let g=e.getColor();this.textFillState_={fillStyle:jt(g||St)}}let i=t.getStroke();if(!i)this.textStrokeState_=null;else{let g=i.getColor(),p=i.getLineCap(),_=i.getLineDash(),m=i.getLineDashOffset(),x=i.getLineJoin(),E=i.getWidth(),C=i.getMiterLimit();this.textStrokeState_={lineCap:p!==void 0?p:Ge,lineDash:_||Ht,lineDashOffset:m||qt,lineJoin:x!==void 0?x:Xe,lineWidth:E!==void 0?E:ri,miterLimit:C!==void 0?C:ii,strokeStyle:jt(g||Yt)}}let r=t.getFont(),s=t.getOffsetX(),o=t.getOffsetY(),a=t.getRotateWithView(),l=t.getRotation(),h=t.getScaleArray(),c=t.getText(),u=t.getTextAlign(),f=t.getTextBaseline();this.textState_={font:r!==void 0?r:io,textAlign:u!==void 0?u:Ii,textBaseline:f!==void 0?f:on},this.text_=c!==void 0?Array.isArray(c)?c.reduce((g,p,_)=>g+=_%2?" ":p,""):c:"",this.textOffsetX_=s!==void 0?this.pixelRatio_*s:0,this.textOffsetY_=o!==void 0?this.pixelRatio_*o:0,this.textRotateWithView_=a!==void 0?a:!1,this.textRotation_=l!==void 0?l:0,this.textScale_=[this.pixelRatio_*h[0],this.pixelRatio_*h[1]]}}},Pf=zc;var ve=.5;function Of(n,t,e,i,r,s,o,a,l){let h=l?xi(r,l):r,c=n[0]*ve,u=n[1]*ve,f=nt(c,u);f.imageSmoothingEnabled=!1;let g=f.canvas,p=new Pf(f,ve,r,null,o,a,l?Hi($i(),l):null),_=e.length,m=Math.floor((256*256*256-1)/_),x={};for(let C=1;C<=_;++C){let y=e[C-1],w=y.getStyleFunction()||i;if(!w)continue;let S=w(y,s);if(!S)continue;Array.isArray(S)||(S=[S]);let R=(C*m).toString(16).padStart(7,"#00000");for(let T=0,I=S.length;T<I;++T){let z=S[T],G=z.getGeometryFunction()(y);if(!G||!ht(h,G.getExtent()))continue;let F=z.clone(),V=F.getFill();V&&V.setColor(R);let lt=F.getStroke();lt&&(lt.setColor(R),lt.setLineDash(null)),F.setText(void 0);let M=z.getImage();if(M){let N=M.getImageSize();if(!N)continue;let tt=nt(N[0],N[1],void 0,{alpha:!1}),it=tt.canvas;tt.fillStyle=R,tt.fillRect(0,0,it.width,it.height),F.setImage(new an({img:it,anchor:M.getAnchor(),anchorXUnits:"pixels",anchorYUnits:"pixels",offset:M.getOrigin(),opacity:1,size:M.getSize(),scale:M.getScale(),rotation:M.getRotation(),rotateWithView:M.getRotateWithView()}))}let X=F.getZIndex()||0,O=x[X];O||(O={},x[X]=O,O.Polygon=[],O.Circle=[],O.LineString=[],O.Point=[]);let $=G.getType();if($==="GeometryCollection"){let N=G.getGeometriesArrayRecursive();for(let tt=0,it=N.length;tt<it;++tt){let wt=N[tt];O[wt.getType().replace("Multi","")].push(wt,F)}}else O[$.replace("Multi","")].push(G,F)}}let E=Object.keys(x).map(Number).sort(Zt);for(let C=0,y=E.length;C<y;++C){let w=x[E[C]];for(let S in w){let A=w[S];for(let R=0,T=A.length;R<T;R+=2){p.setStyle(A[R+1]);for(let I=0,z=t.length;I<z;++I)p.setTransform(t[I]),p.drawGeometry(A[R])}}}return f.getImageData(0,0,g.width,g.height)}function kf(n,t,e){let i=[];if(e){let r=Math.floor(Math.round(n[0])*ve),s=Math.floor(Math.round(n[1])*ve),o=(et(r,0,e.width-1)+et(s,0,e.height-1)*e.width)*4,a=e.data[o],l=e.data[o+1],c=e.data[o+2]+256*(l+256*a),u=Math.floor((256*256*256-1)/t.length);c&&c%u===0&&i.push(t[c/u-1])}return i}var Gm=.5,Df={Point:Bm,LineString:Um,Polygon:jm,MultiPoint:Vm,MultiLineString:Km,MultiPolygon:Zm,GeometryCollection:Ym,Circle:Xm};function Ff(n,t){return parseInt(Y(n),10)-parseInt(Y(t),10)}function Nc(n,t){let e=Gc(n,t);return e*e}function Gc(n,t){return Gm*n/t}function Xm(n,t,e,i,r){let s=e.getFill(),o=e.getStroke();if(s||o){let l=n.getBuilder(e.getZIndex(),"Circle");l.setFillStrokeStyle(s,o),l.drawCircle(t,i,r)}let a=e.getText();if(a&&a.getText()){let l=n.getBuilder(e.getZIndex(),"Text");l.setTextStyle(a),l.drawText(t,i,r)}}function Xc(n,t,e,i,r,s,o,a){let l=[],h=e.getImage();if(h){let f=!0,g=h.getImageState();g==W.LOADED||g==W.ERROR?f=!1:g==W.IDLE&&h.load(),f&&l.push(h.ready())}let c=e.getFill();c&&c.loading()&&l.push(c.ready());let u=l.length>0;return u&&Promise.all(l).then(()=>r(null)),Wm(n,t,e,i,s,o,a),u}function Wm(n,t,e,i,r,s,o){let a=e.getGeometryFunction()(t);if(!a)return;let l=a.simplifyTransformed(i,r);if(e.getRenderer())zf(n,l,e,t,o);else{let c=Df[l.getType()];c(n,l,e,t,o,s)}}function zf(n,t,e,i,r){if(t.getType()=="GeometryCollection"){let o=t.getGeometries();for(let a=0,l=o.length;a<l;++a)zf(n,o[a],e,i,r);return}n.getBuilder(e.getZIndex(),"Default").drawCustom(t,i,e.getRenderer(),e.getHitDetectionRenderer(),r)}function Ym(n,t,e,i,r,s){let o=t.getGeometriesArray(),a,l;for(a=0,l=o.length;a<l;++a){let h=Df[o[a].getType()];h(n,o[a],e,i,r,s)}}function Um(n,t,e,i,r){let s=e.getStroke();if(s){let a=n.getBuilder(e.getZIndex(),"LineString");a.setFillStrokeStyle(null,s),a.drawLineString(t,i,r)}let o=e.getText();if(o&&o.getText()){let a=n.getBuilder(e.getZIndex(),"Text");a.setTextStyle(o),a.drawText(t,i,r)}}function Km(n,t,e,i,r){let s=e.getStroke();if(s){let a=n.getBuilder(e.getZIndex(),"LineString");a.setFillStrokeStyle(null,s),a.drawMultiLineString(t,i,r)}let o=e.getText();if(o&&o.getText()){let a=n.getBuilder(e.getZIndex(),"Text");a.setTextStyle(o),a.drawText(t,i,r)}}function Zm(n,t,e,i,r){let s=e.getFill(),o=e.getStroke();if(o||s){let l=n.getBuilder(e.getZIndex(),"Polygon");l.setFillStrokeStyle(s,o),l.drawMultiPolygon(t,i,r)}let a=e.getText();if(a&&a.getText()){let l=n.getBuilder(e.getZIndex(),"Text");l.setTextStyle(a),l.drawText(t,i,r)}}function Bm(n,t,e,i,r,s){let o=e.getImage(),a=e.getText(),l=a&&a.getText(),h=s&&o&&l?{}:void 0;if(o){if(o.getImageState()!=W.LOADED)return;let c=n.getBuilder(e.getZIndex(),"Image");c.setImageStyle(o,h),c.drawPoint(t,i,r)}if(l){let c=n.getBuilder(e.getZIndex(),"Text");c.setTextStyle(a,h),c.drawText(t,i,r)}}function Vm(n,t,e,i,r,s){let o=e.getImage(),a=o&&o.getOpacity()!==0,l=e.getText(),h=l&&l.getText(),c=s&&a&&h?{}:void 0;if(a){if(o.getImageState()!=W.LOADED)return;let u=n.getBuilder(e.getZIndex(),"Image");u.setImageStyle(o,c),u.drawMultiPoint(t,i,r)}if(h){let u=n.getBuilder(e.getZIndex(),"Text");u.setTextStyle(l,c),u.drawText(t,i,r)}}function jm(n,t,e,i,r){let s=e.getFill(),o=e.getStroke();if(s||o){let l=n.getBuilder(e.getZIndex(),"Polygon");l.setFillStrokeStyle(s,o),l.drawPolygon(t,i,r)}let a=e.getText();if(a&&a.getText()){let l=n.getBuilder(e.getZIndex(),"Text");l.setTextStyle(a),l.drawText(t,i,r)}}var Wc=class extends wo{constructor(t){super(t),this.boundHandleStyleImageChange_=this.handleStyleImageChange_.bind(this),this.animatingOrInteracting_,this.hitDetectionImageData_=null,this.clipExtent_=null,this.extendX_=!1,this.renderedFeatures_=null,this.renderedRevision_=-1,this.renderedResolution_=NaN,this.renderedExtent_=ut(),this.wrappedRenderedExtent_=ut(),this.renderedRotation_,this.renderedCenter_=null,this.renderedProjection_=null,this.renderedPixelRatio_=1,this.renderedRenderOrder_=null,this.renderedFrameDeclutter_,this.replayGroup_=null,this.replayGroupChanged=!0,this.clipping=!0,this.targetContext_=null,this.opacity_=1}renderWorlds(t,e,i){let r=e.extent,s=e.viewState,o=s.center,a=s.resolution,l=s.projection,h=s.rotation,c=l.getExtent(),u=this.getLayer().getSource(),f=this.getLayer().getDeclutter(),g=e.pixelRatio,p=e.viewHints,_=!(p[Rt.ANIMATING]||p[Rt.INTERACTING]),m=this.context,x=Math.round(j(r)/a*g),E=Math.round(ct(r)/a*g),C=u.getWrapX()&&l.canWrapX(),y=C?j(c):null,w=C?Math.ceil((r[2]-c[2])/y)+(this.extendX_?2:1):1,S=C?Math.floor((r[0]-c[0])/y)-(this.extendX_?1:0):0;do{let A=this.getRenderTransform(o,a,0,g,x,E,S*y);e.declutter&&(A=A.slice(0)),t.execute(m,[m.canvas.width,m.canvas.height],A,h,_,i===void 0?Mi:i?Fc:If,i?f&&e.declutter[f]:void 0)}while(++S<w)}setDrawContext_(){this.opacity_!==1&&(this.targetContext_=this.context,this.context=nt(this.context.canvas.width,this.context.canvas.height,gc))}resetDrawContext_(){if(this.opacity_!==1&&this.targetContext_){let t=this.targetContext_.globalAlpha;this.targetContext_.globalAlpha=this.opacity_,this.targetContext_.drawImage(this.context.canvas,0,0),this.targetContext_.globalAlpha=t,Ji(this.context),gc.push(this.context.canvas),this.context=this.targetContext_,this.targetContext_=null}}renderDeclutter(t){!this.replayGroup_||!this.getLayer().getDeclutter()||this.renderWorlds(this.replayGroup_,t,!0)}renderDeferredInternal(t){this.replayGroup_&&(this.clipExtent_&&this.clipUnrotated(this.context,t,this.clipExtent_),this.replayGroup_.renderDeferred(),this.clipExtent_&&(this.context.restore(),this.clipExtent_=null),this.resetDrawContext_())}renderFrame(t,e){let i=t.layerStatesArray[t.layerIndex];this.opacity_=i.opacity;let r=t.viewState;this.prepareContainer(t,e);let s=this.context,o=this.replayGroup_,a=o&&!o.isEmpty();if(!a&&!(this.getLayer().hasListener(Dt.PRERENDER)||this.getLayer().hasListener(Dt.POSTRENDER)))return this.container;this.setDrawContext_(),this.preRender(s,t);let l=r.projection;this.clipExtent_=null;let h=!1;if(a&&i.extent&&this.clipping){let c=ye(i.extent,l);a=ht(c,t.extent),a&&!Pe(c,t.extent)&&(t.declutter?this.clipExtent_=c:(this.clipUnrotated(s,t,c),h=!0))}return a&&this.renderWorlds(o,t,this.getLayer().getDeclutter()?!1:void 0),h&&s.restore(),this.postRender(s,t),this.renderedRotation_!==r.rotation&&(this.renderedRotation_=r.rotation,this.hitDetectionImageData_=null),t.declutter||this.resetDrawContext_(),this.container}getFeatures(t){return new Promise(e=>{if(this.frameState&&!this.hitDetectionImageData_&&!this.animatingOrInteracting_){let i=this.frameState.size.slice(),r=this.renderedCenter_,s=this.renderedResolution_,o=this.renderedRotation_,a=this.renderedProjection_,l=this.wrappedRenderedExtent_,h=this.getLayer(),c=[],u=i[0]*ve,f=i[1]*ve;c.push(this.getRenderTransform(r,s,o,ve,u,f,0).slice());let g=h.getSource(),p=a.getExtent();if(g.getWrapX()&&a.canWrapX()&&!Pe(p,l)){let m=l[0],x=j(p),E=0,C;for(;m<p[0];)--E,C=x*E,c.push(this.getRenderTransform(r,s,o,ve,u,f,C).slice()),m+=x;for(E=0,m=l[2];m>p[2];)++E,C=x*E,c.push(this.getRenderTransform(r,s,o,ve,u,f,C).slice()),m-=x}let _=$i();this.hitDetectionImageData_=Of(i,c,this.renderedFeatures_,h.getStyleFunction(),l,s,o,Nc(s,this.renderedPixelRatio_),_?a:null)}e(kf(t,this.renderedFeatures_,this.hitDetectionImageData_))})}forEachFeatureAtCoordinate(t,e,i,r,s){if(!this.replayGroup_)return;let o=e.viewState.resolution,a=e.viewState.rotation,l=this.getLayer(),h={},c=function(f,g,p){let _=Y(f),m=h[_];if(m){if(m!==!0&&p<m.distanceSq){if(p===0)return h[_]=!0,s.splice(s.lastIndexOf(m),1),r(f,l,g);m.geometry=g,m.distanceSq=p}}else{if(p===0)return h[_]=!0,r(f,l,g);s.push(h[_]={feature:f,layer:l,geometry:g,distanceSq:p,callback:r})}},u=this.getLayer().getDeclutter();return this.replayGroup_.forEachFeatureAtCoordinate(t,o,a,i,c,u?e.declutter?.[u]?.all().map(f=>f.value):null)}handleFontsChanged(){let t=this.getLayer();t.getVisible()&&this.replayGroup_&&t.changed()}handleStyleImageChange_(t){this.renderIfReadyAndVisible()}prepareFrame(t){let e=this.getLayer(),i=e.getSource();if(!i)return!1;let r=t.viewHints[Rt.ANIMATING],s=t.viewHints[Rt.INTERACTING],o=e.getUpdateWhileAnimating(),a=e.getUpdateWhileInteracting();if(this.ready&&!o&&r||!a&&s)return this.animatingOrInteracting_=!0,!0;this.animatingOrInteracting_=!1;let l=t.extent,h=t.viewState,c=h.projection,u=h.resolution,f=t.pixelRatio,g=e.getRevision(),p=e.getRenderBuffer(),_=e.getRenderOrder();_===void 0&&(_=Ff);let m=h.center.slice(),x=En(l,p*u),E=x.slice(),C=[x.slice()],y=c.getExtent(),w=i.getWrapX()&&c.canWrapX();if(this.extendX_=!1,w){let M=i.getExtent();M&&!ke(M)&&(this.extendX_=M[0]<y[0]||M[2]>y[2])}if(w&&(!Pe(y,t.extent)||this.extendX_)){let M=j(y),X=Math.max(j(x)/2,M),O=y[0],$=y[2];this.extendX_&&(O-=M,$+=M),x[0]=O-X,x[2]=$+X,ms(m,c);let N=la(C[0],c);N[0]<y[0]&&N[2]<y[2]?C.push([N[0]+M,N[1],N[2]+M,N[3]]):N[0]>y[0]&&N[2]>y[2]&&C.push([N[0]-M,N[1],N[2]-M,N[3]])}if(this.ready&&this.renderedResolution_==u&&this.renderedPixelRatio_===f&&this.renderedRevision_==g&&this.renderedRenderOrder_==_&&this.renderedFrameDeclutter_===!!t.declutter&&Pe(this.wrappedRenderedExtent_,x))return zt(this.renderedExtent_,E)||(this.hitDetectionImageData_=null,this.renderedExtent_=E),this.renderedCenter_=m,this.replayGroupChanged=!1,!0;this.replayGroup_=null;let S=new Cf(Gc(u,f),x,u,f),A=$i(),R;if(A){for(let M=0,X=C.length;M<X;++M){let O=C[M],$=xi(O,c);i.loadFeatures($,_u(u,c),A)}R=Hi(A,c)}else for(let M=0,X=C.length;M<X;++M)i.loadFeatures(C[M],u,c);let T=Nc(u,f),I=!0,z=(M,X)=>{let O,$=M.getStyleFunction()||e.getStyleFunction();if($&&(O=$(M,u)),O){let N=this.renderFeature(M,T,O,S,R,this.getLayer().getDeclutter(),X);I=I&&!N}},G=xi(x,c),F=i.getFeaturesInExtent(G);_&&F.sort(_);for(let M=0,X=F.length;M<X;++M)z(F[M],M);this.renderedFeatures_=F,this.ready=I;let V=S.finish(),lt=new Mf(x,u,f,i.getOverlaps(),V,e.getRenderBuffer(),!!t.declutter);return this.renderedResolution_=u,this.renderedRevision_=g,this.renderedRenderOrder_=_,this.renderedFrameDeclutter_=!!t.declutter,this.renderedExtent_=E,this.wrappedRenderedExtent_=x,this.renderedCenter_=m,this.renderedProjection_=c,this.renderedPixelRatio_=f,this.replayGroup_=lt,this.hitDetectionImageData_=null,this.replayGroupChanged=!0,!0}renderFeature(t,e,i,r,s,o,a){if(!i)return!1;let l=!1;if(Array.isArray(i))for(let h=0,c=i.length;h<c;++h)l=Xc(r,t,i[h],e,this.boundHandleStyleImageChange_,s,o,a)||l;else l=Xc(r,t,i,e,this.boundHandleStyleImageChange_,s,o,a);return l}},Nf=Wc;var Yc=class extends uo{constructor(t){super(t)}createRenderer(){return new Nf(this)}},ee=Yc;var Hm=!1;function qm(n,t,e,i,r,s,o){let a=new XMLHttpRequest;a.open("GET",typeof n=="function"?n(e,i,r):n,!0),t.getType()=="arraybuffer"&&(a.responseType="arraybuffer"),a.withCredentials=Hm,a.onload=function(l){if(!a.status||a.status>=200&&a.status<300){let h=t.getType();try{let c;h=="text"||h=="json"?c=a.responseText:h=="xml"?c=a.responseXML||a.responseText:h=="arraybuffer"&&(c=a.response),c?s(t.readFeatures(c,{extent:e,featureProjection:r}),t.readProjection(c)):o()}catch{o()}}else o()},a.onerror=o,a.send()}function Uc(n,t){return function(e,i,r,s,o){qm(n,t,e,i,r,(a,l)=>{this.addFeatures(a),s!==void 0&&s(a)},()=>{this.changed(),o!==void 0&&o()})}}function Gf(n,t){return[[-1/0,-1/0,1/0,1/0]]}function Kc(n,t,e,i,r,s,o){let a,l,h=(e-t)/i;if(h===1)a=t;else if(h===2)a=t,l=r;else if(h!==0){let c=n[t],u=n[t+1],f=0,g=[0];for(let m=t+i;m<e;m+=i){let x=n[m],E=n[m+1];f+=Math.sqrt((x-c)*(x-c)+(E-u)*(E-u)),g.push(f),c=x,u=E}let p=r*f,_=bh(g,p);_<0?(l=(p-g[-_-2])/(g[-_-1]-g[-_-2]),a=t+(-_-2)*i):a=t+_*i}o=o>1?o:2,s=s||new Array(o);for(let c=0;c<o;++c)s[c]=a===void 0?NaN:l===void 0?n[a+c]:Nt(n[a+c],n[a+i+c],l);return s}var Xf=Lt(),Vr=class n{constructor(t,e,i,r,s,o){this.styleFunction,this.extent_,this.id_=o,this.type_=t,this.flatCoordinates_=e,this.flatInteriorPoints_=null,this.flatMidpoints_=null,this.ends_=i||null,this.properties_=s,this.squaredTolerance_,this.stride_=r,this.simplifiedGeometry_}get(t){return this.properties_[t]}getExtent(){return this.extent_||(this.extent_=this.type_==="Point"?ds(this.flatCoordinates_):wn(this.flatCoordinates_,0,this.flatCoordinates_.length,this.stride_)),this.extent_}getFlatInteriorPoint(){if(!this.flatInteriorPoints_){let t=Bt(this.getExtent());this.flatInteriorPoints_=vr(this.flatCoordinates_,0,this.ends_,this.stride_,t,0)}return this.flatInteriorPoints_}getFlatInteriorPoints(){if(!this.flatInteriorPoints_){let t=Wu(this.flatCoordinates_,this.ends_),e=go(this.flatCoordinates_,0,t,this.stride_);this.flatInteriorPoints_=Ls(this.flatCoordinates_,0,t,this.stride_,e)}return this.flatInteriorPoints_}getFlatMidpoint(){return this.flatMidpoints_||(this.flatMidpoints_=Kc(this.flatCoordinates_,0,this.flatCoordinates_.length,this.stride_,.5)),this.flatMidpoints_}getFlatMidpoints(){if(!this.flatMidpoints_){this.flatMidpoints_=[];let t=this.flatCoordinates_,e=0,i=this.ends_;for(let r=0,s=i.length;r<s;++r){let o=i[r],a=Kc(t,e,o,this.stride_,.5);fe(this.flatMidpoints_,a),e=o}}return this.flatMidpoints_}getId(){return this.id_}getOrientedFlatCoordinates(){return this.flatCoordinates_}getGeometry(){return this}getSimplifiedGeometry(t){return this}simplifyTransformed(t,e){return this}getProperties(){return this.properties_}getPropertiesInternal(){return this.properties_}getStride(){return this.stride_}getStyleFunction(){return this.styleFunction}getType(){return this.type_}transform(t){t=Et(t);let e=t.getExtent(),i=t.getWorldExtent();if(e&&i){let r=ct(i)/ct(e);kt(Xf,i[0],i[3],r,-r,0,0,0),Vt(this.flatCoordinates_,0,this.flatCoordinates_.length,this.stride_,Xf,this.flatCoordinates_)}}applyTransform(t){t(this.flatCoordinates_,this.flatCoordinates_,this.stride_)}clone(){return new n(this.type_,this.flatCoordinates_.slice(),this.ends_?.slice(),this.stride_,Object.assign({},this.properties_),this.id_)}getEnds(){return this.ends_}enableSimplifyTransformed(){return this.simplifyTransformed=rs((t,e)=>{if(t===this.squaredTolerance_)return this.simplifiedGeometry_;this.simplifiedGeometry_=this.clone(),e&&this.simplifiedGeometry_.applyTransform(e);let i=this.simplifiedGeometry_.getFlatCoordinates(),r;switch(this.type_){case"LineString":i.length=wr(i,0,this.simplifiedGeometry_.flatCoordinates_.length,this.simplifiedGeometry_.stride_,t,i,0),r=[i.length];break;case"MultiLineString":r=[],i.length=zu(i,0,this.simplifiedGeometry_.ends_,this.simplifiedGeometry_.stride_,t,i,0,r);break;case"Polygon":r=[],i.length=Cr(i,0,this.simplifiedGeometry_.ends_,this.simplifiedGeometry_.stride_,Math.sqrt(t),i,0,r);break;default:}return r&&(this.simplifiedGeometry_=new n(this.type_,i,r,this.stride_,this.properties_,this.id_)),this.squaredTolerance_=t,this.simplifiedGeometry_}),this}};Vr.prototype.getFlatCoordinates=Vr.prototype.getOrientedFlatCoordinates;var hn=Vr;var Zc=class{constructor(t){this.rbush_=new en(t),this.items_={}}insert(t,e){let i={minX:t[0],minY:t[1],maxX:t[2],maxY:t[3],value:e};this.rbush_.insert(i),this.items_[Y(e)]=i}load(t,e){let i=new Array(e.length);for(let r=0,s=e.length;r<s;r++){let o=t[r],a=e[r],l={minX:o[0],minY:o[1],maxX:o[2],maxY:o[3],value:a};i[r]=l,this.items_[Y(a)]=l}this.rbush_.load(i)}remove(t){let e=Y(t),i=this.items_[e];return delete this.items_[e],this.rbush_.remove(i)!==null}update(t,e){let i=this.items_[Y(e)],r=[i.minX,i.minY,i.maxX,i.maxY];Zi(r,t)||(this.remove(e),this.insert(t,e))}getAll(){return this.rbush_.all().map(function(e){return e.value})}getInExtent(t){let e={minX:t[0],minY:t[1],maxX:t[2],maxY:t[3]};return this.rbush_.search(e).map(function(r){return r.value})}forEach(t){return this.forEach_(this.getAll(),t)}forEachInExtent(t,e){return this.forEach_(this.getInExtent(t),e)}forEach_(t,e){let i;for(let r=0,s=t.length;r<s;r++)if(i=e(t[r]),i)return i;return i}isEmpty(){return de(this.items_)}clear(){this.rbush_.clear(),this.items_={}}getExtent(t){let e=this.rbush_.toJSON();return Jt(e.minX,e.minY,e.maxX,e.maxY,t)}concat(t){this.rbush_.load(t.rbush_.all());for(let e in t.items_)this.items_[e]=t.items_[e]}},Bc=Zc;var Vc=class extends xt{constructor(t){super(),this.projection=Et(t.projection),this.attributions_=Wf(t.attributions),this.attributionsCollapsible_=t.attributionsCollapsible??!0,this.loading=!1,this.state_=t.state!==void 0?t.state:"ready",this.wrapX_=t.wrapX!==void 0?t.wrapX:!1,this.interpolate_=!!t.interpolate,this.viewResolver=null,this.viewRejector=null;let e=this;this.viewPromise_=new Promise(function(i,r){e.viewResolver=i,e.viewRejector=r})}getAttributions(){return this.attributions_}getAttributionsCollapsible(){return this.attributionsCollapsible_}getProjection(){return this.projection}getResolutions(t){return null}getView(){return this.viewPromise_}ready(){let t=this.getState();return t==="ready"?Promise.resolve():t==="error"?Promise.reject(new Error("Source failed to load")):new Promise((e,i)=>{let r=()=>{let s=this.getState();s==="ready"?(this.un("change",r),e()):s==="error"&&(this.un("change",r),i(new Error("Source failed to load")))};this.on("change",r)})}getState(){return this.state_}getWrapX(){return this.wrapX_}getInterpolate(){return this.interpolate_}refresh(){this.changed()}setAttributions(t){this.attributions_=Wf(t),this.changed()}setState(t){this.state_=t,this.changed()}};function Wf(n){return n?typeof n=="function"?n:(Array.isArray(n)||(n=[n]),t=>n):null}var Ro=Vc;var ie={ADDFEATURE:"addfeature",CHANGEFEATURE:"changefeature",CLEAR:"clear",REMOVEFEATURE:"removefeature",FEATURESLOADSTART:"featuresloadstart",FEATURESLOADEND:"featuresloadend",FEATURESLOADERROR:"featuresloaderror"};var Ue=class extends Tt{constructor(t,e,i){super(t),this.feature=e,this.features=i}},jc=class extends Ro{constructor(t){t=t||{},super({attributions:t.attributions,interpolate:!0,projection:void 0,state:"ready",wrapX:t.wrapX!==void 0?t.wrapX:!0}),this.on,this.once,this.un,this.loader_=$e,this.format_=t.format||null,this.overlaps_=t.overlaps===void 0?!0:t.overlaps,this.url_=t.url,t.loader!==void 0?this.loader_=t.loader:this.url_!==void 0&&(B(this.format_,"`format` must be set when `url` is set"),this.loader_=Uc(this.url_,this.format_)),this.strategy_=t.strategy!==void 0?t.strategy:Gf;let e=t.useSpatialIndex!==void 0?t.useSpatialIndex:!0;this.featuresRtree_=e?new Bc:null,this.loadedExtentsRtree_=new Bc,this.nullGeometryFeatures_={},this.idIndex_={},this.uidIndex_={},this.featureChangeKeys_={},this.featuresCollection_=null;let i,r;Array.isArray(t.features)?r=t.features:t.features&&(i=t.features,r=i.getArray()),!e&&i===void 0&&(i=new Pt(r)),r!==void 0&&this.addFeaturesInternal(r),i!==void 0&&this.bindFeaturesCollection_(i)}addFeature(t){this.addFeatureInternal(t),this.changed()}addFeatureInternal(t){let e=Y(t);if(!this.addToIndex_(e,t)){this.featuresCollection_&&this.featuresCollection_.remove(t);return}this.setupChangeEvents_(e,t);let i=t.getGeometry();if(i){let r=i.getExtent();this.featuresRtree_&&this.featuresRtree_.insert(r,t)}else this.nullGeometryFeatures_[e]=t;this.dispatchEvent(new Ue(ie.ADDFEATURE,t))}setupChangeEvents_(t,e){e instanceof hn||(this.featureChangeKeys_[t]=[K(e,P.CHANGE,this.handleFeatureChange_,this),K(e,ue.PROPERTYCHANGE,this.handleFeatureChange_,this)])}addToIndex_(t,e){let i=!0;if(e.getId()!==void 0){let r=String(e.getId());if(!(r in this.idIndex_))this.idIndex_[r]=e;else if(e instanceof hn){let s=this.idIndex_[r];s instanceof hn?Array.isArray(s)?s.push(e):this.idIndex_[r]=[s,e]:i=!1}else i=!1}return i&&(B(!(t in this.uidIndex_),"The passed `feature` was already added to the source"),this.uidIndex_[t]=e),i}addFeatures(t){this.addFeaturesInternal(t),this.changed()}addFeaturesInternal(t){let e=[],i=[],r=[];for(let s=0,o=t.length;s<o;s++){let a=t[s],l=Y(a);this.addToIndex_(l,a)&&i.push(a)}for(let s=0,o=i.length;s<o;s++){let a=i[s],l=Y(a);this.setupChangeEvents_(l,a);let h=a.getGeometry();if(h){let c=h.getExtent();e.push(c),r.push(a)}else this.nullGeometryFeatures_[l]=a}if(this.featuresRtree_&&this.featuresRtree_.load(e,r),this.hasListener(ie.ADDFEATURE))for(let s=0,o=i.length;s<o;s++)this.dispatchEvent(new Ue(ie.ADDFEATURE,i[s]))}bindFeaturesCollection_(t){let e=!1;this.addEventListener(ie.ADDFEATURE,function(i){e||(e=!0,t.push(i.feature),e=!1)}),this.addEventListener(ie.REMOVEFEATURE,function(i){e||(e=!0,t.remove(i.feature),e=!1)}),t.addEventListener(It.ADD,i=>{e||(e=!0,this.addFeature(i.element),e=!1)}),t.addEventListener(It.REMOVE,i=>{e||(e=!0,this.removeFeature(i.element),e=!1)}),this.featuresCollection_=t}clear(t){if(t){for(let i in this.featureChangeKeys_)this.featureChangeKeys_[i].forEach(J);this.featuresCollection_||(this.featureChangeKeys_={},this.idIndex_={},this.uidIndex_={})}else if(this.featuresRtree_){this.featuresRtree_.forEach(i=>{this.removeFeatureInternal(i)});for(let i in this.nullGeometryFeatures_)this.removeFeatureInternal(this.nullGeometryFeatures_[i])}this.featuresCollection_&&this.featuresCollection_.clear(),this.featuresRtree_&&this.featuresRtree_.clear(),this.nullGeometryFeatures_={};let e=new Ue(ie.CLEAR);this.dispatchEvent(e),this.changed()}forEachFeature(t){if(this.featuresRtree_)return this.featuresRtree_.forEach(t);this.featuresCollection_&&this.featuresCollection_.forEach(t)}forEachFeatureAtCoordinateDirect(t,e){let i=[t[0],t[1],t[0],t[1]];return this.forEachFeatureInExtent(i,function(r){let s=r.getGeometry();if(s instanceof hn||s.intersectsCoordinate(t))return e(r)})}forEachFeatureInExtent(t,e){if(this.featuresRtree_)return this.featuresRtree_.forEachInExtent(t,e);this.featuresCollection_&&this.featuresCollection_.forEach(e)}forEachFeatureIntersectingExtent(t,e){return this.forEachFeatureInExtent(t,function(i){let r=i.getGeometry();if(r instanceof hn||r.intersectsExtent(t)){let s=e(i);if(s)return s}})}getFeaturesCollection(){return this.featuresCollection_}getFeatures(){let t;return this.featuresCollection_?t=this.featuresCollection_.getArray().slice(0):this.featuresRtree_&&(t=this.featuresRtree_.getAll(),de(this.nullGeometryFeatures_)||fe(t,Object.values(this.nullGeometryFeatures_))),t}getFeaturesAtCoordinate(t){let e=[];return this.forEachFeatureAtCoordinateDirect(t,function(i){e.push(i)}),e}getFeaturesInExtent(t,e){if(this.featuresRtree_){if(!(e&&e.canWrapX()&&this.getWrapX()))return this.featuresRtree_.getInExtent(t);let r=ps(t,e);return[].concat(...r.map(s=>this.featuresRtree_.getInExtent(s)))}return this.featuresCollection_?this.featuresCollection_.getArray().slice(0):[]}getClosestFeatureToCoordinate(t,e){let i=t[0],r=t[1],s=null,o=[NaN,NaN],a=1/0,l=[-1/0,-1/0,1/0,1/0];return e=e||He,this.featuresRtree_.forEachInExtent(l,function(h){if(e(h)){let c=h.getGeometry(),u=a;if(a=c instanceof hn?0:c.closestPointXY(i,r,o,a),a<u){s=h;let f=Math.sqrt(a);l[0]=i-f,l[1]=r-f,l[2]=i+f,l[3]=r+f}}}),s}getExtent(t){return this.featuresRtree_?.getExtent(t)??null}getFeatureById(t){let e=this.idIndex_[t.toString()];return e!==void 0?e:null}getFeatureByUid(t){let e=this.uidIndex_[t];return e!==void 0?e:null}getFormat(){return this.format_}getOverlaps(){return this.overlaps_}getUrl(){return this.url_}handleFeatureChange_(t){let e=t.target,i=Y(e),r=e.getGeometry();if(!r)i in this.nullGeometryFeatures_||(this.featuresRtree_&&this.featuresRtree_.remove(e),this.nullGeometryFeatures_[i]=e);else{let o=r.getExtent();i in this.nullGeometryFeatures_?(delete this.nullGeometryFeatures_[i],this.featuresRtree_&&this.featuresRtree_.insert(o,e)):this.featuresRtree_&&this.featuresRtree_.update(o,e)}let s=e.getId();if(s!==void 0){let o=s.toString();this.idIndex_[o]!==e&&(this.removeFromIdIndex_(e),this.idIndex_[o]=e)}else this.removeFromIdIndex_(e),this.uidIndex_[i]=e;this.changed(),this.dispatchEvent(new Ue(ie.CHANGEFEATURE,e))}hasFeature(t){let e=t.getId();if(e!==void 0){let i=this.idIndex_[String(e)];return Array.isArray(i)?i.includes(t):i===t}return Y(t)in this.uidIndex_}isEmpty(){return this.featuresRtree_?this.featuresRtree_.isEmpty()&&de(this.nullGeometryFeatures_):this.featuresCollection_?this.featuresCollection_.getLength()===0:!0}loadFeatures(t,e,i){let r=this.loadedExtentsRtree_,s=this.strategy_(t,e,i);for(let o=0,a=s.length;o<a;++o){let l=s[o];if(!r.forEachInExtent(l,function(c){return Pe(c.extent,l)})){this.loading=Number(this.loading)+1,this.dispatchEvent(new Ue(ie.FEATURESLOADSTART));let c=p=>{this.loading=Number(this.loading)-1,this.dispatchEvent(new Ue(ie.FEATURESLOADEND,void 0,p))},u=()=>{this.changed(),this.loading=Number(this.loading)-1,this.dispatchEvent(new Ue(ie.FEATURESLOADERROR))},f=!1,g=this.loader_.call(this,l,e,i,p=>f||c(p),()=>f||u());g instanceof Promise?(f=!0,g.then(p=>{this.addFeatures(p),c(p)}).catch(u)):this.loader_.length<4&&(this.loading=!1),r.insert(l,{extent:l.slice()})}}}refresh(){this.clear(!0),this.loadedExtentsRtree_.clear(),super.refresh()}removeLoadedExtent(t){let e=this.loadedExtentsRtree_,i=[];e.forEachInExtent(t,function(r){i.push(r)}),i.forEach(r=>{e.remove(r);let s=aa(r.extent,t);for(let o of s)e.insert(o,{extent:o})})}removeFeatures(t){let e=!1;for(let i=0,r=t.length;i<r;++i)e=this.removeFeatureInternal(t[i])||e;e&&this.changed()}removeFeature(t){if(!t)return;this.removeFeatureInternal(t)&&this.changed()}removeFeatureInternal(t){let e=Y(t);if(!(e in this.uidIndex_))return!1;e in this.nullGeometryFeatures_?delete this.nullGeometryFeatures_[e]:this.featuresRtree_&&this.featuresRtree_.remove(t),this.featureChangeKeys_[e]?.forEach(J),delete this.featureChangeKeys_[e];let r=t.getId();if(r!==void 0){let s=r.toString(),o=this.idIndex_[s];o===t?delete this.idIndex_[s]:Array.isArray(o)&&(o.splice(o.indexOf(t),1),o.length===1&&(this.idIndex_[s]=o[0]))}return delete this.uidIndex_[e],this.hasListener(ie.REMOVEFEATURE)&&this.dispatchEvent(new Ue(ie.REMOVEFEATURE,t)),!0}removeFromIdIndex_(t){for(let e in this.idIndex_)if(this.idIndex_[e]===t){delete this.idIndex_[e];break}}setLoader(t){this.loader_=t}setUrl(t){B(this.format_,"`format` must be set when `url` is set"),this.url_=t,this.setLoader(Uc(t,this.format_))}setOverlaps(t){this.overlaps_=t,this.changed()}},Pi=jc;var jn=[0,0,0],Oi=5,Hc=class{constructor(t){let e=t.minZoom,i=t.resolutions;e===void 0&&i&&(e=i.findIndex(o=>o!==void 0)),this.minZoom=e!==void 0?e:0,this.resolutions_=i,B(Th(this.resolutions_,(o,a)=>a-o,!0),"`resolutions` must be sorted in descending order");let r;if(!t.origins){for(let o=0,a=this.resolutions_.length-1;o<a;++o)if(!r)r=this.resolutions_[o]/this.resolutions_[o+1];else if(this.resolutions_[o]/this.resolutions_[o+1]!==r){r=void 0;break}}this.zoomFactor_=r,this.maxZoom=this.resolutions_.length-1,this.origin_=t.origin!==void 0?t.origin:null,this.origins_=null,t.origins!==void 0&&(this.origins_=t.origins,B(this.origins_.length==this.resolutions_.length,"Number of `origins` and `resolutions` must be equal"));let s=t.extent;s!==void 0&&!this.origin_&&!this.origins_&&(this.origin_=ae(s)),B(!this.origin_&&this.origins_||this.origin_&&!this.origins_,"Either `origin` or `origins` must be configured, never both"),this.tileSizes_=null,t.tileSizes!==void 0&&(this.tileSizes_=t.tileSizes,B(this.tileSizes_.length==this.resolutions_.length,"Number of `tileSizes` and `resolutions` must be equal")),this.tileSize_=t.tileSize!==void 0?t.tileSize:this.tileSizes_?null:256,B(!this.tileSize_&&this.tileSizes_||this.tileSize_&&!this.tileSizes_,"Either `tileSize` or `tileSizes` must be configured, never both"),this.extent_=s!==void 0?s:null,this.fullTileRanges_=null,this.tmpSize_=[0,0],this.tmpExtent_=[0,0,0,0],t.tileRanges!==void 0?this.fullTileRanges_=t.tileRanges:t.sizes!==void 0?this.fullTileRanges_=t.sizes.map((o,a)=>{let l=new xo(Math.min(0,o[0]),Math.max(o[0]-1,-1),Math.min(0,o[1]),Math.max(o[1]-1,-1));if(s){let h=this.getTileRangeForExtentAndZ(s,a);l.minX=Math.max(h.minX,l.minX),l.maxX=Math.min(h.maxX,l.maxX),l.minY=Math.max(h.minY,l.minY),l.maxY=Math.min(h.maxY,l.maxY)}return l}):s&&this.calculateTileRanges_(s)}forEachTileCoord(t,e,i){let r=this.getTileRangeForExtentAndZ(t,e);for(let s=r.minX,o=r.maxX;s<=o;++s)for(let a=r.minY,l=r.maxY;a<=l;++a)i([e,s,a])}forEachTileCoordParentTileRange(t,e,i,r){let s,o,a,l=null,h=t[0]-1;for(this.zoomFactor_===2?(o=t[1],a=t[2]):l=this.getTileCoordExtent(t,r);h>=this.minZoom;){if(o!==void 0&&a!==void 0?(o=Math.floor(o/2),a=Math.floor(a/2),s=ln(o,o,a,a,i)):s=this.getTileRangeForExtentAndZ(l,h,i),e(h,s))return!0;--h}return!1}getExtent(){return this.extent_}getMaxZoom(){return this.maxZoom}getMinZoom(){return this.minZoom}getOrigin(t){return this.origin_?this.origin_:this.origins_[t]}getOrigins(){return this.origins_}getResolution(t){return this.resolutions_[t]}getResolutions(){return this.resolutions_}getTileCoordChildTileRange(t,e,i){if(t[0]<this.maxZoom){if(this.zoomFactor_===2){let s=t[1]*2,o=t[2]*2;return ln(s,s+1,o,o+1,e)}let r=this.getTileCoordExtent(t,i||this.tmpExtent_);return this.getTileRangeForExtentAndZ(r,t[0]+1,e)}return null}getTileRangeForTileCoordAndZ(t,e,i){if(e>this.maxZoom||e<this.minZoom)return null;let r=t[0],s=t[1],o=t[2];if(e===r)return ln(s,o,s,o,i);if(this.zoomFactor_){let l=Math.pow(this.zoomFactor_,e-r),h=Math.floor(s*l),c=Math.floor(o*l);if(e<r)return ln(h,h,c,c,i);let u=Math.floor(l*(s+1))-1,f=Math.floor(l*(o+1))-1;return ln(h,u,c,f,i)}let a=this.getTileCoordExtent(t,this.tmpExtent_);return this.getTileRangeForExtentAndZ(a,e,i)}getTileRangeForExtentAndZ(t,e,i){this.getTileCoordForXYAndZ_(t[0],t[3],e,!1,jn);let r=jn[1],s=jn[2];this.getTileCoordForXYAndZ_(t[2],t[1],e,!0,jn);let o=jn[1],a=jn[2];return ln(r,o,s,a,i)}getTileCoordCenter(t){let e=this.getOrigin(t[0]),i=this.getResolution(t[0]),r=pt(this.getTileSize(t[0]),this.tmpSize_);return[e[0]+(t[1]+.5)*r[0]*i,e[1]-(t[2]+.5)*r[1]*i]}getTileCoordExtent(t,e){let i=this.getOrigin(t[0]),r=this.getResolution(t[0]),s=pt(this.getTileSize(t[0]),this.tmpSize_),o=i[0]+t[1]*s[0]*r,a=i[1]-(t[2]+1)*s[1]*r,l=o+s[0]*r,h=a+s[1]*r;return Jt(o,a,l,h,e)}getTileCoordForCoordAndResolution(t,e,i){return this.getTileCoordForXYAndResolution_(t[0],t[1],e,!1,i)}getTileCoordForXYAndResolution_(t,e,i,r,s){let o=this.getZForResolution(i),a=i/this.getResolution(o),l=this.getOrigin(o),h=pt(this.getTileSize(o),this.tmpSize_),c=a*(t-l[0])/i/h[0],u=a*(l[1]-e)/i/h[1];return r?(c=dr(c,Oi)-1,u=dr(u,Oi)-1):(c=ur(c,Oi),u=ur(u,Oi)),Kn(o,c,u,s)}getTileCoordForXYAndZ_(t,e,i,r,s){let o=this.getOrigin(i),a=this.getResolution(i),l=pt(this.getTileSize(i),this.tmpSize_),h=(t-o[0])/a/l[0],c=(o[1]-e)/a/l[1];return r?(h=dr(h,Oi)-1,c=dr(c,Oi)-1):(h=ur(h,Oi),c=ur(c,Oi)),Kn(i,h,c,s)}getTileCoordForCoordAndZ(t,e,i){return this.getTileCoordForXYAndZ_(t[0],t[1],e,!1,i)}getTileCoordResolution(t){return this.resolutions_[t[0]]}getTileSize(t){return this.tileSize_?this.tileSize_:this.tileSizes_[t]}getFullTileRange(t){return this.fullTileRanges_?this.fullTileRanges_[t]:this.extent_?this.getTileRangeForExtentAndZ(this.extent_,t):null}getZForResolution(t,e){let i=_n(this.resolutions_,t,e||0);return et(i,this.minZoom,this.maxZoom)}tileCoordIntersectsViewport(t,e){return Ma(e,0,e.length,2,this.getTileCoordExtent(t))}calculateTileRanges_(t){let e=this.resolutions_.length,i=new Array(e);for(let r=this.minZoom;r<e;++r)i[r]=this.getTileRangeForExtentAndZ(t,r);this.fullTileRanges_=i}},jr=Hc;function So(n){let t=n.getDefaultTileGrid();return t||(t=Jm(n),n.setDefaultTileGrid(t)),t}function Yf(n,t,e){let i=t[0],r=n.getTileCoordCenter(t),s=To(e);if(!me(s,r)){let o=j(s),a=Math.ceil((s[0]-r[0])/o);return r[0]+=o*a,n.getTileCoordForCoordAndZ(r,i)}return t}function $m(n,t,e,i){i=i!==void 0?i:"top-left";let r=Kf(n,t,e);return new jr({extent:n,origin:Gh(n,i),resolutions:r,tileSize:e})}function Uf(n){let t=n||{},e=t.extent||Et("EPSG:3857").getExtent(),i={extent:e,minZoom:t.minZoom,tileSize:t.tileSize,resolutions:Kf(e,t.maxZoom,t.tileSize,t.maxResolution)};return new jr(i)}function Kf(n,t,e,i){t=t!==void 0?t:42,e=pt(e!==void 0?e:256);let r=ct(n),s=j(n);i=i>0?i:Math.max(s/e[0],r/e[1]);let o=t+1,a=new Array(o);for(let l=0;l<o;++l)a[l]=i/Math.pow(2,l);return a}function Jm(n,t,e,i){let r=To(n);return $m(r,t,e,i)}function To(n){n=Et(n);let t=n.getExtent();if(!t){let e=180*Je.degrees/n.getMetersPerUnit();t=Jt(-e,-e,e,e)}return t}var Qm=/\{z\}/g,t_=/\{x\}/g,e_=/\{y\}/g,i_=/\{-y\}/g;function Zf(n,t,e,i,r){return n.replace(Qm,t.toString()).replace(t_,e.toString()).replace(e_,i.toString()).replace(i_,function(){if(r===void 0)throw new Error("If the URL template has a {-y} placeholder, the grid extent must be known");return(r-i).toString()})}function Bf(n){let t=[],e=/\{([a-z])-([a-z])\}/.exec(n);if(e){let i=e[1].charCodeAt(0),r=e[2].charCodeAt(0),s;for(s=i;s<=r;++s)t.push(n.replace(e[0],String.fromCharCode(s)));return t}if(e=/\{(\d+)-(\d+)\}/.exec(n),e){let i=parseInt(e[2],10);for(let r=parseInt(e[1],10);r<=i;r++)t.push(n.replace(e[0],r.toString()));return t}return t.push(n),t}function n_(n,t){return(function(e,i,r){if(!e)return;let s,o=e[0];if(t){let a=t.getFullTileRange(o);a&&(s=a.getHeight()-1)}return Zf(n,o,e[1],e[2],s)})}function Vf(n,t){let e=n.length,i=new Array(e);for(let r=0;r<e;++r)i[r]=n_(n[r],t);return r_(i)}function r_(n){return n.length===1?n[0]:(function(t,e,i){if(!t)return;let r=hf(t),s=Me(r,n.length);return n[s](t,e,i)})}var qc=class extends Ro{constructor(t){super({attributions:t.attributions,attributionsCollapsible:t.attributionsCollapsible,projection:t.projection,state:t.state,wrapX:t.wrapX,interpolate:t.interpolate}),this.on,this.once,this.un,this.tilePixelRatio_=t.tilePixelRatio!==void 0?t.tilePixelRatio:1,this.tileGrid=t.tileGrid!==void 0?t.tileGrid:null;let e=[256,256];this.tileGrid&&pt(this.tileGrid.getTileSize(this.tileGrid.getMinZoom()),e),this.tmpSize=[0,0],this.key_=t.key||Y(this),this.tileOptions={transition:t.transition,interpolate:t.interpolate},this.zDirection=t.zDirection?t.zDirection:0}getGutterForProjection(t){return 0}getKey(){return this.key_}setKey(t){this.key_!==t&&(this.key_=t,this.changed())}getResolutions(t){let e=t?this.getTileGridForProjection(t):this.tileGrid;return e?e.getResolutions():null}getTile(t,e,i,r,s,o){return H()}getTileGrid(){return this.tileGrid}getTileGridForProjection(t){return this.tileGrid?this.tileGrid:So(t)}getTilePixelRatio(t){return this.tilePixelRatio_}getTilePixelSize(t,e,i){let r=this.getTileGridForProjection(i),s=this.getTilePixelRatio(e),o=pt(r.getTileSize(t),this.tmpSize);return s==1?o:Cd(o,s,this.tmpSize)}getTileCoordForTileUrlFunction(t,e){let i=e!==void 0?e:this.getProjection(),r=e!==void 0?this.getTileGridForProjection(i):this.tileGrid||this.getTileGridForProjection(i);return this.getWrapX()&&i.isGlobal()&&(t=Yf(r,t,i)),uf(t,r)?t:null}clear(){}refresh(){this.clear(),super.refresh()}},Io=class extends Tt{constructor(t,e){super(t),this.tile=e}},jf=qc;var Lo={TILELOADSTART:"tileloadstart",TILELOADEND:"tileloadend",TILELOADERROR:"tileloaderror"};var $c=class n extends jf{constructor(t){super({attributions:t.attributions,cacheSize:t.cacheSize,projection:t.projection,state:t.state,tileGrid:t.tileGrid,tilePixelRatio:t.tilePixelRatio,wrapX:t.wrapX,transition:t.transition,interpolate:t.interpolate,key:t.key,attributionsCollapsible:t.attributionsCollapsible,zDirection:t.zDirection}),this.generateTileUrlFunction_=this.tileUrlFunction===n.prototype.tileUrlFunction,this.tileLoadFunction=t.tileLoadFunction,t.tileUrlFunction&&(this.tileUrlFunction=t.tileUrlFunction),this.urls=null,t.urls?this.setUrls(t.urls):t.url&&this.setUrl(t.url),this.tileLoadingKeys_={}}getTileLoadFunction(){return this.tileLoadFunction}getTileUrlFunction(){return Object.getPrototypeOf(this).tileUrlFunction===this.tileUrlFunction?this.tileUrlFunction.bind(this):this.tileUrlFunction}getUrls(){return this.urls}handleTileChange(t){let e=t.target,i=Y(e),r=e.getState(),s;r==k.LOADING?(this.tileLoadingKeys_[i]=!0,s=Lo.TILELOADSTART):i in this.tileLoadingKeys_&&(delete this.tileLoadingKeys_[i],s=r==k.ERROR?Lo.TILELOADERROR:r==k.LOADED?Lo.TILELOADEND:void 0),s!=null&&this.dispatchEvent(new Io(s,e))}setTileLoadFunction(t){this.tileLoadFunction=t,this.changed()}setTileUrlFunction(t,e){this.tileUrlFunction=t,typeof e<"u"?this.setKey(e):this.changed()}setUrl(t){let e=Bf(t);this.urls=e,this.setUrls(e)}setUrls(t){this.urls=t;let e=t.join(`7-`);this.generateTileUrlFunction_?this.setTileUrlFunction(Vf(t,this.tileGrid),e):this.setKey(e)}tileUrlFunction(t,e,i){}},Hf=$c;var Jc=class extends Hf{constructor(t){super({attributions:t.attributions,cacheSize:t.cacheSize,projection:t.projection,state:t.state,tileGrid:t.tileGrid,tileLoadFunction:t.tileLoadFunction?t.tileLoadFunction:s_,tilePixelRatio:t.tilePixelRatio,tileUrlFunction:t.tileUrlFunction,url:t.url,urls:t.urls,wrapX:t.wrapX,transition:t.transition,interpolate:t.interpolate!==void 0?t.interpolate:!0,key:t.key,attributionsCollapsible:t.attributionsCollapsible,zDirection:t.zDirection}),this.crossOrigin=t.crossOrigin!==void 0?t.crossOrigin:null,this.referrerPolicy=t.referrerPolicy,this.tileClass=t.tileClass!==void 0?t.tileClass:mo,this.tileGridForProjection={},this.reprojectionErrorThreshold_=t.reprojectionErrorThreshold,this.renderReprojectionEdges_=!1}getGutterForProjection(t){return this.getProjection()&&t&&!An(this.getProjection(),t)?0:this.getGutter()}getGutter(){return 0}getKey(){let t=super.getKey();return this.getInterpolate()||(t+=":disable-interpolation"),t}getTileGridForProjection(t){let e=this.getProjection();if(this.tileGrid&&(!e||An(e,t)))return this.tileGrid;let i=Y(t);return i in this.tileGridForProjection||(this.tileGridForProjection[i]=So(t)),this.tileGridForProjection[i]}createTile_(t,e,i,r,s,o){let a=[t,e,i],l=this.getTileCoordForTileUrlFunction(a,s),h=l?this.tileUrlFunction(l,r,s):void 0,c=new this.tileClass(a,h!==void 0?k.IDLE:k.EMPTY,h!==void 0?h:"",{crossOrigin:this.crossOrigin,referrerPolicy:this.referrerPolicy},this.tileLoadFunction,this.tileOptions);return c.key=o,c.addEventListener(P.CHANGE,this.handleTileChange.bind(this)),c}getTile(t,e,i,r,s,o){let a=this.getProjection();if(!a||!s||An(a,s))return this.getTileInternal(t,e,i,r,a||s);let l=[t,e,i],h=this.getKey(),c=this.getTileGridForProjection(a),u=this.getTileGridForProjection(s),f=this.getTileCoordForTileUrlFunction(l,s),g=new yo(a,c,s,u,l,f,this.getTilePixelRatio(r),this.getGutter(),(p,_,m,x)=>this.getTileInternal(p,_,m,x,a,o),this.reprojectionErrorThreshold_,this.renderReprojectionEdges_,this.tileOptions);return g.key=h,g}getTileInternal(t,e,i,r,s,o){let a=this.getKey(),l=Zn(this,a,t,e,i);if(o&&o.containsKey(l))return o.get(l);let h=this.createTile_(t,e,i,r,s,a);return o?.set(l,h),h}setRenderReprojectionEdges(t){this.renderReprojectionEdges_!=t&&(this.renderReprojectionEdges_=t,this.changed())}setTileGridForProjection(t,e){let i=Et(t);if(i){let r=Y(i);r in this.tileGridForProjection||(this.tileGridForProjection[r]=e)}}};function s_(n,t){if(bt){let e=n.getCrossOrigin(),i="same-origin",r="same-origin";e==="anonymous"||e===""?(i="cors",r="omit"):e==="use-credentials"&&(i="cors",r="include");let s={mode:i,credentials:r,referrerPolicy:n.getReferrerPolicy()};fetch(t,s).then(o=>{if(!o.ok)throw new Error(`HTTP ${o.status}`);return o.blob()}).then(o=>createImageBitmap(o)).then(o=>{let a=n.getImage();a.width=o.width,a.height=o.height,a.getContext("2d").drawImage(o,0,0),o.close?.(),a.dispatchEvent(new Event("load"))}).catch(()=>{n.getImage().dispatchEvent(new Event("error"))});return}n.getImage().src=t}var qf=Jc;var Qc=class extends qf{constructor(t){t=t||{};let e=t.projection!==void 0?t.projection:"EPSG:3857",i=t.tileGrid!==void 0?t.tileGrid:Uf({extent:To(e),maxResolution:t.maxResolution,maxZoom:t.maxZoom,minZoom:t.minZoom,tileSize:t.tileSize});super({attributions:t.attributions,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,interpolate:t.interpolate,projection:e,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileGrid:i,tileLoadFunction:t.tileLoadFunction,tilePixelRatio:t.tilePixelRatio,tileUrlFunction:t.tileUrlFunction,url:t.url,urls:t.urls,wrapX:t.wrapX!==void 0?t.wrapX:!0,transition:t.transition,attributionsCollapsible:t.attributionsCollapsible,zDirection:t.zDirection}),this.gutter_=t.gutter!==void 0?t.gutter:0}getGutter(){return this.gutter_}},$f=Qc;var Z=n=>document.querySelector(n),b={game:Z("#game-select"),map:Z("#map-select"),variant:Z("#variant-select"),variantField:Z("#variant-field"),gameTitle:Z("#game-title"),title:Z("#map-title"),meta:Z("#map-meta"),legend:Z("#legend"),search:Z("#pin-search"),searchResults:Z("#search-results"),visibleCount:Z("#visible-count"),viewport:Z("#map"),layers:Z("#layers"),zoneToggle:Z("#zone-toggle"),zoneCount:Z("#zone-count"),zoneIndex:Z("#zone-index"),zoneList:Z("#zone-list"),loading:Z("#map-loading"),labelsHint:Z("#labels-hint"),gridHint:Z("#grid-hint"),soloChip:Z("#solo-chip"),overview:Z("#overview"),overviewCanvas:Z("#overview-canvas"),overviewViewport:Z("#overview-viewport"),gridNavigator:Z("#grid-navigator"),gridInput:Z("#grid-input"),gridBack:Z("#grid-back"),detail:Z("#pin-detail"),detailTitle:Z("#detail-title"),detailCategory:Z("#detail-category"),detailDescription:Z("#detail-description"),detailID:Z("#detail-id"),detailCoordinates:Z("#detail-coordinates"),detailLinks:Z("#detail-links"),detailDot:Z("#detail-dot"),sidebar:Z("#sidebar"),mobileLegend:Z("#mobile-legend"),fatal:Z("#fatal-error"),fatalMessage:Z("#fatal-message")},Oo=["#d6f36b","#72d5f4","#ff9e64","#df83ff","#62e6ae","#ff6f91","#f4d35e","#8aa9ff","#e7a56d","#83d483"],Fi="0123456789bcdefghjkmnpqrstuvwxyz",o_=3,a_=2,d={catalog:null,game:null,map:null,variant:null,engine:null,projection:null,layers:null,sources:null,hiddenCategories:new Set,collapsedSections:new Set,pins:[],pinByID:new Map,selectedPin:null,hoveredPin:null,pinLabelsVisible:!1,gridEnabled:!1,gridPrefix:"",zonesVisible:!0,zoneRecords:new Map,highlightedZones:new Set,focusedZoneID:null,search:"",fitZoom:0,zoneTitleCount:0,eligibleLocations:0,tileRun:0,tileStats:{requested:0,loaded:0,errors:0,peakPending:0},overviewRun:0,overviewKey:"",renderedShard:0,styleCache:new Map,markerIcons:new Map};async function l_(){h_();try{let n=await fetch("/static/catalog.json");if(!n.ok)throw new Error(`catalog request returned ${n.status}`);if(d.catalog=await n.json(),!d.catalog.games.length)throw new Error("the embedded catalog contains no maps");c_(),lh(b.game,d.catalog.games,"title");let t=ig();th(t.game||d.catalog.games[0].slug,t.map),Q_(),requestAnimationFrame(()=>b.viewport.focus({preventScroll:!0}))}catch(n){b.loading.hidden=!0,b.fatalMessage.textContent=n instanceof Error?n.message:String(n),b.fatal.hidden=!1}}function c_(){let n=d.catalog.tileGrid.size,t=[0,-n,n,0];d.projection=new mi({code:"ATLAS:PIXELS",units:"pixels",extent:t}),d.sources={grid:new Pi({wrapX:!1}),gridContext:new Pi({wrapX:!1}),zones:new Pi({wrapX:!1}),zoneTitles:new Pi({wrapX:!1}),text:new Pi({wrapX:!1}),pins:new Pi({wrapX:!1}),priority:new Pi({wrapX:!1})},d.layers={raster:new yc({zIndex:0}),rasterDetail:new yc({zIndex:1}),grid:new ee({source:d.sources.grid,style:Qf,renderOrder:be,renderBuffer:40,zIndex:5}),zones:new ee({source:d.sources.zones,style:K_,renderBuffer:32,zIndex:10}),zoneTitles:new ee({source:d.sources.zoneTitles,style:Z_,renderOrder:be,renderBuffer:160,zIndex:20}),zoneTitleDetail:new ee({source:d.sources.zoneTitles,style:B_,renderOrder:be,renderBuffer:160,zIndex:44}),text:new ee({source:d.sources.text,style:G_,renderOrder:be,renderBuffer:220,zIndex:30}),textDetail:new ee({source:d.sources.text,style:X_,renderOrder:be,renderBuffer:220,zIndex:45}),zoneText:new ee({source:d.sources.text,style:W_,renderOrder:be,renderBuffer:220,zIndex:41}),pins:new ee({source:d.sources.pins,style:F_,renderOrder:be,renderBuffer:48,zIndex:40}),zonePins:new ee({source:d.sources.pins,style:z_,renderOrder:be,renderBuffer:48,zIndex:42}),pinLabels:new ee({source:d.sources.pins,style:N_,renderOrder:be,renderBuffer:180,zIndex:45}),gridContext:new ee({source:d.sources.gridContext,style:Qf,renderOrder:be,renderBuffer:40,zIndex:48}),priority:new ee({source:d.sources.priority,style:Y_,renderOrder:be,renderBuffer:220,zIndex:50})},d.engine=new tf({target:b.viewport,layers:Object.values(d.layers),controls:Fs({attribution:!1,rotate:!1,zoom:!1}),interactions:Ys({onFocusOnly:!1}),view:eg(5)}),d.engine.on("movestart",()=>{d.engine.getViewport().classList.add("is-dragging")}),d.engine.on("moveend",()=>{d.engine.getViewport().classList.remove("is-dragging"),Hr()}),d.engine.on("postrender",nh),b.viewport.addEventListener("wheel",()=>{document.activeElement!==b.viewport&&b.viewport.focus({preventScroll:!0})},{capture:!0,passive:!0}),d.engine.on("singleclick",e=>{if(d.gridEnabled){let r=d.engine.forEachFeatureAtPixel(e.pixel,s=>s.get("gridCell")||null,{hitTolerance:1,layerFilter:s=>s===d.layers.grid||s===d.layers.gridContext});if(r&&r.role!=="leaf"){rh(r.hash);return}}let i=d.engine.forEachFeatureAtPixel(e.pixel,(r,s)=>s!==d.layers.pins&&s!==d.layers.pinLabels&&s!==d.layers.text&&s!==d.layers.textDetail&&s!==d.layers.priority?null:r.get("pin")||null,{hitTolerance:5});i&&fg(i)}),d.engine.on("pointermove",e=>{if(e.dragging){Mo(null);return}let i=d.engine.forEachFeatureAtPixel(e.pixel,(o,a)=>a!==d.layers.pins&&a!==d.layers.pinLabels&&a!==d.layers.text&&a!==d.layers.textDetail&&a!==d.layers.priority?null:o.get("pin")||null,{hitTolerance:4,layerFilter:o=>o===d.layers.pins||o===d.layers.pinLabels||o===d.layers.text||o===d.layers.textDetail||o===d.layers.priority}),r=i?.category.displayType==="text"?null:i;Mo(r||null);let s=d.gridEnabled&&d.engine.hasFeatureAtPixel(e.pixel,{layerFilter:o=>o===d.layers.grid||o===d.layers.gridContext});d.engine.getTargetElement().style.cursor=i||s?"pointer":""}),d.engine.getViewport().addEventListener("pointerleave",()=>Mo(null))}function eg(n){let t=d.catalog.tileGrid.size;return new Qt({projection:d.projection,center:[t/2,-t/2],resolutions:sg(n),minZoom:0,maxZoom:n,extent:[0,-t,t,0],constrainResolution:!1,smoothResolutionConstraint:!1,showFullExtent:!0,zoom:0})}function h_(){b.game.addEventListener("change",()=>th(b.game.value)),b.map.addEventListener("change",()=>ng(Number(b.map.value))),b.variant.addEventListener("change",()=>rg(Number(b.variant.value))),b.legend.addEventListener("change",t=>{let e=t.target;if(e.dataset.group){A_(Number(e.dataset.group));return}if(!e.dataset.category)return;let i=Number(e.dataset.category);e.checked?d.hiddenCategories.delete(i):d.hiddenCategories.add(i),zi(),Jn()});let n=()=>b.layers.classList.add("hover-stale");b.layers.addEventListener("scroll",n,{passive:!0}),b.layers.addEventListener("pointerleave",n),b.layers.addEventListener("pointermove",()=>{b.layers.classList.remove("hover-stale")},{passive:!0}),b.layers.addEventListener("click",t=>{let e=t.target.closest("[data-only-category], [data-only-group]");if(e){t.preventDefault(),t.stopPropagation(),M_(e.dataset.onlyCategory?{category:Number(e.dataset.onlyCategory)}:{group:Number(e.dataset.onlyGroup)});return}let i=t.target.closest("[data-section]");if(!i)return;let r=i.dataset.section;d.collapsedSections.has(r)?d.collapsedSections.delete(r):d.collapsedSections.add(r),lg()}),b.soloChip.addEventListener("click",()=>Po(!0)),Z("#show-all").addEventListener("click",()=>Po(!0)),Z("#hide-all").addEventListener("click",()=>Po(!1)),b.zoneToggle.addEventListener("change",()=>{ch(b.zoneToggle.checked)}),b.zoneIndex.addEventListener("click",t=>{let e=t.target.closest("[data-zone]");e&&S_(Number(e.dataset.zone))}),b.zoneIndex.addEventListener("contextmenu",t=>{let e=t.target.closest("[data-zone]");e&&(t.preventDefault(),T_(Number(e.dataset.zone)))}),b.search.addEventListener("input",()=>{d.search=b.search.value.trim().toLocaleLowerCase(),zi(),uh()}),b.searchResults.addEventListener("click",t=>{let e=t.target.closest("[data-location]");if(!e)return;let i=d.pinByID.get(Number(e.dataset.location));i&&Jf(i)}),b.detailLinks.addEventListener("click",t=>{let e=t.target.closest("[data-location]");if(!e)return;let i=d.pinByID.get(Number(e.dataset.location));i&&Jf(i)}),Z("#close-detail").addEventListener("click",Hn),Z("#zoom-in").addEventListener("click",()=>Ao(1)),Z("#zoom-out").addEventListener("click",()=>Ao(-1)),b.gridBack.addEventListener("click",ag),b.gridInput.addEventListener("input",()=>{let t=Do(),e=[...b.gridInput.value.toLocaleLowerCase()].filter(i=>Fi.includes(i)).slice(0,t).join("");b.gridInput.value=e,rh(e)}),b.viewport.addEventListener("keydown",t=>{if(!tg(t.target)){if(t.key==="+"||t.key==="=")Ao(1);else if(t.key==="-")Ao(-1);else if(t.key==="Escape")Hn();else return;t.preventDefault()}}),window.addEventListener("keydown",t=>{if(!tg(t.target)){if((t.metaKey||t.ctrlKey)&&t.key.toLocaleLowerCase()==="k"){t.preventDefault(),b.search.focus(),b.search.select();return}if((t.metaKey||t.ctrlKey)&&t.key.toLocaleLowerCase()==="b"){t.preventDefault(),__();return}x_(t)||t.key.toLocaleLowerCase()==="z"&&(t.preventDefault(),d.pinLabelsVisible=!d.pinLabelsVisible,b.labelsHint.textContent=`Z \xB7 labels ${d.pinLabelsVisible?"on":"off"}`,d.layers.pinLabels.changed())}}),window.addEventListener("hashchange",()=>{let t=ig();t.game===d.game?.slug&&t.map===d.map?.slug||th(t.game||d.catalog.games[0].slug,t.map)}),window.addEventListener("resize",()=>{d.engine?.updateSize(),nh()}),b.overview.addEventListener("pointerdown",t=>{t.preventDefault(),p_(t)}),b.mobileLegend.addEventListener("click",()=>{let t=b.sidebar.classList.toggle("is-open");b.mobileLegend.setAttribute("aria-expanded",String(t))})}function th(n,t){d.game=d.catalog.games.find(i=>i.slug===n)||d.catalog.games[0],b.game.value=d.game.slug,lh(b.map,d.game.maps,"title","id"),b.map.disabled=d.game.maps.length===1,b.map.title=b.map.disabled?"This game has one map":"Choose a map";let e=t&&d.game.maps.find(i=>i.slug===t);ng((e||d.game.maps[0]).id)}function ig(){let[n,t]=decodeURIComponent(location.hash.replace(/^#\/?/,"")).split("/").map(e=>e.trim());return{game:n,map:t}}function u_(){if(!d.game||!d.map)return;let n=`#${d.game.slug}/${d.map.slug}`;location.hash!==n&&history.replaceState(null,"",n)}function ng(n){d.map=d.game.maps.find(t=>t.id===n)||d.game.maps[0],document.documentElement.style.setProperty("--icon-outset-color",fh()),b.map.value=String(d.map.id),lh(b.variant,d.map.variants,"name"),b.variantField.hidden=d.map.variants.length<2,d.styleCache.clear(),Mo(null),d.gridPrefix="",d.hiddenCategories.clear(),d.collapsedSections.clear(),d.collapsedSections.add("zones");for(let t of d.map.groups)for(let e of t.categories)e.visible||d.hiddenCategories.add(e.id);d.search="",b.search.value="",b.searchResults.hidden=!0,Hn(),E_(),cg(),v_(),rg(0,!0),b.gameTitle.textContent=d.game.title,b.title.textContent=d.map.title,b.meta.textContent=`${dn(d.map.pinCount)} locations \xB7 ${dn(d.map.zones?.length||0)} regions`,b.sidebar.classList.remove("is-open"),b.mobileLegend.setAttribute("aria-expanded","false"),u_()}function rg(n,t=!1){let e=d.variant;d.variant=d.map.variants[n]||d.map.variants[0];let i=d.variant,r=t?null:m_(e,i),s=$n(i);b.variant.value=String(d.map.variants.indexOf(d.variant)),t?d.engine.setView(eg(s)):(d.engine.getView().setMinZoom(i.minZoom),d.engine.getView().setMaxZoom(s));let o=++d.tileRun,a=0;d.tileStats={requested:0,loaded:0,errors:0,peakPending:0},b.loading.hidden=!1;let l=p=>{p.on("tileloadstart",()=>{d.tileRun===o&&(a++,d.tileStats.requested++,d.tileStats.peakPending=Math.max(d.tileStats.peakPending,a))});let _=m=>{d.tileRun===o&&(a=Math.max(0,a-1),m?d.tileStats.errors++:d.tileStats.loaded++,a===0&&d.tileStats.loaded>0&&(b.loading.hidden=!0))};return p.on("tileloadend",()=>_(!1)),p.on("tileloaderror",()=>_(!0)),p},h=(p,_)=>l(new $f({projection:d.projection,tileGrid:new jr({extent:[0,-d.catalog.tileGrid.size,d.catalog.tileGrid.size,0],origin:[0,0],resolutions:sg(p),tileSize:d.catalog.tileGrid.tileSize}),cacheSize:64,interpolate:i.interpolate,transition:0,wrapX:!1,tileUrlFunction:([m,x,E])=>{let C=i.formats[m];if(!(!C||x<0||E<0||!_(m,x,E)))return`/static/tiles/${encodeURIComponent(i.tiles)}/${m}/${x}/${E}.${C}`}})),c=i.fullZoom??i.maxZoom,u=h(c,(p,_,m)=>eh(i,p,_,m)),f=d.layers.raster.getSource();d.layers.raster.setSource(u),d.layers.raster.setExtent(un()),d.layers.raster.setBackground(i.background||void 0),f?.clear();let g=d.layers.rasterDetail.getSource();i.maxZoom>c?(d.layers.rasterDetail.setSource(h(i.maxZoom,(p,_,m)=>p>c&&eh(i,p,_,m))),d.layers.rasterDetail.setExtent(un()),d.layers.rasterDetail.setVisible(!0)):d.layers.rasterDetail.setVisible(!1),g?.clear(),sh(),d.gridEnabled&&(fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed()),d.overviewKey="",g_(),d.renderedShard!==(i.shard||0)&&(cg(),zi()),t?requestAnimationFrame(D_):(r&&d.engine.getView().animate({center:r,duration:200}),Hr())}function eh(n,t,e,i){let r=n.coverage?.[t];if(!r)return!0;let s=e-r.x,o=i-r.y;if(s<0||o<0||s>=r.w||o>=r.h)return!1;let a=d_(n,t,r),l=o*r.w+s;return(a[l>>3]&1<<(l&7))!==0}function d_(n,t,e){if(!e.decoded){let i=atob(e.bits),r=new Uint8Array(i.length);for(let s=0;s<i.length;s++)r[s]=i.charCodeAt(s);e.decoded=r}return e.decoded}function sg(n){let t=d.catalog.tileGrid.size/d.catalog.tileGrid.tileSize;return Array.from({length:n+1},(e,i)=>t/2**i)}function $n(n){return n.maxZoom+a_}var f_=168;function g_(){let n=d.variant,t=b.overviewCanvas,e=t.getContext("2d"),i=un(),r=d.catalog.tileGrid.size,s=d.catalog.tileGrid.tileSize,o=i[2]-i[0],a=i[3]-i[1],l=0;for(;l<n.fullZoom&&Math.max(o,a)/r*s*2**l<f_;)l++;let h=s*2**l/r;t.width=Math.max(1,Math.round(o*h)),t.height=Math.max(1,Math.round(a*h)),e.clearRect(0,0,t.width,t.height),n.background&&(e.fillStyle=n.background,e.fillRect(0,0,t.width,t.height));let c=++d.overviewRun,u=n.formats[l],f=Math.floor(i[0]/r*2**l),g=Math.ceil(i[2]/r*2**l),p=Math.floor(-i[3]/r*2**l),_=Math.ceil(-i[1]/r*2**l);for(let m=p;m<_;m++)for(let x=f;x<g;x++){if(!u||!eh(n,l,x,m))continue;let E=new Image;E.onload=()=>{d.overviewRun===c&&e.drawImage(E,x*s-i[0]*h,m*s+i[3]*h,s,s)},E.src=`/static/tiles/${encodeURIComponent(n.tiles)}/${l}/${x}/${m}.${u}`}nh()}function nh(){let n=d.engine?.getView();if(!n||!d.variant)return;let t=un(),e=n.calculateExtent(d.engine.getSize()),i=t[2]-t[0],r=t[3]-t[1],s=(n.getResolution()||0)*4,o=e[0]<=t[0]+s&&e[1]<=t[1]+s&&e[2]>=t[2]-s&&e[3]>=t[3]-s,a=o?"hidden":e.map(Math.round).join(",");if(a===d.overviewKey||(d.overviewKey=a,b.overview.hidden=o,o))return;let l=b.overviewCanvas,h=Di((e[0]-t[0])/i,0,1),c=Di((e[2]-t[0])/i,0,1),u=Di((t[3]-e[3])/r,0,1),f=Di((t[3]-e[1])/r,0,1),g=b.overviewViewport.style;g.left=`${h*l.width}px`,g.top=`${u*l.height}px`,g.width=`${Math.max(8,(c-h)*l.width)}px`,g.height=`${Math.max(8,(f-u)*l.height)}px`}function p_(n){let t=d.engine?.getView();if(!t||!d.variant)return;let e=b.overviewCanvas.getBoundingClientRect(),i=un(),r=(s,o,a)=>Di((s-o)/(a-o),0,1);t.animate({center:[i[0]+r(n.clientX,e.left,e.right)*(i[2]-i[0]),i[3]-r(n.clientY,e.top,e.bottom)*(i[3]-i[1])],duration:180})}function m_(n,t){if(!n||!t||!n.shard||!t.shard||n.shard===t.shard||!n.bounds||!t.bounds)return null;let i=d.engine?.getView()?.getCenter();if(!i)return null;let r=(i[0]-n.bounds.x)/n.bounds.width,s=(-i[1]-n.bounds.y)/n.bounds.height;return[t.bounds.x+Di(r,0,1)*t.bounds.width,-(t.bounds.y+Di(s,0,1)*t.bounds.height)]}function __(){let t=document.querySelector(".app-shell").classList.toggle("sidebar-collapsed");b.mobileLegend.setAttribute("aria-expanded",String(!t)),requestAnimationFrame(()=>d.engine?.updateSize())}function un(){let n=d.catalog.tileGrid.size,t=d.variant?.bounds||{x:0,y:0,width:n,height:n};return[t.x,-(t.y+t.height),t.x+t.width,-t.y]}function x_(n){return n.key.toLocaleLowerCase()==="g"?(n.preventDefault(),og(),!0):n.key==="Escape"&&d.gridEnabled?(n.preventDefault(),ag(),!0):!1}function og(n=!d.gridEnabled){d.gridEnabled=n,sh(),fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed()}function rh(n){let t=Do(),e=[...n.toLocaleLowerCase()].filter(r=>Fi.includes(r)).slice(0,t).join(""),i=e!==d.gridPrefix;d.gridPrefix=e,d.gridEnabled||(d.gridEnabled=!0),sh(),fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed(),i&&(Hn(),d.engine.getView().fit(ko(),{size:d.engine.getSize(),padding:[52,52,52,52],maxZoom:$n(d.variant),duration:180}))}function ag(){if(d.gridEnabled){if(!d.gridPrefix){og(!1);return}rh(d.gridPrefix.slice(0,-1))}}function sh(){if(!d.sources||(d.sources.grid.clear(),d.sources.gridContext.clear(),b.gridNavigator.hidden=!d.gridEnabled,b.gridHint.textContent=d.gridEnabled?`G \xB7 ${d.gridPrefix||"root"}`:"G \xB7 grid off",!d.gridEnabled||!d.variant))return;let n=Do();if(b.gridInput.maxLength=n,b.gridInput.value=d.gridPrefix,b.gridBack.title=d.gridPrefix?"Back one geohash level":"Close geohash grid",y_(),d.gridPrefix.length>=n){ih(d.gridPrefix,ko(),"leaf");return}for(let t of Fi){let e=d.gridPrefix+t;ih(e,oh(e),"child")}}function y_(){for(let n=0;n<d.gridPrefix.length;n++){let t=d.gridPrefix.slice(0,n),e=d.gridPrefix.slice(0,n+1);for(let i of Fi){let r=t+i;r!==e&&ih(r,oh(r),"neighbor",d.gridPrefix.length-n)}}}function ih(n,t,e,i=0){let[r,s,o,a]=t,l=d.pins.filter(u=>{if(u.filteredHidden)return!1;let[f,g]=u.coordinate;return f>=r&&f<=o&&g>=s&&g<=a}).length,h=new lr({geometry:new Ci([[[r,s],[r,a],[o,a],[o,s],[r,s]]]),gridCell:{hash:n,extent:t,role:e,count:l,contextDistance:i},priority:e==="neighbor"?-i*100+Fi.indexOf(n[n.length-1]):Fi.indexOf(n[n.length-1])});(e==="neighbor"?d.sources.gridContext:d.sources.grid).addFeature(h)}function ko(){return oh(d.gridPrefix)}function oh(n){let t=[...un()],e=!0;for(let i of n){let r=Fi.indexOf(i);if(!(r<0))for(let s of[16,8,4,2,1]){if(e){let o=(t[0]+t[2])/2;r&s?t[0]=o:t[2]=o}else{let o=(t[1]+t[3])/2;r&s?t[1]=o:t[3]=o}e=!e}}return t}function Do(){return o_}function ah(n){if(!d.gridEnabled||!d.gridPrefix)return!1;let t=ko(),[e,i]=n.coordinate;return e>=t[0]&&e<=t[2]&&i>=t[1]&&i<=t[3]}function lh(n,t,e,i){n.replaceChildren(),t.forEach((r,s)=>{let o=document.createElement("option");o.value=i?String(r[i]):r.slug||String(s),o.textContent=r[e],n.append(o)})}function E_(){let n=document.createDocumentFragment();for(let t of d.map.groups){if(!t.categories.length)continue;let e=document.createElement("section");e.className="layer-section",e.dataset.groupSection=String(t.id);let i=t.categories.reduce((s,o)=>s+o.locations.length,0);e.append(w_(`group-${t.id}`,t.title,i,t.id));let r=document.createElement("div");r.className="category-toggles";for(let s of t.categories)r.append(C_(s));e.append(r),n.append(e)}b.legend.replaceChildren(n),lg(),Jn()}function w_(n,t,e,i){let r=document.createElement("div");r.className="layer-header";let s=document.createElement("button");s.type="button",s.className="layer-title",s.dataset.section=n;let o=document.createElement("span");o.className="layer-chevron",o.setAttribute("aria-hidden","true"),o.innerHTML='<svg viewBox="0 0 24 24"><path d="m9 6 6 6-6 6"/></svg>';let a=document.createElement("span");a.textContent=t;let l=document.createElement("span");l.className="layer-count",l.textContent=dn(e),s.append(o,a,l);let h=document.createElement("button");h.type="button",h.className="only-button only-group",h.dataset.onlyGroup=String(i),h.textContent="only",h.title=`Show only ${t}`;let c=document.createElement("label");c.className="layer-switch";let u=document.createElement("input");u.type="checkbox",u.dataset.group=String(i),u.setAttribute("aria-label",`Show ${t}`);let f=document.createElement("span");return f.setAttribute("aria-hidden","true"),c.append(u,f),r.append(s,h,c),r}function C_(n){let t=n.displayType==="text",e=document.createElement("label");e.className="category-row",gh(e,n);let i=document.createElement("input");i.type="checkbox",i.dataset.category=String(n.id),i.checked=!d.hiddenCategories.has(n.id);let r=document.createElement("span");t?(r.className="text-symbol",r.textContent="Tt",r.title="Drawn as a text label"):(r.className="category-icon",ph(r,n,No(n.title)),r.title=n.icon||n.title);let s=document.createElement("span");s.className="category-name",s.textContent=n.title;let o=document.createElement("span");o.className="category-count",o.textContent=dn(n.locations.length);let a=document.createElement("button");return a.type="button",a.className="only-button",a.dataset.onlyCategory=String(n.id),a.textContent="only",a.title=`Show only ${n.title}`,e.append(i,r,s,a,o),e}function lg(){for(let n of b.layers.querySelectorAll("[data-section]")){let t=d.collapsedSections.has(n.dataset.section);n.setAttribute("aria-expanded",String(!t)),n.closest(".layer-section").classList.toggle("is-collapsed",t)}}function v_(){d.sources.pins.clear(),d.sources.text.clear(),d.sources.priority.clear(),d.pins=[],d.pinByID.clear();for(let n of d.map.groups)for(let t of n.categories){t.displayType!=="text"&&U_(t);for(let e of t.locations){let i={location:e,category:t,group:n,coordinate:hh(e.lat,e.lng),filteredHidden:!1,priority:H_(t,e),feature:null};i.feature=new lr({geometry:new wi(i.coordinate),pin:i,priority:i.priority}),d.pins.push(i),d.pinByID.set(e.id,i),t.displayType==="text"?d.sources.text.addFeature(i.feature):d.sources.pins.addFeature(i.feature)}}zi()}function cg(){let n=(d.map.zones||[]).filter(xg);d.renderedShard=d.variant?.shard||0,d.sources.zones.clear(),d.sources.zoneTitles.clear(),d.zoneRecords.clear(),d.highlightedZones.clear(),d.focusedZoneID=null,d.zoneTitleCount=0,ch(!0),b.zoneIndex.hidden=n.length===0,b.zoneCount.textContent=dn(n.length);for(let t of n){let e=ut(),i=[],r=!1;for(let l of t.features||[]){let h=I_(l);h&&(r=!0,i.push(h),fs(e,h.getExtent()),d.sources.zones.addFeature(new lr({geometry:h,zone:t,color:qn(t.id),child:t.parentRegionId!=null})))}if(!r)continue;let s=qn(t.id),o=t.center?hh(t.center.lat,t.center.lng):Bt(e),a=Math.max(e[2]-e[0],e[3]-e[1]);d.sources.zoneTitles.addFeature(new lr({geometry:new wi(o),zone:t,color:s,child:t.parentRegionId!=null,span:a,priority:(t.parentRegionId==null?2e6:1e6)+Math.round(a)})),d.zoneRecords.set(t.id,{zone:t,extent:e.slice(),geometries:i,color:s})}d.zoneTitleCount=d.sources.zoneTitles.getFeatures().length,b_()}function b_(){let n=document.createDocumentFragment();for(let{zone:t,depth:e}of R_()){let i=d.zoneRecords.get(t.id);if(!i)continue;let r=document.createElement("button");r.type="button",r.className="zone-index-item",r.dataset.zone=String(t.id),r.style.setProperty("--zone-color",i.color),r.style.setProperty("--zone-depth",String(e)),r.setAttribute("aria-pressed","false"),r.title=`${t.title}: click to jump; right-click to toggle highlight`;let s=document.createElement("span");s.className="zone-index-marker",s.setAttribute("aria-hidden","true");let o=document.createElement("span");o.textContent=t.title,r.append(s,o),n.append(r)}b.zoneList.replaceChildren(n),b.zoneIndex.hidden=d.zoneRecords.size===0}function R_(){let n=[...d.zoneRecords.values()].map(o=>o.zone),t=new Set(n.map(o=>o.id)),e=new Map;for(let o of n){let a=t.has(o.parentRegionId)?o.parentRegionId:null;e.has(a)||e.set(a,[]),e.get(a).push(o)}for(let o of e.values())o.sort((a,l)=>a.title.localeCompare(l.title,void 0,{numeric:!0,sensitivity:"base"}));let i=[],r=new Set,s=(o,a)=>{if(!r.has(o.id)){r.add(o.id),i.push({zone:o,depth:a});for(let l of e.get(o.id)||[])s(l,a+1)}};for(let o of e.get(null)||[])s(o,0);for(let o of n)s(o,0);return i}function ch(n){d.zonesVisible=n,b.zoneToggle.checked=n,d.layers.zones.setVisible(n),d.layers.zoneTitles.setVisible(n),d.layers.zoneTitleDetail.setVisible(n)}function S_(n){let t=d.zoneRecords.get(n);t&&(d.focusedZoneID=n,hg(),Hn(),d.engine.getView().fit(t.extent,{size:d.engine.getSize(),padding:[54,54,54,54],maxZoom:$n(d.variant),duration:220}),b.sidebar.classList.remove("is-open"),b.mobileLegend.setAttribute("aria-expanded","false"))}function T_(n){d.zoneRecords.has(n)&&(d.highlightedZones.has(n)?d.highlightedZones.delete(n):(d.highlightedZones.add(n),ch(!0)),d.hoveredPin=null,ug(),dg(),hg(),d.layers.zones.changed(),d.layers.zoneTitles.changed(),d.layers.zoneTitleDetail.changed())}function hg(){b.zoneIndex.classList.toggle("has-highlights",d.highlightedZones.size>0);for(let n of b.zoneList.querySelectorAll("[data-zone]")){let t=Number(n.dataset.zone),e=d.highlightedZones.has(t);n.classList.toggle("is-highlighted",e),n.classList.toggle("is-current",d.focusedZoneID===t),n.setAttribute("aria-pressed",String(e))}}function I_(n){if(!n?.coordinates)return null;let t=([e,i])=>hh(i,e);return n.type==="Polygon"?new Ci(n.coordinates.map(e=>e.map(t))):n.type==="MultiPolygon"?new nf(n.coordinates.map(e=>e.map(i=>i.map(t)))):null}function hh(n,t){let e=d.catalog.tileGrid,i=2**e.sourceZoom,r=(t+180)/360*i,s=n*Math.PI/180,o=(1-Math.asinh(Math.tan(s))/Math.PI)/2*i;return[(r-e.firstTile)*e.tileSize,-(o-e.firstTile)*e.tileSize]}function zi(){for(let n of d.pins){let t=d.hiddenCategories.has(n.category.id),e=d.search&&!n.location.title.toLocaleLowerCase().includes(d.search);n.filteredHidden=!!(t||e)}ug(),dg(),d.selectedPin?.filteredHidden&&Hn()}function ug(){if(!d.highlightedZones.size){for(let t of d.pins)t.insideHighlightedZone=!1;return}let n=[...d.highlightedZones].map(t=>d.zoneRecords.get(t)).filter(Boolean);for(let t of d.pins)t.insideHighlightedZone=n.some(e=>e.geometries.some(i=>L_(i,t.coordinate)))}function L_(n,t){if(n.intersectsCoordinate(t))return!0;let e=n.getClosestPoint(t),i=e[0]-t[0],r=e[1]-t[1];return i*i+r*r<=1}function dg(){d.eligibleLocations=d.pins.filter(n=>!Ke(n)).length,fn(),d.layers.pins.changed(),d.layers.zonePins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.zoneText.changed(),d.layers.textDetail.changed(),d.layers.priority.changed(),Hr()}function fn(){d.sources.priority.clear();for(let n of d.pins){if(Ke(n))continue;let t=!!d.search&&n.location.title.toLocaleLowerCase().includes(d.search);(n===d.selectedPin||n===d.hoveredPin||t||ah(n))&&d.sources.priority.addFeature(n.feature)}}function Mo(n){d.hoveredPin!==n&&(d.hoveredPin=n,d.sources&&(fn(),d.layers.pins.changed(),d.layers.priority.changed()))}function uh(){if(!d.search){b.searchResults.hidden=!0,b.searchResults.replaceChildren();return}let n=d.pins.filter(e=>!d.hiddenCategories.has(e.category.id)&&e.location.title.toLocaleLowerCase().includes(d.search)).sort((e,i)=>e.location.title.localeCompare(i.location.title)).slice(0,20),t=document.createDocumentFragment();if(!n.length){let e=document.createElement("p");e.className="search-empty",e.textContent="No visible locations match.",t.append(e)}for(let e of n){let i=document.createElement("button");i.type="button",i.className="search-result",i.dataset.location=String(e.location.id),gh(i,e.category);let r=document.createElement("span");r.className="result-dot",ph(r,e.category,No(e.category.title));let s=document.createElement("span"),o=document.createElement("strong");o.textContent=e.location.title;let a=document.createElement("small");a.textContent=`${e.category.title} \xB7 ${e.group.title}`,s.append(o,a),i.append(r,s),t.append(i)}b.searchResults.replaceChildren(t),b.searchResults.hidden=!1}function Po(n){if(d.hiddenCategories.clear(),!n)for(let t of d.map.groups)for(let e of t.categories)d.hiddenCategories.add(e.id);Fo(),zi(),uh(),Jn()}function Fo(){for(let n of document.querySelectorAll("[data-category]"))n.checked=!d.hiddenCategories.has(Number(n.dataset.category))}function A_(n){let t=d.map.groups.find(i=>i.id===n);if(!t)return;let e=t.categories.some(i=>!d.hiddenCategories.has(i.id));for(let i of t.categories)e?d.hiddenCategories.add(i.id):d.hiddenCategories.delete(i.id);Fo(),zi(),Jn()}function M_(n){if(d.map){if(P_(n)){Po(!0);return}d.hiddenCategories.clear();for(let t of d.map.groups){let e=n.group===t.id;for(let i of t.categories)!e&&n.category!==i.id&&d.hiddenCategories.add(i.id)}Fo(),zi(),uh(),Jn()}}function P_(n){for(let t of d.map.groups)for(let e of t.categories)if((n.group===t.id||n.category===e.id)===d.hiddenCategories.has(e.id))return!1;return!0}function O_(){let n=b.soloChip;if(!d.map){n.hidden=!0;return}let t=null,e=0,i=null,r=0;for(let o of d.map.groups){let a=0;for(let l of o.categories)d.hiddenCategories.has(l.id)||(a++,e++,t=l);a>0&&(r++,i=a===o.categories.length?o:null)}let s="";e===1&&t?s=t.title:r===1&&i&&(s=i.title),n.hidden=!s,n.textContent=s?`only: ${s}`:"",n.title=s?`Showing only ${s} \u2014 click to show everything`:""}function Jn(){if(d.map){for(let n of d.map.groups){let t=b.legend.querySelector(`input[data-group="${n.id}"]`);t&&(t.checked=n.categories.some(e=>!d.hiddenCategories.has(e.id)))}O_()}}function Jf(n){d.hiddenCategories.delete(n.category.id),d.search="",b.search.value="",b.searchResults.hidden=!0,Fo(),zi(),Jn(),fg(n,!0)}function fg(n,t=!1){if(d.selectedPin=n,fn(),d.layers.pins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.textDetail.changed(),d.layers.priority.changed(),b.detailTitle.textContent=n.location.title,b.detailCategory.textContent=`${n.group.title} / ${n.category.title}`,b.detailDescription.textContent=J_(n.location.description)||"No description is included in the archive.",b.detailID.textContent=String(n.location.id),b.detailCoordinates.textContent=`${n.location.lat.toFixed(6)}, ${n.location.lng.toFixed(6)}`,k_(n),gh(b.detailDot,n.category),ph(b.detailDot,n.category,No(n.category.title)),b.detail.hidden=!1,t){let e=d.engine.getView();e.animate({center:n.coordinate,zoom:Math.min($n(d.variant),Math.max(e.getZoom()||0,4)),duration:220})}}function k_(n){let t=(n.location.links||[]).filter(i=>d.pinByID.has(i.locationId));if(b.detailLinks.hidden=t.length===0,!t.length){b.detailLinks.replaceChildren();return}let e=document.createDocumentFragment();for(let i of t){let r=document.createElement("button");r.type="button",r.className="detail-link",r.dataset.location=String(i.locationId),r.textContent=i.title,e.append(r)}b.detailLinks.replaceChildren(e)}function Hn(){d.selectedPin=null,d.sources&&(fn(),d.layers.pins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.textDetail.changed(),d.layers.priority.changed()),b.detail.hidden=!0}function D_(){if(!d.engine||!d.variant)return;let n=d.engine.getView();n.fit(un(),{size:d.engine.getSize(),padding:[36,36,36,36],maxZoom:d.variant.maxZoom,duration:0}),d.fitZoom=n.getZoom()||0,Hr()}function Ao(n){let t=d.engine.getView(),e=t.getZoom()||0;t.animate({zoom:Di(e+n,d.variant.minZoom,$n(d.variant)),duration:140})}function Hr(){let n=d.engine?.getView().getZoom();if(b.viewport.dataset.zoom=Number.isFinite(n)?n.toFixed(3):"",!d.engine||!d.pins.length){b.visibleCount.textContent="0 locations visible";return}let t=d.engine.getView().calculateExtent(d.engine.getSize()),e=0;for(let i of d.pins){if(Ke(i))continue;let[r,s]=i.coordinate;r>=t[0]&&r<=t[2]&&s>=t[1]&&s<=t[3]&&e++}b.visibleCount.textContent=`${dn(d.eligibleLocations)} enabled \xB7 ${dn(e)} in view`}function be(n,t){return(n.get("priority")||0)-(t.get("priority")||0)}function F_(n){let t=n.get("pin");return!t||Ke(t)||t.insideHighlightedZone||qr(t)?null:dh(t,!1)}function z_(n){let t=n.get("pin");return!t||!d.highlightedZones.size||!t.insideHighlightedZone||Ke(t)||qr(t)?null:dh(t,!1)}function N_(n){let t=n.get("pin");return!t||Ke(t)||!d.pinLabelsVisible||!$r()?null:gg(t)}function G_(n){let t=n.get("pin");if(!t||Ke(t)||t.insideHighlightedZone||qr(t)||$r())return null;let e=d.fitZoom+Math.log2(q_(t.category));return(d.engine.getView().getZoom()||0)<e?null:zo(t,!1)}function X_(n){let t=n.get("pin");return!t||Ke(t)||t.insideHighlightedZone||qr(t)||!$r()?null:zo(t,!1)}function W_(n){let t=n.get("pin");return!t||!d.highlightedZones.size||!t.insideHighlightedZone||Ke(t)||qr(t)?null:zo(t,!1)}function Y_(n){let t=n.get("pin");if(!t||Ke(t))return null;if(t.category.displayType==="text")return zo(t,t===d.selectedPin);let e=dh(t,t===d.selectedPin);return t===d.hoveredPin||t===d.selectedPin?[e,gg(t)]:e}function dh(n,t){let e=`marker:${n.category.id}:${t?1:0}`;if(d.styleCache.has(e))return d.styleCache.get(e);let i=n.category.color||qn(n.category.id),r=t?2e7:n.priority,s=d.markerIcons.get(pg(n.category)),o;return s?o=new Mt({image:new an({src:s,width:t?36:31,height:t?36:31}),zIndex:r}):o=new Mt({text:new si({text:No(n.category.title),font:`900 ${t?15:13}px Inter, sans-serif`,fill:new _t({color:i}),stroke:new At({color:fh(),width:t?4:3})}),zIndex:r}),d.styleCache.set(e,o),o}function gg(n){let t=`marker-label:${n.location.id}`;if(d.styleCache.has(t))return d.styleCache.get(t);let e=new Mt({text:new si({text:n.location.title,offsetY:21,font:'700 10px "Arial Narrow", "Roboto Condensed", sans-serif',fill:new _t({color:"#f4f6ed"}),stroke:new At({color:"rgba(0,0,0,0.98)",width:3}),backgroundFill:new _t({color:"rgba(10,13,9,0.72)"}),padding:[2,4,2,4],overflow:!0}),zIndex:n.priority});return d.styleCache.set(t,e),e}function U_(n){if(!n.iconAsset)return;let t=pg(n);if(d.markerIcons.has(t))return;d.markerIcons.set(t,null);let e=new Image;e.onload=()=>{let i=document.createElement("canvas");i.width=64,i.height=64;let r=i.getContext("2d"),s=n.color||qn(n.id),o=document.createElement("canvas");o.width=64,o.height=64;let a=o.getContext("2d");a.imageSmoothingEnabled=!n.iconPicture,a.drawImage(e,6,6,52,52),n.iconPicture||(a.globalCompositeOperation="source-in",a.fillStyle=s,a.fillRect(0,0,64,64));let l=document.createElement("canvas");l.width=64,l.height=64;let h=l.getContext("2d");h.drawImage(e,6,6,52,52),h.globalCompositeOperation="source-in",h.fillStyle=fh(),h.fillRect(0,0,64,64);for(let c=-3;c<=3;c++)for(let u=-3;u<=3;u++)u*u+c*c<=10&&r.drawImage(l,u,c);r.drawImage(o,0,0),d.markerIcons.set(t,i.toDataURL("image/png")),d.styleCache.delete(`marker:${n.id}:0`),d.styleCache.delete(`marker:${n.id}:1`),d.layers.pins.changed(),d.layers.zonePins.changed(),d.layers.priority.changed()},e.onerror=()=>d.markerIcons.set(t,!1),e.src=yg(n.iconAsset)}function pg(n){return`${n.iconAsset||""}:${n.color||qn(n.id)}:${d.map?.iconOutset||"light"}`}function fh(){return d.map?.iconOutset==="dark"?"rgba(7, 9, 7, 0.98)":"rgba(255, 255, 255, 0.96)"}function zo(n,t){let e=`text:${n.location.id}:${t?1:0}`;if(d.styleCache.has(e))return d.styleCache.get(e);let r=[new Mt({text:new si({text:n.location.title,font:`${t?"900":"800"} 14px "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:t?"#d6f36b":"#f3f5e9"}),stroke:new At({color:"rgba(0,0,0,0.95)",width:4}),backgroundFill:new _t({color:t?"rgba(17,21,14,0.9)":"rgba(10,13,9,0.58)"}),backgroundStroke:t?new At({color:"#d6f36b",width:1}):void 0,padding:[3,6,3,6],overflow:!0}),zIndex:t?2e7:n.priority+3e6})];return d.styleCache.set(e,r),r}function Qf(n){let t=n.get("gridCell");if(!t)return null;let e=`grid:${t.hash}:${t.role}:${t.contextDistance}`;if(d.styleCache.has(e))return d.styleCache.get(e);let i=Oo[Math.max(0,Fi.indexOf(t.hash[t.hash.length-1]))%Oo.length],r=t.role==="leaf",s=t.role==="neighbor",o=new Mt({fill:new _t({color:s?`rgba(3, 5, 3, ${Math.min(.52,.3+t.contextDistance*.06)})`:ki(i,r?.14:.055)}),stroke:new At({color:r?"#ffffff":ki(i,s?.44:.82),width:r?2.5:s?1:1.4}),text:new si({text:t.hash,font:`${r?"900 17px":s?"750 11px":"800 13px"} "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:r?"#ffffff":s?ki(i,.72):i}),stroke:new At({color:"rgba(0,0,0,0.96)",width:4}),backgroundFill:new _t({color:s?"rgba(4,6,4,0.88)":"rgba(9,12,8,0.76)"}),padding:s?[2,4,2,4]:[3,5,3,5],overflow:!0}),zIndex:r?100:n.get("priority")});return d.styleCache.set(e,o),o}function K_(n){if(!d.zonesVisible)return null;let t=n.get("zone"),e=n.get("child"),i=d.highlightedZones.has(t.id),r=_g(t.id),s=`zone:${t.id}:${e?1:0}:${i?1:r?2:0}`;if(d.styleCache.has(s))return d.styleCache.get(s);let o=n.get("color");if(r){let h=new Mt({fill:new _t({color:`rgba(3, 5, 3, ${e?.38:.32})`}),stroke:new At({color:ki(o,e?.24:.32),width:e?1:1.3,lineDash:e?[3,4]:[7,5]}),zIndex:e?101:100});return d.styleCache.set(s,h),h}let a=new Mt({fill:new _t({color:ki(o,e?.035:.07)}),stroke:new At({color:ki(o,e?.5:.72),width:e?1.2:1.8,lineDash:e?[3,4]:[7,5]})});if(!i)return d.styleCache.set(s,a),a;let l=[new Mt({stroke:new At({color:"rgba(255,255,255,0.94)",width:5}),zIndex:9e3}),new Mt({fill:new _t({color:ki(o,.22)}),stroke:new At({color:o,width:2.6}),zIndex:9001})];return d.styleCache.set(s,l),l}function Z_(n){if(!d.zonesVisible||$r())return null;let t=n.get("child"),e=d.highlightedZones.has(n.get("zone").id),i=d.engine.getView().getZoom()||0;if(!e&&t&&i<d.fitZoom+3)return null;let r=n.get("span")/d.engine.getView().getResolution();return!e&&d.zoneTitleCount>40&&r<52?null:mg(n)}function B_(n){return!d.zonesVisible||!$r()?null:mg(n)}function mg(n){let t=n.get("child"),e=n.get("zone"),i=d.highlightedZones.has(e.id),r=_g(e.id),s=`zone-title:${e.id}:${t?1:0}:${i?1:r?2:0}`;if(d.styleCache.has(s))return d.styleCache.get(s);let o=n.get("color"),a=new Mt({text:new si({text:e.title.toLocaleUpperCase(),font:`${t?"700 12px":"800 14px"} "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:i?"#11140f":r?"rgba(185,192,177,0.56)":t?"#c7ccbd":"#f1f4e7"}),stroke:new At({color:i?"rgba(255,255,255,0.96)":r?"rgba(0,0,0,0.82)":"rgba(0,0,0,0.95)",width:i?2:r?3:4}),backgroundFill:new _t({color:i?o:r?"rgba(4,6,4,0.84)":"rgba(11,14,10,0.72)"}),backgroundStroke:new At({color:i?"#ffffff":ki(o,r?.24:.55),width:i?2:1}),padding:[5,8,5,8],overflow:!0}),zIndex:i?91e5:n.get("priority")});return d.styleCache.set(s,a),a}function _g(n){if(!d.highlightedZones.size||d.highlightedZones.has(n))return!1;for(let t of d.highlightedZones)if(V_(n,t))return!1;return!0}function V_(n,t){let e=new Set,i=d.zoneRecords.get(t)?.zone.parentRegionId;for(;i!=null&&!e.has(i);){if(i===n)return!0;e.add(i),i=d.zoneRecords.get(i)?.zone.parentRegionId}return!1}function qr(n){return n===d.selectedPin||n===d.hoveredPin||ah(n)||!!d.search&&n.location.title.toLocaleLowerCase().includes(d.search)}function Ke(n){return n.filteredHidden||j_(n)||!xg(n.location)}function xg(n){let t=d.variant?.shard;return!t||!n.shard||n.shard===t}function j_(n){return!d.highlightedZones.size||n.insideHighlightedZone||n===d.selectedPin?!1:!(d.search&&n.location.title.toLocaleLowerCase().includes(d.search))}function H_(n,t){return Math.max(0,1e6-Math.min(n.locations.length,999)*1e3)+$_(t.id)%1e3}function q_(n){return n.locations.length>200?4:n.locations.length>75?2.5:1}function $r(){return(d.engine?.getView().getZoom()||0)>=(d.variant?.maxZoom||0)-.05}function $_(n){return Math.imul(Number(n)||0,2654435761)>>>0}function qn(n){let t=Math.abs(Number(n)||0);return Oo[(Math.imul(t,2654435761)>>>0)%Oo.length]}function ki(n,t){let e=String(n||"#ffffff").replace("#",""),i=e.length===3?e.split("").map(s=>s+s).join(""):e.slice(0,6).padEnd(6,"f"),r=Number.parseInt(i,16);return`rgba(${r>>16&255}, ${r>>8&255}, ${r&255}, ${t})`}function gh(n,t){n.style.setProperty("--pin-color",t.color||qn(t.id))}function ph(n,t,e){if(n.classList.remove("has-source-icon"),n.style.removeProperty("--pin-icon"),n.textContent="",!t.iconAsset){n.textContent=e;return}n.style.setProperty("--pin-icon",`url("${yg(t.iconAsset)}")`),n.classList.add("has-source-icon")}function yg(n){return`/static/icons/${n.split("/").map(e=>encodeURIComponent(e)).join("/")}`}function No(n){return n.split(/\s+/).slice(0,2).map(t=>t[0]||"").join("")}function J_(n){return String(n||"").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`>#]/g,"").replace(/\r/g,"").replace(/\n{3,}/g,`7+`);this.generateTileUrlFunction_?this.setTileUrlFunction(Vf(t,this.tileGrid),e):this.setKey(e)}tileUrlFunction(t,e,i){}},Hf=$c;var Jc=class extends Hf{constructor(t){super({attributions:t.attributions,cacheSize:t.cacheSize,projection:t.projection,state:t.state,tileGrid:t.tileGrid,tileLoadFunction:t.tileLoadFunction?t.tileLoadFunction:s_,tilePixelRatio:t.tilePixelRatio,tileUrlFunction:t.tileUrlFunction,url:t.url,urls:t.urls,wrapX:t.wrapX,transition:t.transition,interpolate:t.interpolate!==void 0?t.interpolate:!0,key:t.key,attributionsCollapsible:t.attributionsCollapsible,zDirection:t.zDirection}),this.crossOrigin=t.crossOrigin!==void 0?t.crossOrigin:null,this.referrerPolicy=t.referrerPolicy,this.tileClass=t.tileClass!==void 0?t.tileClass:mo,this.tileGridForProjection={},this.reprojectionErrorThreshold_=t.reprojectionErrorThreshold,this.renderReprojectionEdges_=!1}getGutterForProjection(t){return this.getProjection()&&t&&!An(this.getProjection(),t)?0:this.getGutter()}getGutter(){return 0}getKey(){let t=super.getKey();return this.getInterpolate()||(t+=":disable-interpolation"),t}getTileGridForProjection(t){let e=this.getProjection();if(this.tileGrid&&(!e||An(e,t)))return this.tileGrid;let i=Y(t);return i in this.tileGridForProjection||(this.tileGridForProjection[i]=So(t)),this.tileGridForProjection[i]}createTile_(t,e,i,r,s,o){let a=[t,e,i],l=this.getTileCoordForTileUrlFunction(a,s),h=l?this.tileUrlFunction(l,r,s):void 0,c=new this.tileClass(a,h!==void 0?k.IDLE:k.EMPTY,h!==void 0?h:"",{crossOrigin:this.crossOrigin,referrerPolicy:this.referrerPolicy},this.tileLoadFunction,this.tileOptions);return c.key=o,c.addEventListener(P.CHANGE,this.handleTileChange.bind(this)),c}getTile(t,e,i,r,s,o){let a=this.getProjection();if(!a||!s||An(a,s))return this.getTileInternal(t,e,i,r,a||s);let l=[t,e,i],h=this.getKey(),c=this.getTileGridForProjection(a),u=this.getTileGridForProjection(s),f=this.getTileCoordForTileUrlFunction(l,s),g=new yo(a,c,s,u,l,f,this.getTilePixelRatio(r),this.getGutter(),(p,_,m,x)=>this.getTileInternal(p,_,m,x,a,o),this.reprojectionErrorThreshold_,this.renderReprojectionEdges_,this.tileOptions);return g.key=h,g}getTileInternal(t,e,i,r,s,o){let a=this.getKey(),l=Zn(this,a,t,e,i);if(o&&o.containsKey(l))return o.get(l);let h=this.createTile_(t,e,i,r,s,a);return o?.set(l,h),h}setRenderReprojectionEdges(t){this.renderReprojectionEdges_!=t&&(this.renderReprojectionEdges_=t,this.changed())}setTileGridForProjection(t,e){let i=Et(t);if(i){let r=Y(i);r in this.tileGridForProjection||(this.tileGridForProjection[r]=e)}}};function s_(n,t){if(bt){let e=n.getCrossOrigin(),i="same-origin",r="same-origin";e==="anonymous"||e===""?(i="cors",r="omit"):e==="use-credentials"&&(i="cors",r="include");let s={mode:i,credentials:r,referrerPolicy:n.getReferrerPolicy()};fetch(t,s).then(o=>{if(!o.ok)throw new Error(`HTTP ${o.status}`);return o.blob()}).then(o=>createImageBitmap(o)).then(o=>{let a=n.getImage();a.width=o.width,a.height=o.height,a.getContext("2d").drawImage(o,0,0),o.close?.(),a.dispatchEvent(new Event("load"))}).catch(()=>{n.getImage().dispatchEvent(new Event("error"))});return}n.getImage().src=t}var qf=Jc;var Qc=class extends qf{constructor(t){t=t||{};let e=t.projection!==void 0?t.projection:"EPSG:3857",i=t.tileGrid!==void 0?t.tileGrid:Uf({extent:To(e),maxResolution:t.maxResolution,maxZoom:t.maxZoom,minZoom:t.minZoom,tileSize:t.tileSize});super({attributions:t.attributions,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,interpolate:t.interpolate,projection:e,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileGrid:i,tileLoadFunction:t.tileLoadFunction,tilePixelRatio:t.tilePixelRatio,tileUrlFunction:t.tileUrlFunction,url:t.url,urls:t.urls,wrapX:t.wrapX!==void 0?t.wrapX:!0,transition:t.transition,attributionsCollapsible:t.attributionsCollapsible,zDirection:t.zDirection}),this.gutter_=t.gutter!==void 0?t.gutter:0}getGutter(){return this.gutter_}},$f=Qc;var Z=n=>document.querySelector(n),b={game:Z("#game-select"),map:Z("#map-select"),variant:Z("#variant-select"),variantField:Z("#variant-field"),gameTitle:Z("#game-title"),title:Z("#map-title"),meta:Z("#map-meta"),legend:Z("#legend"),search:Z("#pin-search"),searchResults:Z("#search-results"),visibleCount:Z("#visible-count"),viewport:Z("#map"),layers:Z("#layers"),zoneToggle:Z("#zone-toggle"),zoneCount:Z("#zone-count"),zoneIndex:Z("#zone-index"),zoneList:Z("#zone-list"),loading:Z("#map-loading"),labelsHint:Z("#labels-hint"),gridHint:Z("#grid-hint"),soloChip:Z("#solo-chip"),overview:Z("#overview"),overviewCanvas:Z("#overview-canvas"),overviewViewport:Z("#overview-viewport"),gridNavigator:Z("#grid-navigator"),gridInput:Z("#grid-input"),gridBack:Z("#grid-back"),detail:Z("#pin-detail"),detailTitle:Z("#detail-title"),detailCategory:Z("#detail-category"),detailDescription:Z("#detail-description"),detailID:Z("#detail-id"),detailCoordinates:Z("#detail-coordinates"),detailLinks:Z("#detail-links"),detailDot:Z("#detail-dot"),sidebar:Z("#sidebar"),mobileLegend:Z("#mobile-legend"),fatal:Z("#fatal-error"),fatalMessage:Z("#fatal-message")},Oo=["#d6f36b","#72d5f4","#ff9e64","#df83ff","#62e6ae","#ff6f91","#f4d35e","#8aa9ff","#e7a56d","#83d483"],Fi="0123456789bcdefghjkmnpqrstuvwxyz",o_=3,a_=2,d={catalog:null,game:null,map:null,variant:null,engine:null,projection:null,layers:null,sources:null,hiddenCategories:new Set,collapsedSections:new Set,pins:[],pinByID:new Map,selectedPin:null,hoveredPin:null,pinLabelsVisible:!1,gridEnabled:!1,gridPrefix:"",zonesVisible:!0,zoneRecords:new Map,highlightedZones:new Set,focusedZoneID:null,search:"",fitZoom:0,zoneTitleCount:0,eligibleLocations:0,tileRun:0,tileStats:{requested:0,loaded:0,errors:0,peakPending:0},overviewRun:0,overviewKey:"",renderedShard:0,styleCache:new Map,markerIcons:new Map};async function l_(){h_();try{let n=await fetch("/static/catalog.json");if(!n.ok)throw new Error(`catalog request returned ${n.status}`);if(d.catalog=await n.json(),!d.catalog.games.length)throw new Error("the embedded catalog contains no maps");c_(),lh(b.game,d.catalog.games,"title");let t=ig();th(t.game||d.catalog.games[0].slug,t.map),Q_(),requestAnimationFrame(()=>b.viewport.focus({preventScroll:!0}))}catch(n){b.loading.hidden=!0,b.fatalMessage.textContent=n instanceof Error?n.message:String(n),b.fatal.hidden=!1}}function c_(){let n=d.catalog.tileGrid.size,t=[0,-n,n,0];d.projection=new mi({code:"ATLAS:PIXELS",units:"pixels",extent:t}),d.sources={grid:new Pi({wrapX:!1}),gridContext:new Pi({wrapX:!1}),zones:new Pi({wrapX:!1}),zoneTitles:new Pi({wrapX:!1}),text:new Pi({wrapX:!1}),pins:new Pi({wrapX:!1}),priority:new Pi({wrapX:!1})},d.layers={raster:new yc({zIndex:0}),rasterDetail:new yc({zIndex:1}),grid:new ee({source:d.sources.grid,style:Qf,renderOrder:be,renderBuffer:40,zIndex:5}),zones:new ee({source:d.sources.zones,style:K_,renderBuffer:32,zIndex:10}),zoneTitles:new ee({source:d.sources.zoneTitles,style:Z_,renderOrder:be,renderBuffer:160,zIndex:20}),zoneTitleDetail:new ee({source:d.sources.zoneTitles,style:B_,renderOrder:be,renderBuffer:160,zIndex:44}),text:new ee({source:d.sources.text,style:G_,renderOrder:be,renderBuffer:220,zIndex:30}),textDetail:new ee({source:d.sources.text,style:X_,renderOrder:be,renderBuffer:220,zIndex:45}),zoneText:new ee({source:d.sources.text,style:W_,renderOrder:be,renderBuffer:220,zIndex:41}),pins:new ee({source:d.sources.pins,style:F_,renderOrder:be,renderBuffer:48,zIndex:40}),zonePins:new ee({source:d.sources.pins,style:z_,renderOrder:be,renderBuffer:48,zIndex:42}),pinLabels:new ee({source:d.sources.pins,style:N_,renderOrder:be,renderBuffer:180,zIndex:45}),gridContext:new ee({source:d.sources.gridContext,style:Qf,renderOrder:be,renderBuffer:40,zIndex:48}),priority:new ee({source:d.sources.priority,style:Y_,renderOrder:be,renderBuffer:220,zIndex:50})},d.engine=new tf({target:b.viewport,layers:Object.values(d.layers),controls:Fs({attribution:!1,rotate:!1,zoom:!1}),interactions:Ys({onFocusOnly:!1}),view:eg(5)}),d.engine.on("movestart",()=>{d.engine.getViewport().classList.add("is-dragging")}),d.engine.on("moveend",()=>{d.engine.getViewport().classList.remove("is-dragging"),Hr()}),d.engine.on("postrender",nh),b.viewport.addEventListener("wheel",()=>{document.activeElement!==b.viewport&&b.viewport.focus({preventScroll:!0})},{capture:!0,passive:!0}),d.engine.on("singleclick",e=>{if(d.gridEnabled){let r=d.engine.forEachFeatureAtPixel(e.pixel,s=>s.get("gridCell")||null,{hitTolerance:1,layerFilter:s=>s===d.layers.grid||s===d.layers.gridContext});if(r&&r.role!=="leaf"){rh(r.hash);return}}let i=d.engine.forEachFeatureAtPixel(e.pixel,(r,s)=>s!==d.layers.pins&&s!==d.layers.pinLabels&&s!==d.layers.text&&s!==d.layers.textDetail&&s!==d.layers.priority?null:r.get("pin")||null,{hitTolerance:5});i&&fg(i)}),d.engine.on("pointermove",e=>{if(e.dragging){Mo(null);return}let i=d.engine.forEachFeatureAtPixel(e.pixel,(o,a)=>a!==d.layers.pins&&a!==d.layers.pinLabels&&a!==d.layers.text&&a!==d.layers.textDetail&&a!==d.layers.priority?null:o.get("pin")||null,{hitTolerance:4,layerFilter:o=>o===d.layers.pins||o===d.layers.pinLabels||o===d.layers.text||o===d.layers.textDetail||o===d.layers.priority}),r=i?.category.displayType==="text"?null:i;Mo(r||null);let s=d.gridEnabled&&d.engine.hasFeatureAtPixel(e.pixel,{layerFilter:o=>o===d.layers.grid||o===d.layers.gridContext});d.engine.getTargetElement().style.cursor=i||s?"pointer":""}),d.engine.getViewport().addEventListener("pointerleave",()=>Mo(null))}function eg(n){let t=d.catalog.tileGrid.size;return new Qt({projection:d.projection,center:[t/2,-t/2],resolutions:sg(n),minZoom:0,maxZoom:n,extent:[0,-t,t,0],constrainResolution:!1,smoothResolutionConstraint:!1,showFullExtent:!0,zoom:0})}function h_(){b.game.addEventListener("change",()=>th(b.game.value)),b.map.addEventListener("change",()=>ng(Number(b.map.value))),b.variant.addEventListener("change",()=>rg(Number(b.variant.value))),b.legend.addEventListener("change",e=>{let i=e.target;if(i.dataset.group){A_(Number(i.dataset.group));return}if(!i.dataset.category)return;let r=Number(i.dataset.category);i.checked?d.hiddenCategories.delete(r):d.hiddenCategories.add(r),zi(),Jn()});let n=null,t=()=>{for(let r of b.layers.querySelectorAll(".is-hovered"))r.classList.remove("is-hovered");if(!n)return;let i=document.elementFromPoint(n.x,n.y)?.closest(".category-row, .layer-header");i&&b.layers.contains(i)&&i.classList.add("is-hovered")};b.layers.addEventListener("pointermove",e=>{n={x:e.clientX,y:e.clientY},t()},{passive:!0}),b.layers.addEventListener("pointerleave",()=>{n=null,t()}),b.layers.addEventListener("scroll",t,{passive:!0}),b.layers.addEventListener("click",e=>{let i=e.target.closest("[data-only-category], [data-only-group]");if(i){e.preventDefault(),e.stopPropagation(),M_(i.dataset.onlyCategory?{category:Number(i.dataset.onlyCategory)}:{group:Number(i.dataset.onlyGroup)});return}let r=e.target.closest("[data-section]");if(!r)return;let s=r.dataset.section;d.collapsedSections.has(s)?d.collapsedSections.delete(s):d.collapsedSections.add(s),lg()}),b.soloChip.addEventListener("click",()=>Po(!0)),Z("#show-all").addEventListener("click",()=>Po(!0)),Z("#hide-all").addEventListener("click",()=>Po(!1)),b.zoneToggle.addEventListener("change",()=>{ch(b.zoneToggle.checked)}),b.zoneIndex.addEventListener("click",e=>{let i=e.target.closest("[data-zone]");i&&S_(Number(i.dataset.zone))}),b.zoneIndex.addEventListener("contextmenu",e=>{let i=e.target.closest("[data-zone]");i&&(e.preventDefault(),T_(Number(i.dataset.zone)))}),b.search.addEventListener("input",()=>{d.search=b.search.value.trim().toLocaleLowerCase(),zi(),uh()}),b.searchResults.addEventListener("click",e=>{let i=e.target.closest("[data-location]");if(!i)return;let r=d.pinByID.get(Number(i.dataset.location));r&&Jf(r)}),b.detailLinks.addEventListener("click",e=>{let i=e.target.closest("[data-location]");if(!i)return;let r=d.pinByID.get(Number(i.dataset.location));r&&Jf(r)}),Z("#close-detail").addEventListener("click",Hn),Z("#zoom-in").addEventListener("click",()=>Ao(1)),Z("#zoom-out").addEventListener("click",()=>Ao(-1)),b.gridBack.addEventListener("click",ag),b.gridInput.addEventListener("input",()=>{let e=Do(),i=[...b.gridInput.value.toLocaleLowerCase()].filter(r=>Fi.includes(r)).slice(0,e).join("");b.gridInput.value=i,rh(i)}),b.viewport.addEventListener("keydown",e=>{if(!tg(e.target)){if(e.key==="+"||e.key==="=")Ao(1);else if(e.key==="-")Ao(-1);else if(e.key==="Escape")Hn();else return;e.preventDefault()}}),window.addEventListener("keydown",e=>{if(!tg(e.target)){if((e.metaKey||e.ctrlKey)&&e.key.toLocaleLowerCase()==="k"){e.preventDefault(),b.search.focus(),b.search.select();return}if((e.metaKey||e.ctrlKey)&&e.key.toLocaleLowerCase()==="b"){e.preventDefault(),__();return}x_(e)||e.key.toLocaleLowerCase()==="z"&&(e.preventDefault(),d.pinLabelsVisible=!d.pinLabelsVisible,b.labelsHint.textContent=`Z \xB7 labels ${d.pinLabelsVisible?"on":"off"}`,d.layers.pinLabels.changed())}}),window.addEventListener("hashchange",()=>{let e=ig();e.game===d.game?.slug&&e.map===d.map?.slug||th(e.game||d.catalog.games[0].slug,e.map)}),window.addEventListener("resize",()=>{d.engine?.updateSize(),nh()}),b.overview.addEventListener("pointerdown",e=>{e.preventDefault(),p_(e)}),b.mobileLegend.addEventListener("click",()=>{let e=b.sidebar.classList.toggle("is-open");b.mobileLegend.setAttribute("aria-expanded",String(e))})}function th(n,t){d.game=d.catalog.games.find(i=>i.slug===n)||d.catalog.games[0],b.game.value=d.game.slug,lh(b.map,d.game.maps,"title","id"),b.map.disabled=d.game.maps.length===1,b.map.title=b.map.disabled?"This game has one map":"Choose a map";let e=t&&d.game.maps.find(i=>i.slug===t);ng((e||d.game.maps[0]).id)}function ig(){let[n,t]=decodeURIComponent(location.hash.replace(/^#\/?/,"")).split("/").map(e=>e.trim());return{game:n,map:t}}function u_(){if(!d.game||!d.map)return;let n=`#${d.game.slug}/${d.map.slug}`;location.hash!==n&&history.replaceState(null,"",n)}function ng(n){d.map=d.game.maps.find(t=>t.id===n)||d.game.maps[0],document.documentElement.style.setProperty("--icon-outset-color",fh()),b.map.value=String(d.map.id),lh(b.variant,d.map.variants,"name"),b.variantField.hidden=d.map.variants.length<2,d.styleCache.clear(),Mo(null),d.gridPrefix="",d.hiddenCategories.clear(),d.collapsedSections.clear(),d.collapsedSections.add("zones");for(let t of d.map.groups)for(let e of t.categories)e.visible||d.hiddenCategories.add(e.id);d.search="",b.search.value="",b.searchResults.hidden=!0,Hn(),E_(),cg(),v_(),rg(0,!0),b.gameTitle.textContent=d.game.title,b.title.textContent=d.map.title,b.meta.textContent=`${dn(d.map.pinCount)} locations \xB7 ${dn(d.map.zones?.length||0)} regions`,b.sidebar.classList.remove("is-open"),b.mobileLegend.setAttribute("aria-expanded","false"),u_()}function rg(n,t=!1){let e=d.variant;d.variant=d.map.variants[n]||d.map.variants[0];let i=d.variant,r=t?null:m_(e,i),s=$n(i);b.variant.value=String(d.map.variants.indexOf(d.variant)),t?d.engine.setView(eg(s)):(d.engine.getView().setMinZoom(i.minZoom),d.engine.getView().setMaxZoom(s));let o=++d.tileRun,a=0;d.tileStats={requested:0,loaded:0,errors:0,peakPending:0},b.loading.hidden=!1;let l=p=>{p.on("tileloadstart",()=>{d.tileRun===o&&(a++,d.tileStats.requested++,d.tileStats.peakPending=Math.max(d.tileStats.peakPending,a))});let _=m=>{d.tileRun===o&&(a=Math.max(0,a-1),m?d.tileStats.errors++:d.tileStats.loaded++,a===0&&d.tileStats.loaded>0&&(b.loading.hidden=!0))};return p.on("tileloadend",()=>_(!1)),p.on("tileloaderror",()=>_(!0)),p},h=(p,_)=>l(new $f({projection:d.projection,tileGrid:new jr({extent:[0,-d.catalog.tileGrid.size,d.catalog.tileGrid.size,0],origin:[0,0],resolutions:sg(p),tileSize:d.catalog.tileGrid.tileSize}),cacheSize:64,interpolate:i.interpolate,transition:0,wrapX:!1,tileUrlFunction:([m,x,E])=>{let C=i.formats[m];if(!(!C||x<0||E<0||!_(m,x,E)))return`/static/tiles/${encodeURIComponent(i.tiles)}/${m}/${x}/${E}.${C}`}})),c=i.fullZoom??i.maxZoom,u=h(c,(p,_,m)=>eh(i,p,_,m)),f=d.layers.raster.getSource();d.layers.raster.setSource(u),d.layers.raster.setExtent(un()),d.layers.raster.setBackground(i.background||void 0),f?.clear();let g=d.layers.rasterDetail.getSource();i.maxZoom>c?(d.layers.rasterDetail.setSource(h(i.maxZoom,(p,_,m)=>p>c&&eh(i,p,_,m))),d.layers.rasterDetail.setExtent(un()),d.layers.rasterDetail.setVisible(!0)):d.layers.rasterDetail.setVisible(!1),g?.clear(),sh(),d.gridEnabled&&(fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed()),d.overviewKey="",g_(),d.renderedShard!==(i.shard||0)&&(cg(),zi()),t?requestAnimationFrame(D_):(r&&d.engine.getView().animate({center:r,duration:200}),Hr())}function eh(n,t,e,i){let r=n.coverage?.[t];if(!r)return!0;let s=e-r.x,o=i-r.y;if(s<0||o<0||s>=r.w||o>=r.h)return!1;let a=d_(n,t,r),l=o*r.w+s;return(a[l>>3]&1<<(l&7))!==0}function d_(n,t,e){if(!e.decoded){let i=atob(e.bits),r=new Uint8Array(i.length);for(let s=0;s<i.length;s++)r[s]=i.charCodeAt(s);e.decoded=r}return e.decoded}function sg(n){let t=d.catalog.tileGrid.size/d.catalog.tileGrid.tileSize;return Array.from({length:n+1},(e,i)=>t/2**i)}function $n(n){return n.maxZoom+a_}var f_=168;function g_(){let n=d.variant,t=b.overviewCanvas,e=t.getContext("2d"),i=un(),r=d.catalog.tileGrid.size,s=d.catalog.tileGrid.tileSize,o=i[2]-i[0],a=i[3]-i[1],l=0;for(;l<n.fullZoom&&Math.max(o,a)/r*s*2**l<f_;)l++;let h=s*2**l/r;t.width=Math.max(1,Math.round(o*h)),t.height=Math.max(1,Math.round(a*h)),e.clearRect(0,0,t.width,t.height),n.background&&(e.fillStyle=n.background,e.fillRect(0,0,t.width,t.height));let c=++d.overviewRun,u=n.formats[l],f=Math.floor(i[0]/r*2**l),g=Math.ceil(i[2]/r*2**l),p=Math.floor(-i[3]/r*2**l),_=Math.ceil(-i[1]/r*2**l);for(let m=p;m<_;m++)for(let x=f;x<g;x++){if(!u||!eh(n,l,x,m))continue;let E=new Image;E.onload=()=>{d.overviewRun===c&&e.drawImage(E,x*s-i[0]*h,m*s+i[3]*h,s,s)},E.src=`/static/tiles/${encodeURIComponent(n.tiles)}/${l}/${x}/${m}.${u}`}nh()}function nh(){let n=d.engine?.getView();if(!n||!d.variant)return;let t=un(),e=n.calculateExtent(d.engine.getSize()),i=t[2]-t[0],r=t[3]-t[1],s=(n.getResolution()||0)*4,o=e[0]<=t[0]+s&&e[1]<=t[1]+s&&e[2]>=t[2]-s&&e[3]>=t[3]-s,a=o?"hidden":e.map(Math.round).join(",");if(a===d.overviewKey||(d.overviewKey=a,b.overview.hidden=o,o))return;let l=b.overviewCanvas,h=Di((e[0]-t[0])/i,0,1),c=Di((e[2]-t[0])/i,0,1),u=Di((t[3]-e[3])/r,0,1),f=Di((t[3]-e[1])/r,0,1),g=b.overviewViewport.style;g.left=`${h*l.width}px`,g.top=`${u*l.height}px`,g.width=`${Math.max(8,(c-h)*l.width)}px`,g.height=`${Math.max(8,(f-u)*l.height)}px`}function p_(n){let t=d.engine?.getView();if(!t||!d.variant)return;let e=b.overviewCanvas.getBoundingClientRect(),i=un(),r=(s,o,a)=>Di((s-o)/(a-o),0,1);t.animate({center:[i[0]+r(n.clientX,e.left,e.right)*(i[2]-i[0]),i[3]-r(n.clientY,e.top,e.bottom)*(i[3]-i[1])],duration:180})}function m_(n,t){if(!n||!t||!n.shard||!t.shard||n.shard===t.shard||!n.bounds||!t.bounds)return null;let i=d.engine?.getView()?.getCenter();if(!i)return null;let r=(i[0]-n.bounds.x)/n.bounds.width,s=(-i[1]-n.bounds.y)/n.bounds.height;return[t.bounds.x+Di(r,0,1)*t.bounds.width,-(t.bounds.y+Di(s,0,1)*t.bounds.height)]}function __(){let t=document.querySelector(".app-shell").classList.toggle("sidebar-collapsed");b.mobileLegend.setAttribute("aria-expanded",String(!t)),requestAnimationFrame(()=>d.engine?.updateSize())}function un(){let n=d.catalog.tileGrid.size,t=d.variant?.bounds||{x:0,y:0,width:n,height:n};return[t.x,-(t.y+t.height),t.x+t.width,-t.y]}function x_(n){return n.key.toLocaleLowerCase()==="g"?(n.preventDefault(),og(),!0):n.key==="Escape"&&d.gridEnabled?(n.preventDefault(),ag(),!0):!1}function og(n=!d.gridEnabled){d.gridEnabled=n,sh(),fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed()}function rh(n){let t=Do(),e=[...n.toLocaleLowerCase()].filter(r=>Fi.includes(r)).slice(0,t).join(""),i=e!==d.gridPrefix;d.gridPrefix=e,d.gridEnabled||(d.gridEnabled=!0),sh(),fn(),d.layers.pins.changed(),d.layers.text.changed(),d.layers.priority.changed(),i&&(Hn(),d.engine.getView().fit(ko(),{size:d.engine.getSize(),padding:[52,52,52,52],maxZoom:$n(d.variant),duration:180}))}function ag(){if(d.gridEnabled){if(!d.gridPrefix){og(!1);return}rh(d.gridPrefix.slice(0,-1))}}function sh(){if(!d.sources||(d.sources.grid.clear(),d.sources.gridContext.clear(),b.gridNavigator.hidden=!d.gridEnabled,b.gridHint.textContent=d.gridEnabled?`G \xB7 ${d.gridPrefix||"root"}`:"G \xB7 grid off",!d.gridEnabled||!d.variant))return;let n=Do();if(b.gridInput.maxLength=n,b.gridInput.value=d.gridPrefix,b.gridBack.title=d.gridPrefix?"Back one geohash level":"Close geohash grid",y_(),d.gridPrefix.length>=n){ih(d.gridPrefix,ko(),"leaf");return}for(let t of Fi){let e=d.gridPrefix+t;ih(e,oh(e),"child")}}function y_(){for(let n=0;n<d.gridPrefix.length;n++){let t=d.gridPrefix.slice(0,n),e=d.gridPrefix.slice(0,n+1);for(let i of Fi){let r=t+i;r!==e&&ih(r,oh(r),"neighbor",d.gridPrefix.length-n)}}}function ih(n,t,e,i=0){let[r,s,o,a]=t,l=d.pins.filter(u=>{if(u.filteredHidden)return!1;let[f,g]=u.coordinate;return f>=r&&f<=o&&g>=s&&g<=a}).length,h=new lr({geometry:new Ci([[[r,s],[r,a],[o,a],[o,s],[r,s]]]),gridCell:{hash:n,extent:t,role:e,count:l,contextDistance:i},priority:e==="neighbor"?-i*100+Fi.indexOf(n[n.length-1]):Fi.indexOf(n[n.length-1])});(e==="neighbor"?d.sources.gridContext:d.sources.grid).addFeature(h)}function ko(){return oh(d.gridPrefix)}function oh(n){let t=[...un()],e=!0;for(let i of n){let r=Fi.indexOf(i);if(!(r<0))for(let s of[16,8,4,2,1]){if(e){let o=(t[0]+t[2])/2;r&s?t[0]=o:t[2]=o}else{let o=(t[1]+t[3])/2;r&s?t[1]=o:t[3]=o}e=!e}}return t}function Do(){return o_}function ah(n){if(!d.gridEnabled||!d.gridPrefix)return!1;let t=ko(),[e,i]=n.coordinate;return e>=t[0]&&e<=t[2]&&i>=t[1]&&i<=t[3]}function lh(n,t,e,i){n.replaceChildren(),t.forEach((r,s)=>{let o=document.createElement("option");o.value=i?String(r[i]):r.slug||String(s),o.textContent=r[e],n.append(o)})}function E_(){let n=document.createDocumentFragment();for(let t of d.map.groups){if(!t.categories.length)continue;let e=document.createElement("section");e.className="layer-section",e.dataset.groupSection=String(t.id);let i=t.categories.reduce((s,o)=>s+o.locations.length,0);e.append(w_(`group-${t.id}`,t.title,i,t.id));let r=document.createElement("div");r.className="category-toggles";for(let s of t.categories)r.append(C_(s));e.append(r),n.append(e)}b.legend.replaceChildren(n),lg(),Jn()}function w_(n,t,e,i){let r=document.createElement("div");r.className="layer-header";let s=document.createElement("button");s.type="button",s.className="layer-title",s.dataset.section=n;let o=document.createElement("span");o.className="layer-chevron",o.setAttribute("aria-hidden","true"),o.innerHTML='<svg viewBox="0 0 24 24"><path d="m9 6 6 6-6 6"/></svg>';let a=document.createElement("span");a.textContent=t;let l=document.createElement("span");l.className="layer-count",l.textContent=dn(e),s.append(o,a,l);let h=document.createElement("button");h.type="button",h.className="only-button only-group",h.dataset.onlyGroup=String(i),h.textContent="only",h.title=`Show only ${t}`;let c=document.createElement("label");c.className="layer-switch";let u=document.createElement("input");u.type="checkbox",u.dataset.group=String(i),u.setAttribute("aria-label",`Show ${t}`);let f=document.createElement("span");return f.setAttribute("aria-hidden","true"),c.append(u,f),r.append(s,h,c),r}function C_(n){let t=n.displayType==="text",e=document.createElement("label");e.className="category-row",gh(e,n);let i=document.createElement("input");i.type="checkbox",i.dataset.category=String(n.id),i.checked=!d.hiddenCategories.has(n.id);let r=document.createElement("span");t?(r.className="text-symbol",r.textContent="Tt",r.title="Drawn as a text label"):(r.className="category-icon",ph(r,n,No(n.title)),r.title=n.icon||n.title);let s=document.createElement("span");s.className="category-name",s.textContent=n.title;let o=document.createElement("span");o.className="category-count",o.textContent=dn(n.locations.length);let a=document.createElement("button");return a.type="button",a.className="only-button",a.dataset.onlyCategory=String(n.id),a.textContent="only",a.title=`Show only ${n.title}`,e.append(i,r,s,a,o),e}function lg(){for(let n of b.layers.querySelectorAll("[data-section]")){let t=d.collapsedSections.has(n.dataset.section);n.setAttribute("aria-expanded",String(!t)),n.closest(".layer-section").classList.toggle("is-collapsed",t)}}function v_(){d.sources.pins.clear(),d.sources.text.clear(),d.sources.priority.clear(),d.pins=[],d.pinByID.clear();for(let n of d.map.groups)for(let t of n.categories){t.displayType!=="text"&&U_(t);for(let e of t.locations){let i={location:e,category:t,group:n,coordinate:hh(e.lat,e.lng),filteredHidden:!1,priority:H_(t,e),feature:null};i.feature=new lr({geometry:new wi(i.coordinate),pin:i,priority:i.priority}),d.pins.push(i),d.pinByID.set(e.id,i),t.displayType==="text"?d.sources.text.addFeature(i.feature):d.sources.pins.addFeature(i.feature)}}zi()}function cg(){let n=(d.map.zones||[]).filter(xg);d.renderedShard=d.variant?.shard||0,d.sources.zones.clear(),d.sources.zoneTitles.clear(),d.zoneRecords.clear(),d.highlightedZones.clear(),d.focusedZoneID=null,d.zoneTitleCount=0,ch(!0),b.zoneIndex.hidden=n.length===0,b.zoneCount.textContent=dn(n.length);for(let t of n){let e=ut(),i=[],r=!1;for(let l of t.features||[]){let h=I_(l);h&&(r=!0,i.push(h),fs(e,h.getExtent()),d.sources.zones.addFeature(new lr({geometry:h,zone:t,color:qn(t.id),child:t.parentRegionId!=null})))}if(!r)continue;let s=qn(t.id),o=t.center?hh(t.center.lat,t.center.lng):Bt(e),a=Math.max(e[2]-e[0],e[3]-e[1]);d.sources.zoneTitles.addFeature(new lr({geometry:new wi(o),zone:t,color:s,child:t.parentRegionId!=null,span:a,priority:(t.parentRegionId==null?2e6:1e6)+Math.round(a)})),d.zoneRecords.set(t.id,{zone:t,extent:e.slice(),geometries:i,color:s})}d.zoneTitleCount=d.sources.zoneTitles.getFeatures().length,b_()}function b_(){let n=document.createDocumentFragment();for(let{zone:t,depth:e}of R_()){let i=d.zoneRecords.get(t.id);if(!i)continue;let r=document.createElement("button");r.type="button",r.className="zone-index-item",r.dataset.zone=String(t.id),r.style.setProperty("--zone-color",i.color),r.style.setProperty("--zone-depth",String(e)),r.setAttribute("aria-pressed","false"),r.title=`${t.title}: click to jump; right-click to toggle highlight`;let s=document.createElement("span");s.className="zone-index-marker",s.setAttribute("aria-hidden","true");let o=document.createElement("span");o.textContent=t.title,r.append(s,o),n.append(r)}b.zoneList.replaceChildren(n),b.zoneIndex.hidden=d.zoneRecords.size===0}function R_(){let n=[...d.zoneRecords.values()].map(o=>o.zone),t=new Set(n.map(o=>o.id)),e=new Map;for(let o of n){let a=t.has(o.parentRegionId)?o.parentRegionId:null;e.has(a)||e.set(a,[]),e.get(a).push(o)}for(let o of e.values())o.sort((a,l)=>a.title.localeCompare(l.title,void 0,{numeric:!0,sensitivity:"base"}));let i=[],r=new Set,s=(o,a)=>{if(!r.has(o.id)){r.add(o.id),i.push({zone:o,depth:a});for(let l of e.get(o.id)||[])s(l,a+1)}};for(let o of e.get(null)||[])s(o,0);for(let o of n)s(o,0);return i}function ch(n){d.zonesVisible=n,b.zoneToggle.checked=n,d.layers.zones.setVisible(n),d.layers.zoneTitles.setVisible(n),d.layers.zoneTitleDetail.setVisible(n)}function S_(n){let t=d.zoneRecords.get(n);t&&(d.focusedZoneID=n,hg(),Hn(),d.engine.getView().fit(t.extent,{size:d.engine.getSize(),padding:[54,54,54,54],maxZoom:$n(d.variant),duration:220}),b.sidebar.classList.remove("is-open"),b.mobileLegend.setAttribute("aria-expanded","false"))}function T_(n){d.zoneRecords.has(n)&&(d.highlightedZones.has(n)?d.highlightedZones.delete(n):(d.highlightedZones.add(n),ch(!0)),d.hoveredPin=null,ug(),dg(),hg(),d.layers.zones.changed(),d.layers.zoneTitles.changed(),d.layers.zoneTitleDetail.changed())}function hg(){b.zoneIndex.classList.toggle("has-highlights",d.highlightedZones.size>0);for(let n of b.zoneList.querySelectorAll("[data-zone]")){let t=Number(n.dataset.zone),e=d.highlightedZones.has(t);n.classList.toggle("is-highlighted",e),n.classList.toggle("is-current",d.focusedZoneID===t),n.setAttribute("aria-pressed",String(e))}}function I_(n){if(!n?.coordinates)return null;let t=([e,i])=>hh(i,e);return n.type==="Polygon"?new Ci(n.coordinates.map(e=>e.map(t))):n.type==="MultiPolygon"?new nf(n.coordinates.map(e=>e.map(i=>i.map(t)))):null}function hh(n,t){let e=d.catalog.tileGrid,i=2**e.sourceZoom,r=(t+180)/360*i,s=n*Math.PI/180,o=(1-Math.asinh(Math.tan(s))/Math.PI)/2*i;return[(r-e.firstTile)*e.tileSize,-(o-e.firstTile)*e.tileSize]}function zi(){for(let n of d.pins){let t=d.hiddenCategories.has(n.category.id),e=d.search&&!n.location.title.toLocaleLowerCase().includes(d.search);n.filteredHidden=!!(t||e)}ug(),dg(),d.selectedPin?.filteredHidden&&Hn()}function ug(){if(!d.highlightedZones.size){for(let t of d.pins)t.insideHighlightedZone=!1;return}let n=[...d.highlightedZones].map(t=>d.zoneRecords.get(t)).filter(Boolean);for(let t of d.pins)t.insideHighlightedZone=n.some(e=>e.geometries.some(i=>L_(i,t.coordinate)))}function L_(n,t){if(n.intersectsCoordinate(t))return!0;let e=n.getClosestPoint(t),i=e[0]-t[0],r=e[1]-t[1];return i*i+r*r<=1}function dg(){d.eligibleLocations=d.pins.filter(n=>!Ke(n)).length,fn(),d.layers.pins.changed(),d.layers.zonePins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.zoneText.changed(),d.layers.textDetail.changed(),d.layers.priority.changed(),Hr()}function fn(){d.sources.priority.clear();for(let n of d.pins){if(Ke(n))continue;let t=!!d.search&&n.location.title.toLocaleLowerCase().includes(d.search);(n===d.selectedPin||n===d.hoveredPin||t||ah(n))&&d.sources.priority.addFeature(n.feature)}}function Mo(n){d.hoveredPin!==n&&(d.hoveredPin=n,d.sources&&(fn(),d.layers.pins.changed(),d.layers.priority.changed()))}function uh(){if(!d.search){b.searchResults.hidden=!0,b.searchResults.replaceChildren();return}let n=d.pins.filter(e=>!d.hiddenCategories.has(e.category.id)&&e.location.title.toLocaleLowerCase().includes(d.search)).sort((e,i)=>e.location.title.localeCompare(i.location.title)).slice(0,20),t=document.createDocumentFragment();if(!n.length){let e=document.createElement("p");e.className="search-empty",e.textContent="No visible locations match.",t.append(e)}for(let e of n){let i=document.createElement("button");i.type="button",i.className="search-result",i.dataset.location=String(e.location.id),gh(i,e.category);let r=document.createElement("span");r.className="result-dot",ph(r,e.category,No(e.category.title));let s=document.createElement("span"),o=document.createElement("strong");o.textContent=e.location.title;let a=document.createElement("small");a.textContent=`${e.category.title} \xB7 ${e.group.title}`,s.append(o,a),i.append(r,s),t.append(i)}b.searchResults.replaceChildren(t),b.searchResults.hidden=!1}function Po(n){if(d.hiddenCategories.clear(),!n)for(let t of d.map.groups)for(let e of t.categories)d.hiddenCategories.add(e.id);Fo(),zi(),uh(),Jn()}function Fo(){for(let n of document.querySelectorAll("[data-category]"))n.checked=!d.hiddenCategories.has(Number(n.dataset.category))}function A_(n){let t=d.map.groups.find(i=>i.id===n);if(!t)return;let e=t.categories.some(i=>!d.hiddenCategories.has(i.id));for(let i of t.categories)e?d.hiddenCategories.add(i.id):d.hiddenCategories.delete(i.id);Fo(),zi(),Jn()}function M_(n){if(d.map){if(P_(n)){Po(!0);return}d.hiddenCategories.clear();for(let t of d.map.groups){let e=n.group===t.id;for(let i of t.categories)!e&&n.category!==i.id&&d.hiddenCategories.add(i.id)}Fo(),zi(),uh(),Jn()}}function P_(n){for(let t of d.map.groups)for(let e of t.categories)if((n.group===t.id||n.category===e.id)===d.hiddenCategories.has(e.id))return!1;return!0}function O_(){let n=b.soloChip;if(!d.map){n.hidden=!0;return}let t=null,e=0,i=null,r=0;for(let o of d.map.groups){let a=0;for(let l of o.categories)d.hiddenCategories.has(l.id)||(a++,e++,t=l);a>0&&(r++,i=a===o.categories.length?o:null)}let s="";e===1&&t?s=t.title:r===1&&i&&(s=i.title),n.hidden=!s,n.textContent=s?`only: ${s}`:"",n.title=s?`Showing only ${s} \u2014 click to show everything`:""}function Jn(){if(d.map){for(let n of d.map.groups){let t=b.legend.querySelector(`input[data-group="${n.id}"]`);t&&(t.checked=n.categories.some(e=>!d.hiddenCategories.has(e.id)))}O_()}}function Jf(n){d.hiddenCategories.delete(n.category.id),d.search="",b.search.value="",b.searchResults.hidden=!0,Fo(),zi(),Jn(),fg(n,!0)}function fg(n,t=!1){if(d.selectedPin=n,fn(),d.layers.pins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.textDetail.changed(),d.layers.priority.changed(),b.detailTitle.textContent=n.location.title,b.detailCategory.textContent=`${n.group.title} / ${n.category.title}`,b.detailDescription.textContent=J_(n.location.description)||"No description is included in the archive.",b.detailID.textContent=String(n.location.id),b.detailCoordinates.textContent=`${n.location.lat.toFixed(6)}, ${n.location.lng.toFixed(6)}`,k_(n),gh(b.detailDot,n.category),ph(b.detailDot,n.category,No(n.category.title)),b.detail.hidden=!1,t){let e=d.engine.getView();e.animate({center:n.coordinate,zoom:Math.min($n(d.variant),Math.max(e.getZoom()||0,4)),duration:220})}}function k_(n){let t=(n.location.links||[]).filter(i=>d.pinByID.has(i.locationId));if(b.detailLinks.hidden=t.length===0,!t.length){b.detailLinks.replaceChildren();return}let e=document.createDocumentFragment();for(let i of t){let r=document.createElement("button");r.type="button",r.className="detail-link",r.dataset.location=String(i.locationId),r.textContent=i.title,e.append(r)}b.detailLinks.replaceChildren(e)}function Hn(){d.selectedPin=null,d.sources&&(fn(),d.layers.pins.changed(),d.layers.pinLabels.changed(),d.layers.text.changed(),d.layers.textDetail.changed(),d.layers.priority.changed()),b.detail.hidden=!0}function D_(){if(!d.engine||!d.variant)return;let n=d.engine.getView();n.fit(un(),{size:d.engine.getSize(),padding:[36,36,36,36],maxZoom:d.variant.maxZoom,duration:0}),d.fitZoom=n.getZoom()||0,Hr()}function Ao(n){let t=d.engine.getView(),e=t.getZoom()||0;t.animate({zoom:Di(e+n,d.variant.minZoom,$n(d.variant)),duration:140})}function Hr(){let n=d.engine?.getView().getZoom();if(b.viewport.dataset.zoom=Number.isFinite(n)?n.toFixed(3):"",!d.engine||!d.pins.length){b.visibleCount.textContent="0 locations visible";return}let t=d.engine.getView().calculateExtent(d.engine.getSize()),e=0;for(let i of d.pins){if(Ke(i))continue;let[r,s]=i.coordinate;r>=t[0]&&r<=t[2]&&s>=t[1]&&s<=t[3]&&e++}b.visibleCount.textContent=`${dn(d.eligibleLocations)} enabled \xB7 ${dn(e)} in view`}function be(n,t){return(n.get("priority")||0)-(t.get("priority")||0)}function F_(n){let t=n.get("pin");return!t||Ke(t)||t.insideHighlightedZone||qr(t)?null:dh(t,!1)}function z_(n){let t=n.get("pin");return!t||!d.highlightedZones.size||!t.insideHighlightedZone||Ke(t)||qr(t)?null:dh(t,!1)}function N_(n){let t=n.get("pin");return!t||Ke(t)||!d.pinLabelsVisible||!$r()?null:gg(t)}function G_(n){let t=n.get("pin");if(!t||Ke(t)||t.insideHighlightedZone||qr(t)||$r())return null;let e=d.fitZoom+Math.log2(q_(t.category));return(d.engine.getView().getZoom()||0)<e?null:zo(t,!1)}function X_(n){let t=n.get("pin");return!t||Ke(t)||t.insideHighlightedZone||qr(t)||!$r()?null:zo(t,!1)}function W_(n){let t=n.get("pin");return!t||!d.highlightedZones.size||!t.insideHighlightedZone||Ke(t)||qr(t)?null:zo(t,!1)}function Y_(n){let t=n.get("pin");if(!t||Ke(t))return null;if(t.category.displayType==="text")return zo(t,t===d.selectedPin);let e=dh(t,t===d.selectedPin);return t===d.hoveredPin||t===d.selectedPin?[e,gg(t)]:e}function dh(n,t){let e=`marker:${n.category.id}:${t?1:0}`;if(d.styleCache.has(e))return d.styleCache.get(e);let i=n.category.color||qn(n.category.id),r=t?2e7:n.priority,s=d.markerIcons.get(pg(n.category)),o;return s?o=new Mt({image:new an({src:s,width:t?36:31,height:t?36:31}),zIndex:r}):o=new Mt({text:new si({text:No(n.category.title),font:`900 ${t?15:13}px Inter, sans-serif`,fill:new _t({color:i}),stroke:new At({color:fh(),width:t?4:3})}),zIndex:r}),d.styleCache.set(e,o),o}function gg(n){let t=`marker-label:${n.location.id}`;if(d.styleCache.has(t))return d.styleCache.get(t);let e=new Mt({text:new si({text:n.location.title,offsetY:21,font:'700 10px "Arial Narrow", "Roboto Condensed", sans-serif',fill:new _t({color:"#f4f6ed"}),stroke:new At({color:"rgba(0,0,0,0.98)",width:3}),backgroundFill:new _t({color:"rgba(10,13,9,0.72)"}),padding:[2,4,2,4],overflow:!0}),zIndex:n.priority});return d.styleCache.set(t,e),e}function U_(n){if(!n.iconAsset)return;let t=pg(n);if(d.markerIcons.has(t))return;d.markerIcons.set(t,null);let e=new Image;e.onload=()=>{let i=document.createElement("canvas");i.width=64,i.height=64;let r=i.getContext("2d"),s=n.color||qn(n.id),o=document.createElement("canvas");o.width=64,o.height=64;let a=o.getContext("2d");a.imageSmoothingEnabled=!n.iconPicture,a.drawImage(e,6,6,52,52),n.iconPicture||(a.globalCompositeOperation="source-in",a.fillStyle=s,a.fillRect(0,0,64,64));let l=document.createElement("canvas");l.width=64,l.height=64;let h=l.getContext("2d");h.drawImage(e,6,6,52,52),h.globalCompositeOperation="source-in",h.fillStyle=fh(),h.fillRect(0,0,64,64);for(let c=-3;c<=3;c++)for(let u=-3;u<=3;u++)u*u+c*c<=10&&r.drawImage(l,u,c);r.drawImage(o,0,0),d.markerIcons.set(t,i.toDataURL("image/png")),d.styleCache.delete(`marker:${n.id}:0`),d.styleCache.delete(`marker:${n.id}:1`),d.layers.pins.changed(),d.layers.zonePins.changed(),d.layers.priority.changed()},e.onerror=()=>d.markerIcons.set(t,!1),e.src=yg(n.iconAsset)}function pg(n){return`${n.iconAsset||""}:${n.color||qn(n.id)}:${d.map?.iconOutset||"light"}`}function fh(){return d.map?.iconOutset==="dark"?"rgba(7, 9, 7, 0.98)":"rgba(255, 255, 255, 0.96)"}function zo(n,t){let e=`text:${n.location.id}:${t?1:0}`;if(d.styleCache.has(e))return d.styleCache.get(e);let r=[new Mt({text:new si({text:n.location.title,font:`${t?"900":"800"} 14px "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:t?"#d6f36b":"#f3f5e9"}),stroke:new At({color:"rgba(0,0,0,0.95)",width:4}),backgroundFill:new _t({color:t?"rgba(17,21,14,0.9)":"rgba(10,13,9,0.58)"}),backgroundStroke:t?new At({color:"#d6f36b",width:1}):void 0,padding:[3,6,3,6],overflow:!0}),zIndex:t?2e7:n.priority+3e6})];return d.styleCache.set(e,r),r}function Qf(n){let t=n.get("gridCell");if(!t)return null;let e=`grid:${t.hash}:${t.role}:${t.contextDistance}`;if(d.styleCache.has(e))return d.styleCache.get(e);let i=Oo[Math.max(0,Fi.indexOf(t.hash[t.hash.length-1]))%Oo.length],r=t.role==="leaf",s=t.role==="neighbor",o=new Mt({fill:new _t({color:s?`rgba(3, 5, 3, ${Math.min(.52,.3+t.contextDistance*.06)})`:ki(i,r?.14:.055)}),stroke:new At({color:r?"#ffffff":ki(i,s?.44:.82),width:r?2.5:s?1:1.4}),text:new si({text:t.hash,font:`${r?"900 17px":s?"750 11px":"800 13px"} "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:r?"#ffffff":s?ki(i,.72):i}),stroke:new At({color:"rgba(0,0,0,0.96)",width:4}),backgroundFill:new _t({color:s?"rgba(4,6,4,0.88)":"rgba(9,12,8,0.76)"}),padding:s?[2,4,2,4]:[3,5,3,5],overflow:!0}),zIndex:r?100:n.get("priority")});return d.styleCache.set(e,o),o}function K_(n){if(!d.zonesVisible)return null;let t=n.get("zone"),e=n.get("child"),i=d.highlightedZones.has(t.id),r=_g(t.id),s=`zone:${t.id}:${e?1:0}:${i?1:r?2:0}`;if(d.styleCache.has(s))return d.styleCache.get(s);let o=n.get("color");if(r){let h=new Mt({fill:new _t({color:`rgba(3, 5, 3, ${e?.38:.32})`}),stroke:new At({color:ki(o,e?.24:.32),width:e?1:1.3,lineDash:e?[3,4]:[7,5]}),zIndex:e?101:100});return d.styleCache.set(s,h),h}let a=new Mt({fill:new _t({color:ki(o,e?.035:.07)}),stroke:new At({color:ki(o,e?.5:.72),width:e?1.2:1.8,lineDash:e?[3,4]:[7,5]})});if(!i)return d.styleCache.set(s,a),a;let l=[new Mt({stroke:new At({color:"rgba(255,255,255,0.94)",width:5}),zIndex:9e3}),new Mt({fill:new _t({color:ki(o,.22)}),stroke:new At({color:o,width:2.6}),zIndex:9001})];return d.styleCache.set(s,l),l}function Z_(n){if(!d.zonesVisible||$r())return null;let t=n.get("child"),e=d.highlightedZones.has(n.get("zone").id),i=d.engine.getView().getZoom()||0;if(!e&&t&&i<d.fitZoom+3)return null;let r=n.get("span")/d.engine.getView().getResolution();return!e&&d.zoneTitleCount>40&&r<52?null:mg(n)}function B_(n){return!d.zonesVisible||!$r()?null:mg(n)}function mg(n){let t=n.get("child"),e=n.get("zone"),i=d.highlightedZones.has(e.id),r=_g(e.id),s=`zone-title:${e.id}:${t?1:0}:${i?1:r?2:0}`;if(d.styleCache.has(s))return d.styleCache.get(s);let o=n.get("color"),a=new Mt({text:new si({text:e.title.toLocaleUpperCase(),font:`${t?"700 12px":"800 14px"} "Arial Narrow", "Roboto Condensed", sans-serif`,fill:new _t({color:i?"#11140f":r?"rgba(185,192,177,0.56)":t?"#c7ccbd":"#f1f4e7"}),stroke:new At({color:i?"rgba(255,255,255,0.96)":r?"rgba(0,0,0,0.82)":"rgba(0,0,0,0.95)",width:i?2:r?3:4}),backgroundFill:new _t({color:i?o:r?"rgba(4,6,4,0.84)":"rgba(11,14,10,0.72)"}),backgroundStroke:new At({color:i?"#ffffff":ki(o,r?.24:.55),width:i?2:1}),padding:[5,8,5,8],overflow:!0}),zIndex:i?91e5:n.get("priority")});return d.styleCache.set(s,a),a}function _g(n){if(!d.highlightedZones.size||d.highlightedZones.has(n))return!1;for(let t of d.highlightedZones)if(V_(n,t))return!1;return!0}function V_(n,t){let e=new Set,i=d.zoneRecords.get(t)?.zone.parentRegionId;for(;i!=null&&!e.has(i);){if(i===n)return!0;e.add(i),i=d.zoneRecords.get(i)?.zone.parentRegionId}return!1}function qr(n){return n===d.selectedPin||n===d.hoveredPin||ah(n)||!!d.search&&n.location.title.toLocaleLowerCase().includes(d.search)}function Ke(n){return n.filteredHidden||j_(n)||!xg(n.location)}function xg(n){let t=d.variant?.shard;return!t||!n.shard||n.shard===t}function j_(n){return!d.highlightedZones.size||n.insideHighlightedZone||n===d.selectedPin?!1:!(d.search&&n.location.title.toLocaleLowerCase().includes(d.search))}function H_(n,t){return Math.max(0,1e6-Math.min(n.locations.length,999)*1e3)+$_(t.id)%1e3}function q_(n){return n.locations.length>200?4:n.locations.length>75?2.5:1}function $r(){return(d.engine?.getView().getZoom()||0)>=(d.variant?.maxZoom||0)-.05}function $_(n){return Math.imul(Number(n)||0,2654435761)>>>0}function qn(n){let t=Math.abs(Number(n)||0);return Oo[(Math.imul(t,2654435761)>>>0)%Oo.length]}function ki(n,t){let e=String(n||"#ffffff").replace("#",""),i=e.length===3?e.split("").map(s=>s+s).join(""):e.slice(0,6).padEnd(6,"f"),r=Number.parseInt(i,16);return`rgba(${r>>16&255}, ${r>>8&255}, ${r&255}, ${t})`}function gh(n,t){n.style.setProperty("--pin-color",t.color||qn(t.id))}function ph(n,t,e){if(n.classList.remove("has-source-icon"),n.style.removeProperty("--pin-icon"),n.textContent="",!t.iconAsset){n.textContent=e;return}n.style.setProperty("--pin-icon",`url("${yg(t.iconAsset)}")`),n.classList.add("has-source-icon")}function yg(n){return`/static/icons/${n.split("/").map(e=>encodeURIComponent(e)).join("/")}`}function No(n){return n.split(/\s+/).slice(0,2).map(t=>t[0]||"").join("")}function J_(n){return String(n||"").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`>#]/g,"").replace(/\r/g,"").replace(/\n{3,}/g,`88 99 `).trim()}function dn(n){return new Intl.NumberFormat().format(n)}function Di(n,t,e){return Math.min(e,Math.max(t,n))}function tg(n){return n instanceof HTMLElement&&(n.matches("input, textarea, select")||n.isContentEditable)}function Q_(){let n=()=>({game:d.game?.title,map:d.map?.title,variant:d.variant?.name,zoom:d.engine?.getView().getZoom(),center:d.engine?.getView().getCenter(),resolution:d.engine?.getView().getResolution(),nativeMaxZoom:d.variant?.maxZoom,maxZoom:d.variant?$n(d.variant):null,interpolate:d.variant?.interpolate,tileStats:{...d.tileStats},pins:d.pins.length,eligibleLocations:d.eligibleLocations,domNodes:document.querySelectorAll("*").length,canvases:document.querySelectorAll("canvas").length,rasterCacheSize:64,pinLabelsVisible:d.pinLabelsVisible,hoveredPin:d.hoveredPin?.location.title||null,zones:{visible:d.zonesVisible,count:d.zoneRecords.size,focused:d.zoneRecords.get(d.focusedZoneID)?.zone.title||null,highlighted:[...d.highlightedZones].map(t=>d.zoneRecords.get(t)?.zone.title).filter(Boolean),focusedPins:d.pins.filter(t=>!t.filteredHidden&&t.insideHighlightedZone).length},grid:{enabled:d.gridEnabled,prefix:d.gridPrefix,maximumDepth:Do(),extent:d.gridEnabled?ko():null,cells:[...d.sources.grid.getFeatures(),...d.sources.gridContext.getFeatures()].map(t=>t.get("gridCell")),priorityPins:d.gridPrefix?d.pins.filter(t=>!t.filteredHidden&&ah(t)).length:0}});window.__atlasDebug={snapshot:n,setLayerVisible:(t,e)=>d.layers[t]?.setVisible(e)},window.render_game_to_text=()=>JSON.stringify({coordinateSystem:"ATLAS:PIXELS; origin top-left; x increases right; y decreases downward",...n()}),window.advanceTime=()=>d.engine?.renderSync()}l_();})();
M frontend/app.css +5 -7
M frontend/app.js +24 -9
@@ -372,16 +372,31 @@ function bindUIEvents() {
372372 syncGroupSwitches();373373 });374374 375- // Hover reveals an action on the row under the pointer, and the pointer can376- // stop being over that row without the browser saying so: scrolling moves the377- // list instead of the cursor. The reveal is marked stale until the pointer378- // actually moves again.379- const goStale = () => elements.layers.classList.add("hover-stale");380- elements.layers.addEventListener("scroll", goStale, { passive: true });381- elements.layers.addEventListener("pointerleave", goStale);382- elements.layers.addEventListener("pointermove", () => {383- elements.layers.classList.remove("hover-stale");375+ // Which row the pointer is over is worked out from where the pointer is,376+ // rather than read from :hover. Scrolling moves the list under a still377+ // cursor, and the browser does not always revise :hover when it does -- so a378+ // row kept offering an action to a pointer that had long since left it.379+ // Recomputing on scroll settles it, because the answer comes from the380+ // pointer's actual position either way.381+ let pointerAt = null;382+ const markHoveredRow = () => {383+ for (const marked of elements.layers.querySelectorAll(".is-hovered")) {384+ marked.classList.remove("is-hovered");385+ }386+ if (!pointerAt) return;387+ const under = document.elementFromPoint(pointerAt.x, pointerAt.y);388+ const row = under?.closest(".category-row, .layer-header");389+ if (row && elements.layers.contains(row)) row.classList.add("is-hovered");390+ };391+ elements.layers.addEventListener("pointermove", (event) => {392+ pointerAt = { x: event.clientX, y: event.clientY };393+ markHoveredRow();384394 }, { passive: true });395+ elements.layers.addEventListener("pointerleave", () => {396+ pointerAt = null;397+ markHoveredRow();398+ });399+ elements.layers.addEventListener("scroll", markHoveredRow, { passive: true });385400 386401 elements.layers.addEventListener("click", (event) => {387402 const only = event.target.closest("[data-only-category], [data-only-group]");