1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[696],{24710:(e,t,n)=>{n.d(t,{DI:()=>r,Ft:()=>u,Ib:()=>l,T0:()=>d,UB:()=>i,pp:()=>s,qr:()=>o,uU:()=>a});let r='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.6 4.4 6 7.8l3.4-3.4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>',i='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6 2.4v7.2M2.4 6h7.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>',l='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>',a='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.4 6.2 5 8.8l4.6-5.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>',o='<svg viewBox="0 0 16 16" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="6.4" y="6.4" width="3.2" height="3.2" rx="1" fill="currentColor"/><path d="M7 7 4.4 4.4M9 7l2.6-2.6M7 9l-2.6 2.6M9 9l2.6 2.6" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="3.4" cy="3.4" r="1.9" stroke="currentColor" stroke-width="1.2"/><circle cx="12.6" cy="3.4" r="1.9" stroke="currentColor" stroke-width="1.2"/><circle cx="3.4" cy="12.6" r="1.9" stroke="currentColor" stroke-width="1.2"/><circle cx="12.6" cy="12.6" r="1.9" stroke="currentColor" stroke-width="1.2"/></svg>',s='<svg viewBox="0 0 16 16" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 2.2 9.2 6 13 7.2 9.2 8.4 8 12.2 6.8 8.4 3 7.2 6.8 6 8 2.2Z" fill="currentColor"/><path d="M12.6 10.6l.55 1.65 1.65.55-1.65.55-.55 1.65-.55-1.65-1.65-.55 1.65-.55.55-1.65Z" fill="currentColor"/></svg>',d='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="2.6" y="5.2" width="6.8" height="4.6" rx="1" stroke="currentColor" stroke-width="1.2"/><path d="M4.2 5.2V3.9a1.8 1.8 0 0 1 3.6 0v1.3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>',u='<svg viewBox="0 0 12 12" width="11" height="11" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5 3H3.6A1.1 1.1 0 0 0 2.5 4.1v4.4A1.1 1.1 0 0 0 3.6 9.6H8a1.1 1.1 0 0 0 1.1-1.1V7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.6 2.4H9.6V5.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.4 2.6 5.8 6.2" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg>'},30332:(e,t,n)=>{function r(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),i=2;i<n;i++)r[i-2]=arguments[i];let l=document.createElement(e);return t&&function(e,t){for(let n in t){let r=t[n];if(null!=r&&!1!==r)if("class"===n||"className"===n)e.className=r;else if("style"===n)if("string"==typeof r)e.style.cssText=r;else for(let t in r)e.style[t]=r[t];else if("dataset"===n)for(let t in r)e.dataset[t]=r[t];else if(n.length>2&&n.startsWith("on")&&n[2]===n[2].toUpperCase()){let t=n.slice(2).toLowerCase();e.addEventListener(t,r)}else n in e?e[n]=r:e.setAttribute(n,r)}}(l,t),function e(t,n){for(let r of n)null!=r&&!1!==r&&(Array.isArray(r)?e(t,r):r instanceof Node?t.appendChild(r):t.appendChild(document.createTextNode(String(r))))}(l,r),l}function i(e){for(;e.firstChild;)e.removeChild(e.firstChild)}n.d(t,{I:()=>i,h:()=>r})},43132:(e,t,n)=>{function r(e){return Math.round(Number(e)||0).toLocaleString("en-US",{maximumFractionDigits:0})}function i(e){return String(Math.round(Number(e)||0))}n.d(t,{FO:()=>a,Mv:()=>r,RV:()=>o,hh:()=>l,tN:()=>i});function l(e){let t=Math.round(Number(e));return Number.isFinite(t)?1875+Math.min(Math.max(t,0),160):null}function a(e){let t=Math.round(Number(e)||0);return t>=161?"Future":t>=160?"2035+":i(1875+t)}function o(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:r,l=i(e);return n?"⥠".concat(l):"".concat(l,"â").concat(i(t))}},70696:(e,t,n)=>{n.r(t),n.d(t,{start:()=>nv});var r={};n.r(r),n.d(r,{TINT_MODE_NONE:()=>Z,TINT_MODE_NULL_GRAY:()=>J,TINT_MODE_REPLACE:()=>$,buildBaseMaterialParams:()=>ee,createHeroMaterial:()=>et,createHeroMaterialController:()=>eo,getCityColorGrade:()=>U,getDuskGlow:()=>P,getFlooredAlbedoAudit:()=>j,getGlobalDesaturate:()=>E,getGrayStyle:()=>L,getHeroMinLuma:()=>z,getHeroesFlatSun:()=>W,getRealLights:()=>I,getSharedLawUniforms:()=>ei,isExemptDecision:()=>er,setCityColorGrade:()=>H,setDuskGlow:()=>T,setGlobalDesaturate:()=>N,setHeroMinLuma:()=>Y,setHeroSunDir:()=>X,setHeroUniforms:()=>en,setHeroesFlatSun:()=>K});var i=n(80686);let l={playPause:{key:" ",modAgnostic:!0,group:"global",label:"Play / pause",mac:"Space",win:"Space"},stepYear:{keys:["ArrowLeft","ArrowRight"],shift:!1,group:"global",label:"Step 1 year (pauses)",mac:"â / â",win:"â / â"}
1,stepYear10:{keys:["ArrowLeft","ArrowRight"],shift:!0,group:"global",label:"Step 10 years",mac:"Shift + â / â",win:"Shift + â / â"},commandPalette:{key:"k",mod:"either",shift:!1,group:"global",label:"Command palette",mac:"âK",win:"Ctrl+K"},cycleViewMode:{code:"KeyV",shift:!1,group:"global",label:"Cycle Full UI \xb7 Minimal \xb7 Hide UI",mac:"V",win:"V"},toggleCluster:{code:"KeyV",shift:!0,group:"global",label:"Show / hide this cluster",mac:"Shift + V",win:"Shift + V"},help:{key:"?",printable:!0,codeFallback:{code:"Slash",shift:!0},group:"global",label:"Show shortcuts",mac:"?",win:"?"},buildingUpdates:{code:"KeyN",shift:!1,group:"global",requires:"buildingUpdates",label:"Building updates",mac:"N",win:"N"},droneAxes:{group:"drone",label:"Fly / climb",mac:"W A S D \xb7 R F",win:"W A S D \xb7 R F",axes:{KeyW:["forward",1],KeyS:["forward",-1],KeyA:["strafe",-1],KeyD:["strafe",1],KeyR:["vertical",1],KeyF:["vertical",-1]}},droneBoost:{group:"drone",label:"Speed boost",mac:"Shift",win:"Shift",codes:["ShiftLeft","ShiftRight"]},escape:{key:"Escape",modAgnostic:!0,groups:["global","drone"],label:"Close panel / exit drone",mac:"Esc",win:"Esc"},contextMenu:{pointer:!0,display:!0,group:"global",label:"Context menu (building actions)",mac:"Right-click",win:"Right-click"},legacyCycle:{key:"F10",modAgnostic:!0,hidden:!0,sunset:"one release",group:"global",label:"Cycle view mode (legacy alias of V)",mac:"F10",win:"F10"},legacyCluster:{key:"F9",modAgnostic:!0,hidden:!0,sunset:"one release",group:"global",label:"Show / hide the cluster (legacy alias of Shift+V)",mac:"F9",win:"F9"}},a=l.droneAxes.axes;function o(e,t){if(!e||!t||t.pointer)return!1;let n=!!e.metaKey,r=!!e.ctrlKey,i=!!e.altKey,l=!!e.shiftKey;return"either"===t.mod?!!(n||r)&&!i&&(void 0===t.shift||!!t.shift===l)&&String(e.key).toLowerCase()===t.key:t.printable?!n&&!r&&!i&&(e.key===t.key||!!(t.codeFallback&&e.code===t.codeFallback.code&&!!t.codeFallback.shift===l)):t.modAgnostic?e.key===t.key:!n&&!r&&!i&&(void 0===t.shift||!!t.shift===l)&&(t.code?e.code===t.code:t.keys?-1!==t.keys.indexOf(e.key):!!t.key&&e.key===t.key)}function s(e){return e?"ArrowRight"===e.key?1:"ArrowLeft"===e.key?-1:0:0}function d(e){if(" "===e)return"Space";if("ArrowLeft"===e)return"â";if("ArrowRight"===e)return"â";if("ArrowUp"===e)return"â";if("ArrowDown"===e)return"â";if("Escape"===e)return"Esc";let t=String(e);return 1===t.length?t.toUpperCase():t}function u(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t=>(function(e,t){let n="mac"===t?"mac":"win";if(e&&"string"==typeof e[n])return e[n];if(!e)return"";let r=[];"either"===e.mod&&r.push("mac"===n?"â":"Ctrl"),e.alt&&r.push("mac"===n?"â¥":"Alt"),!0===e.shift&&r.push("Shift");let i="";return(e.code?i=d(String(e.code).replace(/^Key/,"")):e.keys?i=e.keys.map(d).join(" / "):e.key&&(i=d(e.key)),i&&r.push(i),r.length<=1)?r[0]||"":"mac"===n&&"either"===e.mod&&2===r.length?r.join(""):r.join("mac"===n?" + ":"+")})(l[t],e),r=[{keys:n("playPause"),what:l.playPause.label,group:"global"},{keys:n("stepYear"),what:l.stepYear.label,group:"global"},{keys:n("stepYear10"),what:l.stepYear10.label,group:"global"},{keys:n("commandPalette"),what:l.commandPalette.label,group:"global"},{keys:n("cycleViewMode"),what:l.cycleViewMode.label,group:"global"},{keys:n("toggleCluster"),what:l.toggleCluster.label,group:"global"}];for(let e of(t.hasBuildingUpdates&&r.push({keys:n("buildingUpdates"),what:l.buildingUpdates.label,group:"global"}),r.push({keys:"â â",what:"Move inside menus & the palette",group:"global"},{keys:n("contextMenu"),what:l.contextMenu.label,group:"global"},{keys:n("help"),what:l.help.label,group:"global"},{keys:n("escape"),what:l.escape.label,group:"global"}),function(){let e={forward:{},strafe:{},vertical:{}};
1for(let t of Object.keys(a)){let[n,r]=a[t];e[n][r]=t.replace(/^Key/,"")}return[{keys:"".concat(e.forward[1]," / ").concat(e.forward[-1]),what:"Forward / back"},{keys:"".concat(e.strafe[-1]," / ").concat(e.strafe[1]),what:"Left / right"},{keys:"".concat(e.vertical[1]," / ").concat(e.vertical[-1]),what:"Up / down"}]}()))r.push({keys:e.keys,what:e.what,group:"drone"});return r.push({keys:n("droneBoost"),what:l.droneBoost.label,group:"drone"},{keys:n("escape"),what:"Exit drone",group:"drone"}),r}function c(e,t){if(e){let t=e.tagName;if("INPUT"===t||"TEXTAREA"===t||"SELECT"===t||e.isContentEditable)return!0}return!!(t&&"function"==typeof t.closest&&t.closest('input, textarea, select, [contenteditable="true"]'))}var p=n(81584),f=n(17968),h=n(30332),g=n(24710);function m(){let{title:e,body:t,ctaLabel:n,onCta:r,skeletonRows:i=3,ariaLabel:l}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=[],o=Number.isFinite(i)&&i>0?Math.min(i,6):3;for(let e=0;e<o;e+=1)a.push((0,h.h)("div",{class:"dv-locked-row"},(0,h.h)("span",{class:"dv-locked-bar dv-locked-bar--label"}),(0,h.h)("span",{class:"dv-locked-bar dv-locked-bar--value"})));let s=(0,h.h)("span",{class:"dv-locked-glyph","aria-hidden":"true"});s.innerHTML=g.T0;let d="function"==typeof r?(0,h.h)("button",{type:"button",class:"dv-locked-cta",onClick:()=>r()},null!=n&&""!==n?String(n):"Unlock"):null;return(0,h.h)("div",{class:"dv-locked",role:"group","aria-label":l||"Locked content"},(0,h.h)("div",{class:"dv-locked-skeleton","aria-hidden":"true"},a),(0,h.h)("div",{class:"dv-locked-scrim"},s,null!=e&&""!==e?(0,h.h)("div",{class:"dv-locked-title"},String(e)):null,null!=t&&""!==t?(0,h.h)("div",{class:"dv-locked-body"},String(t)):null,d))}function y(e,t){let n=null==e?null:e,r=null==t?null:t;return null===n&&null===r||null!==n&&null!==r&&("number"==typeof n&&"number"==typeof r?1e-9>Math.abs(n-r):String(n)===String(r))}var b=n(87548),v=n(85339),w=n(2502),x=n(55306),k=n(35833),S=n(22290);let M=(()=>{try{return"legacy"!==new URLSearchParams(location.search).get("lights")}catch(e){return!0}})();function I(){return M}let C=(()=>{try{return"warm"===new URLSearchParams(location.search).get("gray")?"warm":"neutral"}catch(e){return"neutral"}})(),_=M&&"neutral"===C;function L(){return C}let F={value:.1},A={value:0};function N(e){A.value=Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}function E(){return A.value}let D={value:0};function T(e){D.value=Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}function P(){return D.value}let B={value:1},R={value:1};function H(e,t){B.value=Number.isFinite(e)?Math.max(0,Math.min(2,e)):1,R.value=Number.isFinite(t)?Math.max(.5,Math.min(1.5,t)):1}function U(){return{saturation:B.value,value:R.value}}function Y(e){Number.isFinite(e)&&(F.value=Math.max(0,e))}function z(){return F.value}let O=[];function j(){return O.slice()}let G=(()=>{try{return new URLSearchParams(location.search).has("dev")}catch(e){return!1}})(),V=!0;function K(e){V=!!e}function W(){return V}let q={value:new v.Pq0(-.3234,.736,.5948).normalize().clone()};function X(e,t,n){q.value.set(e,t,n)}let Z=0,$=1,J=2,Q=[.72,.68,.62];function ee(e,t){let n=!!(e&&e.attributes&&e.attributes.color);
1(M||V)&&e&&"function"==typeof e.computeVertexNormals&&(e.attributes&&e.attributes.normal||e.computeVertexNormals());let r={fog:!1};return n?r.vertexColors=!0:t&&(t.color&&(r.color=t.color.clone()),t.map&&(r.map=t.map),"number"==typeof t.opacity&&(r.opacity=t.opacity),"boolean"==typeof t.transparent&&(r.transparent=t.transparent),"number"==typeof t.side&&(r.side=t.side),"number"==typeof t.alphaTest&&(r.alphaTest=t.alphaTest),"PublicHousing_LooseMesh_Yellow"===t.name&&(r.color=new v.Q1f(...Q),delete r.map)),{params:r,hasColor0:n}}function et(e,t){let{params:n,hasColor0:r}=ee(e,t),i=M?new v.G_z(n):new v.V9B(n);return function(e,t){let n={uTint:{value:new v.Pq0(1,1,1)},uTintMode:{value:Z},uExempt:{value:0},uSelected:{value:0},uSelectTint:{value:new v.Pq0(1,1,1)},uGradeExempt:{value:0}};e.userData.heroUniforms=n;let r=V&&!M;e.onBeforeCompile=t=>{Object.assign(t.uniforms,n),r&&(t.vertexShader=t.vertexShader.replace("#include <common>","#include <common>\nvarying vec3 vHeroNormalW;").replace("#include <begin_vertex>","#include <begin_vertex>\nvHeroNormalW = normalize(mat3(modelMatrix) * normal);")),t.fragmentShader=t.fragmentShader.replace("#include <emissivemap_fragment>","#include <emissivemap_fragment>\n totalEmissiveRadiance += diffuseColor.rgb * (uDuskGlow * 0.55 * dvDuskPainted);"),t.fragmentShader=t.fragmentShader.replace("#include <common>","#include <common>\nuniform vec3 uTint;\nuniform float uTintMode;\nuniform float uExempt;\nuniform float uSelected;\nuniform vec3 uSelectTint;\nuniform float uMinLuma;\nuniform float uGlobalDesat;\nuniform float uDuskGlow;\nuniform float uGradeSat;\nuniform float uGradeVal;\nuniform float uGradeExempt;\n".concat(r?"varying vec3 vHeroNormalW;\nuniform vec3 uHeroSunDir;":"")).replace("#include <color_fragment>","#include <color_fragment>\n\n // 0) city color grade (city-expansion 2026-08-13) â the per-payload\n // base-albedo grade (shared uGradeSat/uGradeVal; 1/1 = the NY identity).\n // Runs FIRST so it touches only the AUTHORED albedo by order: the tint\n // replace / null-gray / selection writes below overwrite it, keeping data\n // paints and the legend verbatim. uGradeExempt gates env materials out.\n {\n float cgLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));\n vec3 cgGraded = clamp(mix(vec3(cgLuma), diffuseColor.rgb, uGradeSat) * uGradeVal, 0.0, 1.0);\n diffuseColor.rgb = mix(cgGraded, diffuseColor.rgb, uGradeExempt);\n }\n\n // 1) tint replace (uTintMode 1=replace flat color, 2=nullGray) â mirrors\n // substrate's texel0 paint write (resolveDecisionToPaint's color/nullGray\n // branches), applied to the vertexColors/baseColor result above.\n if (uTintMode > 1.5) {\n diffuseColor.rgb = vec3(0.62); // null-gray flat luminance 0.62, verbatim\n } else if (uTintMode > 0.5) {\n diffuseColor.rgb = uTint;\n }\n\n // 2) J3 min-luminance floor â natural-PAINT only (uTintMode<0.5 &&\n // uSelected<0.5): additively lift authored near-black albedo to uMinLuma\n // PRE-lighting so the key/shadows still shape the lifted color. Runs\n // BEFORE the K2 desaturate (the mix preserves luminance, so a lifted\n // backdrop grays to the same lifted gray).\n if (uTintMode < 0.5 && uSelected < 0.5) {\n float floorLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));\n if (floorLuma < uMinLuma) {\n diffuseColor.rgb += vec3(uMinLuma - floorLuma);\n }\n }\n\n // 3) K2 backdrop gray-of-natural â the ADR-034 transplant law: one shared\n // uGlobalDesat (1 while a data layer is active + grayBackdrop) desaturates\n // every NON-EXEMPT material toward luminance. Exempt = real data-color\n // subjects + defaultBeige filter paints (Unity: they survive graying);\n // natural decisions are NOT exempt â they ARE the backdrop. nullGray needs\n // no exemption (flat gray is achromatic â a no-op here). K5: under the\n // default NEUTRAL gray style this mix runs POST-lighting instead (the\n // opaque_fragment inject below) so the gray reads Unity-neutral rather\n // than re-tinted by the warm key; ?gray=warm compiles this pre-light form.\n".concat(_?" // (K5 neutral: the desaturate moved post-lighting â see below.)":" {\n float gdLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));\n diffuseColor.rgb = mix(diffuseColor.rgb, vec3(gdLuma), uGlobalDesat * (1.0 - uExempt));\n }","\n\n // 4) selection tint LAST â applied AFTER the desaturate so the selection\n // highlight is never grayed (Unity's sidekick-overlay law).\n if (uSelected >= 0.5) {\n diffuseColor.rgb = uSelectTint;\n }\n\n // 5) dusk-glow arming (city-polish): remember whether this fragment wears\n // a DATA color (the flat-tint branch) or the selection tint â the\n // emissive inject below turns exactly those into self-lit color at dusk.\n float dvDuskPainted = ((uTintMode > 0.5 && uTintMode < 1.5) || uSelected >= 0.5) ? 1.0 : 0.0;\n").concat(r?"\n // Optional fake-sun (HEROES_FLAT_SUN) â verbatim look constants from\n // render/substrate.js's FRAGMENT_SHADER, applied to the already-composed\n // diffuseColor.rgb (post tint/desaturate/selection), matching substrate's\n // own ordering (fake-sun is the LAST step there too).\n {\n float heroKey = clamp(dot(vHeroNormalW, uHeroSunDir), 0.0, 1.0);\n // F-now brightness retune (2026-07-11, Jack's foreground review: heroes\n // read near-black under the substrate-verbatim constants â 0.38*0.55 =\n // 0.21x on away faces vs Unity's bright ambient+directional). Raised\n // ambient floor + sky floor keep directional shape but land in Unity's\n // brightness class. PROVISIONAL â C8 tunes against the real rig via\n // render_config;
1 Jack eyeballs.\n float heroSky = 0.78 + 0.22 * clamp(vHeroNormalW.y, 0.0, 1.0);\n diffuseColor.rgb = diffuseColor.rgb * (0.62 + 0.38 * heroKey) * heroSky;\n }\n":"")),_&&(t.fragmentShader=t.fragmentShader.replace("#include <opaque_fragment>"," {\n float gdLuma = dot(outgoingLight, vec3(0.299, 0.587, 0.114));\n outgoingLight = mix(outgoingLight, vec3(gdLuma), uGlobalDesat * (1.0 - max(uExempt, uSelected)));\n }\n #include <opaque_fragment>")),r&&(t.uniforms.uHeroSunDir=q),t.uniforms.uMinLuma=F,t.uniforms.uGlobalDesat=A,t.uniforms.uDuskGlow=D,t.uniforms.uGradeSat=B,t.uniforms.uGradeVal=R,e.userData.shader=t},e.customProgramCacheKey=()=>"hero-recolor-v5-".concat(t?"c0":"nc0","-").concat(M?"lambert":r?"sun":"flat","-").concat(_?"gneutral":"gwarm")}(i,r),i}function en(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=e&&e.userData&&e.userData.heroUniforms;if(!r)return;let i=t||{},l=Z,a=null;"string"==typeof i.color?(l=$,a=el(i.color)):i.nullGray?l=J:i.defaultBeige&&(l=$,a=el(p.FILTER_GRAY_OUT_HEX)),r.uTintMode.value=l,a&&r.uTint.value.set(a[0],a[1],a[2]);let o="boolean"==typeof n.exempt?n.exempt:er(i);r.uExempt.value=+!!o,r.uSelected.value=+!!n.selected;let s=el("string"==typeof n.selectTintHex?n.selectTintHex:p.toHex(p.DEFAULT_SELECTION_HIGHLIGHT));r.uSelectTint.value.set(s[0],s[1],s[2])}function er(e){return(!e||!e.hidden)&&(!!e&&"string"==typeof e.color||!!e&&!!e.defaultBeige)}function ei(){return{minLuma:F,globalDesat:A,duskGlow:D,gradeSat:B,gradeVal:R}}function el(e){let t=p.fromHex(e)||{r:1,g:1,b:1};return[t.r,t.g,t.b]}let ea=!1;function eo(e,t){let n=[];for(let t of(e&&"function"==typeof e.traverse&&e.traverse(e=>{e&&e.isMesh&&e.geometry&&n.push(e)}),n))Array.isArray(t.material)?(ea||(ea=!0,console.warn("[heroMaterial] array material on a hero mesh â mapping every slot (GLTFLoader normally emits one material per primitive)")),t.material=t.material.map(e=>et(t.geometry,e))):t.material=et(t.geometry,t.material);if(G&&n.length>0){let t=0,r=0;for(let e of n){let n=e.geometry.attributes&&e.geometry.attributes.color;if(n&&n.count>0){let e=Math.max(1,Math.floor(n.count/64));for(let i=0;i<n.count;i+=e)t+=.299*n.getX(i)+.587*n.getY(i)+.114*n.getZ(i),r++}else{let n=Array.isArray(e.material)?e.material[0]:e.material;n&&n.color&&(t+=.299*n.color.r+.587*n.color.g+.114*n.color.b,r++)}}let i=r>0?t/r:1;if(i<F.value){let t=e&&e.userData&&e.userData.id||"(unnamed root)";O.push({id:t,meanLuma:Number(i.toFixed(4))}),console.info("[heroMaterial] low-albedo hero floored to ".concat(F.value,": ").concat(t," (mean luma ").concat(i.toFixed(3),")"))}}function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}
1,r={selected:!!(t&&t.selected),selectTintHex:t&&"string"==typeof t.tintHex?t.tintHex:void 0,...t&&"boolean"==typeof t.exempt?{exempt:t.exempt}:{}};for(let t of n)if(Array.isArray(t.material))for(let n of t.material)en(n,e,r);else en(t.material,e,r)}return{setDecision:r,setTint:function(e){r({color:e})},dispose:function(){n.length=0}}}var es=n(77562);let ed=new Set(["WTC_Memorial.glb","oculus.glb","1069595.glb","wtc_twin_towers.glb","Abolitionist_Place.glb","Public_Square___Gardens_at_Hudson_Yards.glb","3329438.glb","1089723.glb","1089309.glb"]),eu=Math.PI/180;function ec(e,t){let n=-e;return"master_development"===t?n+180:n}let ep=(()=>{try{let e=new URLSearchParams(location.search);return"legacy"!==e.get("lights")&&"off"!==e.get("shadows")}catch(e){return!0}})();function ef(e,t,n){let r=!1;for(let i=0,l=e.length-1;i<e.length;l=i++){let a=e[i][0],o=e[i][1],s=e[l][0],d=e[l][1];o>n!=d>n&&t<(s-a)*(n-o)/(d-o)+a&&(r=!r)}return r}function eh(e){if(null==e)return null;let t=String(e).trim();return""===t?null:t}function eg(e){let t=Number(e);return Number.isFinite(t)?t:null}function em(e){e&&"function"==typeof e.traverse&&e.traverse(e=>{e.geometry&&"function"==typeof e.geometry.dispose&&e.geometry.dispose();let t=e.material;Array.isArray(t)?t.forEach(ey):t&&ey(t)})}function ey(e){if(e){for(let t of Object.keys(e)){let n=e[t];n&&n.isTexture&&"function"==typeof n.dispose&&n.dispose()}"function"==typeof e.dispose&&e.dispose()}}function eb(e){em(e&&(e.scene||e.scenes&&e.scenes[0]))}let ev=Math.PI/180;var ew=n(54809),ex=n(77922),ek=n(11882);async function eS(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/data",t="string"==typeof e&&""!==e?e.replace(/\/+$/,""):"/data";try{let e=await fetch("".concat(t,"/geo_calibration.json"));if(!e.ok)return console.info("[calibration] geo_calibration.json ".concat(e.status," â equirect fallback stays (placement will carry the F3 warp).")),null;let n=function(e){if(!e||"object"!=typeof e)return null;let t=Array.isArray(e.controlPoints)?e.controlPoints:[],n=Array.isArray(e.piecewiseTriangles)?e.piecewiseTriangles:[],r=eM(e.affineFallback),i=eM(e.baselineAffine);if(!r&&!i)return null;let l=[];for(let e of n){if(!e||!eM(e.forward))continue;let{i0:n,i1:r,i2:i}=e;if(![n,r,i].every(e=>Number.isInteger(e)&&e>=0&&e<t.length)||n===r||r===i||n===i)continue;let a=t[n],o=t[r],s=t[i];l.push({ax:a.latitude,ay:a.longitude,bx:o.latitude,by:o.longitude,cx:s.latitude,cy:s.longitude,f:e.forward})}let a=0,o=0;function s(e,t){for(let n=0;n<l.length;n++){let r=l[n];if(function(e,t,n,r,i,l,a,o){let s=(l-o)*(n-a)+(a-i)*(r-o);if(1e-9>Math.abs(s))return!1;let d=((l-o)*(e-a)+(a-i)*(t-o))/s,u=((o-r)*(e-a)+(n-a)*(t-o))/s;return d>=-1e-9&&u>=-1e-9&&1-d-u>=-1e-9}(e,t,r.ax,r.ay,r.bx,r.by,r.cx,r.cy))return a++,[r.f.a1*e+r.f.b1*t+r.f.tx,r.f.a2*e+r.f.b2*t+r.f.tz]}o++;let n=r||i;return[n.a1*e+n.b1*t+n.tx,n.a2*e+n.b2*t+n.tz]}let d=1,u=0,c=0,p=1,f=0,h=0,g=!1;return{gpsToUnity:s,buildFrame:function(e,t){let[n,r]=s(t,e),[i,l]=s(t,e+.002),[a,o]=s(t+.002,e),m=[(i-n)/.002,(l-r)/.002],y=[(a-n)/.002,(o-r)/.002],b=m[0]*y[1]-y[0]*m[1];if(!Number.isFinite(b)||1e-12>Math.abs(b))return;let v=111320*Math.cos(t*Math.PI/180),w=y[1]/b,x=-y[0]/b,k=-m[1]/b,S=m[0]/b;d=v*w,u=v*x,c=-110540*k,p=-110540*S,f=n,h=r,g=!0},project:function(e,t){let[n,r]=s(t,e),i=n-f,l=r-h;return[d*i+u*l,c*i+p*l]},stats:()=>({triangleHits:a,fallbackHits:o,frameBuilt:g})}}(await e.json());return n||console.warn("[calibration] geo_calibration.json parsed but unusable (no valid affines) â equirect fallback stays."),n}catch(e){return console.warn("[calibration] load failed â equirect fallback stays:",e&&e.message?e.message:e),null}}function eM(e){return e&&["a1","b1","tx","a2","b2","tz"].every(t=>Number.isFinite(e[t]))&&e.isValid?e:null}let eI=[178/255,247/255,1],eC=[126/255,165/255,180/255],e_=.5/255;function eL(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}async function eF(e){let t="string"==typeof e&&""!==e?e.replace(/\/+$/,""):"/data";try{let e=await fetch("".concat(t,"/render_config.json"));if(!e.ok)return null;let n=await e.json();return n&&"object"==typeof n?n:null}catch(e){return null}}function eA(e){if(!Array.isArray(e)||e.length<3)return null;let t=[Number(e[0]),Number(e[1]),Number(e[2])];return t.every(Number.isFinite)?t:null}function eN(e,t){return Math.abs(e[0]-t[0])>e_||Math.abs(e[1]-t[1])>e_||Math.abs(e[2]-t[2])>e_}let eE=Math.PI/180;function eD(e,t){return[e[0]-t[0],e[1]-t[1]]}function eT(e){return Math.hypot(e[0],e[1])}function eP(e,t){return e[0]*t[1]-t[0]*e[1]}function eB(e,t){let n=eT(e),r=eT(t);return n>0&&r>0?Math.acos(Math.max(-1,Math.min(1,(e[0]*t[0]+e[1]*t[1])/(n*r))))/eE:NaN}let eR=["1016278","1069595","1016131","1001064","1001009","1018472","4542128"];async function eH(e){let{dataBase:t,unityFrame:n,projectWeb:r,index:i,calibrationStats:l}=e||{};try{if(!n||"function"!=typeof n.projectGps)return{available:!1,reason:"unity frame unavailable (fallback placement active)"};if("function"!=typeof r)return{available:!1,reason:"scene.project unavailable"};let e="string"==typeof t&&""!==t?t.replace(/\/+$/,""):"/data",a=null;try{let t=await fetch("".concat(e,"/web_mesh_manifest.json"));a=t&&t.ok?await t.json():null}catch(e){a=null}let o=a&&Array.isArray(a.buildings)?a.buildings:null;if(!o||0===o.length)return{available:!1,reason:"web_mesh_manifest.json unavailable/empty"};let s=[],d=0;for(let e of o){let t=Number(e&&e.bounds_center_lng),i=Number(e&&e.bounds_center_lat);if(!Number.isFinite(t)||!Number.isFinite(i)){d++;continue}let a=l?l():null,o=n.projectGps(t,i),u=l?l():null,c=!!(a&&u&&u.fallbackHits>a.fallbackHits),p=r(t,i);if(!eU(o)||!eU(p)){d++;continue}s.push({key:null!=e.key?String(e.key):null,bin:null!=e.bin&&""!==e.bin?String(e.bin):null,dx:o[0]-p[0],dz:o[
11]-p[1],oldX:p[0],oldZ:p[1],viaFallback:c})}if(0===s.length)return{available:!1,reason:"no finite anchors",skipped:d};let u=ez(s);u.byResolution={triangle:ez(s.filter(e=>!e.viaFallback)),fallback:ez(s.filter(e=>e.viaFallback))};let c=function(e){let t=e.length;if(t<3)return{rotationDeg:NaN,scalePct:NaN};let n=0,r=0,i=0,l=0;for(let t of e)n+=t.oldX,r+=t.oldZ,i+=t.dx,l+=t.dz;n/=t,r/=t,i/=t,l/=t;let a=0,o=0,s=0;for(let t of e){let e=t.oldX-n,d=t.oldZ-r,u=t.dx-i,c=t.dz-l;a+=e*u+d*c,o+=e*c-d*u,s+=e*e+d*d}if(!(s>0))return{rotationDeg:NaN,scalePct:NaN};let d=a/s,u=o/s;return{rotationDeg:Math.round(180/Math.PI*Math.atan2(u,1+d)*1e3)/1e3,scalePct:Math.round((Math.hypot(1+d,u)-1)*1e5)/1e3}}(s);u.rotationTrendDeg=c.rotationDeg,u.scaleTrendPct=c.scalePct,u.frameYawResidualDeg=c.rotationDeg,u.skipped=d;let p={};for(let e of eR){let t=s.find(t=>t.bin===e);t&&(p[e]={dx:eY(t.dx),dz:eY(t.dz),m:eY(Math.hypot(t.dx,t.dz)),viaFallback:t.viaFallback})}let f=s.reduce((e,t)=>Math.hypot(t.dx,t.dz)>Math.hypot(e.dx,e.dz)?t:e,s[0]);p.maxDelta={key:f.key,bin:f.bin,m:eY(Math.hypot(f.dx,f.dz)),viaFallback:f.viaFallback};let h=function(e,t,n,r,i){if(!t||!(t.byId instanceof Map))return{available:!1,reason:"index unavailable"};let l=t.byId,a=[];for(let e of i){let t=eO(l,e&&e.core200_id)||eO(l,e&&e.bin)||eO(l,e&&e.yimby_cluster_id);if(!t)continue;let i=Number(t.lng),o=Number(t.lat),s=Number(e.bounds_center_lng),d=Number(e.bounds_center_lat);if(![i,o,s,d].every(Number.isFinite))continue;let u=n(i,o),c=r.projectGps(s,d);if(eU(u)&&eU(c)&&(a.push({dx:c[0]-u[0],dz:c[1]-u[1],oldX:u[0],oldZ:u[1]}),a.length>=2e3))break}return 0===a.length?{available:!1,reason:"no joinable rows"}:{available:!0,stats:ez(a)}}(0,i,r,n,o);return{available:!0,stats:u,exemplars:p,markerDelta:h,list:s}}catch(e){return{available:!1,reason:"diagnostic failed: ".concat(e&&e.message?e.message:e)}}}function eU(e){return e&&Number.isFinite(e[0])&&Number.isFinite(e[1])}function eY(e){return Math.round(100*e)/100}function ez(e){if(!e||0===e.length)return{n:0};let t=e.map(e=>Math.hypot(e.dx,e.dz)).sort((e,t)=>e-t),n=e.reduce((e,t)=>
1e+t.dx,0)/e.length,r=e.reduce((e,t)=>e+t.dz,0)/e.length,i=e.map(e=>Math.hypot(e.dx-n,e.dz-r)).sort((e,t)=>e-t),l=(e,t)=>e[Math.min(e.length-1,Math.floor(t*e.length))];return{n:e.length,medianM:eY(l(t,.5)),p90M:eY(l(t,.9)),maxM:eY(t[t.length-1]),meanVec:[eY(n),eY(r)],scatterP90AfterMean:eY(l(i,.9))}}function eO(e,t){return null==t||""===t?null:e.get(String(t))||null}function ej(e){let t=String(e||"").replace("#","");return 6!==t.length?[1,1,1]:[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255]}function eG(e){return!!e.yearVisible&&!e.decisionHidden&&!e.stopHidden}let eV=new v.Q1f(0x9e9e9e),eK=(()=>{try{return"legacy"!==new URLSearchParams(location.search).get("lights")}catch(e){return!0}})();var eW=n(21375);let eq=Math.PI/180,eX=new Set(["new_york_ground_color"]),eZ=(()=>{try{return"1"===new URLSearchParams(location.search).get("tiles")}catch(e){return!1}})(),e$=(()=>{try{return new URLSearchParams(location.search).get("ground")||null}catch(e){return null}})(),eJ=/road|street|asphalt/i;function eQ(e){return!!(e&&"string"==typeof e.name&&eJ.test(e.name))}let e0=/^(sport_|sand_material|natural_sand)/i,e1=(()=>{try{let e=new URLSearchParams(location.search);return"legacy"!==e.get("lights")&&"off"!==e.get("shadows")}catch(e){return!0}})();function e2(e){return+!!eX.has(e&&e.slug)}function e3(e){e&&"function"==typeof e.traverse&&e.traverse(e=>{if(e.isMesh&&e.geometry)try{e.geometry.dispose()}catch(e){}})}let e5=!1;async function e6(e){try{let t=await fetch(e);if(!t.ok)throw Error("HTTP ".concat(t.status));return await t.json()}catch(t){return e5||(e5=!0,console.warn("[environment] manifest unavailable at ".concat(e," â environment layer empty (run the Unity env export + the portal feeder):"),t)),null}}let e4=[.72,.68,.62],e8=[.28,.28,.3],e9=(()=>{try{let e=new URLSearchParams(location.search);return"legacy"!==e.get("lights")&&"off"!==e.get("shadows")}catch(e){return!0}})();function e7(e,t){let n=Number(e),r=Number(t);return{startIdx:Number.isFinite(n)&&n>0?(0,es.FR)(n):0,endIdx:Number.isFinite(r)&&r>0?(0,es.FR)(r):es.TZ}}function te(e){return function(e){let t=0;for(let n=0,r=e.length-1;n<e.length;r=n++)t+=e[r][0]*e[n][1]-e[n][0]*e[r][1];return t}(e)>0?[...e].reverse():e}function tt(e){return Array.isArray(e)&&!(e.length<3)&&Number.isFinite(e[0])&&Number.isFinite(e[1])&&Number.isFinite(e[2])?[e[0],e[1],e[2]]:null}async function tn(e){try{let t=await fetch(e);if(!t.ok)return null;let n=await t.json();return n&&"object"==typeof n?n:null}catch(e){return null}}let tr=Math.PI/180,ti=new Set(["trees2","Trees_Active"]),tl=new Set(["trees2","trees_active"]),ta=(()=>{try{let e=new URLSearchParams(location.search);return"legacy"!==e.get("lights")&&"off"!==e.get("shadows")}catch(e){return!0}})();function to(e){e&&"function"==typeof e.traverse&&e.traverse(e=>{if(e.isMesh&&e.geometry)try{e.geometry.dispose()}catch(e){}})}async function ts(e){try{let t=await fetch(e);if(!t.ok)return null;let n=await t.json();return n&&"object"==typeof n?n:null}catch(e){return null}}let td=new v.Pq0,tu=new v.O9p(0,0,0,"YXZ"),tc=87/180*Math.PI,tp=Math.tan(.495*Math.PI);function tf(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{placeholder:n="Selectâ¦",onSelect:r,searchable:i=!1,menu:l=!1,align:a,triggerIcon:o,footerHint:s}=t,d=th(e),u=t.selectedValue,c=!1,p="",f=(0,h.h)("span",{class:"dv-popdown-label"},w()),g=(0,h.h)("button",{type:"button",class:"dv-popdown-trigger",onClick:e=>S(e)},f);if("string"==typeof o&&o){let e=(0,h.h)("span",{class:"dv-popdown-trigger-icon","aria-hidden":"true"});e.innerHTML=o,g.appendChild(e)}l&&g.setAttribute("aria-haspopup","menu");let m=(0,h.h)("div",{class:"dv-popdown-list",style:l?"overflow-y:auto;":"max-height:".concat(140,"px; overflow-y:auto;")});m.classList.add("dv-scroll-thin"),l&&m.setAttribute("role","menu");let y=(0,h.h)("div",{class:"dv-popdown"},g,m);function b(e){c&&(y.contains(e.target)||k())}function v(){if((0,h.I)(m),i){let e=(0,h.h)("input",{type:"search",class:"dv-popdown-search",placeholder:"Filter fieldsâ¦","aria-label":"Filter the list",value:p,onInput:e=>{p=String(e.target.value||""),v();let t=m.querySelector(".dv-popdown-search");t&&(t.focus(),t.setSelectionRange(p.length,p.length))}});m.appendChild(e)}let e=p.trim().toLowerCase(),t=null;d.forEach(n=>{if(n&&null!=n.group){t=(0,h.h)("div",{class:"dv-popdown-group"},String(n.group));return}if(e&&!String(n.label||"").toLowerCase().includes(e))return;t&&(m.appendChild(t),t=null);let i=n.value===u,a=(0,h.h)("button",{type:"button",class:"dv-popdown-item","data-selected":String(i),...l?{role:"menuitemradio","aria-checked":String(i)}:{},onClick:()=>(function(e){let t=e.value!==u;
1u=e.value,f.textContent=e.label,v(),k(),l&&g.focus(),(t||!l)&&"function"==typeof r&&r(e.value,e.label)})(n)},n.label,null!=n.hint?(0,h.h)("span",{class:"dv-popdown-hint"},String(n.hint)):null);m.appendChild(a)}),l&&s&&m.appendChild((0,h.h)("div",{class:"dv-popdown-hint dv-popdown-footer-hint"},String(s)))}function w(){let e=d.find(e=>null==e.group&&e.value===u);return e?e.label:n}function x(e){if(!c){if(c=!0,M(),i){p="",v();let e=m.querySelector(".dv-popdown-search");e&&e.focus()}if(l&&e&&0===e.detail){let e=m.querySelector(".dv-popdown-item");e&&e.focus()}}}function k(){c&&(c=!1,M())}function S(e){c?k():x(e)}function M(){y.dataset.open=String(c),g.setAttribute("aria-expanded",String(c)),m.hidden=!c}"end"===a&&(y.dataset.align="end"),v(),M(),l&&m.addEventListener("keydown",e=>{let t=e.target;if(t&&"function"==typeof t.closest&&t.closest(".dv-popdown-search"))return;let n=[...m.querySelectorAll(".dv-popdown-item")];if(0===n.length)return;let r=n.indexOf(document.activeElement),i=null;switch(e.key){case"ArrowDown":i=(r+1+n.length)%n.length;break;case"ArrowUp":i=(r-1+n.length)%n.length;break;case"Home":i=0;break;case"End":i=n.length-1;break;case"Enter":e.preventDefault(),e.stopPropagation(),r>=0&&n[r].click();return;default:return}e.preventDefault(),e.stopPropagation(),n[i].focus()}),document.addEventListener("pointerdown",b,!0),y.addEventListener("keydown",e=>{"Escape"===e.key&&c&&(e.stopPropagation(),k(),g.focus())});let I=!1;return{el:y,open:x,close:k,toggle:S,isOpen:()=>c,setOptions:function(e){d=th(e),f.textContent=w(),v()},getSelected:function(){return u},setSelected:function(e){u=e,f.textContent=w(),v()},destroy:function(){I||(I=!0,document.removeEventListener("pointerdown",b,!0),k())}}}function th(e){return(e||[]).map(e=>"string"==typeof e?{value:e,label:e}:e)}let tg="dv.keyLabels",tm=null,ty=new Set;function tb(){try{let e=window.localStorage.getItem(tg);if("mac"===e||"win"===e)return e}catch(e){}if("mac"===tm||"win"===tm)return tm;try{let e="undefined"!=typeof navigator?navigator:null,t=e&&(e.userAgentData&&e.userAgentData.platform||e.platform||e.userAgent)||"";return/mac|iphone|ipad|ipod/i.test(String(t))?"mac":"win"}catch(e){return"win"}}function tv(e){return ty.add(e),()=>ty.delete(e)}let tw=[{key:"dataLayer",title:"Data layer",open:!0},{key:"legend",title:"Legend",open:!0},{key:"filters",title:"Filters",open:!1},{key:"backdrop",title:"Backdrop",open:!1},{key:"cameraLighting",title:"Camera & lighting",open:!1}],tx="full",tk="minimal",tS="fullscreen",tM=[tx,tk,tS],tI=["Full UI","Minimal","Hide UI"],tC=["Dock, inspector & scrubber","Scrubber only","Just the city"];var t_=n(88944);let tL=[{label:"YIMBY",mode:"yimby"},{label:"Public Record",mode:"core200"},{label:"Both",mode:"both"}];function tF(e){let t=tL.findIndex(t=>t.mode===e);return -1===t?tL.findIndex(e=>"core200"===e.mode):t}var tA=n(43132);let tN="Count",tE={searchPlaceholder:"Search valuesâ¦",searchLabel:"Search legend values",sortLabel:"Sort legend values",sortOptions:[tN,"AâZ"],noMatchText:"No values match this search.",cullCollapsed:(e,t)=>"".concat(e," smaller values tucked away \xb7 Expand the full list of ").concat(t),cullExpanded:(e,t)=>"All ".concat(t," values listed \xb7 Tuck the smaller ones away")};function tD(e){return!e||!1===e.interactive}function tT(e){return(Array.isArray(e)?e:[]).reduce((e,t)=>tD(t)?e:e+1,0)>12}function tP(e){let t=e&&"object"==typeof e?e:{};return{search:"string"==typeof t.search?t.search:"",sort:"A-Z"===t.sort?"A-Z":tN,expanded:!0===t.expanded,rows:Array.isArray(t.rows)?t.rows.slice():[],exemptValues:tB(t.exemptValues)}}function tB(e){return e instanceof Set||Array.isArray(e)?new Set(e):new Set}function tR(e,t){let n=Array.isArray(e)?e:[],r=String(null==t?"":t).trim().toLowerCase();return r?n.filter(e=>tY(e).toLowerCase().includes(r)):n.slice()}function tH(e,t){let n=(Array.isArray(e)?e:[]).slice();return"A-Z"===t?n.sort((e,t)=>(0,ew.mB)(tY(e),tY(t))||(0,ew.mB)(String(e.value),String(t.value))):n.sort((e,t)=>(Number(t.count)||0)-(Number(e.count)||0)||(0,ew.mB)(tY(e),tY(t)))}function tU(e,t){let n=Array.isArray(e)?e:[],r=tP(t);if(r.expanded||n.length<=12)return n.slice();let i=[],l=12;for(let e of n){if(l>0){i.push(e),l-=1;continue}r.exemptValues.has(e.value)&&i.push(e)}return i}function tY(e){return e?String(null!=e.label?e.label:e.value):""}let tz="Apply a data layer and its legend appears here.",tO="This layer has no legend in the current dataset.",tj={core200:"Public Record",yimby:"YIMBY",both:"Public Record + YIMBY"},tG=0;function tV(e){return!e||!1===e.interactive}
1var tK=n(81496);let tW=[{label:"Present",token:"Presence"},{label:"Range",token:"Range"},{label:"Yes / No",token:"Yes / No"},{label:"Contains",token:"Contains"}],tq=[{label:"Dim",token:"Dim"},{label:"Hide",token:"Hide"},{label:"Gray out",token:"Gray out"}],tX="paused - not in this dataset",tZ='Records with no value for this field never match. Values like "unknown" or "n/a" count as no value.',t$='"No" and "No value" DO select records that have no value for this field.',tJ={core200:"Public Record",yimby:"YIMBY",both:"YIMBY + Public Record"},tQ=0;function t0(){return tQ+=1,"filter-".concat(Date.now().toString(36),"-").concat(tQ)}let t1=[{label:"Stepped",ramp:"stepped"},{label:"Smooth",ramp:"smooth"}],t2="Apply a data layer to set its gradation.";function t3(e){let t=Math.round(Number(e));return Number.isFinite(t)?Math.min(Math.max(t,2),12):2}let t5=0;function t6(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=!1,i=!1,l=(0,h.h)("span",{class:"dv-color-switch-track"},(0,h.h)("span",{class:"dv-color-switch-thumb"})),a="dv-color-label-".concat(++t5),o="string"==typeof n.describedById?n.describedById:null,s=(0,h.h)("button",{type:"button",class:"dv-color-switch",role:"switch","aria-checked":"false","aria-disabled":"false","aria-labelledby":a,"aria-describedby":o,onClick:()=>{i||(u(!r),"function"==typeof t&&t(r))}},l),d=(0,h.h)("div",{class:"dv-color-row"},(0,h.h)("span",{class:"dv-color-row-label",id:a},e),s);function u(e){r=!!e,s.dataset.checked=String(r),s.setAttribute("aria-checked",String(r))}return{el:d,setChecked:u,setDisabled:function(e){s.disabled=i=!!e,s.setAttribute("aria-disabled",String(i)),d.classList.toggle("dv-color-row--disabled",i)},describedById:o}}let t4=0;function t8(e,t){let n=!1,r=(0,h.h)("span",{class:"dv-cameralighting-switch-track"},(0,h.h)("span",{class:"dv-cameralighting-switch-thumb"})),i="dv-cl-label-".concat(++t4),l=(0,h.h)("button",{type:"button",class:"dv-cameralighting-switch",role:"switch","aria-checked":"false","aria-labelledby":i,onClick:()=>{a(!n),"function"==typeof t&&t(n)}},r);function a(e){n=!!e,l.dataset.checked=String(n),l.setAttribute("aria-checked",String(n))}return{el:(0,h.h)("div",{class:"dv-cameralighting-row"},(0,h.h)("span",{class:"dv-cameralighting-row-label",id:i},e),l),setChecked:a}}function t9(e){let{label:t,min:n,max:r,initial:i,ariaLabel:l,onInput:a}=e,o=t7(Number.isFinite(i)?i:n,n,r),s=(0,tK.P)(ne(o),{tone:"muted"});s.el.classList.add("dv-range-readout");let d=(0,h.h)("input",{type:"range",class:"dv-cameralighting-slider dv-range",min:String(n),max:String(r),step:"1",value:String(o),"aria-label":l,onInput:()=>{let e=t7(Number(d.value),n,r);e!==o&&(o=e,s.setText(ne(o)),"function"==typeof a&&a(o))}}),u=(0,h.h)("span",{class:"dv-cameralighting-row-label dv-range-label"},t);return{el:(0,h.h)("div",{class:"dv-cameralighting-row"},u,d,s.el),setValue:function(e){if(!Number.isFinite(e))return;let t=t7(e,n,r);t!==o&&(o=t,d.value=String(t),s.setText(ne(t)))}}}function t7(e,t,n){let r=Math.round(e);return Number.isFinite(r)?Math.min(Math.max(r,t),n):t}function ne(e){return"".concat(e,"\xb0")}let nt=0,nn=[{label:"0.5\xd7",value:.5},{label:"1\xd7",value:1},{label:"2\xd7",value:2},{label:"3\xd7",value:3}],nr=[{label:"1 yr",value:1},{label:"10 yr",value:10}],ni=[{label:"Forward",value:"forward"},{label:"Loop",value:"loop"},{label:"Palindrome",value:"palindrome"}];function nl(e,t,n){let r=e.findIndex(e=>e.value===t);return -1===r?n:r}let na="newyorkyimby.com",no=new Set(["Public Record","Public Record + YIMBY"]),ns=["â°","\xb9","\xb2","\xb3","â´","âµ","â¶","â·","â¸","â¹"],nd={muted:"dv-pill--muted",warning:"dv-pill--warning",positive:"dv-pill--positive"},nu=null;function nc(){}function np(){}let nf=u("mac",{}).filter(e=>"drone"===e.group).map(e=>[e.keys,e.what]),nh=[["Stick","Fly"],["â² / â¼","Climb / descend"],["Drag","Look around"],["Toggle","Exit drone"]],ng={core200:"Public Record",yimby:"YIMBY"};function nm(e,t){let n=e&&e.yearBuckets?e.yearBuckets:null;return n?"yimby"===t&&n.yimby?n.yimby:"both"===t&&n.union?n.union:n.core200||null:null}let ny=Math.atan2(.736,Math.hypot(.3234,.5948)),nb=0;async function nv(e){let t,d,I,_=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},L="string"==typeof _.dataBase&&""!==_.dataBase?_.dataBase.replace(/\/+$/,""):"/data",F="container"===_.keyScope?"container":"global",A=_.minYear,E=_.capabilities&&"object"==typeof _.capabilities?_.capabilities:{},D={dataLayers:!1!==E.dataLayers,corpus:!1!==E.corpus,facts:"basic"===E.facts?"basic":"full",buildingUpdates:["free","plus","pro"].includes(E.buildingUpdates)&&_.buildingUpdates&&"object"==typeof _.buildingUpdates?E.buildingUpdates:"off"},P=_.upgrade&&"function"==typeof _.upgrade.onSelect?{ctaLabel:"string"==typeof _.upgrade.ctaLabel&&""!==_.upgrade.ctaLabel?_.upgrade.ctaLabel:"Unlock",onSelect:(e,t)=>
1_.upgrade.onSelect(e||"plus",t||"fullCity")}:null,B=(0,i.ur)(_.initial);(0,ex.setDataBase)(L),(0,ex.setDisplayLabelsUrl)(_.labelsUrl);let R=document.createElement("div");R.className="dv-canvas",R.style.position="absolute",R.style.inset="0",R.addEventListener("pointerdown",()=>{R.classList.add("dv-canvas--dragging"),e_()});let U=()=>R.classList.remove("dv-canvas--dragging");R.addEventListener("pointerup",U),R.addEventListener("pointercancel",U),R.addEventListener("pointerleave",U);let Y=document.createElement("div");e.appendChild(R),e.appendChild(Y);let z="container"===F?e:null,O=null,j="mount-".concat(++nb);function G(n){return iy("partialBoot setAnimationLoop(null)",()=>{t&&t.renderer.setAnimationLoop(null)}),iy("partialBoot scene.dispose",()=>{t&&t.dispose()}),O&&(iy("partialBoot pointerdown listener",()=>{e.removeEventListener("pointerdown",O,!0)}),iy("partialBoot focus stamps",()=>{e.dataset.dvOwner===j&&(e.removeAttribute("tabindex"),e.style.outline="",delete e.dataset.dvOwner)})),iy("partialBoot remove appEl",()=>R.remove()),iy("partialBoot remove rootEl",()=>Y.remove()),n}"container"===F&&(e.dataset.dvOwner=j,e.setAttribute("tabindex","0"),e.setAttribute("aria-label","3D timelapse viewport"),O=t=>{let n=e.getBoundingClientRect();if(t.clientX<n.left||t.clientX>n.right||t.clientY<n.top||t.clientY>n.bottom)return;let r=t.target,i=r&&"function"==typeof r.closest?r.closest("button, input, select, textarea, a[href], [tabindex]"):null;i&&i!==e||document.activeElement!==e&&e.focus({preventScroll:!0})},e.addEventListener("pointerdown",O,!0),!1!==_.autoFocus&&e.focus({preventScroll:!0}));try{t=(0,S.createScene)(R)}catch(e){throw G(e)}"scroll-safe"===_.touchPolicy&&t.controls&&t.renderer&&(t.controls.touches&&(t.controls.touches.ONE=null),t.renderer.domElement.style.touchAction="pan-y");let V=null,K=null,W=performance.now(),q=2,Z=0;function $(){q=Math.max(q,2)}let J=null,Q=null,ee=null,en=null,el=!1,ea=!1,ey=null,eM=null;function e_(e){if(!eM)return;let n=eM;t.controls.enableDamping=n.hadDamping;let r=n.onDone;eM=null,!n.settle||e&&!1===e.finishSettle||ee&&ee.isActive()||(t.controls.target.set(n.ex,n.ey,n.ez),t.camera.lookAt(t.controls.target),$()),"function"==typeof r&&r()}function eR(e){let n,r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==e)return;let l=(0,ek.V2)(String(e)).id,a=eJ.byId.get(l);if(!a||null==a.lng||null==a.lat)return;let o=n0.hasResidentFor(l)||nD&&nD.hasVisibleFor(l)?nM:t.project;try{[n,r]=o(a.lng,a.lat)}catch(e){return}if(!Number.isFinite(n)||!Number.isFinite(r))return;let s=.3048*(a.fields&&Number.isFinite(a.fields.height_feet)?a.fields.height_feet:150),d=Math.min(400,Math.max(20,.45*s)),u=t.controls,c=t.camera,p=c.position.x-u.target.x,f=c.position.y-u.target.y,h=c.position.z-u.target.z,g=Math.sqrt(p*p+f*f+h*h)||1,m=Math.min(2200,Math.max(280,4*s));e_({finishSettle:!1}),eM={kind:"focus",t0:performance.now(),dur:Number.isFinite(i&&i.durationMs)?Math.max(1,i.durationMs):400,sx:u.target.x,sy:u.target.y,sz:u.target.z,ex:n,ey:d,ez:r,ox:p,oy:f,oz:h,zoomK:m/g,hadDamping:u.enableDamping},u.enableDamping=!1,$()}function eU(e,n){let r,i,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!Number.isFinite(e)||!Number.isFinite(n))return;let a=l&&null!=l.key?String(l.key):null;!(a&&(n0.hasKey(a)||nD&&nD.hasKey(a)))&&a&&console.info("[app] focusPoint: key ".concat(a," unknown to the renderers â heroProject by default"));try{[r,i]=nM(e,n)}catch(e){return}if(!Number.isFinite(r)||!Number.isFinite(i))return;let o=Number.isFinite(l.heightM)?l.heightM:45,s=Math.min(400,Math.max(20,.45*o));e_();let d=t.controls,u=t.camera,c=u.position.x-d.target.x,p=u.position.y-d.target.y,f=u.position.z-d.target.z,h=Math.sqrt(c*c+p*p+f*f)||1,g=Math.min(2200,Math.max(280,4*o));eM={kind:"focus",t0:performance.now(),dur:Number.isFinite(l.durationMs)?Math.max(1,l.durationMs):400,sx:d.target.x,sy:d.target.y,sz:d.target.z,ex:r,ey:s,ez:i,ox:c,oy:p,oz:f,zoomK:g/h,hadDamping:d.enableDamping},d.enableDamping=!1,$()}function eY(e){let n=null==e?ey:e;Number.isFinite(n)&&(t.camera.fov=n,t.camera.updateProjectionMatrix(),$())}t.renderer.setAnimationLoop(()=>{Z++;let e=performance.now(),n=Math.min(.1,(e-W)/1e3);
1if(W=e,V&&V(n),K&&(K(t.camera),n0.consumeSuppressionDirty()&&$(),nD&&nD.consumeSuppressionDirty()&&$()),ee&&ee.isActive()?(ee.update(n),n4.orbit&&n4.orbit()):eM?!function(e){let n=eM,r=Math.min(1,(e-n.t0)/n.dur);if("pose"===n.kind){let e=r<.5?2*r*r:1-(-2*r+2)**2/2;t.controls.target.set(n.sx+(n.ex-n.sx)*e,n.sy+(n.ey-n.sy)*e,n.sz+(n.ez-n.sz)*e),t.camera.position.set(n.cx+(n.px-n.cx)*e,n.cy+(n.py-n.cy)*e,n.cz+(n.pz-n.cz)*e),t.camera.lookAt(t.controls.target),$(),r>=1&&e_();return}let i=r*(2-r),l=n.sx+(n.ex-n.sx)*i,a=n.sy+(n.ey-n.sy)*i,o=n.sz+(n.ez-n.sz)*i;t.controls.target.set(l,a,o),t.camera.position.set(l+n.ox*(1+(n.zoomK-1)*i),a+n.oy*(1+(n.zoomK-1)*i),o+n.oz*(1+(n.zoomK-1)*i)),t.camera.lookAt(t.controls.target),$(),r>=1&&e_()}(e):t.controls.update()&&$(),J)for(let e=0;e<J.length;e++){let t=J[e].children.length;t!==Q[e]&&(Q[e]=t,$())}"function"==typeof t.updateShadows&&t.updateShadows(),(el||ea)&&$(),q<=0||(q--,t.renderer.render(t.scene,t.camera))});let ez="function"==typeof _.onBootProgress?_.onBootProgress:null,eO={footprints:"Loading footprints",records:"Loading building records"};try{d=await (0,ex.loadBootSet)(ez?{onProgress:(e,t,n)=>{let r=eO[e]||"Loading data",i=n?Math.min(99,Math.round(t/n*100)):null;ez(null!=i?"".concat(r," â ").concat(i,"%"):"".concat(r," â ").concat(Math.round(t/1048576)," MB"))}}:void 0)}catch(e){throw G(e)}ez&&ez("Preparing the cityâ¦");let eJ=d.index;eJ.developmentLinks=d.developmentLinks||null,eJ.developmentParents=d.developmentParents||null,eJ.changeHistoryFeed=d.changeHistoryFeed||null,eJ.yimbyFeatureImages=d.yimbyFeatureImages||null,eJ.displayLabels=d.displayLabels||{},eJ.localityCorpusLabel="string"==typeof _.localityCorpusLabel&&_.localityCorpusLabel.trim()?_.localityCorpusLabel.trim():null,_.cityColorGrade&&"object"==typeof _.cityColorGrade&&H(_.cityColorGrade.saturation,_.cityColorGrade.value);let e5=await nS(L);e5.centroid&&t.setProjectionCentroid(e5.centroid.lon,e5.centroid.lat);let th=null,tY=null;if((()=>{try{return"equirect"===new URLSearchParams(location.search).get("projector")}catch(e){return!1}})())console.info("[calibration] ?projector=equirect â calibrated placement skipped (A/B mode).");else{let e=await eS(L);if(e&&e5.centroid)if(e.buildFrame(e5.centroid.lon,e5.centroid.lat),e.stats().frameBuilt){t.setCalibratedProjector(e.project),th=e.gpsToUnity,tY=e.stats,console.info("[calibration] one-frame placement ACTIVE (piecewise calibration; equirect retired for this session).");try{window.__timelapseCalibration=e}catch(e){}}else console.warn("[calibration] frame derivation degenerate â equirect fallback stays.")}let tQ=(()=>{try{return"gps"===new URLSearchParams(location.search).get("placement")}catch(e){return!1}})(),t4=await nw(L),t7=t4&&t4.metadata&&Number.isFinite(t4.metadata.meters_per_unit)&&t4.metadata.meters_per_unit>0?t4.metadata.meters_per_unit:8.3333,ne=eF(L),nv=null,nM=t.project,nI=null;if(th&&t4&&(nv=function(e){let t,n,r=e&&e.envManifest,i=e&&"function"==typeof e.gpsToUnity?e.gpsToUnity:null,l=e&&"function"==typeof e.projectWeb?e.projectWeb:null,a=e&&e.probeLngLat&&Number.isFinite(e.probeLngLat.lon)&&Number.isFinite(e.probeLngLat.lat)?{lon:e.probeLngLat.lon,lat:e.probeLngLat.lat}:null;if(!r||"object"!=typeof r||!i||!l)return null;let o=r.metadata||{},s=Number.isFinite(o.unity_north_offset_degrees)?o.unity_north_offset_degrees:0,d=Number.isFinite(o.meters_per_unit)&&o.meters_per_unit>0?o.meters_per_unit:8.3333,u=Array.isArray(r.entries)?r.entries:[],c=u.find(e=>e&&"new_york_ground_color"===e.slug)||u.find(e=>e&&Number.isFinite(e.anchor_lng)&&Number.isFinite(e.anchor_lat))||null;if(!c||!Number.isFinite(c.anchor_lng)||!Number.isFinite(c.anchor_lat)||(Number.isFinite(c.unity_anchor_x)&&Number.isFinite(c.unity_anchor_z)&&(0!==c.unity_anchor_x||0!==c.unity_anchor_z)?(t=[c.unity_anchor_x,c.unity_anchor_z],n="baked"):(t=i(c.anchor_lat,c.anchor_lng),n="reconstructed"),!t||!Number.isFinite(t[0])||!Number.isFinite(t[1])))return null;let p=l(c.anchor_lng,c.anchor_lat);if(!p||!Number.isFinite(p[0])||!Number.isFinite(p[1]))return null;let f=-s*eE,h=Math.cos(f),g=Math.sin(f),m=t[0],y=t[1],b=p[0],v=p[1];function w(e,t){let n=-(e-m),r=t-y;return[b+d*(n*h+r*g),v+d*(-n*g+r*h)]}function x(e,t){let n=i(t,e);return w(n[0],n[1])}return{projectUnity:w,projectGps:x,selfCheck:function(){let e=e=>({ok:!1,reason:e,angleLonDeg:NaN,angleLatDeg:NaN,scaleLon:NaN,scaleLat:NaN,mirrored:!1});if(!a)return e("no-probe (footprint centroid unavailable)");let{lon:t,lat:n}=a,r=l(t,n),i=x(t,n),o=eD(l(t+.002,n),r),s=eD(x(t+.002,n),i),d=eD(l(t,n+.002),r),u=eD(x(t,n+.002),i);if(![o,s,d,u].every(e=>Number.isFinite(e[0])&&Number.isFinite(e[1])))return e("non-finite probe");let c=eB(o,s),p=eB(d,u),f=eT(s)/(eT(o)||NaN),h=eT(u)/(eT(d)||NaN),g=eP(o,d),m=eP(s,u),y=!(Number.isFinite(g)&&Number.isFinite(m))||Math.sign(g)!==Math.sign(m)||0===m,b=c<1&&p<1,v=b&&f>.99&&f<1.01&&h>.99&&h<1.01&&!y;return{ok:v,reason:v?"ok":y?"mirrored/axis-swapped":b?"probe scale out of tolerance":"probe angle out of tolerance",angleLonDeg:c,angleLatDeg:p,scaleLon:f,scaleLat:h,mirrored:y}},info:{anchorSlug:String(c.slug||c.name||"entries[0]"),metersPerUnit:d,northOffsetDeg:s,anchorUnity:[m,y],anchorSource:n}}}({envManifest:t4,gpsToUnity:th,projectWeb:t.project,probeLngLat:e5.centroid?{lon:e5.centroid.lon,lat:e5.centroid.lat}:null})),nv){let e=nv.selfCheck();!tQ&&e.ok?(nM=nv.projectGps,nI=nv,console.info("[unityFrame] hero placement: env-frame ACTIVE (anchor=".concat(nv.info.anch
1orSlug,", ")+"source=".concat(nv.info.anchorSource,", δ=").concat(nv.info.northOffsetDeg.toFixed(4),"\xb0, ")+"s=".concat(nv.info.metersPerUnit.toFixed(5),")"))):tQ?console.info("[unityFrame] ?placement=gps â heroes stay on scene.project (A/B control)."):console.error("[unityFrame] selfCheck FAILED (".concat(e.reason,") â heroes stay on scene.project."))}else tQ||console.info("[unityFrame] unavailable (calibration/env manifest missing) â heroes stay on scene.project.");let nC=(()=>{try{if("function"!=typeof window.matchMedia)return!1;if(!window.matchMedia("(any-pointer: fine)").matches)return!0;let e="undefined"==typeof navigator?null:navigator;return!!e&&e.maxTouchPoints>1&&/Macintosh|iPad|iPhone|iPod/.test(e.userAgent||"")}catch(e){return!1}})();nC&&console.info("[app] constrained device â ground stays on the light LOD.");let n_=(()=>{try{return"0"===new URLSearchParams(location.search).get("tiles")}catch(e){return!1}})(),nL=!n_&&(!0===_.tiles||(()=>{try{return"1"===new URLSearchParams(location.search).get("tiles")}catch(e){return!1}})());n_&&console.info("[tiles] ?tiles=0 â the hero path (tiles disabled by the diagnostic escape).");let nF=null,nA=null;if(nL)if(nI)if(M)if(nF=await nx(L)){let e=nF.frame||{},t=nI.info,n=(e,t)=>Number.isFinite(e)&&Number.isFinite(t)&&1e-6>Math.abs(e-t);e.anchorSlug===t.anchorSlug&&n(e.northOffsetDeg,t.northOffsetDeg)&&n(e.metersPerUnit,t.metersPerUnit)?nA=await nk(L):(console.error("[tiles] frame provenance MISMATCH (baked ".concat(e.anchorSlug,"/").concat(e.northOffsetDeg,"/")+"".concat(e.metersPerUnit," vs live ").concat(t.anchorSlug,"/").concat(t.northOffsetDeg,"/")+"".concat(t.metersPerUnit,") â tiles disabled, hero path. Re-run build-tiles.")),nF=null)}else console.error("[tiles] tiles manifest missing/unreadable â tiles disabled, hero path.");else console.error("[tiles] ?tiles=1 is real-lights only (?lights=legacy set) â tiles disabled, hero path.");else console.error("[tiles] ?tiles=1 requires the ACTIVE unity-frame route â tiles disabled, hero path.");let nN=null!=nF,nE=nN?new Set(nF.tiles.flatMap(e=>(e.members||[]).map(e=>String(e.key)))):null,nD=null,nT=(0,ew.K7)(eJ),nP=null,nB="#F7C548",nR=nT,nH=null,nU=!1,nY=!1,nz=()=>{nY=!0},nO=!!(_.highlight&&_.highlight.autoFrame),nj=null,nG={hasKeyPaintedByKey:null,hasPaintId:null};function nV(){let e=!!(nj&&nj.union&&nj.union.size>0),t=!!(nH&&nK()&&nK().size>0);if(!e&&!t){nP=null,nR=nT;return}let n=new Map,r=new Set;if(e)for(let e of nj.resolved.classes)for(let t of(r.add(e.color),e.ids))n.set(String(t),e.color);else for(let e of nK())n.set(String(e),nB);nP=new Set(n.keys()),(nR=Object.create(nT)).resolve=(e,t)=>{let r=nT.resolve(e,t);return t&&null!=t.id&&n.has(String(t.id))?{color:n.get(String(t.id)),nullGray:!1,defaultBeige:!1,hidden:!1,natural:!1}:r&&r.hidden?r:{color:null,nullGray:!0,defaultBeige:!1,hidden:!1,natural:!1}},nR.selectionHighlightHex=e=>e&&"string"==typeof e.color&&r.has(e.color)?p.toHex(p.DEFAULT_SELECTION_HIGHLIGHT):"function"==typeof nT.selectionHighlightHex?nT.selectionHighlightHex(e):p.toHex(p.DEFAULT_SELECTION_HIGHLIGHT)}function nK(){if(!nH)return null;let e=nH.ids.map(e=>(0,ek.V2)(String(e)).id).filter(e=>eJ.byId.has(e));return e.length>0?new Set(e):null}function nW(e,t){let n=t&&"object"==typeof t?t:null;if("change"==(n&&"change"===n.slot?"change":"host")){let t=Array.isArray(e)&&e.length>0?e:null;if(t){let e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.byId&&"function"==typeof t.byId.has?t.byId:null,r="function"==typeof t.redirect?t.redirect:null,i="function"==typeof t.hasKeyPaintedByKey?t.hasKeyPaintedByKey:null,l="function"==typeof t.hasPaintId?t.hasPaintId:null,a=new Set,o=[];for(let t of Array.isArray(e)?e:[]){var s,d;let e=new Set,u=0,c=0,p=0,f=0;for(let a of Array.isArray(t.entries)?t.entries:[]){if(!a){f+=1;continue}let t=null!=a.id&&""!==String(a.id).trim()?String(a.id):null;if(null!=t){if(n&&n.has(t)){e.add(t),u+=1;continue}let i=r?r(t):null;if(null!=i&&n&&n.has(String(i))){e.add(String(i)),u+=1;continue}if(l&&l(t)){e.add(t),p+=1;continue}f+=1;continue}let o=null!=a.key&&""!==String(a.key).trim()?String(a.key):null;
1if(null!=o){if(i&&i(o)){e.add(o),c+=1;continue}f+=1;continue}f+=1}for(let t of e)a.add(t);o.push({name:String(null!=(s=t.name)?s:""),color:String(null!=(d=t.color)?d:""),ids:[...e],resolvedIndex:u,resolvedMesh:c,resolvedPaint:p,unresolved:f})}return{classes:o,union:[...a]}}(t,{byId:eJ.byId,redirect:e=>(0,ek.V2)(String(e)).id,hasKeyPaintedByKey:nG.hasKeyPaintedByKey,hasPaintId:nG.hasPaintId});nj={classes:t,resolved:e,union:new Set(e.union)}}else nj=null;nV();return}let r="string"==typeof t?t:n&&n.color||null,i=Array.isArray(e)&&e.length>0?e.map(e=>String(e)):null;nH=i?{ids:i,color:r}:null,nB="string"==typeof r&&r?r:"#F7C548",nV()}_.highlight&&nW(_.highlight.ids,_.highlight.color);let nq="function"==typeof _.onHighlightStatus?_.onHighlightStatus:null,nX=null;function nZ(){let e=nH?nH.ids:[],t=e.map(e=>(0,ek.V2)(String(e)).id).filter(e=>eJ.byId.has(e)),n=B.get().year,r=0,i=0;for(let e of t)(function(e,t){if(n0.hasResidentFor(e)||nD&&nD.hasVisibleFor(e))return!0;if(nQ.hasVisibleMarkerFor(e)){let n=eJ.byId.get(e);if(n&&Number.isFinite(n.yearIdx))return n.yearIdx<=t&&t<n.endYearIdx}return!1})(e,n)&&(r+=1),function(e){let t=function(){if(nX||!nA)return nX;let e=new Set;for(let t of nA instanceof Map?nA.values():Object.values(nA))if(t)for(let n of["core200_id","bin","yimby_cluster_id","stable_id"]){let r=t[n];if(null==r||""===r)continue;let i=eJ.byId.get((0,ek.V2)(String(r)).id);if(i){e.add(String(i.id));break}}return nX=e,e}();return!!(t&&t.has(e)||n0.hasResidentFor(e)||nD&&nD.hasVisibleFor(e))||nQ.hasVisibleMarkerFor(e)}(e)&&(i+=1);let l=n0.getSchedulerStats(),a=nD?nD.getStats():null,o=(!a||a.loaded+a.holes===a.tiles)&&0===l.bulkPending&&0===l.inFlight,s=0,d=0;if(nj&&nj.resolved)for(let e of nj.resolved.classes)s+=e.resolvedMesh,d+=e.resolvedPaint;return{requested:e.length,resolved:t.length,visible:r,renderable:i,settled:nU,cause:I,renderSettled:o,year:(0,tA.hh)(n),resolvedIndex:t.length,resolvedMesh:s,resolvedPaint:d,painted:nj&&nj.union&&nj.union.size>0?"change":nP?"host":null}}function n$(){if(nq)try{nq(nZ())}catch(e){console.error("[app] onHighlightStatus threw:",e)}}function nJ(){let e=null,t=-1/0;if(!nH)return null;for(let n of nH.ids){let r=(0,ek.V2)(String(n)).id,i=eJ.byId.get(r);if(!i)continue;let l=i.fields&&Number.isFinite(i.fields.height_feet)?i.fields.height_feet:0;l>t&&(t=l,e=r)}return e}if(nA){let e=(0,es.gs)(eJ,nA);console.info("[data] manifest end-year fold: ".concat(e," record(s) folded (boot leg)."))}else console.info("[data] manifest end-year fold SKIPPED â no mesh-manifest rows on this boot (hero-only leg).");let nQ=function(e,t,n){let r="function"==typeof n?n:()=>[0,0],i=0,l=null,a=null,o=null,s=null,d=!1,u=eK?new v.G_z({vertexColors:!0,fog:!1}):new v.V9B({vertexColors:!0,fog:!1}),c={value:161};u.onBeforeCompile=e=>{e.uniforms.uYear=c,e.vertexShader=e.vertexShader.replace("#include <common>","#include <common>\nattribute float aYearIdx;\nattribute float aYearEndIdx;\nvarying float vYearIdx;\nvarying float vYearEndIdx;").replace("#include <begin_vertex>","#include <begin_vertex>\nvYearIdx = aYearIdx;\nvYearEndIdx = aYearEndIdx;"),e.fragmentShader=e.fragmentShader.replace("#include <common>","#include <common>\nuniform float uYear;\nvarying float vYearIdx;\nvarying float vYearEndIdx;").replace("#include <clipping_planes_fragment>","#include <clipping_planes_fragment>\nif (vYearIdx > uYear + 0.5) discard;\nif (vYearEndIdx <= uYear + 0.5) discard;"),u.userData.shader=e},u.customProgramCacheKey=()=>"markers-yearidx-discard-v3-".concat(eK?"lambert":"basic");let p=new v.kn4,f=new v.Q1f,h=[],g=[],m=new Map,y=0,b=[],w=[],x=[],k="core200";function S(e){return!!h[e]&&!b[e]&&!w[e]&&(e<y||"yimby"===k||"both"===k)}function M(e){let t=h[e],n=S(e);if(!t||!n){p.makeScale(0,0,0),s.setMatrixAt(e,p);return}let i=Number(t.lng),l=Number(t.lat),[a,o]=Number.isFinite(i)&&Number.isFinite(l)?r(i,l):[0,0];p.compose(new v.Pq0(a,1.5,o),new v.PTz,new v.Pq0(1,1,1)),s.setMatrixAt(e,p)}function I(){s.boundingSphere=null}function C(t){let n=function(e){let{core200Unknown:t,yimbyPlaceable:n}=function(e){let t=e&&e.byId;if(!t||"function"!=typeof t.values)return{core200Unknown:[],yimbyPlaceable:[]};let n=[],r=[];for(let e of t.values())if(e)if("core200"===e.corpus){let t=e.fields||{};!1===("height_valid"in t?t.height_valid:null!=t.height_feet)&&n.push(e)}else"yimby"===e.corpus&&e.placeable&&r.push(e);return{core200Unknown:n,yimbyPlaceable:r}}(e),r=Math.min(t.length,26),i=r+n.length,l=Array(i),a=Array(i);for(let e=0;e<r;e++)l[e]=t[e],a[e]=String(t[e].id);for(let e=0;e<n.length;e++){let t=r+e;l[t]=n[e],a[t]=String(n[e].id)}return{slotRecords:l,idByInstance:a,core200Count:r}}(t);h=n.slotRecords,g=n.idByInstance,y=n.core200Count,m=new Map;for(let e=0;e<g.length;e++)m.has(g[e])||m.set(g[e],e);(!s||h.length>i)&&function(t){let n=s;i=Math.max(1,t),l=new v.Ho_(6,6,3,8),(a=new v.uWO(new Float32Array(i),1)).setUsage(v.Vnu),l.setAttribute("aYearIdx",a),(o=new v.uWO(new Float32Array(i),1)).setUsage(v.Vnu),l.setAttribute("aYearEndIdx",o),(s=new v.ZLX(l,u,i)).instanceMatrix.setUsage(v.Vnu),s.instanceColor=new v.uWO(new Float32Array(3*i),3),s.instanceColor.setUsage(v.Vnu),s.frustumCulled=!1,n&&(d&&("function"==typeof e.remove&&e.remove(n),e.add(s)),n.geometry.dispose(),"function"==typeof n.dispose&&n.dispose())}(h.length),b=Array(h.length).fill(!1),w=Array(h.length).fill(!1),x=Array(h.length).fill(!1),function(){for(let r=0;r<h.length;r++){M(r);var e,t=r;let i=h[t],l=i&&Number.isFinite(i.yearIdx)?i.yearIdx:161;a.setX(t,l);var n=r;let d=h[n],u=d&&Number.isFinite(d.endYearIdx)?d.endYearIdx:1e9;o.setX(n,u),e=r,s.setColorAt(e,eV)}s.instanceMatrix.needsUpdate=!0,a.needsUpdate=!0,o.needsUpdate=!0,s.instanceColor.
1needsUpdate=!0,s.count=h.length,I()}()}return C(t),e.add(s),d=!0,{get mesh(){return s},repaint:function(e,t){if(!e||"function"!=typeof e.resolve)return;let n=!1;for(let r=0;r<h.length;r++){let i=h[r];if(!i)continue;let l=e.resolve(t,i)||{},a=!!l.hidden;if(a!==w[r]&&(w[r]=a,n=!0),a){s.setColorAt(r,eV),x[r]=!1;continue}l.color?(f.set(l.color),s.setColorAt(r,f),x[r]=!0):l.defaultBeige?(f.set("#999995"),s.setColorAt(r,f),x[r]=!0):l.nullGray?(f.setHSL(0,0,.62),s.setColorAt(r,f),x[r]=!0):x[r]&&(s.setColorAt(r,eV),x[r]=!1)}if(n){for(let e=0;e<h.length;e++)M(e);s.instanceMatrix.needsUpdate=!0,I()}s.instanceColor.needsUpdate=!0},setSuppressed:function(e,t){if(!Number.isInteger(e)||e<0||e>=h.length)return;let n=!!t;b[e]!==n&&(b[e]=n,M(e),s.instanceMatrix.needsUpdate=!0)},setCorpusMode:function(e){let t="yimby"===e||"both"===e?e:"core200";if(k!==t){k=t;for(let e=0;e<h.length;e++)M(e);s.instanceMatrix.needsUpdate=!0,I()}},setYearIndex:function(e){c.value=Number.isFinite(e)?Math.max(0,Math.min(161,e)):161},getBuildingId:function(e){return!Number.isInteger(e)||e<0||e>=g.length?null:g[e]},rebuildSlots:C,hasVisibleMarkerFor:function(e){if(null==e)return!1;let t=m.get(String(e));return void 0!==t&&S(t)},dispose:function(){e.remove(s),l.dispose(),"function"==typeof s.dispose&&s.dispose(),u.dispose()}}}(t.scene,eJ,t.project),n0=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i="function"==typeof(n&&n.project)?n.project:null,l=n&&"canonical"===n.assetNaming?"canonical":"twins",a="function"==typeof(n&&n.onInvalidate)?n.onInvalidate:null,o=n&&n.unityFrame&&"function"==typeof n.unityFrame.projectUnity?n.unityFrame:null,s=n&&n.datumY&&Number.isFinite(n.datumY.metersPerUnit)&&n.datumY.metersPerUnit>0?{metersPerUnit:n.datumY.metersPerUnit,datumUnits:Number.isFinite(n.datumY.datumUnits)?n.datumY.datumUnits:50}:null,d=n&&Number.isFinite(n.metersPerUnit)&&n.metersPerUnit>0?n.metersPerUnit:8.3333,u=n&&n.footprintRingByBin instanceof Map?n.footprintRingByBin:null,c=n&&n.excludeKeys instanceof Set?n.excludeKeys:null,p={scored:0,flipped:0,skippedNoData:0,skippedWeak:0,standdown:0},f={checked:0,fired:0,firedKeys:[]},h=function(){try{return new URLSearchParams(location.search).has("dev")}catch(e){return!1}}(),g="string"==typeof(n&&n.dataBase)&&""!==n.dataBase?n.dataBase.replace(/\/+$/,""):"/data",m="".concat(g,"/").concat("web_mesh_manifest.json"),y=new v.YJl;y.name="heroes",e&&"function"==typeof e.add&&e.add(y);let k=new w.GLTFLoader;k.setMeshoptDecoder(x.MeshoptDecoder);let S=new v.PPD,M=new v.kn4,I=new v.NRn,C=new v.Pq0,_=new v.kn4,L=new v.kn4,F=new v.Pq0,A=null,N=null,E=null,D=null,T=null,P=161,B=new Map,R=new Map,H=new Map,U=0,Y=new Set,z=0,O=0,j=0,G=[],V=!1,K=null,W=null,q=new Set,X=null,Z=!1,$="function"==typeof setInterval?setInterval(()=>{Z||ew()},2e3):null,J=!1,Q=0,ee=et();async function et(){let e=null;try{let t=await fetch(m);if(!t.ok)return void en("manifest ".concat(m," -> HTTP ").concat(t.status,"; heroes disabled"));e=await t.json()}catch(e){en("manifest ".concat(m," unavailable (").concat(e&&e.message,"); heroes disabled"));return}Z||(function(e){var t;let n=(t=e)?Array.isArray(t)?t:Array.isArray(t.entries)?t.entries:Array.isArray(t.meshes)?t.meshes:Array.isArray(t.buildings)?t.buildings:[]:[],r=function(e){if(!e||Array.isArray(e))return 0;let t=e.metadata&&e.metadata.unity_north_offset_degrees,n=null!=t?t:e.unity_north_offset_degrees;return Number.isFinite(Number(n))?Number(n):0}(e);for(let e of(Q=r,n)){let t=e&&(null!=e.key?String(e.key):null);if(!t||R.has(t)||c&&c.has(t))continue;let n=er(e,{url:function(e,t,n){let r=eh(t)||"".concat(n,".glb");return"".concat(e,"/").concat(r.replace(/^\/+/,""))}(g,e.glb_path,t),isTail:ed.has(function(e,t){let n=(eh(e)||"".concat(t,".glb")).split("/");return n[n.length-1]}(e.glb_path,t)),northOffsetDeg:r});n.yearIdx=ea(n),n.endYearIdx=ey(n),R.set(t,n)}for(let e of(j=0,G.length=0,R.values()))e.isTail?G.push(e.key):!H.has(e.key)&&!q.has(e.key)&&j++}(e),ew())}function en(e){J||(J=!0,console.log("[heroes] ".concat(e)))}function er(e,t){let{url:n,isTail:r=!1,northOffsetDeg:i}=t,l=e&&(null!=e.key?String(e.key):null),a={key:l,bin:eh(e.bin),core200Id:eh(e.core200_id),yimbyClusterId:eh(e.yimby_cluster_id),stableId:eh(e.stable_id),corpus:eh(e.corpus),lng:eg(e.bounds_center_lng),lat:eg(e.bounds_center_lat),unityWorldX:eg(e.unity_world_x),unityWorldZ:eg(e.unity_world_z),unityBaseY:eg(e.unity_base_y),headingDeg:Number.isFinite(Number(e.heading_deg))?Number(e.heading_deg):0,footprintOrientation:"shipped"===e.footprint_orientation||"prebaked-180"===e.footprint_orientation?e.footprint_orientation:null,heightM:Number.isFinite(Number(e.height_m))?Number(e.height_m):0,northOffsetDeg:i,containerType:eh(e.container_type),developmentId:eh(e.development_id),objectClass:eh(e.object_class),existingStock:!0===e.existing_stock,generation:eg(e.generation),yearStartManifest:eg(e.year_start),yearEndManifest:eg(e.year_end),url:n,isTail:r};return"master_development"===a.containerType?a.suppression={kind:"none"}:(a.suppression=ei(a),a.suppression&&"none"!==a.suppression.kind||console.log("[heroes] manifest key ".concat(l," unresolved; rendering without suppression"))),a.buildingId=el(a),a}function ei(e){let n=t&&t.links?t.links:null;return e.bin&&n&&n.byBin instanceof Map&&n.byBin.has(e.bin)||e.bin?{kind:"substrate-or-marker",bin:e.bin}:e.yimbyClusterId?{kind:"marker",yimbyClusterId:e.yimbyClusterId}:{kind:"none"}}function el(e){return"master_development"===e.containerType?e.developmentId?String(e.developmentId):null:e.core200Id?String(e.core200Id):e.bin?String(e.bin):e.yimbyClusterId?String(e.yimbyClusterId):e.stableId?String(e.stableId):null}function ea(e){let n=function(e){if(Number.isFinite(e.yearStartManifest)&&e.yearStartManifest>0)return(0,es.FR)(e.yearStartManifest);let n=ev(e);
1if(n&&Number.isFinite(n.yearIdx))return n.yearIdx;let r=(0,es.ch)(t&&t.links,e.yimbyClusterId);return null!=r?r:(0,es.FU)(e)}(e);return!0===e.existingStock&&n===es.q5?0:n}function ey(e){if(Number.isFinite(e.yearEndManifest)){if(-1===e.yearEndManifest)return 1e9;if(e.yearEndManifest>0)return(0,es.FR)(e.yearEndManifest)}let t=ev(e);return t&&Number.isFinite(t.endYearIdx)?t.endYearIdx:1e9}function ev(e){let n=t&&t.byId instanceof Map?t.byId:null;return n?e.core200Id&&n.has(String(e.core200Id))?n.get(String(e.core200Id)):e.bin&&n.has(String(e.bin))?n.get(String(e.bin)):e.yimbyClusterId&&n.has(String(e.yimbyClusterId))?n.get(String(e.yimbyClusterId)):null:null}function ew(){if(Z||0===R.size)return;let e=O>=1;if(z>=12&&e)return;let t=E;ej(t);let n=[];for(let e of 0===j?G.map(e=>R.get(e)).filter(Boolean):R.values()){if(H.has(e.key)||Y.has(e.key)||q.has(e.key))continue;let r=eL(e),i=!t||eG(r),l=t?eV(t,r):0;n.push({entry:e,inFrustum:i,dist:l})}if(0===n.length)return;n.sort((e,t)=>e.inFrustum!==t.inFrustum?e.inFrustum?-1:1:e.dist-t.dist);let r=12-z;for(let e of n){if(r<=0)break;!e.entry.isTail&&(eS(e.entry),r--)}if(!e){let e=ex()+function(){let e=0;for(let t of Y){let n=R.get(t);n&&n.isTail&&e++}return e}()>=3,t=e?ek():null;for(let r of n)if(r.entry.isTail){var i,l;if(e&&(!t||(i=r,l=t,i.inFrustum!==l.inFrustum?!i.inFrustum:!(i.dist<.9*l.dist))))break;eS(r.entry);break}}}function ex(){let e=0;for(let t of H.values())t.entry.isTail&&e++;return e}function ek(){ej(E);let e=null;for(let r of H.values()){var t,n;if(!r.entry.isTail)continue;let i=eL(r.entry),l={hero:r,inFrustum:!E||eG(i),dist:E?eV(E,i):0};(!e||(t=l,n=e,t.inFrustum!==n.inFrustum?!t.inFrustum:t.dist!==n.dist?t.dist>
1n.dist:t.hero.lru<n.hero.lru))&&(e=l)}return e}function eS(e){if(Y.has(e.key)||H.has(e.key))return;Y.add(e.key),e.isTail?O++:z++;let t=e.url.replace(/\.glb$/,".meshopt.glb"),n="canonical"===l,r=e.isTail?n?e.url:t:e.url,i=e.isTail&&n?t:e.url;k.load(r,t=>eM(e,t),void 0,t=>{if(i!==r){console.log("[heroes] tail primary unavailable for ".concat(e.key," ")+"(".concat(t&&t.message?t.message:t,"); trying ").concat(i.split("/").pop())),k.load(i,t=>eM(e,t),void 0,t=>eI(e,t));return}eI(e,t)})}function eM(e,t){if(Y.delete(e.key),e.isTail?O=Math.max(0,O-1):z=Math.max(0,z-1),Z)return void eb(t);let n=t.scene||t.scenes&&t.scenes[0];if(!n){eC(e.key,"GLB parsed with no scene"),ew();return}n.userData.id=null!=e.buildingId?e.buildingId:e.key,n.userData.heroKey=e.key,eF(n,e),eN(n,e),function(e,t){if("master_development"!==t.containerType)return;e.updateMatrixWorld(!0);let n=1/0,r=-1/0,i=1/0,l=-1/0,a=0;if(e.traverse(e=>{if(!e.isMesh)return;a++;let t=e.getWorldPosition(eA);t.x<n&&(n=t.x),t.x>r&&(r=t.x),t.z<i&&(i=t.z),t.z>l&&(l=t.z)}),0===a)return;let o=(n+r)/2-e.position.x,s=(i+l)/2-e.position.z,d=Math.sqrt(o*o+s*s);f.checked++,d>100&&(f.fired++,f.firedKeys.push(t.key),console.log("[heroes] dev-placement guard: ".concat(t.key," content centre ")+"".concat(d.toFixed(1),"m off-anchor (expected ZERO firings on the ")+"shipped cut â a future export regression, not a web defect)"))}(n,e);let r=eE(n);ep&&n.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)});let i={key:e.key,entry:e,root:n,materialCtl:r,lru:++U,suppressing:!1};H.set(e.key,i),!e.isTail&&j>0&&j--,h&&function(e){let t=function(e){if(!e||"function"!=typeof e.traverse)return null;e.updateWorldMatrix(!0,!0);let t=_.copy(e.matrixWorld).invert();I.makeEmpty();let n=!1;return e.traverse(e=>{if(!e||!e.isMesh||!e.geometry)return;let r=e.geometry;r.boundingBox||r.computeBoundingBox();let i=r.boundingBox;if(!i||i.isEmpty())return;let l=L.multiplyMatrices(t,e.matrixWorld);for(let e=0;e<2;e++)for(let t=0;t<2;t++)for(let r=0;r<2;r++)F.set(e?i.max.x:i.min.x,t?i.max.y:i.min.y,r?i.max.z:i.min.z).applyMatrix4(l),I.expandByPoint(F),n=!0}),n&&!I.isEmpty()?I:null}(e.root);if(!t)return;let n=t.min,r=t.max,i=[new v.Pq0(n.x,1,n.z),new v.Pq0(r.x,1,n.z),new v.Pq0(r.x,1,r.z),new v.Pq0(n.x,1,r.z),new v.Pq0(n.x,1,n.z)],l=new v.LoY().setFromPoints(i),a=new v.mrM({color:0xff00ff}),o=new v.N1A(l,a);o.name="hero-overlay:".concat(e.key),o.userData.heroOverlay=!0,e.root.add(o),e.overlay=o}(i),eD(i,D,T),eR(i),eU(),function(){for(;ex()>3;){let t=ek();if(!t)return;var e=t.hero;eY(e,!1);let n=e.entry.parentGroup||y;if(e.root.parent===n&&n.remove(e.root),e.overlay&&e.overlay.parent&&e.overlay.parent.remove(e.overlay),em(e.root),eK(e.overlay),e.materialCtl&&"function"==typeof e.materialCtl.dispose)try{e.materialCtl.dispose()}catch(e){}H.delete(e.key)}}(),ew()}function eI(e,t){Y.delete(e.key),e.isTail?O=Math.max(0,O-1):z=Math.max(0,z-1),eC(e.ke
1y,t&&t.message?t.message:t),ew()}function eC(e,t){if(q.has(e))return;q.add(e);let n=R.get(e);n&&!n.isTail&&j>0&&j--,console.log("[heroes] load failed for ".concat(e,": ").concat(t))}function e_(e){return o&&null!=e.unityWorldX&&null!=e.unityWorldZ&&(0!==e.unityWorldX||0!==e.unityWorldZ)}function eL(e){if(e_(e)){let[t,n]=o.projectUnity(e.unityWorldX,e.unityWorldZ);return C.set(t,0,n)}if(!i||null==e.lng||null==e.lat)return C.set(0,0,0);let[t,n]=i(e.lng,e.lat);return C.set(t,0,n)}function eF(e,t){let n=0,r=0;if(e_(t)){let e=o.projectUnity(t.unityWorldX,t.unityWorldZ);n=e[0],r=e[1]}else if(i&&null!=t.lng&&null!=t.lat){let e=i(t.lng,t.lat);n=e[0],r=e[1]}let l=s&&Number.isFinite(t.unityBaseY)?function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:50;return(e-n)*t}(t.unityBaseY,s.metersPerUnit,s.datumUnits):0;e.position.set(n,l,r),e.scale.setScalar(d);let a=ec(t.northOffsetDeg,t.containerType);e.rotation.set(0,a*eu,0)}let eA=new v.Pq0;function eN(e,t){if(t.autoOrient){t.autoOrient.flip&&(e.rotation.y+=Math.PI);return}if(t.footprintOrientation){t.autoOrient={flip:!1},p.standdown++;return}let n=u&&i&&t.bin?u.get(t.bin):null;if(!n){t.autoOrient={flip:!1},p.skippedNoData++;return}if(!t.footprintPoly){let e=[];for(let t of n)Array.isArray(t)&&t.length>=2&&e.push(i(t[0],t[1]));if(e.length<3){t.autoOrient={flip:!1},p.skippedNoData++;return}t.footprintPoly=e}let r=t.footprintPoly;e.updateMatrixWorld(!0);let l=e.position.x,a=e.position.z,o=0,s=[];if(e.traverse(e=>{if(!e.isMesh||!e.geometry||(e.name||"").startsWith("hero-overlay"))return;let t=e.geometry.attributes&&e.geometry.attributes.position;t&&t.count&&(s.push(e),o+=t.count)}),0===o){t.autoOrient={flip:!1},p.skippedWeak++;return}let d=Math.max(1,Math.ceil(o/300)),c=0,f=0,g=0;for(let e of s){let t=e.geometry.attributes.position,n=e.matrixWorld.elements;for(let e=0;e<t.count;e+=d){let i=t.getX(e),o=t.getY(e),s=t.getZ(e),d=n[0]*i+n[4]*o+n[8]*s+n[12],u=n[2]*i+n[6]*o+n[10]*s+n[14];c++,ef(r,d,u)&&f++,ef(r,2*l-d,2*a-u)&&g++}}if(c<30){t.autoOrient={flip:!1},p.skippedWeak++;return}let m=100*f/c,y=100*g/c,b=y-m>=10&&y>=20;t.autoOrient={flip:b,shippedPct:m,bestPct:y},p.scored++,b&&(p.flipped++,e.rotation.y+=Math.PI,h&&console.debug("[heroes] auto-orient flipped ".concat(t.key,": ")+"".concat(m.toFixed(0),"% -> ").concat(y.toFixed(0),"% in-footprint")))}function eE(e){if(r&&1)try{return eo(e,b)}catch(e){console.log("[heroes] heroMaterial controller failed: ".concat(e&&e.message))}return{setDecision(){},setTint(){},dispose(){}}}function eD(e,t,n){if(!e||!e.materialCtl)return;let r=null;if(t&&"function"==typeof t.resolve){let i=ev(e.entry)||eT(e.entry);try{r=t.resolve(n,i)}catch(e){r=null}}let i=function(e){if(null==e.entry.buildingId)return!1;let t=String(e.entry.buildingId);
1return null!=K&&String(K)===t||null!=W&&W.has(t)}(e),l=null;if(i&&t){let e=null!=W;try{e&&"function"==typeof t.devSelectionHighlightHex?l=t.devSelectionHighlightHex():"function"==typeof t.selectionHighlightHex&&(l=t.selectionHighlightHex(r))}catch(e){l=null}}try{e.materialCtl.setDecision(r,{selected:i,tintHex:l,snapshot:n})}catch(e){}}function eT(e){return{id:e.buildingId||e.key,corpus:e.yimbyClusterId&&!e.core200Id?"yimby":"core200",bin:e.bin||void 0,lng:e.lng,lat:e.lat,yearIdx:e.yearIdx,endYearIdx:e.endYearIdx,fields:{},placeable:!0}}function eP(e){let t=Number.isFinite(e.endYearIdx)?e.endYearIdx:1e9;return e.yearIdx<=P&&P<t}let eB=!0;function eR(e){let t=e.entry.parentGroup||y,n=eP(e.entry)&&!e.entry.stopHidden&&(!!e.entry.decisionExempt||!function(e){if(!D||"function"!=typeof D.resolve)return!1;let t=ev(e.entry)||eT(e.entry);try{let e=D.resolve(T,t);return!!(e&&e.hidden)}catch(e){return!1}}(e))&&(eB||"master_development"!==e.entry.containerType);e.root.visible!==n&&(e.root.visible=n),n?e.root.parent!==t&&t.add(e.root):e.root.parent===t&&t.remove(e.root)}function eH(e){return H.has(e.key)&&eP(e.entry)&&!e.entry.stopHidden}function eU(){for(let e of H.values())eR(e),eH(e)||eY(e,!1);for(let e of H.values())eH(e)&&eY(e,!0)}function eY(e,t){e.suppressing!==t&&(e.suppressing=t,function(e,t){let n=e.entry.suppression;if(n&&"none"!==n.kind){if("substrate-or-marker"===n.kind||"substrate"===n.kind){var r,i;let l=eO(e.entry.buildingId);if(l>=0)return ez(l,t);let a=null!=n.bin?B.get(String(n.bin)):void 0;return null!=a&&(r=a,i=t,A&&"function"==typeof A.setSuppressed&&(A.setSuppressed(r,i),V=!0))}if("marker"===n.kind){let n=eO(e.entry.buildingId);n>=0&&ez(n,t)}}}(e,t))}function ez(e,t){N&&"function"==typeof N.setSuppressed&&(N.setSuppressed(e,t),V=!0)}function eO(e){if(null==e||!N||"function"!=typeof N.getBuildingId)return -1;let t=function(){let e=N&&N.mesh;return e&&Number.isFinite(e.count)?e.count:1817}(),n=String(e);for(let e=0;e<t;e++){let t=N.getBuildingId(e);if(null!=t&&String(t)===n)return e}return -1}function ej(e){e&&e.projectionMatrix&&e.matrixWorldInverse&&(M.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),S.setFromProjectionMatrix(M))}function eG(e){return S.containsPoint(e)}function eV(e,t){return e.position?e.position.distanceTo(t):0}function eK(e){e&&(e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose())}let eW=0,eq=new Set,eX=new Set,eZ=new Set,e$=0,eJ=[],eQ=null,e0=null;function e1(e,t){if(console.log("[heroes] extra load failed for ".concat(e.key,": ").concat(t)),e0)try{e0(e,t)}catch(e){}}return{group:y,applyYear:function(e){for(let t of(P=Number.isFinite(e)?e:161,H.values()))eR(t);eU()},repaint:function(e,t){for(let n of(D=e||null,T=t||null,t&&"selectedBuildingId"in t&&(K=null!=t.selectedBuildingId?t.selectedBuildingId:null),H.values()))eD(n,D,T);eU()},reapplyAfterRebuild:function(e){for(let t of(e&&(N=e),R.values()))t.suppression=ei(t),t.buildingId=el(t),t.extra||(t.yearIdx=ea(t),t.endYearIdx=ey(t));for(let e of H.values())e.suppressing=!1;eU()},setSubstrate:function(e){A=e||null,function(){B=new Map;let e=A&&Array.isArray(A.binOrder)?A.binOrder:null;if(e)for(let t=0;t<e.length;t++)B.set(String(e[t]),t)}(),eU()},setMarkers:function(e){N=e||null,eU()},dispose:function(){var e;for(let t of(Z=!0,null!=X&&(null!=(e=X)&&"function"==typeof clearTimeout&&clearTimeout(e),X=null),null!=$&&"function"==typeof clearInterval&&clearInterval($),Array.from(H.values())))if(eY(t,!1),em(t.root),eK(t.overlay),t.materialCtl&&"function"==typeof t.materialCtl.dispose)try{t.materialCtl.dispose()}catch(e){}for(let e of(H.clear(),Y.clear(),eZ))e&&e.parent&&e.parent.remove(e);eZ.clear(),eq.clear(),eX.clear(),eJ=[],y.parent&&y.parent.remove(y)},setSelected:function(e){let t=null!=e?String(e):null,n=null!=K?String(K):null,r=arguments.length>1&&null!=arguments[1]&&arguments[1].length>0?new Set(arguments[1].map(String)):null,i=W,l=null==i&&null==r||null!=i&&null!=r&&i.size===r.size&&[...r].every(e=>i.has(e));if(n===t&&l)return;K=null!=e?e:null,W=r;let a=new Set;if(null!=n&&a.add(n),null!=t&&a.add(t),i)for(let e of i)a.add(e);if(r)for(let e of r)a.add(e);for(let e of a){var o=e;let t=String(o);for(let e of H.values())null!=e.entry.buildingId&&String(e.entry.buildingId)===t&&eD(e,D,T)}},consumeSuppressionDirty:function(){return!!V&&(V=!1,!0)},hasResidentFor:function(e){if(null==e)return!1;let t=String(e);for(let e of H.values())if(String(null!=e.entry.buildingId?e.entry.buildingId:e.key)===t&&eP(e.entry)&&!e.entry.stopHidden)return!0;return!1},setHubsVisible(e){let t=!1!==e;
1if(t!==eB)for(let e of(eB=t,H.values()))eR(e)},getSchedulerStats:()=>{let e=0,t=0;for(let n of H.values())n.entry.extra?t+=1:e+=1;return{bulkPending:j,inFlight:Y.size,residents:e,extras:t}},tick:function(e){var t;e&&(E=e),null==X&&(t=()=>{X=null,ew()},X="function"==typeof setTimeout?setTimeout(t,250):(t(),null),function(){let e=E;if(e&&0!==H.size)for(let t of(ej(e),H.values()))t.entry.isTail&&eG(eL(t.entry))&&(t.lru=++U)}())},ready:ee,setExtras:function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};eW+=1,eQ="function"==typeof n.onBeforeAttach?n.onBeforeAttach:null,e0="function"==typeof n.onError?n.onError:null;let r=Array.isArray(e)?e:[],i=new Set(r.map(e=>"extra:".concat(e.cutId,":").concat(e.key)));for(let e of[...eq])i.has(e)||function(e){let t=H.get(e);if(t){eY(t,!1);let n=t.entry.parentGroup||y;if(t.root.parent===n&&n.remove(t.root),em(t.root),t.materialCtl&&"function"==typeof t.materialCtl.dispose)try{t.materialCtl.dispose()}catch(e){}H.delete(e)}R.delete(e),q.delete(e),eX.delete(e),eq.delete(e)}(e);for(let e of(eJ=[],r)){let t="extra:".concat(e.cutId,":").concat(e.key);H.has(t)||(eq.add(t),eX.delete(t),eJ.push({spec:e,nsKey:t,gen:eW}))}!function e(){for(;e$<4&&eJ.length>0;){let n=eJ.shift();n&&n.gen===eW&&(e$+=1,k.load(n.spec.url,r=>(function(n,r){e$=Math.max(0,e$-1),e();let{spec:i,nsKey:l,gen:a}=n;if(Z||a!==eW||!eq.has(l))return void eb(r);let o=r.scene||r.scenes&&r.scenes[0];if(!o){eX.add(l),e1(i,"GLB parsed with no scene");return}let s=i.raw||{},d=er(s,{url:i.url,isTail:!1,northOffsetDeg:Number.isFinite(i.northOffsetDeg)?i.northOffsetDeg:0});if(d.extra=!0,d.maskKey=null!=i.maskKey?String(i.maskKey):null,d.parentGroup=i.parentGroup||null,d.parentGroup&&eZ.add(d.parentGroup),d.decisionExempt=!!i.retired&&!d.maskKey,d.tileYearStart=eg(s.tile_year_start),d.maskKey){let e=R.get(d.maskKey);e&&!e.extra&&(d.suppression=e.suppression,d.buildingId=e.buildingId,d.bin=e.bin,d.core200Id=e.core200Id,d.yimbyClusterId=e.yimbyClusterId,d.stableId=e.stableId)}if(i.retired){let e=Number(i.window&&i.window.yearStart),t=Number(i.window&&i.window.yearEnd);d.yearIdx=Number.isFinite(e)&&e>0?(0,es.FR)(e):0,d.endYearIdx=Number.isFinite(t)&&t>0?(0,es.FR)(t):1e9}else d.yearIdx=function(e){if(Number.isFinite(e.yearStartManifest)&&e.yearStartManifest>0)return(0,es.FR)(e.yearStartManifest);let n=ev(e);
1if(n&&Number.isFinite(n.yearIdx))return n.yearIdx;let r=(0,es.ch)(t&&t.links,e.yimbyClusterId);return null!=r?r:Number.isFinite(e.tileYearStart)&&e.tileYearStart>0?(0,es.FR)(e.tileYearStart):(0,es.FU)(e)}(d),d.endYearIdx=ey(d);d.key=l,o.userData.id=null!=d.buildingId?d.buildingId:i.key,o.userData.heroKey=l,eF(o,d),eN(o,d);let u=eE(o);ep&&o.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)});let c={key:l,entry:d,root:o,materialCtl:u,lru:++U,suppressing:!1};if(eQ)try{eQ(i)}catch(e){}H.set(l,c),R.set(l,d),eD(c,D,T),eR(c),eU()})(n,r),void 0,t=>{var r,i;return r=n,i=t,void(e$=Math.max(0,e$-1),e(),r.gen===eW&&(eX.add(r.nsKey),e1(r.spec,i&&i.message?i.message:i)))}))}}()},setKeyHidden:function(e){let t=new Set(e instanceof Set?[...e].map(String):Array.isArray(e)?e.map(String):[]),n=!1;for(let e of R.values()){if(e.extra)continue;let r=t.has(e.key);!!e.stopHidden!==r&&(e.stopHidden=r,n=!0)}n&&(eU(),a&&a())},reassertSuppressionFor:function(e){let t=new Set((Array.isArray(e)?e:[]).map(String));if(0!==t.size){for(let e of H.values()){let n=e.entry;(t.has(String(n.key))||n.extra&&null!=n.maskKey&&t.has(String(n.maskKey)))&&(e.suppressing=!1)}eU()}},hasKey:function(e){return R.has(String(e))},hasKeyPaintedByKey:function(e){let t=R.get(String(e));return!!t&&!t.extra&&null===ev(t)&&String(null!=t.buildingId?t.buildingId:t.key)===String(e)},hasPaintId:function(e){if(null==e)return!1;let t=String(e);for(let e of R.values())if(!e.extra&&null===ev(e)&&String(null!=e.buildingId?e.buildingId:e.key)===t)return!0;return!1},getNorthOffsetDeg:function(){return Q},getResolvedYaw:function(e){let t=H.get(String(e));if(!t)return null;let n=t.entry,r=ec(n.northOffsetDeg,n.containerType);return n.autoOrient&&n.autoOrient.flip&&(r+=180),r},getMarkerSuppressionState:function(){let e=[];for(let t of H.values())if(t.suppressing){let n=t.entry;e.push(String(null!=n.buildingId?n.buildingId:n.key))}return e.sort()},getOrientationStats:()=>({...p}),getDevGuardStats:()=>({checked:f.checked,fired:f.fired,firedKeys:[...f.firedKeys]})}}(t.scene,eJ,{project:nM,assetNaming:_.assetNaming,onInvalidate:$,unityFrame:nI,dataBase:L,footprintRingByBin:e5.ringByBin,excludeKeys:nE,datumY:nF&&nF.baked&&"unity-base-datum"===nF.baked.y?{metersPerUnit:t7,datumUnits:t4&&t4.metadata&&Number.isFinite(t4.metadata.ground_datum_units)?t4.metadata.ground_datum_units:void 0}:null,metersPerUnit:nF&&nF.baked&&"unity-base-datum"===nF.baked.y?t7:null});n0.setMarkers(nQ),K=n0.tick,nN&&(nD=function(e){let t=e||{},n=t.manifest||null,r="function"==typeof t.resolveUrl?t.resolveUrl:e=>e,i="function"==typeof t.onInvalidate?t.onInvalidate:()=>{},l="function"==typeof t.onShadowDirty?t.onShadowDirty:()=>{},a=t.dataIndex||null,o=t.rowsByKey instanceof Map?t.rowsByKey:null,s=new v.YJl;s.name="tiles";let d=new w.GLTFLoader;d.setMeshoptDecoder(x.MeshoptDecoder);let u=M&&"neutral"===C,c=ei(),f={value:161},h=!1,g=null,m=null,y=null,b=null,k=null,S=!1,I=new Map,_=[],L=new Map,F=new Map;for(let e of n&&Array.isArray(n.tiles)?n.tiles:[]){let t=(e.members||[]).map(e=>({index:e.index,key:e.key,buildingId:null!=e.buildingId?String(e.buildingId):null,bin:e.bin||"",core200Id:e.core200_id||"",yimbyClusterId:e.yimby_cluster_id||"",stableId:e.stable_id||"",flip:!!e.flip,yearIdx:0,endYearIdx:es.TZ,hidden:!1,stopHidden:!1,exempt:!1,tintMode:0,rgb:null,selRgb:null,suppTarget:null,up:!1})),n=new Float32Array(3*Math.max(1,t.length)*4),r={id:e.id,url:e.url,anchor:Array.isArray(e.anchor_web_m)?e.anchor_web_m:[0,0],meshes:[],material:null,depthMaterial:null,texture:null,texData:n,members:t,loaded:!1,hole:!1,attempts:0};for(let e of(_.push(r),t)){if(null!=e.key){let t=F.get(String(e.key));t||(t=[],F.set(String(e.key),t)),t.push({tile:r,member:e})}if(!e.buildingId)continue;let t=L.get(e.buildingId);t||(t=[],L.set(e.buildingId,t)),t.push({tile:r,member:e})}}function A(e){return o&&o.get(e.key)||null}function N(e){let t=a&&a.byId instanceof Map?a.byId:null;return t?e.core200Id&&t.has(String(e.core200Id))?t.get(String(e.core200Id)):e.bin&&t.has(String(e.bin))?t.get(String(e.bin)):e.yimbyClusterId&&t.has(String(e.yimbyClusterId))?t.get(String(e.yimbyClusterId)):null:null}function E(){for(let e of _)for(let t of e.members)t.yearIdx=function(e){let t=A(e),n=function(e,t){let n=t?Number(t.year_start):NaN;if(Number.isFinite(n)&&n>0)return(0,es.FR)(n);let r=N(e);if(r&&Number.isFinite(r.yearIdx))return r.yearIdx;let i=(0,es.ch)(a&&a.links,e.yimbyClusterId);if(null!=i)return i;let l=t?Number(t.tile_year_start):NaN;return Number.isFinite(l)&&l>0?(0,es.FR)(l):(0,es.FU)({objectClass:t?t.object_class:null,existingStock:t?!0===t.existing_stock:null,bin:e.bin,core200Id:e.core200Id,yimbyClusterId:e.yimbyClusterId,stableId:e.stableId})}(e,t);return t&&!0===t.existing_stock&&n===es.q5?0:n}(t),t.endYearIdx=function(e){let t=A(e),n=t?Number(t.year_end):NaN;
1if(Number.isFinite(n)){if(-1===n)return es.TZ;if(n>0)return(0,es.FR)(n)}let r=N(e);return r&&Number.isFinite(r.endYearIdx)?r.endYearIdx:es.TZ}(t)}function D(e){let t=Number.isFinite(e.endYearIdx)?e.endYearIdx:es.TZ;return e.yearIdx<=f.value&&f.value<t}E();let T="\n int tIdx = int(vTileBIdx + 0.5);\n vec4 tRow0 = texelFetch(uTileData, ivec2(tIdx, 0), 0);\n float tFlags = tRow0.w;\n float tHidden = mod(tFlags, 2.0);\n if (tHidden > 0.5 || uTileYear + 0.5 < tRow0.x || uTileYear + 0.5 >= tRow0.y) discard;";function P(e){e.vertexShader=e.vertexShader.replace("#include <common>","#include <common>\nattribute float aBuildingIndex;\nvarying float vTileBIdx;").replace("#include <begin_vertex>","#include <begin_vertex>\nvTileBIdx = aBuildingIndex;")}function B(e,t){!function(e,t,n,r){var i,l;let a=4*n,o=(t+n)*4,s=(2*t+n)*4;e[a]=r.yearIdx,e[a+1]=r.endYearIdx,e[a+2]=r.tintMode,e[a+3]=+(i=r.hidden,l=r.stopHidden,!!i||!!l)+2*!!r.exempt+4*!!r.selected;let d=r.rgb||[1,1,1];e[o]=d[0],e[o+1]=d[1],e[o+2]=d[2],e[o+3]=0;let u=r.selRgb||[1,1,1];e[s]=u[0],e[s+1]=u[1],e[s+2]=u[2],e[s+3]=0}(e.texData,e.members.length,t.index,{yearIdx:t.yearIdx,endYearIdx:t.endYearIdx,tintMode:t.tintMode,rgb:t.rgb,selRgb:t.selRgb,hidden:t.hidden,stopHidden:t.stopHidden,exempt:t.exempt,selected:null!=t.buildingId&&(null!=m&&String(m)===String(t.buildingId)||null!=y&&y.has(String(t.buildingId)))})}function R(e){e.texture&&(e.texture.needsUpdate=!0)}function H(e,t,n){let r=t||{};e.hidden=!!r.hidden,e.exempt=er(r),"string"==typeof r.color?(e.tintMode=1,e.rgb=ej(r.color)):r.nullGray?(e.tintMode=2,e.rgb=null):r.defaultBeige?(e.tintMode=1,e.rgb=ej(p.FILTER_GRAY_OUT_HEX)):(e.tintMode=0,e.rgb=null);let i=null!=e.buildingId?String(e.buildingId):null,l=null!=m&&null!=i&&String(m)===i,a=null!=y&&null!=i&&y.has(i);if(l||a){let r=null,i=null!=y;if(n)try{i&&"function"==typeof n.devSelectionHighlightHex?r=n.devSelectionHighlightHex():"function"==typeof n.selectionHighlightHex&&(r=n.selectionHighlightHex(t))}catch(e){r=null}e.selRgb=ej(r||p.toHex(i?p.DEV_SELECTION_HIGHLIGHT:p.DEFAULT_SELECTION_HIGHLIGHT))}}function U(e){return{id:e.buildingId||e.key,corpus:e.yimbyClusterId&&!e.core200Id?"yimby":"core200",bin:e.bin||void 0,yearIdx:e.yearIdx,endYearIdx:e.endYearIdx,fields:{},placeable:!0}}let Y=Promise.all(_.map(e=>(function e(t){return t.attempts+=1,new Promise(n=>{d.load(r(t.url),e=>{if(h)return void n();try{let n=t.members.length;t.texture=new v.GYF(t.texData,Math.max(1,n),3,v.GWd,v.RQf),t.texture.minFilter=v.hxR,t.texture.magFilter=v.hxR,t.texture.needsUpdate=!0,t.material=function(e){let t=new v.G_z({vertexColors:!0});return t.onBeforeCompile=t=>{t.uniforms.uTileData={value:e.texture},t.uniforms.uTileYear=f,t.uniforms.uMinLuma=c.minLuma,t.uniforms.uGlobalDesat=c.globalDesat,t.uniforms.uDuskGlow=c.duskGlow,t.uniforms.uGradeSat=c.gradeSat,t.uniforms.uGradeVal=c.gradeVal,P(t),t.fragmentShader=t.fragmentShader.replace("#include <common>","#include <common>\nuniform sampler2D uTileData;\nuniform float uTileYear;\nuniform float uMinLuma;\nuniform float uGlobalDesat;\nuniform float uDuskGlow;\nuniform float uGradeSat;\nuniform float uGradeVal;\nvarying float vTileBIdx;").replace("#include <clipping_planes_fragment>","#include <clipping_planes_fragment>".concat(T,"\n vec4 tRow1 = texelFetch(uTileData, ivec2(tIdx, 1), 0);\n float tExempt = mod(floor(tFlags / 2.0), 2.0);\n float tSelected = mod(floor(tFlags / 4.0), 2.0);\n float tTintMode = tRow0.z;")).replace("#include <color_fragment>","#include <color_fragment>\n\n // 0) city color grade (city-expansion 2026-08-13) â heroMaterial's shared\n // pair, applied to the authored texel albedo FIRST; the tint replace /\n // null-gray / selection writes below overwrite it (legend fidelity). Tiles\n // are all buildings â no env exemption arm here.\n {\n float cgLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));\n diffuseColor.rgb = clamp(mix(vec3(cgLuma), diffuseColor.rgb, uGradeSat) * uGradeVal, 0.0, 1.0);\n }\n\n // 1) tint replace (mirrors heroMaterial uTintMode; 2=nullGray, 1=replace)\n if (tTintMode > 1.5) {\n diffuseColor.rgb = vec3(0.62); // null-gray flat luminance 0.62, verbatim\n } else if (tTintMode > 0.5) {\n diffuseColor.rgb = tRow1.rgb;\n }\n\n // 2) J3 min-luminance floor â natural-PAINT only, PRE-lighting\n if (tTintMode < 0.5 && tSelected < 0.5) {\n float floorLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));
1\n if (floorLuma < uMinLuma) {\n diffuseColor.rgb += vec3(uMinLuma - floorLuma);\n }\n }\n\n // 3) K2 gray-of-natural â pre-light form ONLY under ?gray=warm (K5:\n // neutral moves it post-lighting, see the opaque_fragment inject)\n".concat(u?" // (K5 neutral: desaturate runs post-lighting below.)":" {\n float gdLuma = dot(diffuseColor.rgb, vec3(0.299, 0.587, 0.114));\n diffuseColor.rgb = mix(diffuseColor.rgb, vec3(gdLuma), uGlobalDesat * (1.0 - tExempt));\n }","\n\n // 4) selection tint LAST â never grayed (Unity's sidekick-overlay law).\n // The highlight lives in ROW 2, its own channel: row 1 stayed the DATA\n // color, so steps 1-3 above composed off the real color. The fetch sits\n // INSIDE the branch â texelFetch is divergence-safe, and only selected\n // fragments pay it.\n if (tSelected >= 0.5) {\n vec4 tRow2 = texelFetch(uTileData, ivec2(tIdx, 2), 0);\n diffuseColor.rgb = tRow2.rgb;\n }")).replace("#include <emissivemap_fragment>","#include <emissivemap_fragment>\n {\n float tDuskPainted = ((tTintMode > 0.5 && tTintMode < 1.5) || tSelected >= 0.5) ? 1.0 : 0.0;\n totalEmissiveRadiance += diffuseColor.rgb * (uDuskGlow * 0.55 * tDuskPainted);\n }"),u&&(t.fragmentShader=t.fragmentShader.replace("#include <opaque_fragment>"," {\n float gdLuma = dot(outgoingLight, vec3(0.299, 0.587, 0.114));\n outgoingLight = mix(outgoingLight, vec3(gdLuma), uGlobalDesat * (1.0 - max(tExempt, tSelected)));\n }\n #include <opaque_fragment>"))},t.customProgramCacheKey=()=>"tiles-v4|".concat(u?"neutral":"warm"),t}(t),t.depthMaterial=function(e){let t=new v.CSG({depthPacking:v.N5j});return t.onBeforeCompile=t=>{t.uniforms.uTileData={value:e.texture},t.uniforms.uTileYear=f,P(t),t.fragmentShader=t.fragmentShader.replace("#include <common>","#include <common>\nuniform sampler2D uTileData;\nuniform float uTileYear;\nvarying float vTileBIdx;").replace("#include <clipping_planes_fragment>","#include <clipping_planes_fragment>".concat(T))},t.customProgramCacheKey=()=>"tiles-depth-v1",t}(t),e.scene.traverse(e=>{if(!e.isMesh)return;let n=e.geometry,r=n.getAttribute("_building_index");r?(n.setAttribute("aBuildingIndex",r),n.deleteAttribute("_building_index")):console.error("[tiles] tile ".concat(t.id,": mesh missing _building_index â picking/state will misbehave")),n.computeBoundingSphere(),e.material=t.material,t.depthMaterial&&(e.customDepthMaterial=t.depthMaterial),e.castShadow=!0,e.receiveShadow=!0,e.userData.tileId=t.id,t.meshes.push(e)});let r=new v.YJl;for(let e of(r.name="tile:".concat(t.id),r.position.set(t.anchor[0],0,t.anchor[1]),t.meshes))r.add(e);for(let e of(s.add(r),t.loaded=!0,t.members)){if(b){let t=null;try{let n=N(e)||U(e);t=b.resolve(k,n)}catch(e){t=null}H(e,t,b)}B(t,e)}R(t),O(),l(),i()}catch(e){console.error("[tiles] tile ".concat(t.id," ingest failed: ").concat(e&&e.message)),t.hole=!0}n()},void 0,r=>{if(h)return void n();t.attempts<2?(console.error("[tiles] tile ".concat(t.id," load failed (attempt ").concat(t.attempts,") â retrying once: ").concat(r&&r.message)),n(e(t))):(console.error("[tiles] tile ".concat(t.id," FAILED twice â ACCEPTED HOLE for this session (buildings: ").concat(t.members.length,")")),t.hole=!0,n())})})})(e))).then(()=>{let e=_.filter(e=>e.hole);return e.length&&console.error("[tiles] ".concat(e.length,"/").concat(_.length," tiles are holes: ").concat(e.map(e=>e.id).join(", "))),{tiles:_.length,holes:e.length}});function z(){if(I=new Map,!g||"function"!=typeof g.getBuildingId)return;let e=g.mesh,t=e&&Number.isFinite(e.count)?e.count:1817;for(let e=0;e<t;e++){let t=g.getBuildingId(e);null!=t&&I.set(String(t),e)}}function O(){if(!g||"function"!=typeof g.setSuppressed)return;let e=[];for(let t of _)if(t.loaded)for(let n of t.members){let t=eG({yearVisible:D(n),decisionHidden:!1,stopHidden:n.stopHidden}),r=null!=n.buildingId?I.get(String(n.buildingId)):void 0;if(null==r){n.up=t,n.suppTarget=null;continue}(t!==n.up||t&&n.suppTarget!==r)&&e.push({target:t?r:null!=n.suppTarget?n.suppTarget:r,up:t,member:n})}if(e.length){for(let[t,n]of function(e){let t=[];if(!Array.isArray(e))return t;for(let n of e)n&&!n.up&&t.push([n.target,!1]);
1for(let n of e)n&&n.up&&t.push([n.target,!0]);return t}(e.map(e=>({target:e.target,up:e.up}))))try{g.setSuppressed(t,n)}catch(e){}for(let t of e)t.member.up=t.up,t.member.suppTarget=t.target;S=!0}}let j=new Set;return{group:s,ready:Y,applyYear:function(e){Number.isFinite(e)&&f.value!==e&&(f.value=e,O(),l(),i())},repaint:function(e,t){for(let n of(b=e||null,k=t||null,t&&"selectedBuildingId"in t&&(m=null!=t.selectedBuildingId?t.selectedBuildingId:null),_))if(n.loaded){for(let e of n.members){let t=null;if(b&&"function"==typeof b.resolve)try{let n=N(e)||U(e);t=b.resolve(k,n)}catch(e){t=null}H(e,t,b),B(n,e)}R(n)}O(),i()},setSelected:function(e){let t=null!=e?String(e):null,n=null!=m?String(m):null,r=arguments.length>1&&null!=arguments[1]&&arguments[1].length>0?new Set(arguments[1].map(String)):null,l=y,a=null==l&&null==r||null!=l&&null!=r&&l.size===r.size&&[...r].every(e=>l.has(e));if(t===n&&a)return;let o=m;m=t,y=r;let s=new Set([o,t]);if(l)for(let e of l)s.add(e);if(r)for(let e of r)s.add(e);for(let e of s){if(null==e)continue;let t=L.get(String(e));if(t)for(let{tile:e,member:n}of t){if(!e.loaded)continue;let t=null;if(b&&"function"==typeof b.resolve)try{t=b.resolve(k,N(n)||U(n))}catch(e){t=null}H(n,t,b),B(e,n),R(e)}}i()},setMarkers:function(e){for(let t of(g=e||null,z(),_))for(let e of t.members)e.up=!1,e.suppTarget=null;O()},reapplyAfterRebuild:function(e){for(let t of(e&&(g=e),E(),z(),_))if(t.loaded){for(let e of t.members)e.up=!1,e.suppTarget=null,B(t,e);R(t)}O(),l(),i()},consumeSuppressionDirty:function(){let e=S;return S=!1,e},hasVisibleFor:function(e){if(null==e)return!1;let t=L.get(String(e));if(!t)return!1;for(let{tile:e,member:n}of t)if(e.loaded&&!e.hole&&eG({yearVisible:D(n),decisionHidden:n.hidden,stopHidden:n.stopHidden}))return!0;return!1},setDesaturate:function(){i()},setDataIndex:function(e){a=e||null},pickApi:{group:s,resolveHits(e){let t=[];for(let n of e||[]){let e=n.object;if(!e||!e.userData||!e.userData.tileId)continue;let r=_.find(t=>t.id===e.userData.tileId);if(!r||!r.loaded)continue;let i=e.geometry&&e.geometry.getAttribute("aBuildingIndex");i&&n.face&&t.push({tile:r,memberIndex:Math.round(i.getX(n.face.a)),distance:n.distance})}t.sort((e,t)=>e.distance-t.distance);let n=function(e,t){for(let n of e){let e=t(n.memberIndex);if(e&&e.visible)return{buildingId:e.buildingId||e.key,memberIndex:n.memberIndex}}return null}(t.map((e,t)=>({memberIndex:t,distance:e.distance})),e=>{let n=t[e],r=n&&n.tile.members[n.memberIndex];return r?{visible:eG({yearVisible:D(r),decisionHidden:r.hidden,stopHidden:r.stopHidden}),buildingId:r.buildingId,key:r.key}:null});if(!n)return null;let r=t[n.memberIndex];return{buildingId:n.buildingId,key:r.tile.members[r.memberIndex].key,memberIndex:r.memberIndex}}},getStats:function(){let e=0,t=0,n=0;for(let r of _)for(let i of(e+=r.members.length,r.members))i.flip&&(n+=1),r.loaded&&eG({yearVisible:D(i),decisionHidden:i.hidden,stopHidden:i.stopHidden})&&(t+=1);return{tiles:_.length,loaded:_.filter(e=>e.loaded).length,holes:_.filter(e=>e.hole).length,members:e,visibleAtYear:t,flipped:n,yearIdx:f.value}},dispose:function(){for(let e of(h=!0,_)){for(let t of e.meshes)t.geometry&&t.geometry.dispose();e.material&&e.material.dispose(),e.depthMaterial&&e.depthMaterial.dispose(),e.texture&&e.texture.dispose(),e.meshes.length=0,e.loaded=!1}s.parent&&s.parent.remove(s),s.clear(),L.clear(),I.clear()},setKeyHidden:function(e){let t=new Set(e instanceof Set?[...e].map(String):Array.isArray(e)?e.map(String):[]),n=new Set;for(let e of t)j.has(e)||n.add(e);for(let e of j)t.has(e)||n.add(e);if(0===n.size){j=t;return}let r=new Set;for(let e of n){let n=F.get(e);if(n)for(let{tile:i,member:l}of n)l.stopHidden=t.has(e),i.loaded&&(B(i,l),r.add(i))}for(let e of(j=t,r))R(e);O(),l(),i()},hasKey:function(e){return F.has(String(e))},hasKeyPaintedByKey:function(e){let t=F.get(String(e));if(!t)return!1;for(let{member:n}of t)if(null===N(n)&&String(null!=n.buildingId?n.buildingId:n.key)===String(e))return!0;return!1},hasPaintId:function(e){if(null==e)return!1;let t=String(e);for(let e of _)for(let n of e.members)if(null===N(n)&&String(null!=n.buildingId?n.buildingId:n.key)===t)return!0;return!1}
1,keysForBuildingId:function(e){if(null==e)return[];let t=L.get(String(e));return t?t.map(e=>e.member.key):[]},getMarkerSuppressionState:function(){let e=[];for(let t of _)for(let n of t.members)n.up&&null!=n.suppTarget&&e.push("".concat(null!=n.buildingId?n.buildingId:n.key,"@").concat(n.suppTarget));return e.sort()}}}({manifest:nF,resolveUrl:e=>"".concat(L,"/").concat(e),dataIndex:eJ,rowsByKey:nA,onInvalidate:$,onShadowDirty:()=>{"function"==typeof t.setShadowDirty&&t.setShadowDirty()}}),t.scene.add(nD.group),nD.setMarkers(nQ),nD.repaint(nR,B.get()),nD.applyYear(B.get().year),console.info("[tiles] ACTIVE â ".concat(nF.tiles.length," tiles / ").concat(nE.size," tiled buildings (heroes keep tails + stragglers).")));let n1=function(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=50,i="function"==typeof(n&&n.project)?n.project:null,l="string"==typeof(n&&n.ground)&&n.ground?n.ground:e$,a="string"==typeof(n&&n.dataBase)&&""!==n.dataBase?n.dataBase.replace(/\/+$/,""):"/data",o=new Set(Array.isArray(n&&n.deferredSlugs)?n.deferredSlugs.filter(e=>"string"==typeof e):[]),s=n&&(!0===n.tilesLod||!0===n.preferGroundLod)||eZ,d=n&&"canonical"===n.assetNaming?"canonical":"twins",u=new v.YJl;u.name="environment",e&&"function"==typeof e.add&&e.add(u);let c=new w.GLTFLoader;c.setMeshoptDecoder(x.MeshoptDecoder);let p=!1,f=[],h=[],g=!1,m=null,y=new Promise(e=>{t=e}),b=(async()=>{let e,i=n&&n.manifest&&"object"==typeof n.manifest?n.manifest:await e6("".concat(a,"/").concat("web_environment_manifest.json"));if(!i||p)return void t();let l=i.metadata||{},s=Number.isFinite(l.unity_north_offset_degrees)?l.unity_north_offset_degrees:0,d=Number.isFinite(l.meters_per_unit)&&l.meters_per_unit>0?l.meters_per_unit:8.3333;r=Number.isFinite(l.ground_datum_units)?l.ground_datum_units:50,45>Math.abs(Math.abs(((e=s%360)>180&&(e-=360),e<-180&&(e+=360),e))-180)&&console.warn("[environment] unity_north_offset_degrees=".concat(s," looks like the mesh-manifest ")+"axis-flip convention â the env manifest must carry the web-ready value (â0 for this calibration; see WebEnvironmentExporter.ComputeNorthOffsetDegrees). Rendering would flip the ground.");let u=Array.isArray(i.entries)?[...i.entries]:[];u.sort((e,t)=>e2(e)-e2(t));let c=[],f=[];for(let e of u)(o.has(e&&e.slug)?f:c).push(e);for(let e of(m={list:f,northOffsetDeg:s,metersPerUnit:d},t(),f.length>0&&console.info("[environment] ".concat(f.length," deferred entr").concat(1===f.length?"y":"ies"," (").concat(f.map(e=>e.slug).join(", "),") â loaded on first enable, not at boot.")),c)){if(p)return;await L(e,s,d)}})().catch(e=>{t(),console.error("[environment] load chain FAILED â terrain/trees may be missing:",e)}),k=null;function S(e){g=!!e;let t=0;for(let e of o){let n="env:".concat(e);for(let e of u.children)e.name===n&&e.visible!==g&&(e.visible=g,t++)}return t}let M=new Map,I=null,C=null;function _(e,t,n,l){let a=function(e,t,n){(!Number.isFinite(n)||n<=0)&&(n=8.3333),e.updateMatrixWorld(!0);let r=new Map,i=0;e.traverse(e=>{if(!e.isMesh||!e.geometry)return;let t=Array.isArray(e.material)?e.material[0]:e.material,n=function(e){try{let t=e.geometry,n=new v.LoY;for(let e of(t.index&&n.setIndex(t.index.clone()),Object.keys(t.attributes))){let r=t.attributes[e];"position"===e||"normal"===e||"tangent"===e?n.setAttribute(e,function(e){if(e.array instanceof Float32Array&&!e.normalized&&!e.isInterleavedBufferAttribute)return e.clone();let t=new Float32Array(e.count*e.itemSize);for(let n=0;n<e.count;n++)for(let r=0;r<e.itemSize;r++)t[n*e.itemSize+r]=e.getComponent(n,r);return new v.THS(t,e.itemSize,!1)}(r)):n.setAttribute(e,r.isInterleavedBufferAttribute?(0,eW.nN)(r):r.clone())}return n.applyMatrix4(e.matrixWorld),n}catch(e){return console.warn("[environment] geometry bake failed (mesh skipped):",e),null}}(e);if(!n)return;i++;let l="".concat(t?t.uuid:"none","|").concat(function(e){let t=Object.keys(e.attributes).sort().map(t=>{let n=e.attributes[t];return"".concat(t,":").concat(n.itemSize,":").concat(+!!n.normalized)});return t.push(e.index?"indexed":"nonindexed"),t.join(",")}(n)),a=r.get(l);a||(a={material:t,geoms:[]},r.set(l,a)),a.geoms.push(n)});let l=new v.YJl;l.name="env:".concat(t);let a=0,o=0,s=0;for(let{material:e,geoms:i}of r.values()){if(eQ(e)){let e=.15/n;for(let t of i)t.translate(0,e,0);o++}else if(e&&"string"==typeof e.name&&e0.test(e.name)){let e=.08/n;for(let t of i)t.translate(0,e,0);s++}let r=null;if(1===i.length)r=i[0];else try{r=(0,eW.pP)(i,!1)}catch(e){r=null}
1if(r){if(r!==i[0])for(let e of i)e.dispose();l.add(F(r,e)),a++}else{for(let n of(console.warn("[environment] merge failed for a ".concat(t," material group (").concat(i.length," meshes kept unmerged).")),i))l.add(F(n,e));a+=i.length}}return e3(e),console.info("[environment] '".concat(t,"': ").concat(i," source meshes -> ").concat(a," draw calls (").concat(r.size," material groups, ").concat(o," road group(s) lifted +").concat(.15,"m, ").concat(s," field group(s) lifted +").concat(.08,"m).")),0===o&&eX.has(t)&&console.warn("[environment] '".concat(t,"': no road-named material groups found â J5 road lift not applied (check Unity material names).")),l}(e.scene,t.slug||t.name||"env",l),o=-r*l;if(i){let[e,n]=i(t.anchor_lng,t.anchor_lat);a.position.set(e,o,n)}else a.position.set(0,o,0);return a.rotation.set(0,-n*eq,0),a.scale.setScalar(l),a}async function L(e,t,n){let r,i=e&&"string"==typeof e.glb_path?e.glb_path:null;if(!i)return!1;let f="".concat(a,"/").concat(i.replace(/^\/+/,"")),h=performance.now(),m=f;try{if(eX.has(e.slug)){if(l&&!r){let e=f.replace(/[^/]+\.glb$/,l);try{r=await c.loadAsync(e),m=e}catch(e){console.warn("[environment] requested ground variant '".concat(l,"' unavailable ")+"(falling back to the standard ladder):",e&&e.message?e.message:e)}}if(s&&!r){let t=f.replace(/[^/]+\.glb$/,"ground_lod.glb");try{r=await c.loadAsync(t),m=t}catch(t){console.warn("[environment] ground LOD unavailable for '".concat(e.slug,"' ")+"(falling back to the variant chain):",t&&t.message?t.message:t)}}let t=f.replace(/\.glb$/,".meshopt.glb"),n="canonical"===d?f:t,i="canonical"===d?t:f;try{r||(r=await c.loadAsync(n),m=n)}catch(t){console.warn("[environment] ".concat(n.split("/").pop()," unavailable for '").concat(e.slug,"' ")+"(trying ".concat(i.split("/").pop(),"):"),t&&t.message?t.message:t),r=await c.loadAsync(i),m=i}}else r=await c.loadAsync(f)}catch(e){return console.warn("[environment] failed to load ".concat(f," (container skipped):"),e),!1}if(p)return e3(r.scene),!1;let y=_(r,e,t,n);if(o.has(e.slug)&&(y.visible=g),u.add(y),eX.has(e.slug)){let r=m.split("/").pop();C={entry:e,northOffsetDeg:t,metersPerUnit:n,dirUrl:f.replace(/[^/]+\.glb$/,"")},M.set(r,y),I=r}return console.info("[environment] '".concat(e.name,"' resident: ").concat(y.children.length," merged meshes ")+"(".concat(Math.round(performance.now()-h),"ms, ").concat(m.split("/").pop(),")")),!0}function F(e,t){let n=et(e,t);n.userData.heroUniforms.uGradeExempt.value=1,f.push(e),h.push(n);let r=new v.eaF(e,n);return eQ(t)&&(r.renderOrder=1),e1&&(r.receiveShadow=!0),r.matrixAutoUpdate=!1,r.updateMatrix(),r}return{group:u,ready:b,loadDeferred:function(){if(!k){let e={requested:0,loaded:0};k=(async()=>{await y;let t=m;if(e.requested=t?t.list.length:0,p||!t||0===t.list.length)return e;for(let n of t.list){if(p)break;await L(n,t.northOffsetDeg,t.metersPerUnit)&&e.loaded++,S(g)}return e})().catch(t=>(console.error("[environment] deferred entry load FAILED:",t),e)).then(e=>(p||0!==e.loaded||(k=null),e))}return k},setDeferredVisible:S,ground:{list:()=>[...M.keys()],active:()=>I,async load(e){let t;if(p||!C||"string"!=typeof e||!e)return!1;if(M.has(e))return!0;try{t=await c.loadAsync(C.dirUrl+e)}catch(t){return console.warn("[environment] ground.load('".concat(e,"') failed:"),t&&t.message?t.message:t),!1}if(p)return e3(t.scene),!1;try{let n=_(t,C.entry,C.northOffsetDeg,C.metersPerUnit);n.visible=!1,u.add(n),M.set(e,n)}catch(n){return console.warn("[environment] ground.load('".concat(e,"') bake failed:"),n&&n.message?n.message:n),e3(t.scene),!1}return console.info("[environment] ground variant loaded (hidden): ".concat(e)),!0},show(e){if(!M.get(e))return!1;for(let[t,n]of M)n.visible=t===e;return I=e,console.info("[environment] ground variant shown: ".concat(e)),!0},unload(e){if(e===I)return!1;let t=M.get(e);return!!t&&(u.remove(t),t.traverse(e=>{e.isMesh&&(e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose())}),M.delete(e),console.info("[environment] ground variant unloaded: ".concat(e)),!0)}},dispose:function(){if(!p){for(let e of(p=!0,u.parent&&u.parent.remove(u),f))try{e.dispose()}catch(e){}for(let e of h)try{e.dispose()}catch(e){}f.length=0,h.length=0}}}}(t.scene,{project:t.project,dataBase:L,manifest:t4,ground:nC?void 0:_.ground,deferredSlugs:[...tl],tilesLod:nN,preferGroundLod:nC,assetNaming:_.assetNaming}),n2=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="function"==typeof(t&&t.project)?t.project:null,r="string"==typeof(t&&t.dataBase)&&""!==t.dataBase?t.dataBase.replace(/\/+$/,""):"/data",i="function"==typeof(t&&t.getYearIdx)?t.getYearIdx:null,l=t&&t.envManifest&&"object"==typeof t.envManifest&&t.envManifest.metadata||{},a=Number.isFinite(l.meters_per_unit)&&l.meters_per_unit>0?l.meters_per_unit:8.3333,o=new v.YJl;o.name="infill",e&&"function"==typeof e.add&&e.add(o);let s=!1,d=[],u=[],c=[],p={present:!1,containers:0,boxes:0,overlays:0,skippedBoxes:0,skippedOverlays:0,batches:0},f=null,h=(async()=>{let e=await tn("".concat(r,"/").concat("web_infill.json"));if(!e||s){e||s||console.info("[infill] web_infill.json absent â speculative infill layer inert (presence-gated; first materializes at the \xa76d sitting).");return}if(!n)return void console.warn("[infill] no projector threaded â layer inert.");
1!function(e){let t=Array.isArray(e.containers)?e.containers:[],r=new Map,i=(e,t,n,i)=>{let l="".concat(e,"|").concat(t,"|").concat(n),a=r.get(l);return a||(a={lift:i,startIdx:e,endIdx:t,positions:[],colors:[],indices:[]},r.set(l,a)),a},l=(e,t)=>{for(;e.colors.length<e.positions.length;)e.colors.push(t[0],t[1],t[2])};for(let e of t){if(!e||"object"!=typeof e)continue;p.containers++;let t=e7(e.year_start,e.recede_year),r=tt(e.color)||e4;for(let o of Array.isArray(e.boxes)?e.boxes:[]){let e=function(e){if(!e||!Array.isArray(e.poly)||4!==e.poly.length)return null;let t=[];for(let n of e.poly){if(!Array.isArray(n)||n.length<2||!Number.isFinite(n[0])||!Number.isFinite(n[1]))return null;t.push([n[0],n[1]])}let n=Number(e.height_m);return!Number.isFinite(n)||n<=0?null:{corners:t,height:n}}(o);if(!e){p.skippedBoxes++;continue}let s=i(t.startIdx,t.endIdx,"box",0);(function(e,t,r){let i=te(t.map(e=>{let[t,r]=e;return n(t,r)})),l=()=>e.positions.length/3,a=l();for(let[t,n]of i)e.positions.push(t,r,n);e.indices.push(a,a+1,a+2,a,a+2,a+3);for(let t=0;t<4;t++){let[n,o]=i[t],[s,d]=i[(t+1)%4];a=l(),e.positions.push(n,-0,o,s,-0,d,n,r,o,s,r,d),e.indices.push(a,a+3,a+1,a,a+2,a+3)}})(s,e.corners,e.height*a),l(s,r),p.boxes++}for(let t of Array.isArray(e.overlays)?e.overlays:[]){if(!t||!Array.isArray(t.ring)||t.ring.length<3){p.skippedOverlays++;continue}let r=e7(t.year_start,t.recede_year),a="road"===t.kind,o=a?e8:tt(e.color)||e4,s=i(r.startIdx,r.endIdx,a?"road":"land",a?.04:.02);!function(e,t){let r,i=[];for(let e of t){if(!Array.isArray(e)||!Number.isFinite(e[0])||!Number.isFinite(e[1]))return!1;i.push(n(e[0],e[1]))}if(i.length>3){let e=i[0],t=i[i.length-1];1e-9>Math.abs(e[0]-t[0])&&1e-9>Math.abs(e[1]-t[1])&&i.pop()}if(i.length<3)return!1;let l=te(i),a=e.lift,o=e.positions.length/3;if(4===l.length){for(let[t,n]of l)e.positions.push(t,a,n);return e.indices.push(o,o+1,o+2,o,o+2,o+3),!0}let s=l.map(e=>{let[t,n]=e;return new v.I9Y(t,n)});try{r=v.xJ6.triangulateShape(s,[])}catch(e){return!1}if(!Array.isArray(r)||0===r.length)return!1;for(let[t,n]of l)e.positions.push(t,a,n);let d=r[0],u=function(e,t,n){let r=t[0]-e[0],i=t[1]-e[1];return i*(n[0]-e[0])-r*(n[1]-e[1])}(l[d[0]],l[d[1]],l[d[2]]);for(let t of r)u>=0?e.indices.push(o+t[0],o+t[1],o+t[2]):e.indices.push(o+t[0],o+t[2],o+t[1]);return!0}(s,t.ring)?p.skippedOverlays++:(l(s,o),p.overlays++)}}for(let e of r.values()){if(0===e.positions.length)continue;let t=new v.LoY,n=new Float32Array(e.positions);if(t.setAttribute("position",new v.THS(n,3)),e.colors.length!==e.positions.length){console.error("[infill] batch color/position drift: ".concat(e.colors.length," vs ").concat(e.positions.length," â batch dropped"));continue}t.setAttribute("color",new v.THS(new Float32Array(e.colors),3)),t.setIndex(e.indices);let r=et(t,null);d.push(t),u.push(r);let i=new v.eaF(t,r);i.name="infill:".concat(e.startIdx,"-").concat(e.endIdx),e9&&(i.receiveShadow=!0),i.matrixAutoUpdate=!1,i.updateMatrix(),i.visible=!1,c.push({mesh:i,startIdx:e.startIdx,endIdx:e.endIdx}),o.add(i),p.batches++}p.present=!0}(e);let t=i?i():null;Number.isFinite(t)&&g(t),console.info("[infill] resident: ".concat(p.containers," containers -> ").concat(p.batches," batches ")+"(".concat(p.boxes," boxes, ").concat(p.overlays," overlays; ")+"".concat(p.skippedBoxes+p.skippedOverlays," malformed skipped)."))})().catch(e=>{console.error("[infill] load FAILED â infill layer missing:",e)});function g(e){if(Number.isFinite(e))for(let r of(f=e,c)){var t,n;r.mesh.visible=(t=r.startIdx,n=r.endIdx,t<=e&&e<n)}}return{group:o,ready:h,applyYear:g,stats:function(){return{...p,lastYearIdx:f,metersPerUnit:a}},dispose:function(){if(!s){for(let e of(s=!0,o.parent&&o.parent.remove(o),d))try{e.dispose()}catch(e){}for(let e of u)try{e.dispose()}catch(e){}d.length=0,u.length=0,c.length=0}}}}(t.scene,{project:nM,dataBase:L,envManifest:t4,getYearIdx:()=>B.get().year}),n3=function(e){let t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r="function"==typeof(n&&n.project)?n.project:null,i="string"==typeof(n&&n.dataBase)&&""!==n.dataBase?n.dataBase.replace(/\/+$/,""):"/data",l="function"==typeof(n&&n.getYearIdx)?n.getYearIdx:null,a=n&&n.envManifest&&"object"==typeof n.envManifest?n.envManifest:null,o=a&&a.metadata||{},s=Number.isFinite(o.ground_datum_units)?o.ground_datum_units:50,d=!!(n&&n.deferLoad),u=new v.YJl;u.name="trees",e&&"function"==typeof e.add&&e.add(u);let c=!1,p=[],f=[],h={value:es.q5},g={present:!1,variants:0,instances:0,gatedGroups:0,ungatedGroups:0,skippedBulkGroups:0,skippedUnknownGroups:0,protoMisses:0,protoFallbacks:0};async function m(){g.gatedGroups=0,g.ungatedGroups=0,g.skippedBulkGroups=0,g.skippedUnknownGroups=0,g.protoMisses=0,g.protoFallbacks=0;let e=a?a.metadata||{}:null,t=(a&&Array.isArray(a.entries)?a.entries:[]).filter(e=>e&&tl.has(e.slug)&&"string"==typeof e.glb_path);if(!e||0===t.length)return void console.info("[trees] env manifest (tree GLB entries + δ_env) unavailable â tree layer inert (third presence gate).");let n=await ts("".concat(i,"/").concat("web_trees.json"));if(!n||c){n||c||console.info("[trees] web_trees.json absent â tree layer inert (presence-gated; first materializes at the \xa76d sitting).");return}
1if(!r)return void console.warn("[trees] no projector threaded â layer inert.");let o=Number.isFinite(e.unity_north_offset_degrees)?e.unity_north_offset_degrees:0,d=Number.isFinite(e.meters_per_unit)&&e.meters_per_unit>0?e.meters_per_unit:8.3333,m=[];for(let e of Array.isArray(n.variants)?n.variants:[]){let t=function(e){if("string"!=typeof e)return null;let t=e.split("|");if(t.length<3)return null;let n=Number(t[1]);return{meshName:t[0],submesh:Number.isFinite(n)?n:0,materialName:t.slice(2).join("|")}}(e&&e.variant),n=e&&Array.isArray(e.groups)?e.groups:[],r=[];for(let e of n){let t=function(e){let t=e?e.year_start:null;if(null!=t&&Number.isFinite(Number(t))&&Number(t)>0)return"gated";let n=e&&"string"==typeof e.source_group?e.source_group:"";return n.startsWith("GeneratedTrees__")?"ungated":ti.has(n)?"skip-bulk":"skip-unknown"}(e);if("gated"===t)g.gatedGroups++;else if("ungated"===t)g.ungatedGroups++;else if("skip-bulk"===t){g.skippedBulkGroups++;continue}else{g.skippedUnknownGroups++,console.warn("[trees] null-year group '".concat(e&&e.source_group,"' matches no known class â SKIPPED (classify deliberately before rendering)."));continue}let n=Array.isArray(e.instances)?e.instances:[];n.length>0&&r.push({cls:t,group:e,instances:n})}r.length>0&&t&&m.push({key:t,meshName:e.mesh_name||t.meshName,rendered:r})}if(0===m.length){g.present=!0,console.info("[trees] web_trees.json present but nothing to render (all groups bulk-skipped).");return}let y=await k(t);if(c)return;if(!y)return void console.warn("[trees] tree GLB load failed â tree layer inert.");for(let e of m){let t=function(e,t){let n=e.get("".concat(t.meshName,"|").concat(t.submesh));if(!n||0===n.length)return null;let r=n.find(e=>e.materialName===t.materialName);return r?{...r,fallback:!1}:(console.warn("[trees] variant '".concat(t.meshName,"|").concat(t.submesh,"|").concat(t.materialName,"': ")+"material name unmatched in the GLB (have: ".concat(n.map(e=>e.materialName).join(", "),") ")+"â first prototype used (fallback)."),{...n[0],fallback:!0})}(y,e.key);if(!t){g.protoMisses++,console.warn("[trees] no prototype for variant '".concat(e.key.meshName,"|").concat(e.key.submesh,"|").concat(e.key.materialName,"' â variant skipped."));continue}t.fallback&&g.protoFallbacks++,function(e,t,n,i){var l,a,o,d,c;let m=e.rendered.reduce((e,t)=>e+t.instances.length,0);if(0===m)return;let y=t.geometry.clone(),b=et(y,t.material);b.color&&b.color.setRGB(1,1,1),b.vertexColors=!0,function(e){let t=e.onBeforeCompile;e.onBeforeCompile=e=>{"function"==typeof t&&t(e),e.uniforms.uYear=h,e.vertexShader=e.vertexShader.replace("#include <common>","#include <common>\nattribute float aYearStart;\nvarying float vTreeYearStart;").replace("#include <begin_vertex>","#include <begin_vertex>\nvTreeYearStart = aYearStart;"),e.fragmentShader=e.fragmentShader.replace("#include <common>","#include <common>\nuniform float uYear;\nvarying float vTreeYearStart;").replace("#include <clipping_planes_fragment>","#include <clipping_planes_fragment>\nif (vTreeYearStart > uYear + 0.5) discard;")};let n=e.customProgramCacheKey?e.customProgramCacheKey.bind(e):()=>"";e.customProgramCacheKey=()=>"".concat(n(),"|treeYear-v1")}(b);let w=new v.ZLX(y,b,m);w.name="trees:".concat(e.key.meshName,"|").concat(e.key.submesh),w.frustumCulled=!1,ta&&(w.receiveShadow=!0),w.instanceColor=new v.uWO(new Float32Array(3*m),3);let x=new v.uWO(new Float32Array(m),1);y.setAttribute("aYearStart",x);let k=(l=t.material)&&l.color&&Number.isFinite(l.color.r)?[l.color.r,l.color.g,l.color.b]:null,S=new v.kn4,M=new v.PTz,I=new v.Pq0,C=new v.Pq0,_=new v.Pq0(0,1,0),L=0;for(let t of e.rendered){let e=(a=t.group,"gated"!==t.cls?0:(0,es.FR)(Number(a.year_start)));for(let l of t.instances){if(!l||!Number.isFinite(l.lng)||!Number.isFinite(l.lat))continue;let[t,a]=r(l.lng,l.lat),u=((Number.isFinite(l.y)?l.y:0)-s)*i;I.set(t,u,a),M.setFromAxisAngle(_,(o=n,d=l.rot_deg,-((Number.isFinite(o)?o:0)+(Number.isFinite(d)?d:0))*tr));let p=Array.isArray(l.scale)?l.scale:[1];if(p.length>=3)C.set(p[0]*i,p[1]*i,p[2]*i);else{let e=(Number.isFinite(p[0])?p[0]:1)*i;C.set(e,e,e)}S.compose(I,M,C),w.setMatrixAt(L,S);let f=(Array.isArray(c=l.color)&&!(c.length<3)&&Number.isFinite(c[0])&&Number.isFinite(c[1])&&Number.isFinite(c[2])?[c[0],c[1],c[2]]:null)||k||[1,1,1];w.instanceColor.setXYZ(L,f[0],f[1],f[2]),x.setX(L,e),L++}}w.count=L,g.instances+=L,g.variants++,p.push(y),f.push(b),u.add(w)}(e,t,o,d)}for(let e of y.values())for(let t of e)try{t.geometry.dispose()}catch(e){}g.present=!0;let b=l?l():null;Number.isFinite(b)&&S(b),console.info("[trees] resident: ".concat(g.variants," variants, ").concat(g.instances," instances ")+"(".concat(g.gatedGroups," gated + ").concat(g.ungatedGroups," ungated-generated groups; ")+"".concat(g.skippedBulkGroups," bulk groups skipped â env GLBs render those; ")+"".concat(g.skippedUnknownGroups," unknown skipped)."))}let y=null,b=new Promise(e=>{t=e});function x(){return c?(t(),Promise.resolve()):(y||(y=m().catch(e=>{console.error("[trees] load FAILED â tree layer missing:",e)}).finally(()=>{t(),g.present&&0!==g.variants||c||(y=null)})),y)}async function k(e){let t=new w.GLTFLoader,n=new Map,r=!1;for(let l of e){let e,a="".concat(i,"/").concat(l.glb_path.replace(/^\/+/,""));try{e=await t.loadAsync(a)}catch(e){console.warn("[trees] failed to load ".concat(a," (prototypes from this GLB unavailable):"),e);continue}if(c)return to(e.scene),null;r=!0;let o=e.parser&&e.parser.json?e.parser.json:null,s=e.parser?e.parser.associations:null;if(!o||!s){console.warn("[trees] ".concat(a,": parser associations unavailable â prototypes from this GLB unusable.")),to(e.scene);continue}e.scene.traverse(e=>{if(!e.isMesh||!e.geometry)return;let t=s.get(e);if(!t||!Number.isFinite(t.meshes))return;let r=o.meshes&&o.meshes[t.meshes];if(!r)return;let i=Number.isFinite(t.primitives)?t.primitives:0,a="string"==typeof r.name?r.name:"",d=r.primitives&&r.primitives[i],u=d&&Number.isFinite(d.material)?d.material:null,c=null!=u&&o.materials&&o.materials[u]&&"string"==typeof o.materials[u].name?o.materials[u].name:"",p="".concat(a,"|").concat(i),f=n.get(p);f||(f=[],n.set(p,f)),f.some(e=>e.materialName===c)||f.push({materialName:c,geometry:e.geometry.clone(),material:Array.isArray(e.material)?e.material[0]:e.material,slug:l.slug})}),to(e.scene)}return r?n:null}function S(e){Number.isFinite(e)&&(h.value=e)}return d||x(),{group:u,ready:b,activate:x,setYearIndex:S,stats:function(){return{...g,yearIdx:h.value,activated:!!y}},dispose:function(){if(!c){for(let e of(c=!0,t(),u.parent&&u.parent.remove(u),p))try{e.dispose()}catch(e){}for(let e of f)try{e.dispose()}catch(e){}p.length=0,f.length=0}}}}(t.scene,{project:nM,dataBase:L,envManifest:t4,getYearIdx:()=>B.get().year,deferLoad:!0});n3.group.visible=!0===B.get().treesEnabled;let n5=nD?[n0.group,n1.group,n2.group,n3.group,nD.group]:[n0.group,n1.group,n2.group,n3.group];"function"==typeof t.setShadowWatchGroups&&t.setShadowWatchGroups(n5),Q=(J=n5.slice()).map(()=>-1),"function"==typeof t.setOnInvalidate&&t.setOnInvalidate($);let n6=()=>$(),n4={orbit:null};t.controls.addEventListener("change",n6),t.controls.addEventListener("start",nz);let n8=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.markers||null,i=n.heroesGroup||null,l=n.tiles||null,a=("function"==typeof n.redirectFn&&n.redirectFn,null),o=new v.tBo,s=new v.I9Y,d=!!(t&&"function"==typeof t.addEventListener);function u(e){let n=t.getBoundingClientRect(),r=n.width||1,i=n.height||1;s.x=(e.clientX-n.left)/r*2-1,s.y=-(2*((e.clientY-n.top)/i))+1}function c(){if(o.setFromCamera(s,e),i){let e=o.intersectObject(i,!0);if(e.length>0){let t=function(e){if(!e||!e.object)return null;let t=e.object;for(;t;){if(t.userData&&null!=t.userData.id)return String(t.userData.id);if(t=t.parent,i&&t===i){if(t.userData&&null!=t.userData.id)return String(t.userData.id);break}}return null}(e[0]);if(null!=t)return{kind:"hero",id:t,buildingIndex:null}}}if(l&&l.group){let e=o.intersectObject(l.group,!0);if(e.length>0){let t=l.resolveHits(e);if(t&&null!=t.buildingId)return{kind:"tile",id:String(t.buildingId),buildingIndex:null}}}let t=r&&r.mesh;if(t){let e=o.intersectObject(t,!1);if(e.length>0){let t=function(e){if(!e||!Number.isInteger(e.instanceId)||!r||"function"!=typeof r.getBuildingId)return null;let t=r.getBuildingId(e.instanceId);return null!=t?String(t):null}(e[0]);if(null!=t)return{kind:"marker",id:t,buildingIndex:null}}}return null}function p(e){let t=x;if(x=null,t&&Math.hypot(e.clientX-t.x,e.clientY-t.y)>6)return;u(e);let n=c();a&&a(n?n.id:null,{clientX:e.clientX,clientY:e.clientY})}let f=null,h=0,g=null;function m(e){if(!f)return;if(0!==e.buttons){null!=g&&(g=null,f(null,null));return}let t=performance.now();if(t-h<33)return;h=t,u(e);let n=c();g=n?n.id:null,f(g,null!=g?{clientX:e.clientX,clientY:e.clientY}:null)}function y(){f&&null!=g&&(g=null,f(null,null))}let b=null,w=null,x=null;function k(e){0===e.button&&(x={x:e.clientX,y:e.clientY,t:performance.now()}),2===e.button&&(w={x:e.clientX,y:e.clientY,t:performance.now()})}function S(e){if(e.preventDefault(),!b)return;let t=w;if(w=null,!t||performance.now()-t.t>450||Math.hypot(e.clientX-t.x,e.clientY-t.y)>6)return;u(e);let n=c();b(n?n.id:null,{clientX:e.clientX,clientY:e.clientY})}return d&&(t.addEventListener("click",p),t.addEventListener("pointermove",m),t.addEventListener("pointerleave",y),t.addEventListener("pointerdown",k),t.addEventListener("contextmenu",S)),{onSelect:function(e){a="function"==typeof e?e:null}
1,onHover:function(e){f="function"==typeof e?e:null},onContext:function(e){b="function"==typeof e?e:null},setMarkers:function(e){r=e||null},setHeroesGroup:function(e){i=e||null},setTiles:function(e){l=e||null},setRedirectFn:function(e){},dispose:function(){d&&(t.removeEventListener("click",p),t.removeEventListener("pointermove",m),t.removeEventListener("pointerleave",y),t.removeEventListener("pointerdown",k),t.removeEventListener("contextmenu",S)),a=null,f=null,b=null}}}(t.camera,t.renderer.domElement,{markers:nQ,redirectFn:ek.V2,keyTarget:z});n8.setHeroesGroup(n0.group),nD&&n8.setTiles(nD.pickApi);let n9=["activeFieldId","corpusMode","glossarySelection","glossaryIsolate","legendHidden","filters","gradation","backdrop","fieldSourceOverrides"];function n7(){let e=B.get();n0.repaint(nR,e),nD&&nD.repaint(nR,e),nQ.repaint(nR,e);let t=null!=e.activeFieldId||null!=nP,n=!(e.backdrop&&!1===e.backdrop.grayBackdrop);N(t&&n?1:0),$()}function re(e){nQ.setYearIndex(e),n0.applyYear(e),nD&&nD.applyYear(e),n2.applyYear(e),n3.setYearIndex(e),$()}function rt(e){let t=null;if(null!=e&&nT&&"function"==typeof nT.getDevelopmentMemberIds)try{t=nT.getDevelopmentMemberIds(e)}catch(e){t=null}n0.setSelected(e,t),nD&&nD.setSelected(e,t),$()}let rn=!1;function rr(e){let n=e&&Number.isFinite(e.azimuthDeg)?e.azimuthDeg:i.ht.azimuthDeg;if(!rn&&n===i.ht.azimuthDeg)return;rn=!0;let[r,l,a]=function(e){let t=e*Math.PI/180,n=Math.cos(ny);return[n*Math.cos(t),Math.sin(ny),n*Math.sin(t)]}(n);t.keyLight&&"function"==typeof t.setSunDirection?t.setSunDirection(r,l,a):X(r,l,a),$()}let ri=B.subscribe((e,n)=>{if("activeFieldId"in n&&e.legendHidden&&e.legendHidden.size>0&&B.set({legendHidden:new Set}),"activeFieldId"in n&&null==e.activeFieldId&&null!=e.selectedBuildingId){let t=e.selectedBuildingId;"function"==typeof n0.hasResidentFor&&n0.hasResidentFor(t)||nD&&nD.hasVisibleFor(t)||"function"==typeof nQ.hasVisibleMarkerFor&&nQ.hasVisibleMarkerFor(t)||B.set({selectedBuildingId:null})}if("year"in n&&re(e.year),"corpusMode"in n){nQ.setCorpusMode(e.corpusMode);let t=nm(eJ,e.corpusMode);t&&rH.api.setYearBuckets(t)}for(let e of n9)if(e in n){n7();break}if("selectedBuildingId"in n&&rt(e.selectedBuildingId),"lighting"in n&&rr(e.lighting),"backdrop"in n){let n=e.backdrop||{};t.setFog(!1!==n.fog),t.setSun(!1!==n.sun),T(+(!1===n.sun)),$()}if("cameraMode"in n){if(ee&&"drone"===e.cameraMode){if(e_(),!ee.isActive()){let e=t.controls,n=e.enableDamping;e.enableDamping=!1,e.update(),e.enableDamping=n,en=t.renderer.domElement.style.touchAction,t.renderer.domElement.style.touchAction="none"}ee.setActive(!0)}else ee&&(ee.setActive(!1),null!=en&&(t.renderer.domElement.style.touchAction=en,en=null));$()}}),rl=await ne,ra=function(e,t){if(!e||"object"!=typeof e)return null;let n=[],r={azimuthDeg:null,fov:null,sky:null,notes:n},i=e.sun&&"object"==typeof e.sun?e.sun:null;if(i){let e=Number(i.azimuth_web_deg);Number.isFinite(e)?.05>=Math.abs(eL(e-t.defaultAzimuthDeg))?n.push("sun: azimuth ".concat(e.toFixed(3),"\xb0 â default (â¤").concat(.05,"\xb0) â skip-at-default")):(r.azimuthDeg=e,n.push("sun: azimuth seeded ".concat(e.toFixed(3),"\xb0 (default ").concat(t.defaultAzimuthDeg.toFixed(3),"\xb0)"))):n.push("sun: azimuth_web_deg not finite â skipped"),n.push("sun: color_linear/intensity NOT consumed (the Lane-B key lock)")}else n.push("sun: block absent â azimuth default holds");let l=e.camera&&e.camera.globe&&"object"==typeof e.camera.globe?e.camera.globe:null;if(l){let e=Number(l.fov);Number.isFinite(e)?e<20||e>90?n.push("fov: ".concat(e," outside [").concat(20,",").concat(90,"] â skipped")):.01>=Math.abs(e-t.currentFov)?n.push("fov: ".concat(e," â current ").concat(t.currentFov," â skip-at-default")):(r.fov=e,n.push("fov: seeded ".concat(e," (was ").concat(t.currentFov,")"))):n.push("fov: not finite â skipped")}let a=e.sky&&"object"==typeof e.sky?e.sky:null;if(a)if("skybox-material"!==a.source)n.push("sky: source='".concat(a.source,"' â skip-always (only skybox-material is comparable)"));else{let e=eA(a.top),t=eA(a.bottom);e&&t?eN(e,eI)||eN(t,eC)?n.push("sky: skybox-material differs from the web-owned pair â NOT consumed (registered divergence 2026-08-03, the open-sky retune)"):n.push("sky: matches the web-owned pair (â¤0.5/255 per channel) â NOT consumed (web-owned)"):n.push("sky: top/bottom malformed â skipped");let r=Number(a.mult),i=Number(a.pwer);(Number.isFinite(r)&&Math.abs(r-1)>1e-6||Number.isFinite(i)&&Math.abs(i-1)>1e-6)&&n.push("sky: mult/pwer (".concat(a.mult,"/").concat(a.pwer,") not consumed (dome is a 2-stop gradient)"))}else n.push("sky: block absent â web-owned constants hold");return e.ambient&&n.push("ambient: SEED-NOTHING (deliberate divergence â trilight->hemi is lossy; the rig is Jack-tuned, Lane B)"),!0===e.tonemapping&&n.push("WARN tonemapping=true in Unity â the web renders untonemapped (registered divergence)"),r}(rl,{defaultAzimuthDeg:i.ht.azimuthDeg,currentFov:t.camera.fov});if(ra){let e=[];null!=ra.azimuthDeg&&(B.set({lighting:{...B.get().lighting,azimuthDeg:ra.azimuthDeg}}),e.push("azimuth ".concat(ra.azimuthDeg.toFixed(2),"\xb0"))),null!=ra.fov&&(t.camera.fov=ra.fov,t.camera.updateProjectionMatrix(),$(),e.push("fov ".concat(ra.fov))),ra.sky&&"function"==typeof t.setSkySeed&&(t.setSkySeed(ra.sky.top,ra.sky.bottom),e.push("sky pair")),console.info("[renderConfig] consumed: ".concat(e.length?e.join(", "):"nothing to seed"," ")+"| ".concat(ra.notes.join(" | ")))}else console.info("[renderConfig] render_config.json absent â defaults hold (presence-gated; first materializes at the \xa76d sitting).");ey=t.camera.fov;let ro=function(e,t){let n=e&&e.camera&&e.camera.globe&&"object"==typeof e.camera.globe?e.camera.globe:null;if(!n)return null;let r=Number.isFinite(t&&t.metersPerUnit)&&t.metersPerUnit>0?t.metersPerUnit:8.3333,i=[],l={minDistance:null,maxDistance:null,notes:i},a=Number(n.dolly_min),o=Number(n.dolly_max);return Number.isFinite(a)&&a>0&&Number.isFinite(o)&&o>a?(l.minDistance=a*r,l.maxDistance=o*r,i.push("orbit clamps seeded: ".concat(l.minDistance.toFixed(1),"m .. ").concat(Math.round(l.maxDistance),"m (dolly ").concat(a,"/").concat(o," x mpu)"))):i.push("orbit clamps: dolly_min/max absent or degenerate â skipped"),"hardcoded"===n.clamp_source?i.push("polar clamps: clamp_source=hardcoded (0/90 mirrors the controller literals) â SKIPPED (would loosen the web 89.1\xb0 guard)"):(null!=n.min_polar_deg||null!=n.max_polar_deg)&&i.push("polar clamps: present (source=".concat(n.clamp_source,") but unconsumed
1in v1 â no web mapping law yet")),i.push("feel params (dampening/sensitivity): SKIPPED â no principled unit map (registered divergence; C8 arbitrates)"),i.push("fov: rides computeRenderPlan (one seeding site)"),l}(rl,{metersPerUnit:t7});if(ro&&(null!=ro.minDistance&&(t.controls.minDistance=ro.minDistance),null!=ro.maxDistance&&(t.controls.maxDistance=ro.maxDistance),console.info("[globeSeed] ".concat(ro.notes.join(" | "))),$()),(()=>{try{return"unity"===new URLSearchParams(location.search).get("cam")}catch(e){return!1}})()){let e=rl&&rl.camera&&rl.camera.globe;if(e)if(nI&&th){let n=function(e,t){if(!e||"object"!=typeof e||!t||"function"!=typeof t.gpsToUnity||"function"!=typeof t.projectUnity)return null;let n=Number.isFinite(t.metersPerUnit)&&t.metersPerUnit>0?t.metersPerUnit:8.3333,r=Number(e.home_lng),i=Number(e.home_lat),l=Number(e.home_altitude_unity_world_y),a=Number(e.home_yaw_deg),o=Number(e.home_pitch_deg);if(![r,i,l,a,o].every(Number.isFinite))return null;let s=t.gpsToUnity(i,r);if(!Array.isArray(s)||s.length<2||!Number.isFinite(s[0])||!Number.isFinite(s[1]))return null;let d=eL(o)*Math.PI/180,u=a*Math.PI/180,c=[Math.sin(u)*Math.cos(d),-Math.sin(d),Math.cos(u)*Math.cos(d)],p=[s[0]+120*c[0],s[1]+120*c[2]],f=l+120*c[1],h=t.projectUnity(s[0],s[1]),g=t.projectUnity(p[0],p[1]);if(!Array.isArray(h)||!Array.isArray(g))return null;let m=Number.isFinite(t&&t.datumUnits)?t.datumUnits:50;return{position:[h[0],(l-m)*n,h[1]],target:[g[0],(f-m)*n,g[1]]}}(e,{gpsToUnity:th,projectUnity:nI.projectUnity,metersPerUnit:t7,datumUnits:t4&&t4.metadata&&Number.isFinite(t4.metadata.ground_datum_units)?t4.metadata.ground_datum_units:void 0});n?(t.camera.position.set(n.position[0],n.position[1],n.position[2]),t.controls.target.set(n.target[0],n.target[1],n.target[2]),$(),console.info("[globeSeed] ?cam=unity â home pose applied: cam(".concat(n.position.map(e=>e.toFixed(1)).join(", "),") ")+"-> target(".concat(n.target.map(e=>e.toFixed(1)).join(", "),") (the C8 matched-angle instrument)."))):console.info("[globeSeed] ?cam=unity â home pose fields malformed, skipped.")}else console.info("[globeSeed] ?cam=unity â unity frame INACTIVE (fallback/control route), home pose skipped.");else console.info("[globeSeed] ?cam=unity â render_config camera.globe absent, home pose skipped.")}ee=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.camera||null,n=e.domElement||null,r=e.controls||null,i=e.keyTarget||window,o="function"==typeof e.invalidate?e.invalidate:()=>{},s="function"==typeof e.onExitSettle?e.onExitSettle:null,d="function"==typeof e.getConfig?e.getConfig:()=>({}),u=!1,p=!1,f=83.333,h=3.5,g=.0022,m=!1,y=0,b=0,w=new Set,x={strafe:0,forward:0,vertical:0},k={strafe:0,forward:0,vertical:0},S=new v.Pq0,M=!1,I=NaN,C=null,_=0,L=0;function F(){t&&(tu.set(b,y,0,"YXZ"),t.quaternion.setFromEuler(tu))}function A(e){if(u&&!p&&(null==e.button||0===e.button)&&(C=e.pointerId,_=Number.isFinite(e.clientX)?e.clientX:0,L=Number.isFinite(e.clientY)?e.clientY:0,"function"==typeof n.setPointerCapture))try{n.setPointerCapture(e.pointerId)}catch(e){}}function N(e){if(!u||null==C||e.pointerId!==C)return;let t=Number.isFinite(e.clientX)?e.clientX:_,n=Number.isFinite(e.clientY)?e.clientY:L,r=t-_,i=n-L;_=t,L=n,(0!==r||0!==i)&&(y-=r*g,b=Math.min(tc,Math.max(-tc,b-i*g)),F(),U(),o(),"function"==typeof e.preventDefault&&e.preventDefault())}function E(e){if(null!=C&&(!e||null==e.pointerId||e.pointerId===C)){if(n&&"function"==typeof n.releasePointerCapture)try{n.releasePointerCapture(C)}catch(e){}C=null}}function D(){n&&"function"==typeof n.removeEventListener&&(n.removeEventListener("pointerdown",A),n.removeEventListener("pointermove",N),document.removeEventListener("pointerup",E),document.removeEventListener("pointercancel",E),C=null)}function T(){for(let e of(x.strafe=0,x.forward=0,x.vertical=0,w)){let t=a[e];t&&(x[t[0]]+=t[1])}}function P(e){if(!(!u||e.altKey||c(void 0,e.target))){if(-1!==l.droneBoost.codes.indexOf(e.code)){m=!0;return}a[e.code]&&(w.add(e.code),T(),o(),e.preventDefault())}}function B(e){if(-1!==l.droneBoost.codes.indexOf(e.code)){m=!1;return}a[e.code]&&(w.delete(e.code),T())}function R(){w.clear(),T(),m=!1,k.strafe=0,k.forward=0,k.vertical=0}function H(){i&&"function"==typeof i.removeEventListener&&(i.removeEventListener("keydown",P),window.removeEventListener("keyup",B),window.removeEventListener("blur",R),window.removeEventListener("pagehide",R),document.removeEventListener("visibilitychange",R))}function U(){if(!r||!r.target||!t)return;let e=t.getWorldDirection(td);r.target.set(t.position.x+500*e.x,t.position.y+500*e.y,t.position.z+500*e.z)}return{isActive:()=>u,setActive:function(e){let l=!!e;if(l!==u&&!p&&(!l||t&&n)){if(u=l)!function(){let e=d()||{},t=e.drone&&"object"==typeof e.drone?e.drone:{},n=Number.isFinite(e.metersPerUnit)&&e.metersPerUnit>0?e.metersPerUnit:8.3333,r=Number.isFinite(t.move_speed)&&t.move_speed>0?t.move_speed:10,i=Number.isFinite(t.look_speed)&&t.look_speed>0?t.look_speed:.09;h=Number.isFinite(t.high_speed_multiplier)&&t.high_speed_multiplier>0?t.high_speed_multiplier:3.5,f=r*n,g=i/.09*.0022}(),r&&r.target?(S.copy(r.target),I=t.position.distanceTo(r.target),M=!0):(M=!1,I=NaN),!function(){if(!t||"function"!=typeof t.getWorldDirection)return;let e=t.getWorldDirection(td),n=function(e,t,n){let r=Math.hypot(e,t,n)||1;return{yaw:Math.atan2(-e,-n),pitch:Math.min(tc,Math.max(-tc,Math.asin(Math.min(1,Math.max(-1,t/r)))))}}(e.x,e.y,e.z);Math.hypot(e.x,e.z)>=1e-6&&(y=n.yaw),b=n.pitch,F()}(),r&&(r.enabled=!1),i&&"function"==typeof i.addEventListener&&(i.addEventListener("keydown",P),window.addEventListener("keyup",B),window.addEventListener("blur",R),window.addEventListener("pagehide",R),document.addEventListener("visibilitychange",R)),n&&"function"==typeof n.addEventListener&&(n.addEventListener("pointerdown",A),n.addEventListener("pointermove",N),document.addEventListener("pointerup",E),document.addEventListener("pointercancel",E));else{R(),H(),D();let e=t?function(){let e=t.getWorldDirection(td),n=-Math.sin(y),i=-Math.cos(y);return function(e){let t=Number.isFinite(e.minDist)?e.minDist:83.33,n=Number.isFinite(e.maxDist)?e.maxDist:20833;function r(r){let i=r.x-e.px,l=r.y-e.py,a=r.z-e.pz;"saved"===r.source&&.001>Math.hypot(i,a)&&(r.x+=.001*e.hx,r.z+=.001*e.hz,i=r.x-e.px,a=r.z-e.pz);let o=Math.hypot(i,l,a);if(o>0&&o<t){let n=t/o;r.x=e.px+i*n,r.y=e.py+l*n,r.z=e.pz+a*n}else if(o>n){let t=n/o;r.x=e.px+i*t,r.y=e.py+l*t,r.z=e.pz+a*t}return r}let i=e.sx-e.px,l=e.sy-e.py,a=e.sz-e.pz;if(e.savedValid){let t=i*e.fx+l*e.fy+a*e.fz,n=Math.hypot(i,l,a),o=Math.hypot(i,a),s=e.py-e.sy;if(t>0&&s>=Math.max(2,o/tp*1.15)&&n<=6e3)return r({x:e.sx,y:e.sy,z:e.sz,source:"saved"})}if(e.fy<-.05&&e.py>5){let t=(0-e.py)/e.fy;if(t<=6e3)return r({x:e.px+e.fx*t,y:0,z:e.pz+e.fz*t,source:"ground"})}let o=Number.isFinite(e.savedRadius)?Math.min(3e3,Math.max(200,e.savedRadius)):500,s=Math.min(0,e.py-o/tp*1.15);return r({x:e.px+e.hx*o,y:s,z:e.pz+e.hz*o,source:"forward"})}({px:t.position.x,py:t.position.y,pz:t.position.z,fx:e.x,fy:e.y,fz:e.z,hx:n,hz:i,savedValid:M,sx:S.x,sy:S.y,sz:S.z,savedRadius:I,minDist:r?r.minDistance:NaN,maxDist:r?r.maxDistance:NaN})}():null;r&&(r.enabled=!0),e&&(s?s(e):r&&r.target&&r.target.set(e.x,e.y,e.z)),M=!1}o()}},update:function(e){if(!u||!t)return;let n=Number.isFinite(e)?e:.016,r=Math.min(1,Math.max(-1,x.strafe+k.strafe)),i=Math.min(1,Math.max(-1,x.forward+k.forward)),l=Math.min(1,Math.max(-1,x.vertical+k.vertical));if(0===r&&0===i&&0===l)return;let a=f*(m?h:1)*n,s=t.getWorldDirection(td);t.position.x+=(s.x*i+Math.cos(y)*r)*a,t.position.y+=(s.y*i+l)*a,t.position.z+=(s.z*i+-Math.sin(y)*r)*a,t.position.y<-6&&(t.position.y=-6),U(),o()},setMoveAxes:function(e,t){k.strafe=Number.isFinite(e)?Math.min(1,Math.max(-1,e)):0,k.forward=Number.isFinite(t)?Math.min(1,Math.max(-1,t)):0,(0!==k.strafe||0!==k.forward)&&o()},setVertical:function(e){k.vertical=Number.isFinite(e)?Math.min(1,Math.max(-1,e)):0,0!==k.vertical&&o()},clearMoveState:R,dispose:function(){if(!p){p=!0;try{R(),u&&(u=!1,H(),D(),r&&(r.enabled=!0))}catch(e){}}}}}({camera:t.camera,domElement:t.renderer.domElement,controls:t.controls,keyTarget:z,invali
1date:$,onExit:()=>B.set({cameraMode:"globe"}),onExitSettle:function(e){if(!(e&&["x","y","z"].every(t=>Number.isFinite(e[t]))))return;e_();let n=t.controls,r=t.camera;if("function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches){n.target.set(e.x,e.y,e.z),r.lookAt(n.target),$();return}r.updateMatrixWorld();let i=r.matrixWorld.elements,l=-i[8],a=-i[9],o=-i[10],s=Math.hypot(l,a,o)||1;l/=s,a/=s,o/=s;let d=Math.hypot(e.x-r.position.x,e.y-r.position.y,e.z-r.position.z)||1;eM={kind:"pose",settle:!0,t0:performance.now(),dur:600,sx:r.position.x+l*d,sy:r.position.y+a*d,sz:r.position.z+o*d,ex:e.x,ey:e.y,ez:e.z,cx:r.position.x,cy:r.position.y,cz:r.position.z,px:r.position.x,py:r.position.y,pz:r.position.z,hadDamping:n.enableDamping,onDone:null},n.enableDamping=!1,$()},getConfig:()=>({drone:rl&&rl.camera?rl.camera.drone:null,metersPerUnit:t7})}),"drone"===B.get().cameraMode&&ee.setActive(!0);let rs=[],rd=(e,t)=>(rs.push({name:e,handle:t}),t),ru=rd("toasts",function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let n=(0,h.h)("div",{class:"dv-toast-host","aria-live":"polite"}),r=[];function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==e)return a();let i=String(e);if(""===i.trim())return a();let s=(0,h.h)("div",{class:"dv-toast"},i);n.appendChild(s);let d={el:s,fadeTimer:null,removeTimer:null,sticky:!0===t.sticky};return r.push(d),d.sticky||l(d),{update(e){if(-1===r.indexOf(d)||null==e)return;let t=String(e);""!==t.trim()&&(d.el.textContent=t,d.el.classList.remove("dv-toast--fading"),d.sticky||l(d))},finalize(e){-1!==r.indexOf(d)&&(null!=e&&""!==String(e).trim()&&(d.el.textContent=String(e)),d.sticky=!1,d.el.classList.remove("dv-toast--fading"),l(d))},dismiss(){o(d)}}}function l(e){e.fadeTimer&&clearTimeout(e.fadeTimer),e.removeTimer&&clearTimeout(e.removeTimer),e.fadeTimer=setTimeout(()=>{e.el.classList.add("dv-toast--fading"),e.removeTimer=setTimeout(()=>{o(e)},300)},2600)}function a(){return{update(){},finalize(){},dismiss(){}}}function o(e){let t=r.indexOf(e);-1!==t&&r.splice(t,1),e.el.parentNode===n&&n.removeChild(e.el)}function s(e){i(e&&e.detail?e.detail.message:void 0)}document.addEventListener("dv:toast",s);let d={push:i,destroy(){for(let e of(document.removeEventListener("dv:toast",s),r.slice()))e.fadeTimer&&clearTimeout(e.fadeTimer),e.removeTimer&&clearTimeout(e.removeTimer);r.length=0,(0,h.I)(n),nu===d&&(nu=null)}};return nu=d,{el:n,api:d}}(B,nT)),rc=e=>ru.api.push(e),rp=null,rf=null,rh=null,rg=null,rm=!1,ry=null,rb=document.createElement("div");function rv(e){e.preventDefault(),il||rc("3D view lost its graphics context â reload the page to restore it.")}function rw(){il||$()}rb.className="dv-updates-key-slot",t.renderer.domElement.addEventListener("webglcontextlost",rv),t.renderer.domElement.addEventListener("webglcontextrestored",rw);let rx=D.corpus?rd("corpusToggle",function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let n=e.get().corpusMode,r=(0,t_.T)(tL.map(e=>e.label),tF(n),a,{ariaLabel:"Dataset"}),i=(0,h.h)("div",{class:"dv-corpus-toggle"},(0,h.h)("span",{class:"dv-corpus-toggle-eyebrow"},"DATASET"),r.el),l=e.subscribe((e,t)=>{"corpusMode"in t&&r.setSelected(tF(t.corpusMode))});function a(t){let n=tL[t];n&&e.set({corpusMode:n.mode})}return{el:i,api:{destroy(){l()},getMode:()=>e.get().corpusMode,setMode(e){a(tF(e))}}}}(B,nT,{toast:rc})):null,rk=(()=>{try{return new URLSearchParams(location.search).has("dev")}catch(e){return!1}})(),rS=D.dataLayers?rd("dataLayer",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=!1,{toast:i}=n,l=!0===n.devMode,a=(0,h.h)("div",{class:"dv-datalayer"}),o=(0,h.h)("div",{class:"dv-datalayer-root"},a),s=new Set;p();let d=e.subscribe((t,n)=>{if("corpusMode"in n)return void function(t){let n=e.get(),r=n.activeFieldId;if(!r)return p();let i=(0,ew.O)({corpusMode:t,fieldSourceOverrides:n.fieldSourceOverrides},r);if(!function(e,t){for(let n of g(t).categories)for(let t of n.fields)if(t.id===e)return!!t.eligible;return!1}(r,i))return e.set({activeFieldId:null});p()}(n.corpusMode);
1if("activeFieldId"in n){r=null==t.activeFieldId,p();return}"fieldSourceOverrides"in n&&p()});function u(e,n){if(null==e)return!1;let r=function(e,n){try{let r=t&&"function"==typeof t.getLegendModel?t.getLegendModel(e,n):null;if(r&&"object"==typeof r)return r}catch(e){console.error("[dataLayerWidget] getLegendModel threw:",e)}return null}(e,n);return!!r&&"glossary"===r.kind}function c(e,n,r){let{rows:i}=function(e,n,r,i){try{let r=t&&"function"==typeof t.getGlossaryValues?t.getGlossaryValues(e,n,"",i):null;if(r&&Array.isArray(r.rows))return r}catch(e){console.error("[dataLayerWidget] getGlossaryValues threw:",e)}return{rows:[],total:0}}(e,"Count","",n),l=new Set;for(let e of i){if(l.size>=r)break;l.add(e.value)}return l}function p(){let t=r;r=!1,(0,h.I)(a);let n=e.get(),i=n.corpusMode,o=n.activeFieldId;for(let e of(a.appendChild(f({id:null,label:"Natural city",corpusBadge:null,sparse:!1,isActive:null==o,baseEnter:t&&null==o},i)),g(i).categories)){if(!e.fields||0===e.fields.length)continue;let t=e.fields.filter(e=>!e.filterOnly),n=l?t:t.filter(e=>!e.internal);if(0===n.length)continue;let r=n.some(e=>o===e.id)||s.has(e.name);if(a.appendChild(function(e,t,n){return(0,h.h)("button",{type:"button",class:"dv-datalayer-eyebrow dv-datalayer-eyebrow--disclosure","aria-expanded":String(t),onClick:()=>{s.has(e)?s.delete(e):s.add(e),p()}},(0,h.h)("span",{class:"dv-datalayer-eyebrow-chevron"},t?"â¾":"â¸"),(0,h.h)("span",{class:"dv-datalayer-eyebrow-name"},e),(0,h.h)("span",{class:"dv-datalayer-eyebrow-count"},String(n)))}(e.name,r,n.length)),r)for(let e of n)a.appendChild(f({id:e.id,label:e.label,corpusBadge:e.corpusBadge,sparse:e.sparse,isActive:o===e.id},i))}}function f(n,r){var l;let{id:a,label:o,corpusBadge:s,sparse:d,isActive:p,baseEnter:f}=n,g=null==a,m=[(0,h.h)("div",{class:"dv-datalayer-row-main"},g?(0,h.h)("span",{class:"dv-datalayer-swatch","aria-hidden":"true"}):null,(0,h.h)("span",{class:"dv-datalayer-row-label"},o),s?(l=s,(0,h.h)("span",{class:"dv-datalayer-badge dv-datalayer-badge--".concat(l)},"core200"===l?"Public Record":"YIMBY")):null)];if(g&&p&&m.push((0,h.h)("div",{class:"dv-datalayer-row-detail"},"No data layers applied")),p&&null!=a&&"both"===r&&s){let e="core200"===s?"Public Record":"YIMBY";m.push((0,h.h)("div",{class:"dv-datalayer-precedence"},"".concat(e," takes precedence")))}return(0,h.h)("button",{type:"button",class:g?"dv-datalayer-row dv-datalayer-row--base".concat(f?" dv-datalayer-row--base-enter":""):"dv-datalayer-row","data-active":String(!!p),"aria-pressed":String(!!p),disabled:null!=a&&!!d,"aria-disabled":String(null!=a&&!!d),onClick:()=>{null!=a&&d||function(n){let r=e.get();if(r.activeFieldId===n)return;let l=r.activeFieldId,a=r.glossarySelection,o=(0,ew.O)(r,n),s=u(n,o)?c(n,o,12):new Set;if(e.set({activeFieldId:n,glossarySelection:s}),null!==n){var d;0===function(){try{let e=t&&"function"==typeof t.getMatchCounts?t.getMatchCounts():null;if(e&&"number"==typeof e.matched)return e}catch(e){console.error("[dataLayerWidget] getMatchCounts threw:",e)}return{matched:0,total:0}}().matched&&(e.set({activeFieldId:l,glossarySelection:a}),d="No buildings carry this data in the current dataset","function"==typeof i&&i(d))}}(a)}},...m)}function g(e){try{let n=t&&"function"==typeof t.getFieldCatalog?t.getFieldCatalog(e):null;if(n&&Array.isArray(n.categories))return n}catch(e){console.error("[dataLayerWidget] getFieldCatalog threw:",e)}return{categories:[]}}return{el:o,api:{destroy(){d()},reseedIfEmptyGlossary(){let t=e.get(),n=t.activeFieldId;if(null==n||t.glossarySelection&&t.glossarySelection.size>0)return;let r=(0,ew.O)(t,n);if(!u(n,r))return;let i=c(n,r,12);i.size>0&&e.set({glossarySelection:i})},refresh(){p()}}}}(B,nT,{toast:rc,devMode:rk})):null,rM=D.dataLayers?rd("gradation",function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let n=(0,h.h)("div",{class:"dv-gradation"}),r=null,i=null,l=null,a=null;s();let o=e.subscribe((e,t)=>{("activeFieldId"in t||"corpusMode"in t||"gradation"in t||"fieldSourceOverrides"in t)&&s()});function s(){(0,h.I)(n);let a=e.get(),{activeFieldId:o}=a;if(!o)return void d(t2);let s=function(e,n){try{if(t&&"function"==typeof t.getLegendModel)return t.getLegendModel(e,n)}catch(e){console.error("[gradationWidget] getLegendModel threw:",e)}return null}(o,(0,ew.O)(a,o)),p=s?s.kind:null;return s&&s.eligible&&p?"continuous"===p||"stepped"===p?void function(e){let t=e&&e.ramp?e.ramp:"stepped",a=t3(e&&Number.isFinite(e.steps)?e.steps:7),o=(0,h.h)("div",{class:"dv-gradation-eyebrow"},"RAMP");r=(0,t_.T)(t1.map(e=>e.label),function(e){let t=t1.findIndex(t=>t.ramp===e);return -1===t?0:t}(t),u,{ariaLabel:"Ramp style"});let s=function(e){let t=(0,h.h)("span",{class:"dv-gradation-steps-label"},"Color steps"),n=(0,h.h)("button",{type:"button",class:"dv-btn dv-gradation-stepper-btn","aria-label":"Decrease color steps",disabled:e<=2,"aria-disabled":String(e<=2),onClick:()=>c(e-1)},"â");(l=(0,tK.P)(String(e),{tone:"muted"})).el.classList.add("dv-gradation-steps-value");let r=(0,h.h)("button",{type:"button",class:"dv-btn dv-gradation-stepper-btn","aria-label":"Increase color steps",disabled:e>=12,"aria-disabled":String(e>=12),onClick:()=>c(e+1)},"+");return(0,h.h)("div",{class:"dv-gradation-steps-row"},t,(0,h.h)("div",{class:"dv-gradation-stepper"},n,l.el,r))}(a);i=(0,h.h)("div",{class:"dv-gradation-numeric"},o,r.el,s),n.appendChild(i)}(a.gradation):"categorical"===p?void d("Discrete colors per value."):"glossary"===p?void d("Open-ended values â pick up to 12 from the glossary to colorize; the rest gray."):void d(t2):void d(t2)}function d(e){a=(0,h.h)("div",{class:"dv-gradation-caption"},e),n.appendChild(a)}function u(t){let n=t1[t];
1if(!n)return;let r=e.get().gradation||{};e.set({gradation:{ramp:n.ramp,steps:t3(r.steps)}})}function c(t){let n=t3(t),r=e.get().gradation||{};n!==t3(r.steps)&&e.set({gradation:{ramp:r.ramp||"stepped",steps:n}})}return{el:n,api:{destroy(){o()},refresh(){s()}}}}(B,nT,{})):null,rI=D.dataLayers?rd("legend",function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{mountGlossaryPicker:i}=r,l=(0,h.h)("div",{class:"dv-legend"}),a=r.updatesKeyMirror||null,o=(0,h.h)("div",{class:"dv-legend-updates-paused"},"paused while building updates are lit"),s=(0,h.h)("div",{class:"dv-legend-updates-mirror"},o),d=!0,u=!1;function c(e){u=e;let t=!!(a&&"function"==typeof a.isLit&&a.isLit()),n=e&&t;n?(a.el&&a.el.parentNode!==s&&s.appendChild(a.el),s.parentNode!==l&&l.appendChild(s)):s.parentNode&&s.parentNode.removeChild(s);let r=l.closest?l.closest(".dv-root"):null;r&&(n&&d?r.setAttribute("data-has-legend",""):r.removeAttribute("data-has-legend"))}let p=null,f=null,m=null,y=null,b=[],v=function(){var e,t;let{initial:n,onControlsChange:r,copy:i}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},l={...tE,...i||{}},a=tP(n),o="function"==typeof r?r:null,s=(0,h.h)("div",{class:"dv-legend-controls"}),d=(0,h.h)("input",{type:"search",class:"dv-legend-search",placeholder:l.searchPlaceholder,"aria-label":l.searchLabel,value:a.search,onInput:function(e){let t=e&&e.target?String(e.target.value||""):"";t!==a.search&&y(function(e,t){let n=tP(e);return n.search="string"==typeof t?t:"",n.expanded=!1,n}(a,t))}}),u=(0,t_.T)(l.sortOptions,(e=a.sort,t=l.sortOptions,"A-Z"===e?Math.min(1,t.length-1):0),function(e){let t=1===e?"A-Z":tN;t!==a.sort&&y(function(e,t){let n=tP(e);return n.sort="A-Z"===t?"A-Z":tN,n}(a,t))},{ariaLabel:l.sortLabel}),c=(0,h.h)("div",{class:"dv-legend-controls-head"},d,u.el),p=null,f=(0,h.h)("div",{class:"dv-legend-controls-cull"}),g=(0,h.h)("div",{class:"dv-legend-controls-note"});function m(){y(function(e,t){let n=tP(e);return n.expanded=!0===t,n}(a,!a.expanded))}function y(e){a=e,b(),o&&o(v())}function b(){let e=tT(a.rows);if(s.hidden=!e,!e){(0,h.I)(f),g.hidden=!0;return}let t=function(e,t){let n=Array.isArray(e)?e:[],r=tP(t);if(!tT(n))return{total:0,shown:0,culled:0,cullable:!1};let i=tR(n.filter(e=>!tD(e)),r.search),l=tU(tH(i,r.sort),r);return{total:i.length,shown:l.length,culled:Math.max(0,i.length-l.length),cullable:i.length>12}}(a.rows,a);if((0,h.I)(f),t.cullable||a.expanded){let e=p||(p=(0,h.h)("button",{type:"button",class:"dv-legend-cull","aria-expanded":"false",onClick:m}));e.textContent=a.expanded?l.cullExpanded(t.culled,t.total):l.cullCollapsed(t.culled,t.total),e.setAttribute("aria-expanded",String(a.expanded)),f.appendChild(e)}let n=0===t.total&&!!a.search;g.textContent=n?l.noMatchText:"",g.hidden=!n}function v(){return tP(a)}return s.appendChild(c),s.appendChild(f),s.appendChild(g),b(),{el:s,api:{update(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};a=function(e,t,n){let r=tP(e);return r.rows=Array.isArray(t)?t.slice():[],r.exemptValues=tB(n),r}(a,e,t.exemptValues),d.value!==a.search&&(d.value=a.search),b()},reset(){a=function(e){let t=tP(e);return t.search="",t.expanded=!1,t}(a),d.value="",b()},getState:v,destroy(){o=null}}}}({onControlsChange:()=>{C()}}),w=e.get().activeFieldId;e.get().activeFieldId,k();let x=e.subscribe((t,n)=>{if("activeFieldId"in n){let t=e.get().legendHidden;if(n.activeFieldId,function(){let t=e.get().legendHidden;t instanceof Set&&0===t.size||e.set({legendHidden:new Set})}(),t instanceof Set&&t.size>0)return}"activeFieldId"in n||"corpusMode"in n||"fieldSourceOverrides"in n||"legendHidden"in n||"glossarySelection"in n||"glossaryIsolate"in n||"gradation"in n&&"glossary"!==f?k():"filters"in n&&function(){if(!m)return;let t=e.get();m.replaceChildren(...S(t,t.activeFieldId))}()});function k(){var r,a,o;L(),(0,h.I)(l),m=null,y=null,b=[];let s=e.get(),{activeFieldId:d}=s;if(w!==d&&(w=d,v.api.reset()),!d){I(tz),c(!1);return}c(!0),l.appendChild(function(n,r){let i=function(e,n){try{for(let r of t.getFieldCatalog(n).categories){let t=r.fields.find(t=>t.id===e);if(t)return t.label}}catch(e){}return String(e)}(r,n.corpusMode),l=(0,h.h)("button",{type:"button",class:"dv-legend-clear","aria-label":"Clear the ".concat(i," layer"),title:"Clear layer",onClick:()=>e.set({activeFieldId:null})});l.innerHTML=g.Ib;let a=(n.fieldSourceOverrides||{})[r],o=[null,"core200","yimby","both"],s=Math.max(0,o.indexOf("core200"===a||"yimby"===a||"both"===a?a:null)),d=(0,t_.T)(["Auto","Public","YIMBY","Both"],s,t=>{let n={...e.get().fieldSourceOverrides||{}};null==o[t]?delete n[r]:n[r]=o[t],e.set({fieldSourceOverrides:n})},{ariaLabel:"Layer source"});return(0,h.h)("div",{class:"dv-legend-activebar"},(0,h.h)("div",{class:"dv-legend-activebar-head"},(0,h.h)("span",{class:"dv-legend-activebar-label"},i),l),(0,h.h)("div",{class:"dv-datalayer-source"},(0,h.h)("span",{class:"dv-datalayer-source-label"},"Source"),d.el),(0,h.h)("div",{class:"dv-legend-activebar-caption"},"Auto follows the dataset toggle"))}(s,d));let u=function(e,n){try{if(t&&"function"==typeof t.getLegendModel)return t.getLegendModel(e,n)}catch(e){console.error("[legendWidget] getLegendModel threw:",e)}return null}(d,(0,ew.O)(s,d));if(f=u&&u.kind?u.kind:null,!u||!u.eligible||!u.kind)return void I(u&&u.loading?"Still loading this dataset. The legend appears when it lands.":tO);if("continuous"===u.kind){(function(e){let t=e.stops&&e.stops.low||"#2A3F5F",n=e.stops&&e.stops.high||"#63D6D1",r=(0,h.h)("div",{class:"dv-legend-gradient",style:"background: linear-gradient(90deg, ".concat(t," 0%, ").concat(n," 100%);")}),i=Array.isArray(e.rows)?e.rows:[],a=i.find(e=>"min"===e.value),o=i.find(e=>"mid"===e.value),s=i.find(e=>"max"===e.value),d=(0,h.h)("div",{class:"dv-legend-axis"},(0,h.h)("span",{class:"dv-legend-axis-label"},a?a.label:""),(0,h.h)("span",{class:"dv-legend-axis-label dv-legend-axis-label--mid"},o?o.label:""),(0,h.h)("span",{class:"dv-legend-axis-label"},s?s.label:""));l.appendChild(r),l.appendChild(d)})(u),M();return}if("glossary"===u.kind){if(function(r){var a,o;let s=(0,h.h)("div",{class:"dv-legend-glossary-host"});if(l.appendChild(s),"function"==typeof i){try{p=i(s,r)||null}catch(e){console.error("[legendWidget] deps.mountGlossaryPicker threw:",e),_(s)}return}a=s,o=r,n.e(8478).then(n.bind(n,88478)).then(n=>{if(!l.contains(a))return;let r=n&&(n.createGlossaryPicker||n.default);if("function"!=typeof r)return void _(a);let i=r(e,t,{fieldId:o});i&&i.el&&((0,h.I)(a),a.appendChild(i.el)),p=i||null}).catch(e=>{console.error("[legendWidget] glossaryPicker.js not yet available:",e),l.contains(a)&&_(a)})}(d),function(e,t){if(!t||"glossary"!==t.kind)return!1;if(e&&e.glossaryIsolate)return!0;let n=Array.isArray(t.rows)?t.rows:[];return!!n[0]&&"__isolate__"===n[0].value}(s,u))return}else{b=Array.isArray(r=u.rows||[])?r:[],y=(0,h.h)("div",{class:"dv-legend-rows"}
1),v.api.update(b,{exemptValues:function(){let t=e.get().legendHidden;return t instanceof Set?t:new Set}()}),l.appendChild(v.el),l.appendChild(y),C(),l.appendChild((0,h.h)("div",{class:"dv-legend-caption"},"Counts cover the whole timeline, not the current year")),"stepped"===u.kind&&M()}a=s,o=d,(m=(0,h.h)("div",{class:"dv-legend-footer"})).replaceChildren(...S(a,o)),l.appendChild(m)}function S(e,n){if(0===(e&&Array.isArray(e.filters)?e.filters:[]).length)return[];let r=function(e){try{if(t&&"function"==typeof t.getMatchCounts){let n=t.getMatchCounts(e);if(n&&"number"==typeof n.hidden)return n}}catch(e){console.error("[legendWidget] getMatchCounts threw:",e)}return{matched:0,total:0,nullGray:0,beige:0,hidden:0,dimmed:0,forField:!1}}(n),i=(e,t)=>(0,h.h)("div",{class:"dv-legend-footer-line"},(0,h.h)("span",{class:"dv-legend-footer-label"},e),(0,h.h)("span",{class:"dv-legend-footer-count"},(0,tA.Mv)(t))),l=[i("Grayed out by a filter",r.dimmed),i("Marked gray",r.beige),i("Hidden by a filter",r.hidden)],a=e&&e.corpusMode||"core200";return(0,ew.O)(e,n)!==a&&l.push((0,h.h)("div",{class:"dv-legend-footer-corpus"},"".concat("Counted across"," ").concat(tj[a]||a))),l}function M(){let e=r.gradationEl;e&&1===e.nodeType&&l.appendChild(e)}function I(e){l.appendChild((0,h.h)("div",{class:"dv-legend-empty"},e||tz))}function C(){if(!y)return;(0,h.I)(y);let t=b.filter(e=>!tV(e)).map(e=>e.value);for(let n of function(e,t){let n=Array.isArray(e)?e:[];if(!tT(n))return n.slice();let r=tP(t),i=n.filter(e=>!tD(e)),l=n.filter(tD);return tU(tH(tR(i,r.search),r.sort),r).concat(l)}(b,v.api.getState()))y.appendChild(function(t,n){let r=tV(t),i=(0,h.h)("span",{class:"dv-swatch dv-legend-swatch".concat(r?" dv-legend-swatch--muted":""),style:"background:".concat(t.color||"#9E9E9C",";")}),l=(0,h.h)("span",{class:"dv-legend-label"},null!=t.label?String(t.label):""),a=(0,h.h)("span",{class:"dv-legend-count"},(0,tA.Mv)(t.count));if(r){let e=t&&String(t.value).startsWith("bin:")?"dv-legend-row--bin":"dv-legend-row--static";return(0,h.h)("div",{class:"dv-legend-row ".concat(e)},i,l,a)}let o=e.get().legendHidden,s=o instanceof Set&&o.has(t.value),d="dv-legend-label-".concat(++tG);l.id=d;let u=(0,h.h)("button",{type:"button",class:"dv-legend-solo",title:"Show only this value (click again to show all)","aria-label":"Show only ".concat(null!=t.label?String(t.label):"this value"),onClick:()=>(function(t,n){let r=e.get().legendHidden,i=r instanceof Set?r:new Set,l=n.filter(e=>e!==t),a=l.length>0&&l.every(e=>i.has(e))&&!i.has(t);e.set({legendHidden:a?new Set:new Set(l)})})(t.value,n)},i,l,a),c=(0,h.h)("button",{type:"button",class:"dv-checkbox dv-legend-checkbox",role:"checkbox","aria-checked":String(!s),"data-checked":String(!s),"aria-labelledby":d,onClick:()=>(function(t){let n=e.get().legendHidden,r=n instanceof Set?new Set(n):new Set;r.has(t)?r.delete(t):r.add(t),e.set({legendHidden:r})})(t.value)});return(0,h.h)("div",{class:"dv-legend-row"},u,c)}(n,t))}function _(e){(0,h.I)(e),e.appendChild((0,h.h)("div",{class:"dv-legend-empty"},tO))}function L(){let e=p&&"function"==typeof p.destroy?p.destroy:p&&p.api&&"function"==typeof p.api.destroy?p.api.destroy:null;if(e)try{e.call(p.api||p)}catch(e){console.error("[legendWidget] mounted glossary picker destroy() threw:",e)}p=null}return{el:l,api:{destroy(){L(),v.api.destroy(),x()},refresh(){k()},refreshRows(){C()},setLegendRowOpen(e){d=!1!==e,c(u)},refreshUpdatesMirror(){c(u)}}}}(B,nT,{gradationEl:rM.el,updatesKeyMirror:{el:rb,isLit:()=>!!(rp&&rp.isLit())}})):null,rC=D.dataLayers?rd("filters",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=!0===n.devMode,i="function"==typeof n.getCorpusLoadState?n.getCorpusLoadState:null,l="function"==typeof n.requestCorpusLoad?n.requestCorpusLoad:null,a=!1,o=!1,s=[],d=(0,h.h)("div",{class:"dv-filters-cards"}),u=(0,tK.P)("",{tone:"muted"}),c=(0,h.h)("div",{class:"dv-filters-count"},u.el),p=(0,h.h)("div",{class:"dv-filters-hint",hidden:!0}),f=(0,h.h)("button",{type:"button",class:"dv-btn dv-btn--ghost dv-filters-add",onClick:function(){let t=e.get().corpusMode,n=function(e){for(let t of M(e).categories)for(let e of t.fields)if(e.eligible)return e.id;return null}(t),r={id:t0(),fieldId:n,condition:tW[0].token,action:tq[0].token,min:null,max:null,text:"",boolWanted:!0,presenceWantsHas:!0,paused:null==n||!_(n,t)};s.push(r),k(),w(),S()}},(0,h.h)("span",{class:"dv-filters-add-icon",innerHTML:g.UB}
1),"+ Add filter"),m=(0,h.h)("div",{class:"dv-filters"},d,f,c,p),y=[];k(),S();let b=e.subscribe((e,t)=>{"corpusMode"in t&&v(),("activeFieldId"in t||"corpusMode"in t||"glossarySelection"in t||"glossaryIsolate"in t||"legendHidden"in t||"filters"in t||"gradation"in t||"backdrop"in t||"fieldSourceOverrides"in t)&&S()});function v(){let t=e.get().corpusMode,n=!1;for(let e of s){let r=null==e.fieldId||!_(e.fieldId,t);r!==e.paused&&(e.paused=r,n=!0)}k(),n&&w()}function w(){let t=s.filter(e=>!e.paused&&null!=e.fieldId).map(e=>({fieldId:e.fieldId,condition:e.condition,action:e.action,min:e.min,max:e.max,text:e.text,boolWanted:e.boolWanted,presenceWantsHas:e.presenceWantsHas}));e.set({filters:t})}function x(){for(let e of y)try{e.destroy()}catch(e){console.error("[filtersWidget] popdown destroy() threw:",e)}y=[]}function k(){for(let n of(x(),(0,h.I)(d),0===s.length&&d.appendChild((0,h.h)("div",{class:"dv-legend-empty"},"No filters yet. Narrow the city by any field (dim, gray, or hide what doesnât match).")),s))d.appendChild(function(n){let d=tf(function(e){let t=M(e),n=[];for(let e of t.categories){let t=e.fields.filter(e=>r||!e.internal&&!e.filterExcluded);if(0!==t.length)for(let r of(n.push({group:e.name}),t))n.push({value:r.id,label:r.label})}return n}(e.get().corpusMode),{selectedValue:n.fieldId,placeholder:"Choose fieldâ¦",searchable:!0,onSelect:t=>{n.fieldId=t,n.paused=null==t||!_(t,e.get().corpusMode),F.dataset.paused=String(!!n.paused),T(),w(),S()}});y.push(d);let u=(0,t_.T)(tW.map(e=>e.label),L(tW,n.condition),e=>{n.condition=tW[e].token,D(),w(),S()},{ariaLabel:"Filter condition"}),c=(0,t_.T)(tq.map(e=>e.label),L(tq,n.action),e=>{n.action=tq[e].token,w(),S()},{ariaLabel:"Filter action"}),p=(0,h.h)("button",{type:"button",class:"dv-filters-remove","aria-label":"Remove filter",onClick:()=>{var e;return e=n.id,void(s=s.filter(t=>t.id!==e),k(),w(),S())}},(0,h.h)("span",{innerHTML:g.Ib})),f=(0,h.h)("span",{class:"dv-filters-paused-badge"},tX),m=(0,h.h)("div",{class:"dv-filters-value-host"}),b=(0,h.h)("div",{class:"dv-filters-card-row"},(0,h.h)("div",{class:"dv-filters-field-popdown"},d.el),p),v=(0,h.h)("div",{class:"dv-filters-card-row dv-filters-card-row--segmented"},u.el),x=(0,h.h)("div",{class:"dv-filters-card-row dv-filters-card-row--segmented"},c.el),F=(0,h.h)("div",{class:"dv-filters-card","data-paused":String(!!n.paused)},b,v,m,x,f),A=null,N=null,E=null;function D(){if((0,h.I)(m),"Range"===n.condition){let e=(0,h.h)("input",{type:"number",class:"dv-input dv-filters-range-input",placeholder:"No minimum",value:null==n.min?"":String(n.min),onInput:e=>{let t=e.target.value;A&&clearTimeout(A),A=setTimeout(()=>{n.min=""===t?null:Number(t),w(),S()},200)}}),r=(0,h.h)("input",{type:"number",class:"dv-input dv-filters-range-input",placeholder:"No maximum",value:null==n.max?"":String(n.max),onInput:e=>{let t=e.target.value;N&&clearTimeout(N),N=setTimeout(()=>{n.max=""===t?null:Number(t),w(),S()},200)}});m.appendChild((0,h.h)("div",{class:"dv-filters-range-row"},e,(0,h.h)("span",{class:"dv-filters-range-sep"},"â"),r));let i=function(e){try{if(t&&"function"==typeof t.getFieldNumericDomain)return t.getFieldNumericDomain(e)||null}catch(e){console.error("[filtersWidget] getFieldNumericDomain threw:",e)}return null}(n.fieldId);i&&m.appendChild(I("Data range: ".concat((0,ew.uM)(n.fieldId,i.min)," â ").concat((0,ew.uM)(n.fieldId,i.max))+" (".concat((0,tA.Mv)(i.count)," records with values)"))),m.appendChild(I(tZ))}else if("Contains"===n.condition){let e=(0,h.h)("input",{type:"text",class:"dv-input dv-filters-text-input",placeholder:"Containsâ¦",value:n.text||"",onInput:e=>{let t=e.target.value;E&&clearTimeout(E),E=setTimeout(()=>{n.text=t,w(),S()},200)}});m.appendChild(e),m.appendChild(I(tZ))}else if("Yes / No"===n.condition){let e=(0,t_.T)(["Yes","No"],+(!1===n.boolWanted),e=>{n.boolWanted=0===e,w(),S()},{ariaLabel:"Yes or No value to match"});m.appendChild(e.el),m.appendChild(I(t$))}else if("Presence"===n.condition){let e=(0,t_.T)(["Has value","No value"],+(!1===n.presenceWantsHas),e=>{n.presenceWantsHas=0===e,w(),S()},{ariaLabel:"Match records that have a value or have no value"});m.appendChild(e.el),m.appendChild(I(t$))}}function T(){var t;let r=C(n.fieldId,e.get().corpusMode);t=function(){if(!i)return"idle";try{let e=i();return"string"==typeof e?e:"idle"}catch(e){return console.error("[filtersWidget] getCorpusLoadState threw:",e),"idle"}}(),f.textContent="listed-ineligible"===r?"loading"===t?"paused - dataset still loading":"paused - no values in this dataset":tX,"listed-ineligible"===r&&!a&&l&&(a=!0,queueMicrotask(()=>
1{if(!o)try{l()}catch(e){console.error("[filtersWidget] requestCorpusLoad threw:",e)}}))}return D(),T(),F}(n))}function S(){let n=s.length,r=s.filter(e=>e.paused).length,i="Filtered: ".concat(n," ").concat(1===n?"rule":"rules");n>=2&&(i+=" \xb7 all rules must pass"),r>0&&(i+=" \xb7 ".concat(r," paused"));let l=e.get(),a=l.activeFieldId,o=!!a||n>0;if(o){let e=function(){try{let e=t&&"function"==typeof t.getMatchCounts?t.getMatchCounts():null;if(e&&"number"==typeof e.matched)return e}catch(e){console.error("[filtersWidget] getMatchCounts threw:",e)}return{matched:0,total:0,nullGray:0,beige:0,hidden:0,dimmed:0}}();if(a){let t=(e.hidden||0)+(e.beige||0)+(e.dimmed||0),r=Math.max(0,(e.nullGray||0)-(e.dimmed||0));i+=" \xb7 ".concat((0,tA.Mv)(e.matched)," of ").concat((0,tA.Mv)(e.total)," records colored"),n>0&&(i+=" \xb7 ".concat((0,tA.Mv)(t)," filtered out")),i+=" \xb7 ".concat((0,tA.Mv)(r)," no data")}else i+=" \xb7 ".concat((0,tA.Mv)(e.matched)," of ").concat((0,tA.Mv)(e.total)," records match")}u.setText(i),function(e,t){if(!e){p.hidden=!0;return}let n=tJ[t]||tJ.both;p.textContent="Counts are ".concat(n," data records across the whole timeline, not only 3D-modeled buildings."),p.hidden=!1}(o,l.corpusMode)}function M(e){try{let n=t&&"function"==typeof t.getFieldCatalog?t.getFieldCatalog(e):null;if(n&&Array.isArray(n.categories))return n}catch(e){console.error("[filtersWidget] getFieldCatalog threw:",e)}return{categories:[]}}function I(e){return(0,h.h)("div",{class:"dv-filters-hint"},e)}function C(e,t){if(null==e)return"absent";for(let n of M(t).categories)for(let t of n.fields)if(t.id===e)return t.eligible?"eligible":"listed-ineligible";return"absent"}function _(e,t){return"eligible"===C(e,t)}function L(e,t){let n=e.findIndex(e=>e.token===t);return -1===n?0:n}return{el:m,api:{destroy(){o=!0,b(),x()},refresh(){v(),k(),S()},getRules:()=>s.map(e=>({...e})),setRules(t){let n=e.get().corpusMode;s=(Array.isArray(t)?t:[]).filter(e=>e&&"object"==typeof e).map(e=>{let t=null==e.fieldId?null:e.fieldId,r=tW.some(t=>t.token===e.condition)?e.condition:tW[0].token,i=tq.some(t=>t.token===e.action)?e.action:tq[0].token;return{id:t0(),fieldId:t,condition:r,action:i,min:Number.isFinite(e.min)?e.min:null,max:Number.isFinite(e.max)?e.max:null,text:"string"==typeof e.text?e.text:"",boolWanted:!1!==e.boolWanted,presenceWantsHas:!1!==e.presenceWantsHas,paused:null==t||!_(t,n)}}),k(),w(),S()},getFilters:()=>e.get().filters,addRuleSeeded(t){if(!t||null==t.fieldId)return!1;let n=e.get().corpusMode,r="Range"===t.condition||"Contains"===t.condition?t.condition:"Presence",i={id:t0(),fieldId:t.fieldId,condition:r,action:tq[0].token,min:"number"==typeof t.min&&Number.isFinite(t.min)?t.min:null,max:"number"==typeof t.max&&Number.isFinite(t.max)?t.max:null,text:"string"==typeof t.text?t.text:"",boolWanted:!0,presenceWantsHas:!0,paused:!_(t.fieldId,n)};return s.push(i),k(),w(),S(),!i.paused}}}}(B,nT,{toast:rc,devMode:rk,requestCorpusLoad:()=>iu({revertOnFail:!1}),getCorpusLoadState:()=>(0,ex.getYimbyLoadState)()})):null,r_=rd("color",function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let n=(0,h.h)("div",{class:"dv-color"}),r=(0,h.h)("div",{class:"dv-color-root"},n),i="dv-color-caption-".concat(++t5),l=t6("Gray the backdrop",e=>{s({grayBackdrop:e})},{describedById:i}),a=t6("Gray non-applicable buildings",e=>{s({grayNonApplicable:e})},{describedById:i});n.appendChild(l.el),n.appendChild(a.el),n.appendChild((0,h.h)("div",{class:"dv-color-caption",id:i},"Both switches paint the same gray, so with both on a gray building could be either not-yet-built or not-applicable.")),d();let o=e.subscribe((e,t)=>{("activeFieldId"in t||"backdrop"in t)&&d()});function s(t){let n=e.get().backdrop||{};e.set({backdrop:{...n,...t}})}function d(){let t=e.get(),n=t.backdrop||{},r=null==t.activeFieldId;l.setDisabled(r),a.setDisabled(r),l.setChecked(!1!==n.grayBackdrop),a.setChecked(!1!==n.grayNonApplicable)}return{el:r,api:{destroy(){o()}}}}(B,nT,{})),rL=rd("cameraLighting",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(0,h.h)("div",{class:"dv-cameralighting"}),i=(0,h.h)("div",{class:"dv-cameralighting-root"},r),l=t8("Fog",e=>{g({fog:e})}),a=t8("Sun / dusk",e=>{g({sun:e})}),o="function"==typeof n.setTreesEnabled?t8("Trees",e=>{n.setTreesEnabled(!0===e)}
1):null,s="function"==typeof n.setHubsEnabled?t8("Master developments",e=>{n.setHubsEnabled(!0===e)}):null,d=t9({label:"Light",min:0,max:360,ariaLabel:"Light azimuth in degrees",onInput:t=>{var n={azimuthDeg:t};let r=e.get().lighting||{};e.set({lighting:{...r,...n}})}}),u="function"==typeof n.setFov?t9({label:"FOV",min:20,max:90,initial:"function"==typeof n.getFov?n.getFov():50,ariaLabel:"Camera field of view in degrees",onInput:e=>{n.setFov(e)}}):null,c=(0,h.h)("div",{class:"dv-cameralighting-caption"},"Scene lighting. Camera orbits with drag."),p=e=>(0,h.h)("div",{class:"dv-cameralighting-subeyebrow"},e);r.appendChild(p("ATMOSPHERE")),r.appendChild(l.el),r.appendChild(a.el),r.appendChild(d.el),(o||s)&&(r.appendChild(p("SCENE")),o&&r.appendChild(o.el),s&&r.appendChild(s.el)),u&&(r.appendChild(p("VIEW")),r.appendChild(u.el)),r.appendChild(c),m();let f=e.subscribe((e,t)=>{("backdrop"in t||"lighting"in t||"cameraMode"in t||"treesEnabled"in t||"hubsEnabled"in t)&&m()});function g(t){let n=e.get().backdrop||{};e.set({backdrop:{...n,...t}})}function m(){let t=e.get(),r=t.backdrop||{},i=t.lighting||{};if(l.setChecked(!1!==r.fog),a.setChecked(!1!==r.sun),o&&o.setChecked(!0===t.treesEnabled),s&&s.setChecked(!1!==t.hubsEnabled),Number.isFinite(i.azimuthDeg)&&d.setValue(i.azimuthDeg),u&&"function"==typeof n.getFov){let e=n.getFov();Number.isFinite(e)&&u.setValue(e)}}return{el:i,api:{destroy(){f()},refresh(){m()}}}}(B,nT,{getFov:()=>t.camera.fov,setFov:e=>{Number.isFinite(e)&&(t.camera.fov=e,t.camera.updateProjectionMatrix(),$())},setTreesEnabled:e=>{B.set({treesEnabled:!0===e})},setHubsEnabled:e=>{B.set({hubsEnabled:!1!==e})}})),rF="function"==typeof _.buildShareUrl?_.buildShareUrl:null,rA="function"==typeof _.buildEmbedUrl?_.buildEmbedUrl:null,rN=null,rE=rd("inspector",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{onRequestClose:r}=n,i=!0===n.devMode,l="basic"===n.facts?"basic":"full",a=n.upgrade&&"function"==typeof n.upgrade.onSelect?n.upgrade:null,o=["Height","Floors","Completion year","Borough / locality"],s=(0,h.h)("div",{class:"dv-inspector-name"},""),d=(0,h.h)("span",{class:"dv-pill dv-inspector-corpus-pill"},""),u=(0,h.h)("span",{class:"dv-inspector-adjudication",hidden:!0},"Needs adjudication"),c=(0,h.h)("span",{class:"dv-inspector-notbuilt",hidden:!0},""),p=null,f=null,y=(0,h.h)("div",{class:"dv-inspector-merged",hidden:!0},""),b=(0,h.h)("div",{class:"dv-inspector-changehistory",hidden:!0}),v=(0,h.h)("button",{type:"button",class:"dv-inspector-close","aria-label":"Close inspector",onClick:()=>(function(){if(e.set({selectedBuildingId:null}),"function"==typeof r)try{r()}catch(e){console.error("[inspector] deps.onRequestClose threw:",e)}})(),innerHTML:g.Ib}),w="function"==typeof n.buildShareUrl?(0,h.h)("button",{type:"button",class:"dv-inspector-share","aria-label":"Copy link to this building",title:"Copy link",onClick:()=>{let e="";try{e=String(n.buildShareUrl()||"")}catch(t){e=""}if(!e)return;let t=e=>{"function"==typeof n.toast&&n.toast(e)};navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>t("Link copied")).catch(()=>t(e)):t(e)}},"\uD83D\uDD17"):null,x=(0,h.h)("div",{class:"dv-inspector-header"},(0,h.h)("div",{class:"dv-inspector-heading"},s,d,u,c),w,v),k=(0,h.h)("div",{class:"dv-inspector-body dv-scroll-thin"}),S=(0,h.h)("div",{class:"dv-inspector",hidden:!0,role:"region","aria-label":"Building inspector",tabindex:"-1"},x,y,b,k);C();let M=e.subscribe((e,t)=>{"selectedBuildingId"in t&&C(),"year"in t&&I(e.year)});function I(e){let t=null!=p&&Number.isFinite(e)&&p>e;c.hidden=!t,t&&(c.textContent="Not yet built in ".concat((0,tA.FO)(e)))}function C(){let{selectedBuildingId:r}=e.get(),g=S.hidden;if(!r){if(S.hidden=!0,(0,h.I)(k),p=null,c.hidden=!0,!g&&f&&S.contains(document.activeElement))try{f.focus({preventScroll:!0})}catch(e){}f=null;return}let b=function(r){try{if(t&&"function"==typeof t.getInspectorModel){let i=(0,tA.hh)(e.get().year),l="function"==typeof n.manifestWindowFor?n.manifestWindowFor(r):null;return t.getInspectorModel(r,{scrubYear:i,survivorWindow:l})}}catch(e){console.error("[inspector] getInspectorModel threw:",e)}return null}(r);if(!b||!b.found){if(S.hidden=!1,g){f=document.activeElement;try{S.focus({preventScroll:!0})}catch(e){}}(function(e,t){let n=(0,ew.gz)(e),r=t&&"string"==typeof t.displayName?t.dis
1playName.trim():"";if(n&&"basic"===l){let t=r||ew.MS;s.textContent=t,d.textContent="",d.hidden=!0,d.classList.remove("dv-pill--accent"),d.classList.add("dv-pill--muted"),y.hidden=!0,(0,h.I)(k),k.appendChild((0,h.h)("div",{class:"dv-inspector-card--locked"},m({title:"This building is tracked",body:"Its coverage â the record, timeline and sources behind this building â is part of Plus.",ctaLabel:a?a.ctaLabel:null,onCta:a?a.onSelect:null,skeletonRows:3,ariaLabel:"".concat(t,", coverage locked")}))),console.debug("dv:inspector-no-record",{id:e,arm:"cluster-locked"});return}s.textContent=r||"No record yet",d.textContent="",d.hidden=!0,d.classList.remove("dv-pill--accent"),d.classList.add("dv-pill--muted"),y.hidden=!0,(0,h.I)(k),k.appendChild((0,h.h)("div",{class:"dv-legend-empty"},"basic"===l?"This building has no public record in the loaded data yet.":"This building has no record in the loaded data yet. If the YIMBY data is still loading, this panel fills in automatically when it lands.")),console.debug("dv:inspector-no-record",{id:e})})(r,b),u.hidden=!0,p=null,c.hidden=!0;return}if(S.hidden=!1,g){f=document.activeElement;try{S.focus({preventScroll:!0})}catch(e){}}let v=function(e){let t=e&&Array.isArray(e.fields)?e.fields:[];return i?t:t.filter(e=>!0!==e.raw)}(b.publicRecord),w=("full"===l?v.length>0:!!(b.publicRecord&&!b.publicRecord.empty))&&!!(b.yimby&&!b.yimby.empty);(function(t,n){var r,i;s.textContent=function(t){if(t.displayName)return t.displayName;let n=t.shared&&Array.isArray(t.shared.fields)?t.shared.fields:[],r=L(n,"Project name");if(r)return r;let i=L(n,"Address");return i||"Building ".concat(e.get().selectedBuildingId)}(t);let a="full"===l?n.length>0:!!(t.publicRecord&&!t.publicRecord.empty),o=!!(t.yimby&&!t.yimby.empty),u=void 0!==t.corpusLabel?t.corpusLabel:(r=a,i=o,r&&i?"Public Record + YIMBY":i?"YIMBY":"Public Record");if("full"===l&&t.publicRecord&&0===n.length&&no.has(u)&&(u="Public Record + YIMBY"===u?"YIMBY":""),d.textContent=u,d.hidden=""===u,""!==u&&(d.classList.toggle("dv-pill--accent",a&&o),d.classList.toggle("dv-pill--muted",!(a&&o))),"basic"===l){y.hidden=!0,y.textContent="",_(null);return}t.merged&&t.merged.from?(y.hidden=!1,y.textContent="merged from ".concat(t.merged.from)):(y.hidden=!0,y.textContent=""),_(t.changeHistory)})(b,v),function(t,r,i){var s,d,u;if((0,h.I)(k),k.appendChild((s=t.imageUrl)?(0,h.h)("div",{class:"dv-inspector-hero"},(0,h.h)("img",{class:"dv-inspector-hero-img",src:s,alt:"",loading:"lazy"})):(0,h.h)("div",{class:"dv-inspector-hero",hidden:!0})),"basic"===l){k.appendChild(function(e,t){let n=e.shared,r=[];if(n&&!n.empty&&Array.isArray(n.fields))for(let e of n.fields)e.raw||e.provenance||o.includes(e.label)&&r.push({label:e.label,value:e.value});return(!r.some(e=>"Completion year"===e.label)&&Number.isFinite(e.yearIdx)&&(e.yearAsserted?r.push({label:"Timeline year",value:(0,tA.FO)(e.yearIdx)}):"existing"!==e.yearBucket&&r.push({label:"Est. completion",value:"TBD"})),0===r.length)?N(F(t),null):E(F(t),"dv-inspector-card--shared",[D(r)])}(t,i)),k.appendChild(E("FULL RECORD","dv-inspector-card--locked",[m({title:"The full record",body:"Units, areas, cost, the team behind it, sources and the change history live in the full record.",ctaLabel:a?a.ctaLabel:null,onCta:a?a.onSelect:null,skeletonRows:4,ariaLabel:"Full record, locked"})]));return}k.appendChild(function(e,t){if(!e||e.empty)return N(F(t),null);let n=e.pills&&e.pills.length?(0,h.h)("div",{class:"dv-inspector-pills"},e.pills.map(A)):null;return E(F(t),"dv-inspector-card--shared",[n,D(e.fields)])}(t.shared,i)),k.appendChild((d=t.publicRecord?{...t.publicRecord,fields:r,empty:0===r.length}:null)&&!d.empty?E("PUBLIC RECORD","dv-inspector-card--public",[D(d.fields)]):N("PUBLIC RECORD",null)),k.appendChild((u=t.yimby)&&!u.empty?E("YIMBY","dv-inspector-card--yimby",[D(u.fields)]):N("YIMBY",null));let c=function(t,r){if(!t||"object"!=typeof t)return null;let i=[],l=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];for(let e of t){if(null==e)continue;let t=String(e).trim();if(t.length>0)return t}return null}(t.developmentName);l&&i.push({label:"Name",value:l});let a=t.memberCount;null!=a&&i.push({label:"Members",value:(0,tA.Mv)(a)});let o=!0===t.isModeled?"modeled":!1===t.isModeled?"unmodeled":null;o&&i.push({label:"Modeled state",value:String(o).split(/[\s_-]+/).filter(
1Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")});let s=t.yearCompleted;null!=s&&Number(s)>0&&i.push({label:"Year",value:(0,tA.tN)(s)});let d=()=>(0,h.h)("span",{class:"dv-inspector-devtitle"},(0,h.h)("span",{class:"dv-inspector-devtitle-ring","aria-hidden":"true"}),"DEVELOPMENT");if(0===i.length)return N(d(),null);let u=[function(e){let t=(0,h.h)("div",{class:"dv-inspector-fields dv-inspector-metricrows"});for(let n of e)t.appendChild((0,h.h)("div",{class:"dv-inspector-field"},(0,h.h)("span",{class:"dv-inspector-field-label"},n.label),(0,h.h)("span",{class:"dv-inspector-field-value"},n.value)));return t}(i)];{let r=null!=t.developmentId?String(t.developmentId):null,i=e.get().selectedBuildingId,l=null!=r&&String(null!=i?i:"")===r;r&&!l&&u.push((0,h.h)("button",{class:"dv-inspector-devfocus",type:"button",title:"Highlight and focus the whole master development",onClick:()=>{e.set({selectedBuildingId:r}),"function"==typeof n.focusBuilding&&n.focusBuilding(r)}},(0,h.h)("span",{class:"dv-inspector-devtitle-ring","aria-hidden":"true"}),"Focus master development"))}if(r&&Array.isArray(r.shown)&&r.shown.length>0){let e=(0,h.h)("ol",{class:"dv-inspector-memberlist","aria-label":"Development members"});for(let t of r.shown)e.appendChild((0,h.h)("li",{class:"dv-inspector-memberlist-row"},t.name));u.push(e),r.moreCount>0&&u.push((0,h.h)("div",{class:"dv-inspector-memberlist-more"},"+ ".concat((0,tA.Mv)(r.moreCount)," more")))}return E(d(),"dv-inspector-card--development",u)}(t.rollup,t.members);c&&k.appendChild(c)}(b,v,w),p=Number.isFinite(b.yearIdx)?b.yearIdx:null,I(e.get().year);let x=!0===b.needsAdjudication;u.hidden=!(x&&i),void 0!==b.linkConfidence&&null!==b.linkConfidence?u.title="Link confidence: ".concat(b.linkConfidence):u.removeAttribute("title"),x&&console.debug("dv:adjudication",{id:r,linkConfidence:b.linkConfidence})}function _(e){if((0,h.I)(b),!Array.isArray(e)||0===e.length){b.hidden=!0;return}for(let t of(b.hidden=!1,e))b.appendChild(function(e){let t=function(e){if(!e)return"";let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toISOString().slice(0,10)}(e&&e.changed_at),n=e&&e.change?String(e.change):"",r=e&&e.merged_into?String(e.merged_into):"",i=[t,n].filter(e=>e.length>0).join(" \xb7 "),l=(0,h.h)("div",{class:"dv-inspector-changehistory-row"},i);return r&&l.appendChild((0,h.h)("span",{class:"dv-inspector-changehistory-target"}," â ".concat(r))),l}(t))}function L(e,t){let n=e.find(e=>e&&e.label===t);return n&&n.value?n.value:null}function F(e){return e?"SHARED":"KEY FACTS"}function A(e){let t=nd[e.kind]||"dv-pill--muted";return(0,h.h)("span",{class:"dv-pill ".concat(t)},e.label)}function N(e,t){return(0,h.h)("div",{class:"dv-inspector-card dv-inspector-card--empty"},(0,h.h)("div",{class:"dv-inspector-card-title"},e),(0,h.h)("div",{class:"dv-inspector-card-empty-note"},"No data in this dataset."))}function E(e,t,n){return(0,h.h)("div",{class:"dv-inspector-card ".concat(t)},(0,h.h)("div",{class:"dv-inspector-card-title"},e),n.filter(Boolean))}function D(e){let t=(0,h.h)("div",{class:"dv-inspector-fields"});for(let n of e||[])t.appendChild(function(e){let t=!!(e.raw||e.provenance),n=!0===e.link?function(e){let t=String(null==e?"":e).trim(),n=T(t);return n?(0,h.h)("span",{class:"dv-inspector-field-value"},(0,h.h)("a",{class:"dv-inspector-article-link",href:t,target:"_blank",rel:"noopener noreferrer",title:n},(0,h.h)("span",{innerHTML:g.Ft}),n)):(0,h.h)("span",{class:"dv-inspector-field-value"},e)}(e.value):"Yimby Articles"===e.label?function(e){let t=String(e||"").split(",").map(e=>e.trim()).filter(e=>e.length>0),n=(0,h.h)("span",{class:"dv-inspector-field-value dv-inspector-articles"});return t.forEach((e,t)=>{t>0&&n.appendChild(document.createTextNode(", ")),function(e){try{let t=new URL(e);return t.hostname===na||t.hostname.endsWith(".".concat(na))}catch(e){return!1}}(e)?n.appendChild((0,h.h)("a",{class:"dv-inspector-article-link",href:e,target:"_blank",rel:"noopener noreferrer"},(0,h.h)("span",{innerHTML:g.Ft}),"Article")):n.appendChild(document.createTextNode(e))}),n}(e.value):(0,h.h)("span",{class:"dv-inspector-field-value"},e.value);return function(e,t,n){Array.isArray(t)&&0!==t.length&&t.forEach((t,r)=>{let i=String(r+1).split("").map(e=>{let t=e.charCodeAt(0)-48;return t>=0&&t<=9?ns[t]:e}).join(""),l=T(t);l?e.appendChild((0,h.h)("a",{class:"dv-inspector-cite",href:t,target:"_blank",rel:"noopener noreferrer",title:l,"aria-label":"Source ".concat(r+1).concat(n?" for ".concat(n):""," (").concat(l,")")},i)):e.appendChild((0,h.h)("span",{class:"dv-inspector-cite"},i))})}(n,e.citations,e.label),(0,h.h)("div",{class:t?"dv-inspector-field dv-inspector-field--subordinate":"dv-inspector-field"},(0,h.h)("span",{class:"dv-inspector-field-label"},e.label),n)}(n));return t}function T(e){try{let t=new URL(e);if("http:"===t.protocol||"https:"===t.protocol)return t.host;return null}catch(e){return null}}return{el:S,api:{destroy(){M()},refresh(){C()}}}}(B,nT,{keyTarget:z,devMode:rk,buildShareUrl:rF,toast:rc,facts:D.facts,upgrade:P,manifestWindowFor:e=>{if(null==e||!nA)return null;if(!rN)for(let e of(rN=new Map,nA instanceof Map?nA.values():Object.values(nA))){if(!e||null!=e.generation&&Number(e.generation)>=1)continue;let t=Number(e.year_start);if(!Number.isFinite(t)||t<=0)continue;let n=Number(e.year_end);for(let r of["core200_id","bin","yimby_cluster_id","stable_id"]){let i=e[r];if(null==i||""===i)continue;let l=eJ.byId.get((0,ek.V2)(String(i)).id);if(l){rN.set(String(l.id),{yearStart:t,yearEnd:Number.isFinite(n)&&n>0?n:null});break}}}return rN.get((0,ek.V2)(String(e)).id)||null},focusBuilding:eR})),rD=rk?rd("driftBadge",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{fetchImpl:r="function"==typeof fetch?fetch:null,syncStateUrl:i="/data/web_sync_state.json"}=n,l=(0,h.h)("span",{class:"dv-drift-badge",hidden:!0}),a=null;s();let o=e&&"function"==typeof e.subscribe?e.subscribe(()=>{}):nc;function s(){"function"==typeof r&&r(i).then(e=>e&&e.ok?e.json():null).then(e=>{e&&(a=e,function(e){var t,n;let r=!!e.in_sync,i=Array.isArray(e.warnings)?e.warnings:[];l.classList.toggle("dv-drift-badge--synced",r),l.classList.toggle("dv-drift-badge--drift",!r),l.textContent=r?(t=e.generated_at,"
1synced ".concat(t)):(n=i.length,"drift: ".concat((0,tA.Mv)(n)," warning(s)")),l.title=i.length?i.join("\n"):"unity <-> web in sync",l.hidden=!1}(e))}).catch(()=>{})}return{el:l,api:{refresh(){s()},getSyncState:()=>a,destroy(){o()}}}}(B,nT,{syncStateUrl:"".concat(L,"/web_sync_state.json")})):null;if(rk)try{window.__timelapseDebug={scene:t,heroes:n0,environment:n1,markers:nQ,state:B,invalidate:$,focusBuilding:eR,infill:n2,trees:n3,renderConfigPlan:ra,tiles:nD,renderInfo:()=>{let e=t.renderer.info.render;return{calls:e.calls,triangles:e.triangles,frame:t.renderer.info.render.frame}},droneMode:ee,lighting:t.lighting,render:{framesToRender:()=>q,pumpTicks:()=>Z}},window.__timelapseDebug.placementDelta={available:!1,reason:"computingâ¦"},eH({dataBase:L,unityFrame:nv,projectWeb:t.project,index:eJ,calibrationStats:tY}).then(e=>{try{window.__timelapseDebug.placementDelta=e,e&&e.available?console.info("[unityFrame] placementDelta ready:",e.stats):e&&console.info("[unityFrame] placementDelta unavailable: ".concat(e.reason))}catch(e){}})}catch(e){}let rT=rd("yearChip",function(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let n=(0,h.h)("div",{class:"dv-year-chip"});l(i());let r=e&&"function"==typeof e.subscribe?e.subscribe((e,t)=>{"year"in t&&l(t.year)}):np;function i(){return e&&"function"==typeof e.get?e.get().year:0}function l(e){n.textContent=(0,tA.FO)(e)}return{el:n,api:{refresh(){l(i())},destroy(){r()}}}}(B,nT,{})),rP=rd("droneHud",function(e){let t="function"==typeof window.matchMedia&&window.matchMedia("(any-pointer: coarse)").matches&&!window.matchMedia("(any-pointer: fine)").matches,n=(0,h.h)("div",{class:"dv-drone-hud",hidden:!0},(0,h.h)("div",{class:"dv-drone-hud-title"},"DRONE"),...(t?nh:nf).map(e=>{let[t,n]=e;return(0,h.h)("div",{class:"dv-shortcut-row"},(0,h.h)("span",{class:"dv-shortcut-keys"},t),(0,h.h)("span",{class:"dv-shortcut-what"},n))}));function r(e){n.hidden="drone"!==e}r(e.get().cameraMode);let i=e.subscribe((e,t)=>{"cameraMode"in t&&r(e.cameraMode)});return{el:n,api:{destroy(){i()}}}}(B)),rB=rd("droneTouch",function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="function"==typeof t.setMoveAxes?t.setMoveAxes:()=>{},r="function"==typeof t.setVertical?t.setVertical:()=>{},i=(0,h.h)("div",{class:"dv-drone-stick-knob"}),l=(0,h.h)("div",{class:"dv-drone-stick",role:"img","aria-label":"Fly (drag the stick)"},i),a=(0,h.h)("button",{class:"dv-drone-alt-btn",type:"button","aria-label":"Climb"},"â²"),o=(0,h.h)("button",{class:"dv-drone-alt-btn",type:"button","aria-label":"Descend"},"â¼"),s=(0,h.h)("div",{class:"dv-drone-alt"},a,o),d=(0,h.h)("div",{class:"dv-drone-touch",hidden:!0},l,s),u=null,c=0,p=0;function f(e,t){let r=Math.hypot(e,t),l=r>44?44/r:1;i.style.transform="translate(".concat(e*l,"px, ").concat(t*l,"px)"),n(e*l/44,-(t*l/44))}function g(){u=null,i.style.transform="",n(0,0)}function m(e){null!=u&&(e&&null!=e.pointerId&&e.pointerId!==u||g())}l.addEventListener("pointerdown",e=>{u=e.pointerId,c=e.clientX,p=e.clientY;try{l.setPointerCapture(e.pointerId)}catch(e){}f(0,0),e.preventDefault(),e.stopPropagation()}),l.addEventListener("pointermove",e=>{null!=u&&e.pointerId===u&&(f(e.clientX-c,e.clientY-p),e.preventDefault())}),l.addEventListener("pointerup",m),l.addEventListener("pointercancel",m),document.addEventListener("pointerup",m),document.addEventListener("pointercancel",m);let y={up:{held:!1,pointerId:null},down:{held:!1,pointerId:null}};function b(){r(!!y.up.held-!!y.down.held)}function v(e,t){let n=y[t];e.addEventListener("pointerdown",t=>{n.held=!0,n.pointerId=null!=t.pointerId?t.pointerId:null,b();try{e.setPointerCapture(t.pointerId)}catch(e){}t.preventDefault(),t.stopPropagation()});let r=e=>{n.held&&(e&&null!=e.pointerId&&null!=n.pointerId&&e.pointerId!==n.pointerId||(n.held=!1,n.pointerId=null,b()))};return e.addEventListener("pointerup",r),e.addEventListener("pointercancel",r),e.addEventListener("lostpointercapture",r),r}let w=v(a,"up"),x=v(o,"down");function k(){g(),w(),x()}document.addEventListener("pointerup",w),document.addEventListener("pointerup",x),document.addEventListener("pointercancel",w),document.addEventListener("pointercancel",x),window.addEventListener("blur",k),window.addEventListener("pagehide",k),document.addEventListener("visibilitychange",k);let S="function"==typeof window.matchMedia,M=S?window.matchMedia("(any-pointer: coarse)"):null,I=S?window.matchMedia("(any-pointer: fine)"):null;function C(){let t=!!(M&&I&&M.matches&&!I.matches),n="drone"===e.get().cameraMode&&t;d.hidden=!n,n||k()}C();let _=e.subscribe((e,t)=>{"cameraMode"in t&&C()}),L=()=>C();return M&&"function"==typeof M.addEventListener&&M.addEventListener("change",L),I&&"function"==typeof I.addEventListener&&I.addEventListener("change",L),{el:d,api:{destroy(){_(),M&&"function"==typeof M.removeEventListener&&M.removeEventListener("change",L),I&&"function"==typeof I.removeEventListener&&I.removeEventListener("change",L),document.removeEventListener("pointerup",m),document.removeEventListener("pointercancel",m),document.removeEventListener("pointerup",w),document.removeEventListener("pointerup",x),document.removeEventListener("pointercancel",w),document.removeEventListener("pointercancel",x),window.removeEventListener("blur",k),window.removeEventListener("pagehide",k),document.removeEventListener("visibilitychange",k),k()}}}}(B,{setMoveAxes:(e,t)=>{ee&&ee.setMoveAxes(e,t)},setVertical:e=>{ee&&ee.setVertical(e)}})),rR=0;
1if("data"===A){let e=eJ&&eJ.yearBuckets?eJ.yearBuckets.core200:null;if(e){for(let t=1;t<e.length&&t<=160;t++)if(e[t]>0){rR=t;break}}}else Number.isFinite(A)&&(rR=Math.min(Math.max(Math.round(A)-1875,0),160));rR>0&&B.get().year<rR&&B.set({year:rR});let rH=rd("scrubber",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=V(n.yearBuckets),i=n.keyTarget||document,a=(()=>{let e=Math.round(Number(n.minYearIndex));return Number.isFinite(e)&&e>0?Math.min(e,159):0})(),d=161-a,u=e=>Math.max(function(e){let t=Math.round(Number(e));return Number.isFinite(t)?Math.min(Math.max(t,0),161):0}(e),a),p=(0,h.h)("span",{class:"dv-scrubber-play-icon"}),f=(0,h.h)("button",{type:"button",class:"dv-btn dv-btn--accent dv-scrubber-play","aria-label":"Play",onClick:z},p),g=(0,h.h)("div",{class:"dv-scrubber-track",role:"slider",tabindex:"0","aria-label":"Timelapse year","aria-valuemin":String(a),"aria-valuemax":String(161),onPointerdown:function(e){e.preventDefault(),H=!0,g.setPointerCapture(e.pointerId),q(e.clientX),g.addEventListener("pointermove",K),g.addEventListener("pointerup",W),g.addEventListener("pointercancel",W)},onKeydown:function(e){}}),m=(0,h.h)("div",{class:"dv-scrubber-histogram"});g.appendChild(m);let y=(0,h.h)("div",{class:"dv-scrubber-playedfill"}),b=(0,h.h)("div",{class:"dv-scrubber-playhead"}),v=(0,h.h)("div",{class:"dv-scrubber-ticks"});for(let e=1880;e<=2035;e+=10){let t=e-1875;if(t<a||t>160)continue;let n=(0,h.h)("div",{class:"dv-scrubber-tick"});n.style.left="".concat((t-a)/d*100,"%"),v.appendChild(n)}let w=(0,h.h)("div",{class:"dv-scrubber-hovertip",hidden:!0});g.appendChild(v),g.appendChild(y),g.appendChild(b),g.appendChild(w),g.addEventListener("pointermove",e=>{let t=g.getBoundingClientRect();if(t.width<=0)return;let n=Math.min(Math.max((e.clientX-t.left)/t.width,0),1),r=u(a+Math.round(n*d));w.textContent=(0,tA.FO)(r),w.style.left="".concat(100*n,"%"),w.hidden=!1}),g.addEventListener("pointerleave",()=>{w.hidden=!0});let x=(0,h.h)("div",{class:"dv-scrubber-center"},g),k=(0,h.h)("div",{class:"dv-scrubber-year"}),S=e.get().playback||{},M=(0,t_.T)(nn.map(e=>e.label),nl(nn,S.speed,1),function(t){let n=nn[t];if(!n)return;let r=e.get().playback||{};e.set({playback:{...r,speed:n.value}})},{ariaLabel:"Playback speed"}),I=(0,t_.T)(nr.map(e=>e.label),nl(nr,S.increment,0),function(t){let n=nr[t];if(!n)return;let r=e.get().playback||{};e.set({playback:{...r,increment:n.value}})},{ariaLabel:"Play step"}),C=(0,t_.T)(ni.map(e=>e.label),nl(ni,S.direction,0),function(t){let n=ni[t];if(!n)return;let r=e.get().playback||{};e.set({playback:{...r,direction:n.value}})},{ariaLabel:"Playback mode"}),_=e=>(0,h.h)("span",{class:"dv-scrubber-micro-label"},e),L=(0,h.h)("div",{class:"dv-scrubber-increment"},_("STEP"),I.el),F=(0,h.h)("div",{class:"dv-scrubber-direction"},_("MODE"),C.el),A="dv-scrubber-more-panel-".concat(++nt),N=(0,h.h)("div",{class:"dv-scrubber-more-panel",id:A},L,F),E=()=>N.classList.contains("dv-scrubber-more-panel--open");function D(e){N.classList.toggle("dv-scrubber-more-panel--open",e),T.setAttribute("aria-expanded",String(e))}let T=(0,h.h)("button",{type:"button",class:"dv-btn dv-scrubber-more-btn","aria-label":"More playback controls",title:"More playback controls","aria-expanded":"false","aria-controls":A,onClick:()=>D(!E())},"â¯"),P=(0,h.h)("div",{class:"dv-scrubber-more"},T,N),B=(0,h.h)("div",{class:"dv-scrubber"},f,x,k,(0,h.h)("div",{class:"dv-scrubber-speed"},_("SPEED"),M.el),P);function R(e){if(!E()||N.contains(e.target)||T.contains(e.target))return;let t=N.contains(document.activeElement);D(!1),t&&T.focus()}B.addEventListener("keydown",e=>{"Escape"===e.key&&E()&&(e.stopPropagation(),D(!1),T.focus())}),document.addEventListener("pointerdown",R,!0);let H=!1;O(e.get().playing),j(e.get().year),G();let U=e.subscribe((e,t)=>{"playing"in t&&O(t.playing),"year"in t&&j(t.year),"playback"in t&&$(t.playback)});i.addEventListener("keydown",Z);let Y=!1;function z(){if(Y)return;let t=e.get();e.set({playing:!t.playing})}function O(e){p.innerHTML=e?'<svg viewBox="0 0 16 16" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="4" y="3" width="3" height="10" rx="0.5" fill="currentColor"/><rect x="9" y="3" width="3" height="10" rx="0.5" fill="currentColor"/></svg>':'<svg viewBox="0 0 16 16" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.5 2.8 13 8 4.5 13.2V2.8Z" fill="currentColor"/></svg>',f.setAttribute("aria-label",e?"Pause":"Play")}function j(e){let t=(0,tA.FO)(e);k.textContent=t,g.setAttribute("aria-valuenow",String(e)),g.setAttribute("aria-valuetext",t);let n=(Math.min(Math.max(e,a),161)-a)/d*100;b.style.left="".concat(n,"%"),y.style.width="".concat(n,"%")}function G(){(0,h.I)(m);let e=function(e){let t=0;for(let n=0;n<e.length;n++)e[n]>t&&(t=e[n]);return t}(r)||1;for(let t=a;t<r.length;t++){let n=r[t],i=n>0?Math.max(.0625,n/e):0,l=n>0?Math.max(1,16*i):0,a=(0,h.h)("div",{class:"dv-scrubber-histobar",style:{height:"".concat(l,"px")}});m.appendChild(a)}}function V(e){return e&&"number"==typeof e.length&&e.length>0?e:new Int32Array(162)}function K(e){H&&q(e.clientX)}function W(e){H=!1;try{g.releasePointerCapture(e.pointerId)}catch(e){}g.removeEventListener("pointermove",K),g.removeEventListener("pointerup",W),g.removeEventListener("pointercancel",W)}function q(e){let t=g.getBoundingClientRect();t.width<=0||X(u(a+Math.round(Math.min(Math.max((e-t.left)/t.width,0),1)*d)))}function X(t){let n=u(t),r=e.get();(r.year!==n||!1!==r.playing)&&e.set({year:n,playing:!1})}function Z(t){if(o(t,l.playPause)){if(!function(){let e=document.activeElement;return!e||e===document.body||e===document.documentElement||i!==document&&e===i||e===g}())return;t.preventDefault(),z();return}let n=o(t,l.stepYear10);if(!n&&!o(t,l.stepYear)||c(document.activeElement,t.target))return;let r=s(t);t.preventDefault(),X(e.get().year+r*(n?10:1))}function $(e){e&&("speed"in e&&M.setSelected(nl(nn,e.speed,1)),"increment"in e&&I.setSelected(nl(nr,e.increment,0)),"direction"in e&&C.setSelected(nl(ni,e.direction,0)))}return{el:B,api:{destroy(){U(),i.removeEventListener("keydown",Z),document.removeEventListener("pointerdown",R,!0),g.removeEventListener("pointermove",K),g.removeEventListener("pointerup",W),g.removeEventListener("pointercancel",W),H=!1},refresh(){let t=e.get();O(t.playing),j(t.year),$(t.playback),G()},setPlayDisabled(e){f.disabled=Y=!0===e,f.setAttribute("aria-disabled",String(Y))},setYearBuckets(e){r=V(e),G()}}}}(B,nT,{yearBuckets:nm(eJ,B.get().corpusMode),keyTarget:z,minYearIndex:rR}));V=rd("playback",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=(()=>{let e=Math.round(Number(n.minYearIndex));return Number.isFinite(e)&&e>0?Math.min(e,160):0})();function i(e){return e<r?r:e>161?161:e}let l=0,a=1,o=e.subscribe((e,t)=>{"playing"in t&&!0===t.playing&&(l=0,a=1)});return{el:(0,h.h)("div",{class:"dv-playback dv-playback--engine-only",hidden:!0}),api:{tick:function(t){let n=e.get();if(!n.playing)return;let o=n.playback,s=o&&Number.isFinite(o.speed)?o.speed:1,d=o&&(10===o.increment?10:1),u=o?o.direction:"forward";l+=8*s*t;let c=n.year,p=!0;for(;l>=d;)if(l-=d,"loop"===u)c=c>=161?r:i(c+d);else if("palindrome"===u)if(c>=161)a=-1,c=160;else if(a>0){let e=c+d;c=e>160?161:e}else{let e=c-d;e<=r?(a=1,c=r):c=e}else if((c=i(c+d))>=161){p=!1;break}let f={year:c};p||(f.playing=!1),e.set(f)},destroy(){o()}}}}(B,nT,{minYearIndex:rR})).api.tick;let rU=rd("search",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=[],i=-1,l=null,a=(0,h.h)("input",{type:"search",class:"dv-search-input",placeholder:"Find a buildingâ¦","aria-label":"Find a building by name, address, or BIN",role:"combobox","aria-expanded":"false","aria-autocomplete":"list",onInput:function(){l&&clearTimeout(l),l=setTimeout(u,150)},onKeydown:function(e){if("Escape"===e.key){if(o.hidden&&""===a.value)return;e.stopPropagation(),o.hidden?a.value="":f();return}if(!o.hidden&&0!==r.length){if("ArrowDown"===e.key||"ArrowUp"===e.key){e.preventDefault(),e.stopPropagation();let t="ArrowDown"===e.key?1:-1;i=(i+t+r.length)%r.length,c();return}"Enter"===e.key&&i>=0&&(e.preventDefault(),p(i))}}}),o=(0,h.h)("div",{class:"dv-search-results",role:"listbox",hidden:!0}),s=(0,h.h)("div",{class:"dv-search"},a,o);function d(e){!o.hidden&&(s.contains(e.target)||f())}function u(){var e;l=null;let n=a.value.trim();if(n.length<2)return void f();try{r=t.searchRecords(n,{corpusMode:"both",limit:10})||[]}catch(e){r=[]}i=r.length>0?0:-1,e=n,(0,h.I)(o),0===r.length?o.appendChild((0,h.h)("div",{class:"dv-search-empty"},"No buildings match â".concat(e,"â"))):r.forEach((e,t)=>{let n=(0,h.h)("button",{type:"button",class:"dv-search-result",role:"option",id:"dv-search-opt-".concat(t),"aria-selected":String(t===i),"data-active":String(t===i),onClick:()=>p(t)},(0,h.h)("span",{class:"dv-search-result-label"},String(e.label)),(0,h.h)("span",{class:"dv-search-result-sub"}
1,[e.sublabel,ng[e.corpus]].filter(Boolean).join(" \xb7 ")));o.appendChild(n)}),o.hidden=!1,a.setAttribute("aria-expanded","true"),c()}function c(){[...o.querySelectorAll(".dv-search-result")].forEach((e,t)=>{e.dataset.active=String(t===i),e.setAttribute("aria-selected",String(t===i))}),a.setAttribute("aria-activedescendant",i>=0?"dv-search-opt-".concat(i):"")}function p(t){let i=r[t];i&&(e.set({selectedBuildingId:i.id}),"function"==typeof n.focusBuilding&&n.focusBuilding(i.id),f(),a.value="")}function f(){o.hidden=!0,a.setAttribute("aria-expanded","false"),i=-1}return document.addEventListener("pointerdown",d,!0),{el:s,api:{destroy(){l&&clearTimeout(l),document.removeEventListener("pointerdown",d,!0)}}}}(B,nT,{focusBuilding:eR})),rY=null,rz=null,rO=rd("palette",function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.keyTarget||window,i=n.capabilities&&"object"==typeof n.capabilities?n.capabilities:{dataLayers:!0,corpus:!0},a=!1,s=[],d=-1,u=(0,h.h)("input",{type:"search",class:"dv-palette-input",placeholder:"Type a layer, building, or actionâ¦","aria-label":"Command palette",onInput:()=>b(),onKeydown:function(e){if("Escape"===e.key){e.stopPropagation(),y();return}if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),e.stopPropagation(),0===s.length)return;let t="ArrowDown"===e.key?1:-1;d=(d+t+s.length)%s.length,[...c.querySelectorAll(".dv-palette-item")].forEach((e,t)=>{e.dataset.active=String(t===d),e.setAttribute("aria-selected",String(t===d)),t===d&&e.scrollIntoView({block:"nearest"})});return}"Enter"===e.key&&d>=0&&(e.preventDefault(),v(d))}}),c=(0,h.h)("div",{class:"dv-palette-list",role:"listbox"}),p=(0,h.h)("div",{class:"dv-palette-panel"},u,c),f=(0,h.h)("div",{class:"dv-palette",hidden:!0,role:"dialog","aria-label":"Command palette"},p);function g(e){o(e,l.commandPalette)&&(e.preventDefault(),e.stopPropagation(),a?y():m())}function m(){a=!0,f.hidden=!1,u.value="",b(),u.focus()}function y(){a=!1,f.hidden=!0}function b(){d=(s=function(r){let l=e.get(),a=[],o=[{label:"drone"===l.cameraMode?"Exit drone mode":"Enter drone mode",run:()=>e.set({cameraMode:"drone"===l.cameraMode?"globe":"drone"})},{label:!0===l.treesEnabled?"Hide trees":"Show trees",run:()=>e.set({treesEnabled:!0!==l.treesEnabled})}];!1!==i.corpus&&o.push({label:"Dataset: YIMBY",run:()=>e.set({corpusMode:"yimby"})},{label:"Dataset: Public Record",run:()=>e.set({corpusMode:"core200"})},{label:"Dataset: Both",run:()=>e.set({corpusMode:"both"})}),!1!==i.dataLayers&&o.push({label:"Clear the data layer",run:()=>e.set({activeFieldId:null})}),"function"==typeof n.downloadShareCard&&o.push({label:"Download share image",run:()=>n.downloadShareCard()}),"function"==typeof n.recordSweep&&o.push({label:"Record a year sweep (WebM)",run:()=>n.recordSweep()});let s=e=>{"function"==typeof n.toast&&n.toast(e)},d=(e,t)=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>s(t)).catch(()=>s(e)):s(e)};for(let e of("function"==typeof n.buildShareUrl&&o.push({label:"Copy link to this view",run:()=>{try{d(String(n.buildShareUrl()||""),"Link copied")}catch(e){}}}),"function"==typeof n.buildEmbedUrl&&o.push({label:"Copy embed snippet",run:()=>{try{let e=String(n.buildEmbedUrl()||"");d('<iframe src="'.concat(e,'" style="width:100%;aspect-ratio:16/10;min-height:320px;border:0" loading="lazy" title="YIMBY+ 3D timelapse"></iframe>'),"Embed snippet copied")}catch(e){}}}),o))(!r||e.label.toLowerCase().includes(r))&&a.push({section:"Actions",label:e.label,run:e.run});if(!1!==i.dataLayers)try{for(let n of t.getFieldCatalog(l.corpusMode).categories)for(let i of n.fields)!i.internal&&!i.filterOnly&&i.eligible&&(!r||i.label.toLowerCase().includes(r))&&a.push({section:"Layers",label:i.label,sublabel:n.name,run:()=>(function(n){let r=e.get().activeFieldId;if(r===n)return;e.set({activeFieldId:n});let i=0;try{let e=t&&"function"==typeof t.getMatchCounts?t.getMatchCounts():null;i=e&&"number"==typeof e.matched?e.matched:0}catch(e){i=0}0===i&&e.set({activeFieldId:r})})(i.id)})}catch(e){}if(r.length>=2)try{for(let i of t.searchRecords(r,{corpusMode:"both",limit:6})||[])a.push({section:"Buildings",label:String(i.label),sublabel:i.sublabel||"",run:()=>{e.set({selectedBuildingId:i.id}),"function"==typeof n.focusBuilding&&n.focusBuilding(i.id)}})}catch(e){}return a}(u.value.trim().toLowerCase())).length>0?0:-1,(0,h.I)(c);let r=null;
1s.forEach((e,t)=>{e.section!==r&&(r=e.section,c.appendChild((0,h.h)("div",{class:"dv-palette-section"},e.section))),c.appendChild((0,h.h)("button",{type:"button",class:"dv-palette-item",role:"option","data-active":String(t===d),"aria-selected":String(t===d),onClick:()=>v(t)},(0,h.h)("span",{class:"dv-palette-item-label"},e.label),e.sublabel?(0,h.h)("span",{class:"dv-palette-item-sub"},e.sublabel):null))}),0===s.length&&c.appendChild((0,h.h)("div",{class:"dv-palette-empty"},"Nothing matches"))}function v(e){let t=s[e];if(t){y();try{t.run()}catch(e){console.error("[commandPalette] action threw:",e)}}}return f.addEventListener("pointerdown",e=>{e.target===f&&y()}),r&&"function"==typeof r.addEventListener&&r.addEventListener("keydown",g),{el:f,api:{open:m,close:y,destroy(){r&&"function"==typeof r.removeEventListener&&r.removeEventListener("keydown",g)}}}}(B,nT,{keyTarget:z,focusBuilding:eR,buildShareUrl:rF,buildEmbedUrl:rA,toast:rc,downloadShareCard:function(){let e;try{e=t.captureFrame()}catch(e){console.error("[timelapse] captureFrame failed:",e),rc("Could not capture the view");return}let n=new Image;n.onload=()=>{let e=document.createElement("canvas");e.width=n.width,e.height=n.height+56;let t=e.getContext("2d");t.drawImage(n,0,0),t.fillStyle="#0F172A",t.fillRect(0,n.height,e.width,56);let r=B.get(),i=null;if(null!=r.activeFieldId){i=String(r.activeFieldId);try{for(let e of nT.getFieldCatalog(r.corpusMode).categories){let t=e.fields.find(e=>e.id===r.activeFieldId);if(t){i=t.label;break}}}catch(e){}}let l=(0,tA.FO)(r.year);t.fillStyle="#F8FAFC",t.font="600 ".concat(Math.round(20.16),'px -apple-system, "Segoe UI", Roboto, sans-serif'),t.textBaseline="middle",t.fillText("NYC ".concat(l).concat(i?" \xb7 ".concat(i):""),16,n.height+28),t.fillStyle="rgba(248,250,252,0.6)",t.font="400 ".concat(Math.round(14),'px -apple-system, "Segoe UI", Roboto, sans-serif');let a="YIMBY+ \xb7 Public Record + YIMBY data";t.fillText(a,e.width-t.measureText(a).width-16,n.height+28);let o=document.createElement("a");o.download="yimby-timelapse-".concat(l.replace(/\W+/g,""),".png"),o.href=e.toDataURL("image/png"),o.click(),rc("Share image downloaded")},n.src=e},recordSweep:function(){let e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(rY||ea)return void rc("Already recording");let r=t.renderer.domElement;if("function"!=typeof r.captureStream||"undefined"==typeof MediaRecorder)return void rc("Recording is not supported in this browser");let i=Number.isFinite(n.fromIdx)?n.fromIdx:0,l=Number.isFinite(n.toIdx)?n.toIdx:160,a="function"==typeof MediaRecorder.isTypeSupported&&MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm";try{e=new MediaRecorder(r.captureStream(30),{mimeType:a})}catch(e){console.error("[timelapse] recorder init failed:",e),rc("Could not start the recorder");return}let o=[];e.ondataavailable=e=>{e.data&&e.data.size>0&&o.push(e.data)},e.onstop=()=>{if(el=!1,rY=null,rz&&(rz(),rz=null),B.set({playing:!1}),il||0===o.length)return;let e=new Blob(o,{type:"video/webm"}),t=document.createElement("a");t.download="yimby-timelapse-sweep.webm",t.href=URL.createObjectURL(e),t.click(),setTimeout(()=>URL.revokeObjectURL(t.href),3e4),rc("Sweep recording downloaded")},rz=B.subscribe((t,n)=>{if("year"in n&&t.year>=l)try{e.stop()}catch(e){}}),rY=e,el=!0,B.set({year:i,playing:!1,playback:{...B.get().playback,direction:"forward"}}),e.start(250),B.set({playing:!0}),rc("Recording the sweep â it downloads when the year completes")},capabilities:D}));Y.appendChild(rO.el);let rj=document.createElement("button");rj.type="button",rj.className="dv-view-cluster-fullscreen dv-drone-toggle",rj.setAttribute("aria-pressed","false"),rj.setAttribute("aria-label","Drone mode â fly the camera"),rj.title="Drone mode â fly the camera",rj.innerHTML=g.qr,rj.addEventListener("click",()=>{B.set({cameraMode:"drone"===B.get().cameraMode?"globe":"drone"})});let rG=B.subscribe((e,t)=>{if(!("cameraMode"in t))return;let n="drone"===e.cameraMode;rj.setAttribute("aria-pressed",String(n)),rj.dataset.active=String(n)});if("off"!==D.buildingUpdates){let n=_.buildingUpdates,r="string"==typeof n.region?n.region:"new_york",
1i=Number.isFinite(n.nowMs)?n.nowMs:Date.now(),l=null;try{l=window.localStorage.getItem((0,f.AQ)(r))}catch(e){}function rV(){if(!rg){let e=function(){let{unitsToMeters:e=8.3333,constrained:t=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t?512:1024,r="undefined"!=typeof document?document.createElement("canvas"):null;r&&(r.width=n,r.height=n);let i=new b.WebGLRenderer({canvas:r||void 0,antialias:!0,alpha:!0,powerPreference:"low-power"});i.setPixelRatio(1),i.setScissorTest(!0);let l=new w.GLTFLoader;l.setMeshoptDecoder(x.MeshoptDecoder);let a=new Map,o=0;function s(e){let t=a.get(e);return t?(t.at=++o,Promise.resolve(t.gltf)):new Promise((t,n)=>{l.load(e,n=>{for(a.set(e,{gltf:n,at:++o});a.size>8;){let e=null,t=1/0;for(let[n,r]of a)r.at<t&&(t=r.at,e=n);if(null==e)break;let n=a.get(e);a.delete(e);try{eb(n.gltf)}catch(e){}}t(n)},void 0,e=>n(e||Error("GLB load failed")))})}function d(t,n){let r=t.scene||t.scenes&&t.scenes[0];if(!r)return null;let i=r.clone(!0),l=eo(i,b);l.setDecision({},{exempt:!0}),i.rotation.set(0,(Number.isFinite(n)?n:0)*ev,0),i.scale.setScalar(e),i.updateMatrixWorld(!0);let a=new v.NRn().setFromObject(i);if(a.isEmpty())return null;let o=a.getBoundingSphere(new v.iyt);return i.position.sub(o.center),i.updateMatrixWorld(!0),a.translate(o.center.clone().negate()),{root:i,materialCtl:l,box:a,radius:Math.max(o.radius,1e-6)}}function u(){let e=new v.Z58,t=(0,S.makeHeroRig)();return e.add(t.key),e.add(t.key.target),e.add(t.hemi),e}function c(e,t){e&&(t&&e.root.parent===t&&t.remove(e.root),e.root.traverse(e=>{if(e.isMesh)for(let t of Array.isArray(e.material)?e.material:[e.material])t&&t.dispose&&t.dispose()}),e.materialCtl&&e.materialCtl.dispose&&e.materialCtl.dispose())}function p(e,t,i,l,a){let o=e.getContext("2d");if(!o||!r)return;let s=n-i-a;o.clearRect(0,0,e.width,e.height),o.drawImage(r,t,s,l,a,0,0,e.width,e.height)}let h=new v.qUd(-1,1,1,-1,.1,10),g=u();async function m(e){let{size:t,orientationDeg:r=0,dprBucket:l=1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(C)return null;let a=await s(e);if(C)return null;let o=d(a,r);if(!o)return null;let u=Math.max(1,Math.round(t&&t.w||56)),m=Math.max(1,Math.round(t&&t.h||56)),y=2===l?2:1,b=Math.min(n,u*y),w=Math.min(n,m*y),x=225*ev,k=32*ev,S=new v.Pq0(Math.cos(k)*Math.cos(x),Math.sin(k),Math.cos(k)*Math.sin(x)).normalize(),M=4*o.radius;h.position.copy(S).multiplyScalar(M),h.up.set(0,1,0),h.lookAt(0,0,0),h.updateMatrixWorld(!0);let I=h.matrixWorldInverse,_=new v.Pq0,L=1/0,F=-1/0,A=1/0,N=-1/0,E=1/0,D=-1/0,T=o.box;for(let e=0;e<2;e++)for(let t=0;t<2;t++)for(let n=0;n<2;n++)_.set(e?T.max.x:T.min.x,t?T.max.y:T.min.y,n?T.max.z:T.min.z).applyMatrix4(I),_.x<L&&(L=_.x),_.x>F&&(F=_.x),_.y<A&&(A=_.y),_.y>N&&(N=_.y),_.z<E&&(E=_.z),_.z>D&&(D=_.z);let P=(0,f.Td)({halfW:Math.max(Math.abs(L),Math.abs(F)),halfH:Math.max(Math.abs(A),Math.abs(N))},b/w);h.left=-P.halfW,h.right=P.halfW,h.top=P.halfH,h.bottom=-P.halfH,h.near=Math.max(.01,-D-.1*o.radius),h.far=-E+.1*o.radius,h.updateProjectionMatrix(),g.add(o.root);let B=document.createElement("canvas");return B.width=b,B.height=w,i.setViewport(0,0,b,w),i.setScissor(0,0,b,w),i.render(g,h),p(B,0,0,b,w),g.remove(o.root),c(o,null),B}let y=null,M=new Set;function I(){for(let e of M)try{e(null!=y)}catch(e){}}let C=!1;return{renderThumbnail:m,loadModel:s,createOrbitSession:function(e){let{panes:t=[]}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,l=new v.ubm(40,1,.1,10),a=new k.OrbitControls(l,e);a.enableDamping=!0,a.enablePan=!1,a.enableZoom=!0,a.maxPolarAngle=85*ev,a.autoRotate=!r,a.autoRotateSpeed=2,a.target.set(0,0,0);let o=t.map(e=>({spec:e,scene:u(),staged:null,failed:!1})),h=!1,g=0,m=!1,b=null,w=10,x=1,S=(e,t)=>{if(e.spec.onStatus)try{e.spec.onStatus(t)}catch(e){}};for(let e of o)S(e,"loading");function M(){let e=function(){let e=o[0]&&o[0].spec.canvas;return e&&e.height>0?e.width/e.height:1}();l.aspect=e,w=(0,f.dZ)(x,l.fov*ev,e),l.near=Math.max(.01,w/100),l.far=10*w+4*x,l.updateProjectionMatrix(),a.minDistance=.6*w,a.maxDistance=3*w,1e-6>l.position.lengthSq()?l.position.set(.66*w,.4*w,.66*w):l.position.setLength(w),a.update()}Promise.all(o.map(async e=>{try{let t=await s(e.spec.url);if(h)return;let n=d(t,e.spec.orientationDeg);if(!n)throw Error("empty model");e.staged=n,e.scene.add(n.root),S(e,"ready")}catch(t){e.failed=!0,S(e,"failed")}})).then(()=>
1{if(!h){for(let e of(x=1,o))e.staged&&(x=Math.max(x,e.staged.radius));M(),F()}});let C=()=>{a.autoRotate=!1,b&&clearTimeout(b)},_=()=>{b&&clearTimeout(b),r||(b=setTimeout(()=>{a.autoRotate=!0},5e3))};function L(){g=requestAnimationFrame(L),a.update();let e=o[0]&&o[0].spec.canvas;if(!e)return;let t=(0,f.p_)(e.clientWidth||e.width,e.clientHeight||e.height,window.devicePixelRatio||1,n,n,o.length),r=t.paneW/t.paneH;Math.abs(l.aspect-r)>.001&&(l.aspect=r,w=(0,f.dZ)(x,l.fov*ev,r),l.updateProjectionMatrix());for(let e=0;e<o.length;e++){let n=o[e],r=n.spec.canvas;if(!r||n.failed||!n.staged)continue;let a=e*t.paneW;i.setViewport(a,0,t.paneW,t.paneH),i.setScissor(a,0,t.paneW,t.paneH),i.render(n.scene,l),(r.width!==t.paneW||r.height!==t.paneH)&&(r.width=t.paneW,r.height=t.paneH),p(r,a,0,t.paneW,t.paneH)}}function F(){m||h||(m=!0,g=requestAnimationFrame(L))}function A(){m&&(m=!1,cancelAnimationFrame(g))}a.addEventListener("start",C),a.addEventListener("end",_);let N={refit:M,hide(){A(),N.dispose()},pause:A,resume:F,dispose(){if(!h){for(let e of(h=!0,A(),b&&clearTimeout(b),a.removeEventListener("start",C),a.removeEventListener("end",_),a.dispose(),o))c(e.staged,e.scene);y===N&&(y=null,I())}}};return y&&y.dispose(),y=N,I(),N},isSessionLive:()=>null!=y,onSessionStateChange:e=>(M.add(e),()=>M.delete(e)),dispose(){if(!C){for(let[,e]of(C=!0,y&&y.dispose(),a))try{eb(e.gltf)}catch(e){}a.clear(),i.dispose(),i.forceContextLoss()}}}}({unitsToMeters:t7,constrained:nC});rg={stage:e,thumbnailer:function(){let{stage:e,scrollRoot:t=null}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=function(e){let{raf:t,maxPerFrame:n=1}=e,r=[],i=new Set,l=!1,a=!1;function o(){if(a=!1,l)return;let e=0;for(;r.length>0&&e<n;){let t=r.shift();if(!t)break;i.delete(t.key),e+=1;try{t.run()}catch(e){console.error("[fifo] job threw:",e)}}r.length>0&&s()}function s(){a||l||(a=!0,t(o))}return{enqueue(e,t){let n=String(e);i.has(n)||(i.add(n),r.push({key:n,run:t}),s())},drop(e){let t=String(e);if(!i.has(t))return!1;i.delete(t);let n=r.findIndex(e=>e.key===t);return -1!==n&&r.splice(n,1),!0},pause(){l=!0},resume(){l&&(l=!1,r.length>0&&s())},isPaused:()=>l,size:()=>r.length}}({raf:e=>requestAnimationFrame(e),maxPerFrame:1}),r=e&&"function"==typeof e.onSessionStateChange?e.onSessionStateChange(e=>{e?n.pause():n.resume()}):null,i=new Map,l=0,a=new Map,o=null;function s(){for(let r of(o&&o.disconnect(),o=new IntersectionObserver(t=>{for(let r of t){let t=a.get(r.target);t&&(r.isIntersecting?function(t,r){let o=r.job,s=i.get(o.cacheKey);if(s){s.at=++l,d(t,s.canvas,o);return}n.enqueue(o.cacheKey,()=>{let n=a.get(t);n&&n.job.cacheKey===o.cacheKey&&e.renderThumbnail(o.url,{size:o.size,orientationDeg:o.yawDeg,dprBucket:o.dpr}).then(e=>{let n=a.get(t);if(n&&n.job.cacheKey===o.cacheKey){if(!e)return void t.classList.add("dv-updates-thumb--missing");var r=o.cacheKey;for(i.set(r,{canvas:e,at:++l});i.size>200;){let e=null,t=1/0;for(let[n,r]of i)r.at<t&&(t=r.at,e=n);if(null==e)break;i.delete(e)}d(t,e,o)}}).catch(()=>{let e=a.get(t);e&&e.job.cacheKey===o.cacheKey&&t.classList.add("dv-updates-thumb--missing")})})}(r.target,t):n.drop(t.job.cacheKey))}},{root:t,rootMargin:"200px"}),a.keys()))o.observe(r)}function d(e,t,n){e.classList.remove("dv-updates-thumb--missing"),t.className="dv-updates-thumb",t.style.width="".concat(n.size.w,"px"),t.style.height="".concat(n.size.h,"px"),e.replaceChildren(t)}return s(),{attach(e,t){var n;let{url:r,cutId:s,key:u,size:c,yawDeg:p=0,yawTier:f="degraded"}=t,h=Math.round(Math.min(Number.isFinite(n=window.devicePixelRatio||1)&&n>0?n:1,2)),g={url:r,size:{w:c&&c.w||56,h:c&&c.h||56},yawDeg:p,dpr:h,cacheKey:"".concat(s,"/").concat(u,"@").concat(h,"@").concat(f)},m=a.get(e);a.set(e,{job:g}),!m&&o&&o.observe(e);let y=i.get(g.cacheKey);y&&(y.at=++l,d(e,y.canvas,g))},detach(e){let t=a.get(e);t&&(n.drop(t.job.cacheKey),a.delete(e),o&&o.unobserve(e))},reconnect(){s()},_fifo:n,destroy(){o&&o.disconnect(),o=null,a.clear(),i.clear(),r&&r()}}}({stage:e,scrollRoot:null}),orbitViewer:function(e){let{stage:t}=e,n=(0,h.h)("div",{class:"dv-updates-viewer",hidden:!0}),r=null,i=null,l=null;function a(){i&&(i.disconnect(),i=null),l&&(document.removeEventListener("visibilitychange",l),l=null),r&&(r.dispose(),r=null),(0,h.I)(n),n.hidden=!0}return{el:n,show:function(){let{panes:e=[]}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(a(),!e.length)return;n.hidden=!1;let o=[];for(let t of e.map((t,n)=>{let r=(0,h.h)("canvas",{class:"dv-updates-viewer-canvas"}),i=(0,h.h)("div",{class:"dv-updates-viewer-note",hidden:!0}),l=(0,h.h)("div",{class:"dv-updates-viewer-label",...t.degraded?{title:"orientation approximate â the export carried no resolved facing"}:{}},t.label||""),a=(0,h.h)("div",{class:"dv-updates-viewer-pane"},l,r,i);return o.push({url:t.url,orientationDeg:t.orientationDeg,canvas:r,onStatus:t=>{"failed"===t&&(r.hidden=!0,i.hidden=!1,i.textContent=0===n&&e.length>1?"Previous model unavailable â the earlier release no longer serves this file.":"Model unavailable.")}}),a}))n.appendChild(t);r=t.createOrbitSession(n,{panes:o}),(i=new IntersectionObserver(e=>{let t=!e[0]||e[0].isIntersecting;r&&(t&&"visible"===document.visibilityState?r.resume():r.pause())})).observe(n),l=()=>{r&&("visible"===document.visibilityState?r.resume():r.pause())},document.addEventListener("visibilitychange",l)},hide:a,isOpen:()=>!n.hidden,destroy(){a()}}}({stage:e})}}return rg}let a=n.frames&&"object"==typeof n.frames?n.frames:{},o=Array.isArray(n.releases)&&n.releases[0]?n.releases[0].cut_id:null,d=o&&a[o]?a[o]:{frame:nI&&nI.info?nI.info:null,env_anchor:null,unity_north_offset_degrees:null,baked_y:nF&&nF.baked?nF.baked.y:null,ground_datum_units:t4&&t4.metadata&&Number.isFinite(t4.metadata.ground_datum_units)?t4.metadata.ground_datum_units:null};rf=function(e){let{heroes:t,tiles:n,bases:r,frames:i,liveFrame:l,releases:a,toast:o,constrained:s=!1,getCameraPos:d,acquireRetiredGroup:u,releaseRetiredGroup:c,onInvalidate:p}=e,h=s?120:400,g=null,m=new Set,b=new Set,v=0,w=0,x=null,k={extrasRequested:0,extrasAttached:0};function S(){n&&"function"==typeof n.setKeyHidden&&n.setKeyHidden(m),t.setKeyHidden(m)}function M(){o&&(x&&clearTimeout(x),x=setTimeout(()=>{x=null,v>0&&o("showing today's model for ".concat(v," building").concat(1===v?"":"s"," â older meshes no longer retained"))},600))}function I(){t.setExtras([]),m=new Set,S(),t.reassertSuppressionFor([...b]),b=new Set,c&&c(),p&&p()}return{setStop:function(e){if(null==e){if(null==g)return;g=null,I();return}if(g===e)return;g=e,v=0,w=0,k={extrasRequested:0,extrasAttached:0};let n=(0,f.TW)(a,e),s=[],c=new Set;for(let e of n.extras){let t=function(e){let t=r&&e.cut_id?r[e.cut_id]:null;if(!t)return null;let n=e.glb_path;if(!n)return null;let a=e.row||{},o=e.snapshot||{},s=a.ids&&"object"==typeof a.ids?a.ids:{},d={...o,key:e.key,glb_path:n,building_id:null!=s.building_id?s.building_id:o.building_id,core200_id:null!=s.core200_id?s.core200_id:o.core200_id,yimby_cluster_id:null!=s.yimby_cluster_id?s.yimby_cluster_id:o.yimby_cluster_id,bin:null!=s.bin?s.bin:o.bin,stable_id:null!=s.stable_id?s.stable_id:o.stable_id,container_type:null!=a.c
1ontainer_type?a.container_type:o.container_type,object_class:null!=a.object_class?a.object_class:o.object_class,bounds_center_lng:null!=a.bounds_center_lng?a.bounds_center_lng:o.bounds_center_lng,bounds_center_lat:null!=a.bounds_center_lat?a.bounds_center_lat:o.bounds_center_lat,height_m:null!=a.height_m?a.height_m:o.height_m};if(!(!1!==a.placeable&&function(e,t){if(!e||!t)return!1;let n=e.frame||null,r=t.frame||null;if(!n||!r||!y(n.anchorSlug,r.anchorSlug)||!y(n.northOffsetDeg,r.northOffsetDeg)||!y(n.metersPerUnit,r.metersPerUnit))return!1;let i=e.env_anchor||null,l=t.env_anchor||null;return!!i&&!!l&&!!y(i.slug,l.slug)&&!!y(null!=i.unity_anchor_x?i.unity_anchor_x:i.x,null!=l.unity_anchor_x?l.unity_anchor_x:l.x)&&!!y(null!=i.unity_anchor_z?i.unity_anchor_z:i.z,null!=l.unity_anchor_z?l.unity_anchor_z:l.z)&&!!y(e.baked_y,t.baked_y)&&!!y(e.ground_datum_units,t.ground_datum_units)&&!0}(i?i[e.cut_id]:null,l))){if(null==d.bounds_center_lng||null==d.bounds_center_lat)return null;delete d.unity_world_x,delete d.unity_world_z,delete d.unity_base_y}let u=i&&i[e.cut_id]?i[e.cut_id].unity_north_offset_degrees:null;return{cutId:e.cut_id,key:e.key,url:"".concat(String(t).replace(/\/+$/,""),"/").concat(String(n).replace(/^\/+/,"")),raw:d,maskKey:e.maskKey,retired:"retired"===e.kind,window:"retired"===e.kind?{yearStart:o.year_start,yearEnd:o.year_end}:null,northOffsetDeg:Number.isFinite(u)?u:0,_pos:{lng:d.bounds_center_lng,lat:d.bounds_center_lat}}}(e);if(!t){v+=1;continue}s.push(t),null!=t.maskKey&&c.add(String(t.maskKey))}v>0&&M();let x=s;if(s.length>h){let e=d?d():null;x=e&&Number.isFinite(e.lng)&&Number.isFinite(e.lat)?[...s].sort((t,n)=>(t._pos.lng-e.lng)**2+(t._pos.lat-e.lat)**2-((n._pos.lng-e.lng)**2+(n._pos.lat-e.lat)**2)).slice(0,h):s.slice(0,h),w=s.length-h,o&&o("showing the ".concat(h," nearest changed models â ").concat(w," more not shown at this stop"));let t=new Set(x.map(e=>"extra:".concat(e.cutId,":").concat(e.key)));for(let e of s)t.has("extra:".concat(e.cutId,":").concat(e.key))||null==e.maskKey||c.delete(String(e.maskKey))}k.extrasRequested=x.length;let C=x.some(e=>e.retired&&null==e.maskKey)&&u?u():null;for(let e of x)e.retired&&null==e.maskKey&&C&&(e.parentGroup=C);for(let e of m=new Set([...n.masks].filter(e=>!c.has(e))))b.add(e);S(),t.reassertSuppressionFor([...m]),t.setExtras(x,{onBeforeAttach:e=>{if(k.extrasAttached+=1,null==e.maskKey)return;let n=String(e.maskKey);m.has(n)||(m.add(n),b.add(n),S(),t.reassertSuppressionFor([n]))},onError:e=>{v+=1,M(),null!=e.maskKey&&m.has(String(e.maskKey))&&(m.delete(String(e.maskKey)),S(),t.reassertSuppressionFor([String(e.maskKey)]))}}),p&&p()},getStop:()=>g,getStatus:()=>({engaged:g,masks:m.size,extrasRequested:k.extrasRequested,extrasAttached:k.extrasAttached,unavailable:v,capped:w}),dispose(){x&&clearTimeout(x),null!=g&&(g=null,I())}}}({heroes:n0,tiles:nD,bases:n.bases||{},frames:a,liveFrame:d,releases:Array.isArray(n.releases)?n.releases:[],toast:rc,constrained:nC,getCameraPos:()=>null,acquireRetiredGroup:()=>(ry||((ry=new(Object.getPrototypeOf(n0.group)).constructor).name="retired-extras",t.scene.add(ry),J=[...J,ry],Q=[...Q,-1],"function"==typeof t.setShadowWatchGroups&&(t.setShadowWatchGroups(J),"function"==typeof t.setShadowDirty&&t.setShadowDirty())),ry),releaseRetiredGroup:()=>{ry&&(ry.parent&&ry.parent.remove(ry),Q=(J=J.filter(e=>e!==ry)).map(()=>-1),"function"==typeof t.setShadowWatchGroups&&(t.setShadowWatchGroups(J),"function"==typeof t.setShadowDirty&&t.setShadowDirty()),ry=null)},onInvalidate:$}),rh=e=>{nW(Array.isArray(e)?e.map(e=>({...e,color:"added"===e.name?p.toHex(p.ADDED_HIGHLIGHT):p.toHex(p.UPDATED_HIGHLIGHT)})):null,{slot:"change"}),n7(),n$(),rI&&"function"==typeof rI.api.refreshUpdatesMirror&&rI.api.refreshUpdatesMirror(),rW&&rW()},rp=function(e){let{state:t,releases:n,older:r,totalReleases:i,tier:l,bases:a,frames:o,links:d,cityLabel:u,upgrade:c,thumbnailer:p,orbitViewer:y,focusBuilding:b,focusPoint:v,resolveId:w,colorEngine:x,metersPerUnit:k,getLiveYaw:S,newestSeen:M,nowMs:I,onOpenChange:C,onLightUpChange:_,onStopChange:L,refocusKeyTargetIfLost:F,keyTargetEl:A,region:N,developmentParents:E}=e,D=(0,f.q7)(null!=E?E:null),{launchOnly:T,launch:P}=(0,f.td)(n),B=!1,R=!1,H=null,U=null,Y=null,z=0,O=-1,j=n.filter(e=>Array.isArray(e.rows)&&e.rows.length>0),G=(0,h.h)("span",{class:"dv-updates-badge",hidden:!0}),V=(0,h.h)("span",{class:"dv-updates-toggle-label"},T?"Launch":"New"),K=(0,h.h)("span",{class:"dv-updates-toggle-icon","aria-hidden":"true"});K.innerHTML=g.pp;let W=(0,h.h)("button",{type:"button",class:"dv-updates-toggle dv-view-cluster-fullscreen","aria-controls":"dv-updates-panel","aria-expanded":"false","aria-label":"Building updates",title:"Building updates",onClick:()=>R?ek():ex()},K,V,G);function q(){if(B){G.hidden=!0;return}let{count:e,dot:t}=(0,f.Gj)(n,M,I,{membership:D});e>0?(G.hidden=!1,G.classList.remove("dv-updates-badge--dot"),G.textContent=e>99?"99+":String(e)):t?(G.hidden=!1,G.classList.add("dv-updates-badge--dot"),G.textContent=""):G.hidden=!0}function X(){let e=t.get().buildingUpdates;return e&&"object"==typeof e?e:{range:"window",chip:"all",lightUp:!1}}function Z(e){t.set({buildingUpdates:{...X(),...e}})}function $(){let e=X();return(0,f.fF)({releases:n,older:r,boundaryLabel:r?r.boundaryLabel:null,totalReleases:i,newest_cut_id:n[0]?n[0].cut_id:null},{tier:l,range:e.range,chip:e.chip,seen:M,nowMs:I})}function J(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={...X(),...e};if(!t.lightUp&&!0!==e.lightUp)return null;let a=(0,f.fF)({releases:n,older:r,boundaryLabel:r?r.boundaryLabel:null,totalReleases:i,newest_cut_id:n[0]?n[0].cut_id:null},{tier:l,range:t.range,chip:"all",seen:M,nowMs:I}),o=t.chip,s=[],d=[];for(let e of a.releases)if(Array.isArray(e.rows))for(let t of e.rows){let e=(()=>{let e=(0,f.lO)(t);return null!=e?{id:e}:{key:String(t.key)}})();"added"===t.change?s.push(e):"updated"===t.change&&d.push(e)}let u=[];return s.length&&"updated"!==o&&u.push({name:"added",entries:s}),d.length&&"added"!==o&&u.push({name:"updated",entries:d}),u.length?u:null}function Q(){let e=(0,h.h)("div",{class:"dv-updates-key-rows"}),t=(e,t)=>(0,h.h)("span",{class:"dv-updates-key-row"},(0,h.h)("span",{class:"dv-updates-key-swatch dv-updates-key-swatch--".concat(e),"aria-hidden":"true"}),t);return e.appendChild(t("added","Added")),e.appendChild(t("updated","Updated")),e.appendChild((0,h.h)("button",{type:"button",class:"dv-updates-key-off","aria-label":"Turn off the change highlight",onClick:()=>er(!1)},"Off")),e}q();let ee=(0,h.h)("div",{class:"dv-updates-key",hidden:!0},Q()),et=(0,h.h)("div",{class:"dv-updates-key dv-updates-key--mirror"},Q());function en(){ee.hidden=!(X().lightUp&&null!=J())}function er(e){if(Z({lightUp:!!e}),ed.setAttribute("aria-pressed",String(!!e)),en(),_)try{_(e?J():null)}catch(e){}}let ei=(0,h.h)("button",{type:"button",class:"dv-updates-close","aria-label":"Close building updates",onClick:()=>ek()});ei.innerHTML=g.Ib;let el=(0,h.h)("span",{class:"dv-updates-title"},"Building updates"),ea=(0,h.h)("div",{class:"dv-updates-header"},el,ei),eo=(0,h.h)("div",{class:"dv-updates-range"}),es=(0,h.h)("div",{class:"dv-updates-chips",role:"group","aria-label":"Change type"}),ed=(0,h.h)("button",{type:"button",class:"dv-updates-lightup","aria-pressed":"false",onClick:()=>er(!X().lightUp)},"Light up changes"),eu=(0,h.h)("div",{class:"dv-updates-controls"},eo,es,ed),ec=(0,h.h)("div",{class:"dv-updates-scroll"}),ep=(0,h.h)("div",{class:"dv-updates-stops-host"}),ef=(0,h.h)("div",{class:"dv-updates-footer"},(0,h.h)("a",{class:"dv-updates-all",href:d.allUpdatesHref},"See everything in What's New")),eh=(0,h.h)("section",{class:"dv-updates",id:"dv-updates-panel",role:"region","aria-label":"Building updates",tabindex:"-1",hidden:!0,onKeydown:e=>{0!==s(e)&&e.stopPropagation()}},ea,eu,ec,ep,ef),eg={window:"Recent",sinceLastVisit:"Since your last visit","30d":"30 days","90d":"90 days",all:"All"},em=[["all","All"],["added","Added"],["updated","Updated"]];function ey(){null!=H&&(H=null,y.hide(),U&&(U.hidden=!0,(0,h.I)(U),U=null),Y&&(Y.setAttribute("aria-expanded","fal
1se"),Y=null))}function eb(t){if((0,h.I)(ep),!t.showStops||j.length<2)return;if("pro"!==l)return void ep.appendChild(m({title:"Release stops",body:"Step through ".concat(i," city releases with the changed models swapped in place, lit, and compared as they stood â Release stops are part of Pro."),ctaLabel:"Unlock release stops",ariaLabel:"Release stops, locked",onCta:c?()=>c.onSelect("pro","releaseStops"):null,skeletonRows:2}));let n=-1===O?"Live":"Release \xb7 ".concat(function(e){let t=j[e];return t?t.label||(0,f.Cg)(t,I):""}(O)," \xb7 ").concat(O+1," of ").concat(j.length),r=(0,h.h)("div",{class:"dv-updates-stops"},(0,h.h)("button",{type:"button",class:"dv-updates-stop-prev","aria-label":"Older release stop",disabled:O>=j.length-1,onClick:()=>ev(Math.min(j.length-1,O+1))},"â"),(0,h.h)("span",{class:"dv-updates-stop-label"},n),(0,h.h)("button",{type:"button",class:"dv-updates-stop-next","aria-label":"Newer release stop",disabled:O<=-1,onClick:()=>ev(O-1)},"â¸"),(0,h.h)("button",{type:"button",class:"dv-updates-stop-live",hidden:-1===O,onClick:()=>ev(-1)},"Back to live"),(0,h.h)("button",{type:"button",class:"dv-updates-stop-light",hidden:-1===O,onClick:()=>{O>=0&&e.onLightUpStop&&e.onLightUpStop(j[O])}},"Light up changes at this stop"),O>=0?(0,h.h)("a",{class:"dv-updates-stop-open",href:d.releaseHref(j[O].cut_id)},"Open this release in City versions"):null);ep.appendChild(r),O>=0&&ep.appendChild((0,h.h)("div",{class:"dv-updates-stops-note"},"A stop swaps changed models only â surroundings and overlays stay current."))}function ev(e){let n=Math.max(-1,Math.min(j.length-1,e));if(n===O)return;let r=-1===(O=n)?null:j[O].cut_id;if(t.set({releaseStop:r}),L)try{L(r)}catch(e){}
1eb($())}function ew(){let i=$();!function(e){if((0,h.I)(eo),e.rangeOptions.length<=1){eo.hidden=!0;return}for(let t of(eo.hidden=!1,e.rangeOptions))eo.appendChild((0,h.h)("button",{type:"button",class:"dv-updates-range-btn".concat(e.range===t?" is-active":""),"aria-pressed":String(e.range===t),onClick:()=>{Z({range:t}),ew()}},eg[t]||t))}(i),function(e){(0,h.I)(es);let t=e.showChips;if(es.hidden=!t,ed.hidden=!e.showLightUp,!t)return;let n=X();for(let[e,t]of em)es.appendChild((0,h.h)("button",{type:"button",class:"dv-updates-chip".concat(n.chip===e?" is-active":""),"aria-pressed":String(n.chip===e),onClick:()=>{Z({chip:e}),ew()}},t))}(i),function(i){if(p)for(let e of ec.querySelectorAll(".dv-updates-thumb-box"))p.detach(e);if((0,h.I)(ec),ey(),i.empty){let e="launch-only"===i.empty.kind&&P?"The 3D city launched ".concat("Current"===(0,f.Cg)(P,I)?"recently":(0,f.Cg)(P,I)," â changes appear here with the next release."):"nothing-new"===i.empty.kind&&n[0]?"Nothing new since your last visit â the city is current as of ".concat(n[0].label||(0,f.Cg)(n[0],I),"."):i.empty.label;ec.appendChild((0,h.h)("div",{class:"dv-updates-empty"},e));return}for(let r of i.releases){let i=(0,h.h)("div",{class:"dv-updates-release"},function(e){let t=e.label||(0,f.Cg)(e,I),n=e.dateTitle||(0,f.Yl)(e);return(0,h.h)("div",{class:"dv-updates-release-head",...n?{title:n}:{}},(0,h.h)("span",{class:"dv-updates-release-label"},"Release \xb7 ".concat(t)),null==e.published_at?(0,h.h)("span",{class:"dv-updates-release-current"},"Current"):null)}(r));if("launch"===r.kind){let e=r.summary&&r.summary.launch&&Number.isFinite(r.summary.launch.models)?r.summary.launch.models:null;i.appendChild((0,h.h)("div",{class:"dv-updates-launch"},"Launched".concat(null!=e?" with ".concat(e," models"):"","."))),ec.appendChild(i);continue}if(Array.isArray(r.rows)){for(let l of(0,f.nP)(r.rows,D))i.appendChild(function r(i,l){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,{member:d=!1}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c=String(l.key),m=function(e){let t=Number(e.height_m),n=Number(k)||1;return Number.isFinite(t)&&t*n>=150}(l),M=d?null:(0,h.h)("div",{class:"dv-updates-thumb-box".concat(m?" dv-updates-thumb-box--tall":""),"aria-hidden":"true"}),C=l.after_cut_id||i.cut_id,_=(0,f.A9)(a,C,l.after&&l.after.glb_path?l.after.glb_path:l.glb_path,c),L=(0,f.rT)(l,o,S?S(c):null);M&&_&&p?p.attach(M,{url:_,cutId:C,key:c,size:m?{w:44,h:64}:{w:56,h:56},yawDeg:L.yawDeg,yawTier:L.tier}):M&&M.classList.add("dv-updates-thumb--missing"),(0,f.lO)(l);let F="retired"===l.change||"removed"===l.change,A=function(e){if(e.display_name)return e.display_name;let t=(0,f.lO)(e);if(null!=t&&x&&"function"==typeof x.getInspectorModel)try{let e=x.getInspectorModel(t);if(e&&e.found){let t=function(e){if(!e||"string"!=typeof e)return null;if(x)try{if("string"==typeof x.GENERIC_BUILDING_LABEL&&e===x.GENERIC_BUILDING_LABEL)return null}catch(e){}return"Tracked building"===e||/^Building \S+$/.test(e)?null:e}(e.name);if(t)return t}}catch(e){}return"Unnamed building \xb7 ".concat(u)}(l),N=s&&s.partOf&&s.partOf.name?s.partOf.name:null,E=(0,h.h)("button",{type:"button",class:"dv-updates-row".concat(F?" dv-updates-row--retired":"").concat(d?" dv-updates-row--member":""),"data-change":l.change,"data-key":c,...F?{disabled:!0}:{},...L.degraded?{title:"orientation approximate"}:{},onClick:()=>{if(!F){let n=(0,f.lO)(l),r=String(l.key);if(null!=n)try{t.set({selectedBuildingId:n})}catch(e){}if(null!=n&&w&&w(n))try{b(n)}catch(e){}else if(Number.isFinite(l.bounds_center_lng)&&Number.isFinite(l.bounds_center_lat))try{v(l.bounds_center_lng,l.bounds_center_lat,{key:r,heightM:Number.isFinite(l.height_m)?l.height_m*(Number(k)||1):null})}catch(e){}e.onRowSelected&&e.onRowSelected()}}},M,(0,h.h)("span",{class:"dv-updates-row-main"},(0,h.h)("span",{class:"dv-updates-row-label"},A),(0,h.h)("span",{class:"dv-updates-row-badge","data-change":l.change},"added"===l.change?"Added":"retired"===l.change||"removed"===l.change?"Retired":"Updated"),null!=N?(0,h.h)("span",{class:"dv-updates-row-partof"},"Part of ".concat(N)):null)),D=l.before_cut_id||i.previous_cut_id,T="updated"===l.change?(0,f.A9)(a,D,l.before&&l.before.glb_path||l.old_glb_path,c):null,P=null,B=null,R=(0,h.h)("div",{class:"dv-updates-row-wrap"},E);"updated"===l.change&&(B="dv-updates-viewer-host-".concat(++z),(P=(0,h.h)("button",{type:"button",class:"dv-updates-expand","aria-expanded":"false","aria-controls":B,"aria-label":"Compare before and after â ".concat(A),onClick:()=>(function(){let e=H===c;
1if(ey(),e)O.hidden=!0,P&&P.setAttribute("aria-expanded","false");else{H=c,U=O,Y=P,O.hidden=!1,O.appendChild(y.el);let e=(0,f.rT)({...l,after_cut_id:null,before_cut_id:D},o,S?S(c):null),t=[];if(null!=T){let r=n.find(e=>e.cut_id===D)||null,i=r?(0,f.Cg)(r,I):D;t.push({url:T,orientationDeg:e.yawDeg,degraded:e.degraded,label:"Before \xb7 ".concat(i)})}null!=_&&t.push({url:_,orientationDeg:L.yawDeg,degraded:L.degraded,label:"After \xb7 ".concat(i.label||(0,f.Cg)(i,I))}),null==T&&t.length>0&&O.appendChild((0,h.h)("div",{class:"dv-updates-viewer-note"},"Previous model unavailable â the earlier release no longer serves this file.")),y.show({panes:t}),P&&P.setAttribute("aria-expanded","true")}})()})).innerHTML=g.DI,R.appendChild(P));let O=(0,h.h)("div",{class:"dv-updates-viewer-host",...B?{id:B}:{},hidden:!0}),j=null;if(s&&Array.isArray(s.members)&&s.members.length>0){j=(0,h.h)("div",{class:"dv-updates-members"});let e=s.members.slice(0,8),t=s.members.slice(8);for(let t of e)j.appendChild(r(i,t,null,{member:!0}));if(t.length>0){let e=(0,h.h)("button",{type:"button",class:"dv-updates-members-more",onClick:()=>{for(let n of(e.remove(),t))j.appendChild(r(i,n,null,{member:!0}))}},"+".concat(t.length," more"));j.appendChild(e)}}return(0,h.h)("div",{class:"dv-updates-row-outer"},R,O,j)}(r,l.row,l));let l=r.summary&&r.summary.updated_by_class,s=l?(Number(l.retouched)||0)+(Number(l.rekeyed)||0):0;s>0&&i.appendChild((0,h.h)("div",{class:"dv-updates-touchups"},"+".concat(s," touch-up").concat(1===s?"":"s"))),0===r.rows.length&&i.appendChild((0,h.h)("div",{class:"dv-updates-none"},"No changes of this type in this release."))}else{let e=r.summary&&r.summary.first_class;i.appendChild((0,h.h)("div",{class:"dv-updates-summaryonly"},"".concat(e?(e.added||0)+(e.remodeled||0):0," changes â "),(0,h.h)("a",{href:d.releaseHref(r.cut_id)},"Open in What's New")))}ec.appendChild(i)}"free"===l&&r&&ec.appendChild(m({title:"Older releases",body:"".concat(r.models," models across ").concat(r.releases," release").concat(1===r.releases?"":"s"," before ").concat(r.boundaryLabel||"the recent window",". Older history is part of Plus."),ctaLabel:"Unlock older history",ariaLabel:"Older releases, locked",onCta:c?()=>c.onSelect("plus","olderHistory"):null,skeletonRows:3}))}(i),eb(i),en()}function ex(){if(!R){R=!0,B=!0,q(),eh.hidden=!1,W.setAttribute("aria-expanded","true");try{if(n[0]){let e=(0,f.AQ)(N),t=String(n[0].cut_id),r=window.localStorage.getItem(e);(null==r||String(r)<t)&&window.localStorage.setItem(e,t)}}catch(e){}ew(),p&&p.reconnect();try{eh.focus({preventScroll:!0})}catch(e){}if(C)try{C(!0)}catch(e){}}}function ek(){if(R){if(ey(),-1!==O&&ev(-1),R=!1,eh.hidden=!0,W.setAttribute("aria-expanded","false"),W.offsetParent||W.getClientRects().length)try{W.focus({preventScroll:!0})}catch(e){}else if(A)try{A.focus({preventScroll:!0})}catch(e){}else if(F)try{F(document.activeElement)}catch(e){}if(C)try{C(!1)}catch(e){}}}return{toggleEl:W,panelEl:eh,keyStripEl:ee,keyMirrorEl:et,open:ex,close:ek,isOpen:()=>R,setWindow:e=>{Z({range:e}),R&&ew()},setChip:e=>{Z({chip:e}),R&&ew()},setStop:e=>{ev(null==e?-1:j.findIndex(t=>t.cut_id===e))},getStop:()=>-1===O?null:j[O].cut_id,getLitClasses:J,isLit:()=>!!X().lightUp&&null!=J(),collapseExpandedRow:ey,refreshBadge:q,destroy(){ey(),p&&p.destroy()}}}({state:B,releases:Array.isArray(n.releases)?n.releases:[],older:n.older||null,totalReleases:Number.isFinite(n.totalReleases)?n.totalReleases:(n.releases||[]).length,tier:D.buildingUpdates,bases:n.bases||{},frames:a,links:{allUpdatesHref:n.links&&n.links.allUpdatesHref||"/whats-new",releaseHref:n.links&&"function"==typeof n.links.releaseHref?n.links.releaseHref:e=>"/whats-new/city/".concat(e)},cityLabel:"string"==typeof n.cityLabel?n.cityLabel:"this city",upgrade:P,thumbnailer:{attach:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return rV().thumbnailer.attach(...t)},detach:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];rg&&rg.thumbnailer.detach(...t)},reconnect:()=>{rg&&rg.thumbnailer.reconnect()},destroy:()=>{rg&&rg.thumbnailer.destroy()}},orbitViewer:{get el(){return rV().orbitViewer.el},show:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return rV().orbitViewer.show(...t)},hide:()=>{rg&&rg.orbitViewer.hide()},isOpen:()=>!!rg&&rg.orbitViewer.isOpen(),destroy:()=>{rg&&rg.orbitViewer.destroy()}},focusBuilding:eR,focusPoint:eU,resolveId:e=>eJ.byId.has((0,ek.V2)(String(e)).id),colorEngine:nT,metersPerUnit:t7,getLiveYaw:e=>n0.getResolvedYaw(e),newestSeen:l,nowMs:i,region:r,developmentParents:eJ.developmentParents||null,onOpenChange:t=>{if(t&&e.clientWidth<768&&null!=B.get().selectedBuildingId&&B.set({selectedBuildingId:null}),"function"==typeof n.onOpenChange)try{n.onOpenChange(t)}
1catch(e){}},onRowSelected:()=>{rm=!0},onLightUpChange:null,onStopChange:e=>{rf&&rf.setStop(e)},onLightUpStop:e=>{let t=(Array.isArray(e.rows)?e.rows:[]).map(e=>{let t=function(e){let t=e&&e.ids&&"object"==typeof e.ids?e.ids:e||{},n=e=>null!=e&&""!==String(e).trim()?String(e):null;return n(t.building_id)||n(t.core200_id)||n(t.yimby_cluster_id)||n(t.bin)||n(t.tile_building_id)}(e);return null!=t?{id:t}:{key:String(e.key)}});nW([{name:"updated",color:p.toHex(p.UPDATED_HIGHLIGHT),entries:t}],{slot:"change"}),n7(),n$()},keyTargetEl:z||null}),rb.appendChild(rp.keyMirrorEl),nG.hasKeyPaintedByKey=e=>nD&&nD.hasKeyPaintedByKey(e)||n0.hasKeyPaintedByKey(e),nG.hasPaintId=e=>nD&&nD.hasPaintId(e)||n0.hasPaintId(e);let u=()=>{nj&&(nW(nj.classes,{slot:"change"}),n7(),n$())};nD&&nD.ready&&"function"==typeof nD.ready.then&&nD.ready.then(()=>{rK()||u()}),n0.ready&&"function"==typeof n0.ready.then&&n0.ready.then(()=>{rK()||u()})}function rK(){try{return!0===il}catch(e){return!1}}let rW=null,rq=null,rX=null,rZ=null;if(D.dataLayers){(rq=document.createElement("div")).className="dv-mini-legend",rq.hidden=!0;let e=null;function r$(t){let n=t.activeFieldId;if(rq.textContent="",null==n){rq.hidden=!0,e=null;return}let r=null;try{r=nT.getLegendModel(n,(0,ew.O)(t,n))}catch(e){}e=r?r.kind:null;let i=r&&Array.isArray(r.rows)?r.rows:null;if(!i||0===i.length){rq.hidden=!0;return}let{seats:l,more:a}=function(e,t,n){let r=e.filter(e=>null!==e.value),i=e.find(e=>null===e.value),l=r.filter(e=>!t.has(e.value)),a=l.slice(0,i?6:7),o=l.length-a.length;return i&&a.push(i),{seats:a,more:o}}(i,t.legendHidden instanceof Set?t.legendHidden:new Set,7),o=document.createElement("div");for(let e of(o.className="dv-mini-legend-title",o.textContent=function(e,t){let n=String(t);try{for(let r of nT.getFieldCatalog((0,ew.O)(e,t)).categories){let e=r.fields.find(e=>e.id===t);if(e){n=e.label;break}}}catch(e){}let r=ew.jE[t],i=r&&(r.suffix&&r.suffix.trim()||r.prefix)||"";return i?"".concat(n," (").concat(i,")"):n}(t,n),rq.appendChild(o),l)){let t=document.createElement("div");t.className="dv-mini-legend-row";let n=document.createElement("span");n.className="dv-mini-legend-swatch",n.style.background=e.color||"#9E9E9C";let r=document.createElement("span");r.className="dv-mini-legend-label",r.textContent=null!=e.label?String(e.label):"",t.appendChild(n),t.appendChild(r),rq.appendChild(t)}if(a>0){let e=document.createElement("div");e.className="dv-mini-legend-more",e.textContent="+".concat(a," more"),rq.appendChild(e)}if(null!=t.activeFieldId&&rp&&rp.isLit()){let e=document.createElement("div");e.className="dv-mini-legend-paused",e.textContent="paused while building updates are lit",rq.appendChild(e)}rq.hidden=!1}rW=rZ=()=>r$(B.get()),rX=B.subscribe((t,n)=>{"activeFieldId"in n||"corpusMode"in n||"fieldSourceOverrides"in n||"legendHidden"in n||"glossarySelection"in n||"glossaryIsolate"in n?r$(t):"gradation"in n&&"glossary"!==e&&r$(t)}),r$(B.get())}let rJ=null;D.dataLayers&&D.corpus||!P||(rJ=m({title:"Data layers",body:"Color every building by height, units, cost, developer and more, from two datasets. This is part of the full city.",ctaLabel:P.ctaLabel,onCta:P.onSelect,skeletonRows:3,ariaLabel:"Data layers, locked"})).classList.add("dv-dock-locked");let rQ=function(e){let{rootEl:t,corpusToggleEl:n,rowContent:r={},inspectorEl:i,scrubberContentEl:a,toastHostEl:s,driftBadgeEl:d,yearChipEl:p,keyTarget:f}=e,m=f||window;t.classList.add("dv-root");let y=(0,h.h)("div",{class:"dv-accordion-scroll"}),b={};for(let t of tw){let n=r[t.key];if(!n)continue;let i=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{open:n=!0,onToggle:r}=t,i=!!n,l=(0,h.h)("span",{class:"dv-row-chevron",innerHTML:g.DI}),a=(0,h.h)("span",{class:"dv-row-summary",hidden:!0}),o=(0,h.h)("span",{class:"dv-row-titlegroup"},(0,h.h)("span",{class:"dv-row-title"},e.toUpperCase()),a),s=(0,h.h)("button",{type:"button",class:"dv-row-header","aria-expanded":String(i),onClick:()=>f(!i)},o,l),d=(0,h.h)("div",{class:"dv-row-host"}),u=(0,h.h)("div",{class:"dv-row-hostwrap"},d),c=(0,h.h)("div",{class:"dv-row","data-open":String(i)},s,u);d.hidden=!i,i||(u.style.height="0px"),l.style.transform=i?"rotate(0deg)":"rotate(-90deg)";let p=null;function f(e){i!==e&&(i=e,function(){c.dataset.open=String(i),l.style.transform=i?"rotate(0deg)":"rotate(-90deg)",null!=p&&(clearTimeout(p),p=null);let e=function(e){let t=0;
1for(let n of String(e||"").split(",")){let e=n.trim(),r=parseFloat(e);Number.isFinite(r)&&(t=Math.max(t,e.endsWith("ms")?r:1e3*r))}return t}(getComputedStyle(u).transitionDuration);i?(d.hidden=!1,u.style.height="0px",u.offsetHeight,u.style.height="".concat(d.scrollHeight,"px"),p=setTimeout(()=>{p=null,i&&(u.style.height="")},e+60)):(u.style.height="".concat(u.scrollHeight,"px"),u.offsetHeight,u.style.height="0px",p=setTimeout(()=>{p=null,i||(d.hidden=!0)},e+60))}(),s.setAttribute("aria-expanded",String(i)),"function"==typeof r&&r(i))}return{el:c,setOpen:f,host:d,setSummary:function(e){let t="string"==typeof e&&""!==e;a.hidden=!t,a.textContent=t?e:""}}}(t.title,{open:t.open,..."legend"===t.key&&"function"==typeof e.onLegendOpenChange?{onToggle:t=>{try{e.onLegendOpenChange(t)}catch(e){}}}:{}});i.host.appendChild(n),y.appendChild(i.el),b[t.key]=i}let v=(0,h.h)("div",{class:"dv-dock-left"},e.searchEl||null,n||null,e.lockedSectionEl||null,y),w=(0,h.h)("div",{class:"dv-scrubber-bar"},a||null);t.appendChild(v),i&&t.appendChild(i),t.appendChild(w),s&&t.appendChild(s),d&&t.appendChild(d),p&&t.appendChild(p);let x=tx,k=!0,S=tf(tM.map((e,t)=>({value:e,label:tI[t],hint:tC[t]})),{menu:!0,selectedValue:x,align:"end",triggerIcon:g.DI,footerHint:"V cycles \xb7 â§V hides",onSelect:e=>R(e)});S.el.classList.add("dv-view-mode-menu");let M="function"==typeof e.onHostFullscreenToggle?(0,h.h)("button",{type:"button",class:"dv-view-cluster-fullscreen","aria-label":"Toggle page fullscreen",title:"Toggle page fullscreen",onClick:()=>e.onHostFullscreenToggle()},"⤢"):null,I=(0,h.h)("div",{class:"dv-shortcut-title",id:"dv-shortcut-title"},"Keyboard shortcuts"),C=function(){let e=(e,t)=>(0,h.h)("button",{type:"button",class:"dv-keylabel-btn","data-mode":e,role:"radio","aria-checked":"false",onClick:()=>(function(e){let t="mac"===e?"mac":"win";tm=t;try{window.localStorage.setItem(tg,t)}catch(e){}for(let e of[...ty])try{e(t)}catch(e){}})(e)},t),t=e("mac","Mac"),n=e("win","Windows"),r=(0,h.h)("div",{class:"dv-keylabel-toggle",role:"radiogroup","aria-label":"Keyboard label style"},t,n);function i(e){t.setAttribute("aria-checked",String("mac"===e)),n.setAttribute("aria-checked",String("win"===e)),t.dataset.selected=String("mac"===e),n.dataset.selected=String("win"===e)}i(tb());let l=tv(i);return{el:r,destroy:()=>l()}}(),_=(0,h.h)("div",{class:"dv-shortcut-body"}),L=(0,h.h)("div",{class:"dv-shortcut-popover",hidden:!0,role:"dialog",id:"dv-shortcut-dialog","aria-labelledby":"dv-shortcut-title",tabindex:"-1"},(0,h.h)("div",{class:"dv-shortcut-header"},I,C.el),_);function F(){(0,h.I)(_);let t=u(tb(),{hasBuildingUpdates:!0===e.hasBuildingUpdates}),n=e=>(0,h.h)("div",{class:"dv-shortcut-row"},(0,h.h)("span",{class:"dv-shortcut-keys"},e.keys),(0,h.h)("span",{class:"dv-shortcut-what"},e.what));for(let e of t.filter(e=>"drone"!==e.group))_.appendChild(n(e));for(let e of(_.appendChild((0,h.h)("div",{class:"dv-shortcut-group"},"Drone")),t.filter(e=>"drone"===e.group)))_.appendChild(n(e))}let A=!1;function N(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=!!e;if(A!==n){if(L.hidden=!(A=n),D.setAttribute("aria-expanded",String(A)),A){F();try{L.focus({preventScroll:!0})}catch(e){}}else if(t.refocus)try{D.focus({preventScroll:!0})}catch(e){}}}let E=tv(()=>{A&&F()}),D=(0,h.h)("button",{type:"button",class:"dv-view-cluster-fullscreen dv-shortcut-btn","aria-label":"Keyboard shortcuts",title:"Keyboard shortcuts","aria-expanded":"false","aria-controls":"dv-shortcut-dialog",onClick:()=>N(!A)},"?");L.addEventListener("focusout",e=>{if(L.hidden)return;let t=e.relatedTarget;t&&(L.contains(t)||t===D||D.contains(t))||N(!1)});let T=(0,h.h)("div",{class:"dv-view-cluster"},S.el,e.buildingUpdatesToggleEl||null,e.droneToggleEl||null,M,D,L);function P(e){!L.hidden&&(L.contains(e.target)||D.contains(e.target)||N(!1))}function B(e){let n=t.closest("[data-dv-owner]");if(n&&(!e||n.contains(e))&&(!e||e===document.body||!(e.offsetParent||e.getClientRects().length)))try{n.focus({preventScroll:!0})}catch(e){}}function R(n){let r=document.activeElement,l="string"==typeof n?n.toLowerCase():n;if(tM.includes(l)||console.warn('[dock] unknown view mode "'.concat(n,'" â falling back to "').concat(tx,'"')),x=tM.includes(l)?l:tx,"function"==typeof e.onViewModeChange)try{e.onViewModeChange(x)}catch(e){}let a=x===tx,o=x===tk,s=x===tS;t.classList.toggle("dv-root--full",a),t.classList.toggle("dv-root--minimal",o),v.style.display=a?"":"none",i&&(i.style.display=s?"none":""),w.style.display=s?"none":"",p&&(p.style.display=s?"":"none"),S.setSelected(x),B(r)}function H(t){if(k=!!t,"function"==typeof e.onClusterVisibleChange)try{e.onClusterVisibleChange(k)}catch(e){}let n=document.activeElement;k||(N(!1),S.close()),T.style.display=k?"":"none",B(n)}function U(e){if(!c(document.activeElement,e.target)){if(o(e,l.cycleViewMode)||o(e,l.legacyCycle)){e.preventDefault(),R(tM[(tM.indexOf(x)+1)%tM.length]);return}if(o(e,l.toggleCluster)||o(e,l.legacyCluster)){e.preventDefault(),H(!k);return}if(o(e,l.help)){if(!k||!T.offsetParent)return;e.preventDefault(),N(!A,{refocus:A})}}}return t.appendChild(T),e.miniLegendEl&&t.appendChild(e.miniLegendEl),document.addEventListener("pointerdown",P,!0),m.addEventListener("keydown",U),R("string"==typeof e.initialViewMode?e.initialViewMode:tx),{el:t,rows:b,setViewMode:R,getViewMode:()=>x,setClusterVisible:H,isClusterVisible:()=>k,isHelpOpen:()=>A,closeHelp:e=>N(!1,e||{refocus:!0}),refocusKeyTargetIfLost:B,setChromeVisible:function(e){R(e?tx:tS)}
1,isChromeVisible:()=>x===tx,destroy:function(){m.removeEventListener("keydown",U),document.removeEventListener("pointerdown",P,!0),S.destroy(),E(),C.destroy()}}}({rootEl:Y,keyTarget:z,corpusToggleEl:rx?rx.el:null,lockedSectionEl:rJ,searchEl:rU.el,buildingUpdatesToggleEl:rp?rp.toggleEl:null,hasBuildingUpdates:"off"!==D.buildingUpdates,onLegendOpenChange:e=>{rI&&"function"==typeof rI.api.setLegendRowOpen&&rI.api.setLegendRowOpen(e)},droneToggleEl:rj,miniLegendEl:rq,rowContent:{...D.dataLayers?{dataLayer:rS.el,legend:rI.el,filters:rC.el}:{},backdrop:r_.el,cameraLighting:rL.el},inspectorEl:rE.el,scrubberContentEl:rH.el,toastHostEl:ru.el,driftBadgeEl:rD?rD.el:null,yearChipEl:rT.el,onHostFullscreenToggle:"function"==typeof _.onHostFullscreenToggle?_.onHostFullscreenToggle:void 0,initialViewMode:"string"==typeof _.initialViewMode?_.initialViewMode:void 0,onViewModeChange:e=>{"fullscreen"===e&&rp&&rp.isOpen()&&rp.close(),"function"==typeof _.onViewModeChange&&_.onViewModeChange(e)},onClusterVisibleChange:e=>{!e&&rp&&rp.isOpen()&&rp.close()}});if(Y.appendChild(rP.el),Y.appendChild(rB.el),rp){let e=Y.querySelector(".dv-view-cluster");e?Y.insertBefore(rp.panelEl,e):Y.appendChild(rp.panelEl),Y.appendChild(rp.keyStripEl)}let r0=rp?B.subscribe((t,n)=>{if("releaseStop"in n&&rf&&rf.setStop(t.releaseStop),"buildingUpdates"in n&&rh){let e=t.buildingUpdates||{},n=e.range,r=e.chip;e.lightUp?rh(rp.getLitClasses({range:n,chip:r})):nj&&rh(null)}"selectedBuildingId"in n&&null!=t.selectedBuildingId&&rp.isOpen()&&e.clientWidth<1e3&&!rm&&rp.close(),"selectedBuildingId"in n&&null==t.selectedBuildingId&&(rm=!1)}):null,r1=B.subscribe((e,t)=>{if("corpusMode"in t&&null!=e.selectedBuildingId){let t=eJ.byId.get(String(e.selectedBuildingId));t&&("core200"===e.corpusMode&&"core200"!==t.corpus||"yimby"===e.corpusMode&&"yimby"!==t.corpus)&&(B.set({selectedBuildingId:null}),rc("Selection cleared â building not in the active dataset"))}if("activeFieldId"in t&&rQ.rows&&rQ.rows.dataLayer&&rQ.rows.legend){if("function"==typeof rQ.rows.dataLayer.setSummary){let t=null;if(null!=e.activeFieldId){t=String(e.activeFieldId);try{for(let n of nT.getFieldCatalog(e.corpusMode).categories){let r=n.fields.find(t=>t.id===e.activeFieldId);if(r){t=r.label;break}}}catch(e){}}rQ.rows.dataLayer.setSummary(t)}if(null!=e.activeFieldId){if(rQ.rows.dataLayer.setOpen(!1),rQ.rows.legend.setOpen(!0),rQ.rows.legend.el&&"function"==typeof rQ.rows.legend.el.scrollIntoView){let e="function"==typeof matchMedia&&matchMedia("(prefers-reduced-motion: reduce)").matches;rQ.rows.legend.el.scrollIntoView({block:"nearest",behavior:e?"auto":"smooth"})}}else rQ.rows.dataLayer.setOpen(!0)}});n8.onSelect((t,n)=>{if(B.set({selectedBuildingId:t}),null!=t&&n&&Number.isFinite(n.clientX)){let r=e.getBoundingClientRect();r.width>=768&&n.clientX>r.right-356&&eR(t)}});let r2=document.createElement("div");r2.className="dv-hover-tip",r2.hidden=!0,Y.appendChild(r2);let r3=null;n8.onHover((t,n)=>{if(null!=t&&ee&&ee.isActive()&&(t=null),null==t||!n){r2.hidden=!0,r3=null,R.classList.remove("dv-canvas--pick");return}if(R.classList.add("dv-canvas--pick"),t!==r3){r3=t;let e=String(t),n="";try{let r=nT.getInspectorModel(String(t));r&&(e=r.displayName||e,n=r.corpusLabel||"")}catch(e){}r2.textContent="";let r=document.createElement("span");if(r.className="dv-hover-tip-name",r.textContent=e,r2.appendChild(r),n){let e=document.createElement("span");e.className="dv-hover-tip-sub",e.textContent=n,r2.appendChild(e)}}let r=e.getBoundingClientRect();r2.hidden=!1;let i=r2.offsetWidth||180;r2.style.left="".concat(Math.min(n.clientX-r.left+14,r.width-i-4),"px"),r2.style.top="".concat(Math.max(n.clientY-r.top-34,4),"px")});let r5=document.createElement("div");r5.className="dv-context-menu",r5.setAttribute("role","menu"),r5.hidden=!0,Y.appendChild(r5);let r6=!1;function r4(){r6&&(r6=!1,r5.hidden=!0,r5.textContent="")}function r8(e){r6&&!r5.contains(e.target)&&r4()}document.addEventListener("pointerdown",r8,!0);let r9=(e,t)=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(e).then(()=>rc(t)).catch(()=>rc(e)):rc(e)};function r7(e,t){let n=document.createElement("button");return n.type="button",n.className="dv-context-item",n.setAttribute("role","menuitem"),n.textContent=e,n.addEventListener("click",()=>{r4();try{t()}catch(e){console.error("[contextMenu] action threw:",e)}}),n}r5.addEventListener("keydown",e=>{if("ArrowDown"!==e.key&&"ArrowUp"!==e.key)return;e.preventDefault(),e.stopPropagation();let t=[...r5.querySelectorAll(".dv-context-item")];if(0===t.length)return;let n=t.indexOf(document.activeElement),r="ArrowDown"===e.key?(n+1+t.length)%t.length:(n-1+t.length)%t.length;t[r].focus()}),n8.onContext((t,n)=>{r4();let r=B.get(),i=[];if(null!=t){let e=String(t);if(i.push(r7("Fly to building",()=>eR(e))),rF&&i.push(r7("Copy link to building",()=>{B.set({selectedBuildingId:e});try{r9(String(rF()||""),"Link copied")}catch(e){}})),null!=r.activeFieldId&&rC){let t=null;try{t=nT.getRecordLegendFacts(e)}catch(e){t=null}t&&t.found&&"categorical"===t.kind&&null!=t.rowValue&&i.push(r7('Solo "'.concat(t.rowValue,'" in legend'),()=>{let e=B.get();if(e.activeFieldId!==t.fieldId)return;let n=[];try{let t=nT.getLegendModel(e.activeFieldId,(0,ew.O)(e,e.activeFieldId));n=t&&t.rows||[]}catch(e){n=[]}let r=n.filter(e=>!1!==e.interactive&&null!=e.value&&e.value!==t.rowValue).map(e=>e.value);B.set({legendHidden:new Set(r)}),rc("Solo: ".concat(t.rowValue))})),t&&t.found&&("categorical"===t.kind&&t.text?i.push(r7("Filter like this",()=>{rc(rC.api.addRuleSeeded({fieldId:t.fieldId,condition:"Contains",text:t.text})?'Filter added: contains "'.concat(t.text,'"'):"Filter added (paused â field ineligible here)")})):("stepped"===t.kind||"continuous"===t.kind)&&t.numeric&&i.push(r7("Filter this range",()=>{rc(rC.api.addRuleSeeded({fieldId:t.fieldId,condition:"Range",min:t.numeric.min,max:t.numeric.max})?"Filter added: ".concat(t.numeric.min,"â").concat(t.numeric.max):"Filter added (paused â field ineligible here)")})))}}else rF&&i.push(r7("Copy link to this view",()=>{try{r9(String(rF()||""),"Link copied")}catch(e){}}));if(null!=r.selectedBuildingId&&i.push(r7("Clear selection",()=>B.set({selectedBuildingId:null}))),0===i.length)return;for(let e of i)r5.appendChild(e);r5.hidden=!1,r6=!0;let l=e.getBoundingClientRect(),a=r5.offsetWidth||220,o=r5.offsetHeight||120;r5.style.left="".concat(Math.max(4,Math.min(n.clientX-l.left,l.width-a-8)),"px"),r5.style.top="".concat(Math.max(4,Math.min(n.clientY-l.top,l.height-o-8)),"px");let s=r5.querySelector(".dv-context-item");s&&s.focus()});let ie=z||window;function it(e){if(!o(e,l.escape))return;if(rQ.isHelpOpen&&rQ.isHelpOpen())return void rQ.closeHelp({refocus:!0});if(r6)return void r4();let t=B.get();if(rp&&rp.isOpen()){rp.close(),rm&&null!=t.selectedBuildingId&&B.set({selectedBuildingId:null}),rm=!1;return}if(null!=t.selectedBuildingId)return void B.set({selectedBuildingId:null});"drone"===t.cameraMode&&B.set({cameraMode:"globe"})}function ir(e){!(!rp||c())&&o(e,l.buildingUpdates)&&"off"!==D.buildingUpdates&&rQ.isClusterVisible()&&(e.preventDefault(),rp.isOpen()?rp.close():rp.open())}function ii(e){rp&&o(e,l.commandPalette)&&queueMicrotask(()=>{rO&&rO.el&&!1===rO.el.hidden&&rp.isOpen()&&rp.close()})}ie&&ie.addEventListener("keydown",it),ie&&ie.addEventListener("keydown",ir),ie&&ie.addEventListener("keydown",ii);let il=!1,ia=!1,io=!1,is=B.subscribe((e,t)=>{if("corpusMode"in t){let t=e.corpusMode;("yimby"===t||"both"===t)&&iu({revertOnFail:!0})}if("fieldSourceOverrides"in t&&"loaded"!==(0,ex.getYimbyLoadState)()&&Object.values(e.fieldSourceOverrides||{}).some(e=>"yimby"===e||"both"===e)&&iu({revertOnFail:!1}),"selectedBuildingId"in t&&null!=t.selectedBuildingId&&"loaded"!==(0,ex.getYimbyLoadState)()){let e=nT.getInspectorModel(String(t.selectedBuildingId));e&&e.found||iu({revertOnFail:!1})}});function id(){rC&&"function"==typeof rC.api.refresh&&rC.api.refresh(),rS&&"function"==typeof rS.api.refresh&&rS.api.refresh()}function iu(){let{revertOnFail:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!D.corpus||(e&&(io=!0),"loaded"===(0,ex.getYimbyLoadState)()||ia&&"loading"===(0,ex.getYimbyLoadState)()))return;ia=!0;let t=-1,n=ru.api.push("Loading YIMBY dataâ¦",{sticky:!0}),r=0;(0,ex.ensureYimbyLoaded)(e=>{if(e){if("fetching"===e.phase){let i=performance.now(),l=e.total?Math.min(99,Math.floor(e.loaded/e.total*100)):null;(null!=l&&l>=t+10||i-r>1e3)&&(null!=l&&(t=l),r=i,n.update(null!=l?"Loading YIMBY data⦠".concat(l,"%"):"Loading YIMBY data⦠".concat(Math.round(e.loaded/1048576)," MB")))}else if("parsing"===e.phase)n.update("Loading YIMBY data⦠parsing");else if("projecting"===e.phase)n.update("Loading YIMBY data⦠preparing");else if("merging"===e.phase){let t=e.total?Math.floor(e.loaded/e.total*100):0;n.update("Loading YIMBY data⦠finishing ".concat(t,"%"))}else if("indexing"===e.phase){let t=e.total?Math.floor(e.loaded/e.total*100):0;n.update("Loading YIMBY data⦠indexing ".concat(t,"%"))}}}).then(()=>
1{if(il)return;if(io=!1,nT.notifyIndexMutated(),nX=null,nA){let e=(0,es.gs)(eJ,nA);console.info("[data] manifest end-year fold: ".concat(e," record(s) folded (YIMBY-merge leg)."))}if(nQ.rebuildSlots(eJ),n0.reapplyAfterRebuild(nQ),nD&&nD.reapplyAfterRebuild(nQ),nQ.setCorpusMode(B.get().corpusMode),nQ.setYearIndex(B.get().year),nH&&(nW(nH.ids,nH.color),nU=!0,I=nK()?void 0:"absent",n$(),nK()&&nO&&!nY)){let e=nJ();if(null!=e)try{eR(e)}catch(e){}}n7();let e=nm(eJ,B.get().corpusMode);e&&rH.api.setYearBuckets(e),rS&&"function"==typeof rS.api.refresh&&rS.api.refresh(),rI&&"function"==typeof rI.api.refresh&&rI.api.refresh(),rZ&&rZ(),rC&&"function"==typeof rC.api.refresh&&rC.api.refresh(),rM&&"function"==typeof rM.api.refresh&&rM.api.refresh(),"function"==typeof rE.api.refresh&&rE.api.refresh(),"function"==typeof rS.api.reseedIfEmptyGlossary&&rS.api.reseedIfEmptyGlossary(),n.finalize("YIMBY data ready")}).catch(e=>{if(il)return;if(nH){let e=nH.ids.reduce((e,t)=>e+ +!!eJ.byId.has((0,ek.V2)(String(t)).id),0);nU=!0,I="corpus-unavailable",0===e?(nV(),n7()):io||n7(),n$()}console.error("[app] YIMBY corpus load failed:",e),ia=!1,n.dismiss(),rc("YIMBY data unavailable"),io&&(io=!1,B.set({corpusMode:"core200"}));let t=B.get().fieldSourceOverrides||{},r={},i=!1;for(let[e,n]of Object.entries(t)){if("yimby"===n||"both"===n){i=!0;continue}r[e]=n}i&&B.set({fieldSourceOverrides:r}),id()}),id()}let ic=!1;function ip(e){if(n3.group.visible=!0===e,n1.setDeferredVisible(!0===e),$(),!e||ic)return;ic=!0;let t=ru.api.push("Loading treesâ¦",{sticky:!0});Promise.all([n3.activate(),n1.loadDeferred()]).then(e=>{let[,n]=e;if(il)return;let r=n3.stats().present,i=!!(n&&n.loaded>0);r&&i||(ic=!1),r&&i?t.finalize("Trees ready"):i?t.finalize("Trees ready (year-gated layer pending the next Unity export)"):t.finalize("Tree data not exported yet â trees will appear after the next Unity export")}).catch(e=>{il||(console.error("[app] tree layer load failed:",e),ic=!1,t.dismiss(),rc("Trees unavailable"),B.set({treesEnabled:!1}))})}let ih=B.subscribe((e,t)=>{"treesEnabled"in t&&ip(!0===e.treesEnabled)});B.subscribe((e,t)=>{"hubsEnabled"in t&&(n0.setHubsVisible(!1!==e.hubsEnabled),$())});{let e=B.get().activeFieldId;null==e||((e,t)=>{try{for(let n of nT.getFieldCatalog(t).categories)for(let t of n.fields)if(t.id===e)return!t.filterOnly}catch(e){return console.error("[app] ?layer= validation: getFieldCatalog threw:",e),!0}return!1})(e,B.get().corpusMode)||(console.warn("[app] ?layer=".concat(e," is not a data layer in this corpus â ignoring it.")),B.set({activeFieldId:null}))}let ig=B.get();if(nQ.setCorpusMode(ig.corpusMode),re(ig.year),n7(),rt(ig.selectedBuildingId),t.setFog(!1!==(ig.backdrop||{}).fog),t.setSun(!1!==(ig.backdrop||{}).sun),T(+(!1===(ig.backdrop||{}).sun)),rr(ig.lighting),!0===ig.treesEnabled&&ip(!0),!1===ig.hubsEnabled&&n0.setHubsVisible(!1),"yimby"===ig.corpusMode||"both"===ig.corpusMode?iu({revertOnFail:!0}):"loaded"!==(0,ex.getYimbyLoadState)()&&Object.values(ig.fieldSourceOverrides||{}).some(e=>"yimby"===e||"both"===e)&&iu({revertOnFail:!1}),null!=ig.selectedBuildingId&&"loaded"!==(0,ex.getYimbyLoadState)()){let e=nT.getInspectorModel(String(ig.selectedBuildingId));e&&e.found||iu({revertOnFail:!1})}let im=function(){let e=e=>{try{return new URLSearchParams(location.search).get(e)}catch(e){return null}},t=e("ground");if(t)return"pin:".concat(t);let n=e("groundMode");return"lod"===n||"upgrade"===n||"chunks"===n?"chunks"===n?(console.warn("[app] ground mode: chunks requested â chunk layer not landed yet, falling back to upgrade."),"upgrade"):n:nC?"lod":"lod"===_.groundMode||"upgrade"===_.groundMode?_.groundMode:"chunks"===_.groundMode?(console.warn("[app] ground mode: chunks (host opt) â chunk layer not landed yet, falling back to upgrade."),"upgrade"):!0===_.groundUpgrade||"1"===e("groundUpgrade")?"upgrade":"lod"}();if(console.info("[app] ground mode: ".concat(im)),"upgrade"===im){let e=!1,n=async()=>{if(e)return;e=!0;let t=n1.ground.active();if(!t||!/^ground_lod/.test(t))return;let n=null;try{n=ru.api.push("Upgrading ground detailâ¦",{sticky:!0});let t=await n1.ground.load("new_york_ground_color.meshopt.glb")?"new_york_ground_color.meshopt.glb":await n1.ground.load("new_york_ground_color.glb")?"new_york_ground_color.glb":null;if(!t){n.finalize("Ground detail unavailable â staying on the light version"),console.warn("[app] ground upgrade: full ground unavailable â staying on the LOD."),e=!1;return}let r=n1.ground.active();n1.ground.show(t),r&&r!==t&&n1.ground.unload(r),$(),n.finalize("Ground detail upgraded"),console.info("[app] ground upgrade: resident swapped ".concat(r," -> ").concat(t,"."))}catch(t){n&&n.finalize("Ground detail unavailable â staying on the light version"),e=!1,console.warn("[app] ground upgrade failed â staying on the LOD:",t&&t.message?t.message:t)}};n1.ready.then(()=>
1{if(!n1.ground.active())return;"function"==typeof requestIdleCallback?requestIdleCallback(n,{timeout:8e3}):setTimeout(n,4e3);let r=0,i=()=>{let i=performance.now();!(i-r<300)&&(r=i,!e&&2200>t.camera.position.distanceTo(t.controls.target)&&n())};t.controls.addEventListener("change",i),n4.orbit=i})}if(null!=ig.activeFieldId&&rQ.rows&&rQ.rows.dataLayer&&rQ.rows.legend){if("function"==typeof rQ.rows.dataLayer.setSummary){let e=String(ig.activeFieldId);try{for(let t of nT.getFieldCatalog(ig.corpusMode).categories){let n=t.fields.find(e=>e.id===ig.activeFieldId);if(n){e=n.label;break}}}catch(e){}rQ.rows.dataLayer.setSummary(e)}rQ.rows.dataLayer.setOpen(!1),rQ.rows.legend.setOpen(!0)}function iy(e,t){try{t()}catch(t){console.warn("[app] destroy: ".concat(e," threw (continuing):"),t)}}if(nH){if("loaded"===(0,ex.getYimbyLoadState)()||!D.corpus)if(nU=!0,nK()){if(nO&&!nY){let e=nJ();if(null!=e)try{eR(e)}catch(e){}}}else I="absent";n$()}let ib={scene:t,colorEngine:nT,markers:nQ,heroes:n0,picking:n8,dock:rQ,state:B,getHighlightStatus:nZ,focusBuilding:eR,focusPoint:eU,buildingUpdates:{open:()=>{rp&&rp.open()},close:()=>{rp&&rp.close()},isOpen:()=>!!rp&&rp.isOpen(),setWindow:e=>{rp&&rp.setWindow(e)},setChip:e=>{rp&&rp.setChip(e)},setStop:e=>{rp&&rp.setStop(e)},getStop:()=>rp?rp.getStop():null,getStopStatus:()=>rf?rf.getStatus():null},getMarkerSuppressionState:()=>({heroes:n0.getMarkerSuppressionState?n0.getMarkerSuppressionState():[],tiles:nD&&nD.getMarkerSuppressionState?nD.getMarkerSuppressionState():[]}),getCameraPose:function(){let e=t.camera;if(ee&&ee.isActive()){e.updateMatrixWorld();let t=e.matrixWorld.elements,n=-t[8],r=-t[9],i=-t[10],l=Math.hypot(n,r,i)||1;return n/=l,r/=l,i/=l,{x:e.position.x,y:e.position.y,z:e.position.z,tx:e.position.x+100*n,ty:e.position.y+100*r,tz:e.position.z+100*i,fov:e.fov}}let n=t.controls.target;return{x:e.position.x,y:e.position.y,z:e.position.z,tx:n.x,ty:n.y,tz:n.z,fov:e.fov}},setCameraPose:function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(r=>{if(!(e&&["x","y","z","tx","ty","tz"].every(t=>Number.isFinite(e[t]))))return void r();ee&&ee.isActive()&&B.set({cameraMode:"globe"}),e_(),eY(Number.isFinite(e.fov)?e.fov:null);let i=Number.isFinite(n&&n.durationMs)?Math.max(0,n.durationMs):1200,l=t.controls,a=t.camera;if(0===i){l.target.set(e.tx,e.ty,e.tz),a.position.set(e.x,e.y,e.z),a.lookAt(l.target),$(),r();return}eM={kind:"pose",t0:performance.now(),dur:i,sx:l.target.x,sy:l.target.y,sz:l.target.z,ex:e.tx,ey:e.ty,ez:e.tz,cx:a.position.x,cy:a.position.y,cz:a.position.z,px:e.x,py:e.y,pz:e.z,hadDamping:l.enableDamping,onDone:r},l.enableDamping=!1,$()})},captureFrame:async e=>t.captureFrame(e),applyFov:eY,setContinuousRender:e=>!0===e?!rY&&(ea=!0,$(),!0):(ea=!1,!0),setRecordSize:(e,n)=>!rY&&!0===t.setRecordSize(e,n),clearRecordSize(){t.clearRecordSize()},setRules:e=>!!rC&&(rC.api.setRules(e),!0),getRules:()=>rC?rC.api.getRules():[],setHighlight(e,t){nW(e,t),n7()},clearHighlight(){nW(null,null),n7()},setPlayDisabled(e){rH.api.setPlayDisabled(e)},setTheme(e){Y.dataset.theme="dark"===e?"dark":"light"},destroy(){if(!il){for(let{name:e,handle:n}of(il=!0,iy("cityColorGrade.reset",()=>H(1,1)),iy("setAnimationLoop(null)",()=>t.renderer.setAnimationLoop(null)),iy("escapeDispatch.remove",()=>{ie&&ie.removeEventListener("keydown",it)}),iy("contextMenu.docListener.remove",()=>{document.removeEventListener("pointerdown",r8,!0)}),iy("orbitChange.remove",()=>t.controls.removeEventListener("change",n6)),iy("userCameraStart.remove",()=>t.controls.removeEventListener("start",nz)),iy("groundZoomHook.remove",()=>{n4.orbit&&(t.controls.removeEventListener("change",n4.orbit),n4.orbit=null)}),iy("unsubscribeRenderers",()=>ri()),iy("unsubscribeBuildingUpdates",()=>{r0&&r0()}),iy("unsubscribeYimby",()=>is()),iy("unsubscribeTrees",()=>ih()),iy("unsubscribeDockChoreo",()=>r1()),iy("unsubscribeDroneToggle",()=>rG()),iy("unsubscribeMiniLegend",()=>{rX&&rX()}),iy("cancelFocusTween",()=>e_()),iy("recorder.stop",()=>{if(rY)try{rY.stop()}catch(e){}rz&&(rz(),rz=null),el=!1,ea=!1}),rs))iy("".concat(e,".destroy"),()=>n.api.destroy());iy("buildingUpdates.destroy",()=>{rp&&rp.destroy()}),iy("buildingUpdatesKey.remove",()=>{ie&&ie.removeEventListener("keydown",ir)}),iy("paletteSibling.remove",()=>{ie&&ie.removeEventListener("keydown",ii)}),iy("releaseStops.dispose",()=>{rf&&rf.dispose()}),iy("modelStage.dispose",()=>{rg&&(rg.orbitViewer.destroy(),rg.stage.dispose(),rg=null)}),iy("heroes.dispose",()=>n0.dispose()),iy("environment.dispose",()=>n1.dispose()),iy("infill.dispose",()=>n2.dispose()),iy("trees.dispose",()=>
1n3.dispose()),iy("droneMode.dispose",()=>{ee&&ee.dispose(),null!=en&&(t.renderer.domElement.style.touchAction=en,en=null)}),iy("picking.dispose",()=>n8.dispose()),iy("markers.dispose",()=>nQ.dispose()),iy("dock.destroy",()=>rQ.destroy()),iy("contextlost.remove",()=>{t.renderer.domElement.removeEventListener("webglcontextlost",rv),t.renderer.domElement.removeEventListener("webglcontextrestored",rw)}),iy("scene.dispose",()=>t.dispose()),O&&(iy("container pointerdown listener",()=>{e.removeEventListener("pointerdown",O,!0)}),iy("container focus stamps",()=>{e.dataset.dvOwner===j&&(e.removeAttribute("tabindex"),e.style.outline="",delete e.dataset.dvOwner)})),iy("remove appEl",()=>R.remove()),iy("remove rootEl",()=>Y.remove())}}};if(rk)try{window.__timelapseDebug.app=ib}catch(e){}return ib}async function nw(e){try{let t=await fetch("".concat(e,"/web_environment_manifest.json"));if(!t.ok)return null;let n=await t.json();return n&&"object"==typeof n?n:null}catch(e){return null}}async function nx(e){for(let t of["web_tiles_manifest.json","tiles/tiles_manifest.json"])try{let n=await fetch("".concat(e,"/").concat(t));if(!n.ok)continue;let r=await n.json();if(r&&"object"==typeof r&&Array.isArray(r.tiles))return r}catch(e){}return null}async function nk(e){try{let t=await fetch("".concat(e,"/web_mesh_manifest.json"));if(!t.ok)return null;let n=await t.json();if(!n||!Array.isArray(n.buildings))return null;let r=new Map;for(let e of n.buildings)e&&null!=e.key&&r.set(String(e.key),e);return r}catch(e){return null}}async function nS(e){try{let t=await fetch("".concat(e,"/footprints_web.geojson"));if(!t.ok)return{centroid:null,ringByBin:null};let n=await t.json();return{centroid:function(e){let t=e&&Array.isArray(e.features)?e.features:[],n=0,r=0,i=0;for(let e of t){let t=e.geometry&&e.geometry.coordinates&&e.geometry.coordinates[0]&&e.geometry.coordinates[0][0];t&&(n+=t[0][0],r+=t[0][1],i++)}return i>0?{lon:n/i,lat:r/i}:null}(n),ringByBin:function(e){let t=e&&Array.isArray(e.features)?e.features:[],n=new Map;for(let e of t){let t=e&&e.properties&&null!=e.properties.bin?String(e.properties.bin).trim():"",r=e&&e.geometry;if(!t||!r)continue;let i="Polygon"===r.type?[r.coordinates]:"MultiPolygon"===r.type?r.coordinates:null;if(!Array.isArray(i))continue;let l=null,a=-1;for(let e of i){let t=Array.isArray(e)?e[0]:null;if(!Array.isArray(t)||t.length<3||!Array.isArray(t[0]))continue;let n=0;for(let e=0,r=t.length-1;e<t.length;r=e++)n+=t[r][0]*t[e][1]-t[e][0]*t[r][1];let r=Math.abs(n);r>a&&(a=r,l=t)}l&&n.set(t,l)}return n}(n)}}catch(e){return console.warn("[app] footprint index fetch failed; using default projection center:",e),{centroid:null,ringByBin:null}}}},81496:(e,t,n)=>{n.d(t,{P:()=>s});var r=n(30332);let i=/\d[\d,]*(?:\.\d+)?/g,l=/\u0000/g;function a(e){let t=[];return{skeleton:e.replace(i,e=>(t.push(e),"\0")),tokens:t}}function o(e){return Number(e.replace(/,/g,""))}function s(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{tone:n="accent"}=t,i=null,s=null,d=String(e),u=(0,r.h)("span",{class:"dv-counter dv-counter--".concat(n)},d);function c(){s&&(cancelAnimationFrame(s),s=null)}return{el:u,setText:function(e){let t=String(e),n=d;if(d=t,c(),t===n){u.textContent=t;return}let r=a(n),i=a(t);if("function"==typeof matchMedia&&matchMedia("(prefers-reduced-motion: reduce)").matches||0===i.tokens.length||r.skeleton!==i.skeleton){u.textContent=t;return}let p=performance.now(),f=e=>{let n=Math.min((e-p)/240,1);if(n>=1||d!==t){d===t&&(u.textContent=t),s=null;return}let a=1-Math.pow(1-n,3),c=0;u.textContent=i.skeleton.replace(l,()=>{let e=o(r.tokens[c]);return function(e,t){let n=t.match(/\.(\d+)$/),r=e.toFixed(n?n[1].length:0);if(-1!==t.indexOf(",")){let[e,t]=r.split(".");r=e.replace(/\B(?=(\d{3})+(?!\d))/g,",")+(t?"."+t:"")}return r}(e+(o(i.tokens[c])-e)*a,i.tokens[c++])}),s=requestAnimationFrame(f)};s=requestAnimationFrame(f)},flashWarning:function(e){i&&clearTimeout(i),c(),"string"==typeof e&&(u.textContent=e),u.classList.add("dv-counter--warning-flash"),i=setTimeout(()=>{u.classList.remove("dv-counter--warning-flash"),"string"==typeof e&&(u.textContent=d),i=null},450)}}}},88944:(e,t,n)=>{n.d(t,{T:()=>i});var r=n(30332);function i(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=l(t,e.length),o=[],s=(0,r.h)("div",{class:"dv-segmented",role:"radiogroup"});function d(t){t!==a&&(a=t,u(),"function"==typeof n&&n(a,e[a]))}function u(){o.forEach((e,t)=>{let n=t===a;e.dataset.selected=String(n),e.setAttribute("aria-checked",String(n)),e.setAttribute("tabindex",n?"0":"-1")})}return i.ariaLabel&&s.setAttribute("aria-label",i.ariaLabel),s.addEventListener("keydown",function(t){let n=null;switch(t.key){case"ArrowLeft":case"ArrowUp":n=(a-1+e.length)%e.length;break;case"ArrowRight":case"ArrowDown":n=(a+1)%e.length;break;case"Home":n=0;break;case"End":n=e.length-1;break;default:return}t.preventDefault(),t.stopPropagation(),d(n);let r=o[n];r&&r.focus()}),(0,r.I)(s),o.length=0,e.forEach((e,t)=>{let n=t===a,i=(0,r.h)("button",{type:"button",class:"dv-segmented-pill","data-selected":String(n),role:"radio","aria-checked":String(n),tabindex:n?"0":"-1",onClick:()=>d(t)},e);o.push(i),s.appendChild(i)}),{el:s,setSelected:function(t){let n=l(t,e.length);n!==a&&(a=n,u())},getSelected:function(){return a}}}function l(e,t){return Number.isFinite(e)?Math.min(Math.max(Math.round(e),0),Math.max(t-1,0)):0}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.