From 0e5ee030feed3c50bfa197aa2b855b73730fe09c Mon Sep 17 00:00:00 2001 From: Sergey Matyunin Date: Thu, 20 Aug 2026 11:00:22 +0300 Subject: [PATCH] fix: polish device marker geometry and input Issue: #213 User-Visible: yes --- .../houseplan/frontend/houseplan-card.js | 612 ++++++++++-------- demo/capture_device_icon_reference.mjs | 6 +- demo/smoke_device_icon_design.mjs | 155 ++++- demo/smoke_device_icon_pixel_alignment.mjs | 186 ++++++ demo/smoke_device_preview_parity.mjs | 8 +- demo/smoke_hidden_flag.mjs | 2 +- demo/smoke_opening_binding.mjs | 48 ++ demo/smoke_vacuum.mjs | 11 +- demo/srv/assets/houseplan-card.js | 612 ++++++++++-------- dist/houseplan-card.js | 612 ++++++++++-------- docs/ARCHITECTURE.md | 25 +- docs/CHANGELOG.md | 8 + docs/CHANGELOG.ru.md | 8 + docs/TESTING.md | 19 +- docs/USER-GUIDE.md | 12 +- docs/USER-GUIDE.ru.md | 20 +- docs/images/01-view-desktop.png | Bin 196597 -> 196663 bytes docs/images/02-view-touch.png | Bin 63560 -> 63198 bytes docs/images/06-device-display-preview.png | Bin 296642 -> 296313 bytes docs/images/06-device-editor.png | Bin 298309 -> 297972 bytes docs/images/08-room-card.png | Bin 32783 -> 32778 bytes docs/images/09-device-info.png | Bin 136817 -> 136808 bytes docs/images/screenshots.json | 34 +- docs/specs/213-device-marker-geometry.md | 56 +- scripts/mutation-gate.mjs | 10 +- src/device-face.ts | 1 + src/device-marker-geometry.ts | 15 + src/device-presentation.ts | 7 +- src/houseplan-card.ts | 17 +- src/hp-device-preview.ts | 1 + src/space-render.ts | 10 +- src/styles.ts | 158 +++-- test/device-face.test.mjs | 1 + test/device-marker-geometry.test.mjs | 16 + test/device-marker-polish-contract.test.mjs | 30 +- test/device-presentation.test.mjs | 9 +- tsconfig.test.json | 2 +- 37 files changed, 1760 insertions(+), 951 deletions(-) create mode 100644 demo/smoke_device_icon_pixel_alignment.mjs create mode 100644 src/device-marker-geometry.ts create mode 100644 test/device-marker-geometry.test.mjs diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js index a767e7be..28e542b4 100755 --- a/custom_components/houseplan/frontend/houseplan-card.js +++ b/custom_components/houseplan/frontend/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function ai(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function li(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function hi(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function di(t){const e=[],i=new Set;for(const s of t||[]){const t=ci(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function pi(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of di(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function _i(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function gi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function mi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function vi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function yi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function xi(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!fi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||$i(t)||t[0]}function $i(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(bi(s,t,e))return s;for(let s=0;sMi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Mi(e,t,i)))}function Ti(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ri(t,e,i){for(let s=0;s1&&mi(i[0],i[i.length-1],e)&&i.pop(),i}function Ii(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(mi(s,n,i))return null;const o=Ri(t,s,i),r=Ri(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!bi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ai(r,i)};let c,h;if(o===r){const r=Ai([...e],i);if(r.length<3||Ti(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ai(a,i),h=r}else c=Ai([...l(s,o,n,r),...[...a].reverse()],i),h=Ai([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Ti(c)<=i||Ti(h)<=i||Math.abs(Ti(c)+Ti(h)-Ti(t))>Math.max(i,1e-6*Ti(t))?null:[c,h]}function Fi(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function Ei(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function zi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Oi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Yi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Ki(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Xi(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Ji(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Zi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Gi;const o=(e?.attr||"").trim(),r=Xi(t,i,o||null);if(null===r)return Gi;return Ji(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function Qi(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Ki(e);return n?(o=!0,s(n.entity||"")?Zi(i,n):Gi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Vi);return t>=0?n.slice(0,t)+Gi+n.slice(t+2):n?`${n} ${Gi}`:Gi}const l=Zi(i,e),c=n.indexOf(Vi);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const ts=20;function es(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function is(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ss="#55606c",ns=.55,os={c:"#607d8b",a:.18};function rs(t,e=os){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function as(t,e){const i=rs(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?rs(s,i):i}function ls(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ss),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):ns,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:rs(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function cs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const hs={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function ds(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(hs)){const s=hs[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function us(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function ps(t,e,i,s,n,o,r,a=os){const l=function(t,e,i,s,n,o,r,a=os){if("custom"===t)return rs(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:us(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const _s={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},gs=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function ms(t){for(const e of[...Object.values(_s),...gs])if(t===e[0]||t===e[1])return e;return null}function fs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?ms(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=_s[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=ms(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function vs(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const ys=1/2.2;function bs(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ws(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function ks(t,e,i){const s=ws(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:bs(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=vs(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function xs(t,e,i){return"on"===t?.state?ks(t,e,i):null}function $s(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,ys));return Math.max(0,Math.min(1,s))}function Ss(t){return t.startsWith("light.")||t.startsWith("switch.")}function Ms(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Cs(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ds(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=As(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function As(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Is(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Fs(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function Es(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function zs(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Os(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Hs(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ns=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Ls(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ns.has(e)}function Bs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const qs={availability:"available",status:"alarm",activity:"none"},js=new Set(["motion","vibration","sound"]),Ws=new Set(["occupancy","presence"]),Us=new Set(["door","window","garage_door","opening"]),Gs=new Set(["running","power"]),Vs=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ks=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Ys=new Set([...Ks,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Xs=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Js=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Zs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,Qs=t=>String(t??"").trim().toLowerCase(),tn=t=>Qs(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),en=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),sn=new Set(["wifi","connection","signal","battery"]);function nn(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>Qs(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(tn).filter(Boolean);if(r.some(t=>t.split("_").some(t=>sn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of en)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const on=(t,e)=>null!=nn(t,e);function rn(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(Qs).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=Qs(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function an(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=Qs(t?.[e]);if(Ks.has(i)||Xs.has(i))return i}return""}function ln(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n=String(e||"").split(".")[0],o=Qs(i?.attributes?.device_class),r={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Ls(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return js.has(o)?{...r,edge:"rising"}:Ws.has(o)?{...r,activity:"on"===s?"presence":"none"}:Us.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Gs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=an(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(Qs):[],n=!Xs.has(s)&&(Js.has(s)||Ks.has(s)||e.includes(s));return(t?Ks.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=an(i.attributes);return Ks.has(a)||Ks.has(s)&&!Xs.has(s)?{...r,status:"working",activity:"running"}:r}function cn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>rn(t,e));if(!(s.length>1&&!!n))return e.map(e=>ln(t,e));const o=e.find(e=>e!==n&&on(t,e)),r=ln(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?Qs(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=an(i?.attributes);return Ks.has(o)||Ys.has(s)&&!Xs.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:ln(t,e),status:"neutral",activity:"none",edge:"none"}})}function hn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return qs;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function dn(t,e){if(!(t=>!!t&&!Zs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const un=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},pn=(t,e)=>{const i={rev:0,configRev:un(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function _n(t,e=0){return pn(t,e).snapshot}function gn(t,e,i,s){const n=pn(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Cn(i,"id"),o=Cn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Tn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Dn(t,e)},80))}async function Pn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Tn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Tn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function Rn(t,e){const i=Mn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Dn(t,i),Pn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function An(t){const e=Mn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Tn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function In(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=kn.get(t);return e||(e=xn++,kn.set(t,e)),e}function Fn(t,e=An(t)){return[e.revision,e.access,In(e.devices),In(e.entities)].join(":")}function En(t){return!!t&&null==t.disabled_by}function zn(t,e=An(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))En(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!En(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!En(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!En(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!En(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function On(t,e=An(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Hn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Nn(){if(Sn)return Sn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem($n)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Sn=i,Sn}catch{return{}}}function Ln(t,e,i=An(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Hn(a,o);if(!En(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>En(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!En(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!En(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Nn()[t]||null}(e);if("device"===n){const e=r[o],i=Hn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function Bn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!En(s))continue;const n=t.devices?.[s.device_id];n&&!En(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function qn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function jn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Wn=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Un=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Gn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Wn){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Un(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=Qs(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return js.has(i)||Ws.has(i)||Us.has(i)||Gs.has(i)||"moving"===i||Vs.has(i)}(t,e.eid));if(o.length)return Un(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Un(r),s=e.find(e=>rn(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=nn(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Un(o.filter(i=>nn(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Un(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Un(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Vn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>jn(t,e.eid));if(i)return i.eid}const o=Gn(t,e);return o.find(Ss)||o[0]}function Kn(t,e,i=[]){return[...new Set(Yn(t,e,i))].filter(t=>Ss(t))}function Yn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Xn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Jn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ss),s=t.primary&&Ss(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ss(t)))]}function Zn(t){const e=Jn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function Qn(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Zn(e),via:"forced"}]}const i=e.primary||Gn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const to=new WeakMap,eo=new WeakMap;function io(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function so(t){const e=io(t),i=to.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ss):e.controls.filter(Ss)),s=Zn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return to.set(t,a),a}function no(t){return so(t).incomingByMarker}function oo(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&Qn(t,e).length>0}function ro(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=oo(t,e)?Qn(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function ao(t,e,i,s){if(null!=i)return ao(t,e,null,s).filter(t=>Xn(t.device,i));const n=io(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=fn(s),a=eo.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=so(e),u=null==i?l:l.filter(t=>Xn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ro(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ss):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&vn(i.device.marker)&&(i.on=yn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Xn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ss(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return eo.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function lo(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function co(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function ho(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return Ei(i)}function uo(t,e){for(const i of e){if(!jn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function po(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function _o(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function go(t,e){for(const i of e){if(!_o(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function mo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!En(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!En(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function fo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function vo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function yo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function bo(t,e,i,s,n){const o=Kn(e.binding,e.controls,t.entities).filter(t=>!yo(i,t,s)).filter(t=>"active"===Ln(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function wo(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function ko(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),n=On(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=vo(r),g=mo(s,p).filter(t=>!yo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=Bn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Ln(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=qn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=fo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Vn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=uo(s,_)),C.primary&&_o(s,C.primary)&&(C.hum=go(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Ln(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=wo(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?fo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Vn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=uo(s,g)),f.primary&&_o(s,f.primary)&&(f.hum=go(s,g)),bo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(yo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=wo(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=fo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=uo(s,v.entities)),v.entities.length&&_o(s,l)&&(v.hum=go(s,v.entities)),bo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};bo(r,t,n,_,i),k.push(r)}}return k}function xo(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=vo(i);return"device"===n?r.devices.has(o):"entity"===n&&yo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?uo(t,e):go(t,e)}return null}const $o=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function So(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=ho(t,n.entities);null!=e&&s.push(e)}return Ei(s)}function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Co={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function Do(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const To=new WeakMap;function Po(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ro(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Ao(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Io(t){return t.replaceAll("_"," ")}function Fo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Eo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function zo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Ao(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Ho(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Xi(t,i.entity_id);n=s?Ji(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Io(i.attribute)} · ${Ao(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Ho(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Xi(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Fo(o,100/255);if("volume_level"===i)return Fo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Fo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=ho(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Eo(i)}}function Oo(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>jn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&_o(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Ho(t,e){const i=t?.entities?.[e];if(i&&!En(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||En(s)}function No(t,e){return Ho(t,e)&&!!t?.states?.[e]}function Lo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=To.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=ao(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Po(i);if(r.some(t=>t.key===s))return;const n=zo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!No(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Co[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==ho(t,e.entities)||c({kind:"derived_lqi"}),To.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function Bo(t,e,i){const s=Oo(t,e);if(s&&i.some(t=>t.key===Po(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function qo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function jo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Wo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Uo(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` + `,Yt=new Set(["hacs","sun","backup","hassio","met","telegram_bot","mobile_app","systemmonitor","better_thermostat","adaptive_lighting","yandex_pogoda","upnp_serial_number"]),Xt=[{pattern:"протечк|leak|water sensor",icon:"mdi:water-alert"},{pattern:"клапан|valve",icon:"mdi:pipe-valve"},{pattern:"дым|smoke",icon:"mdi:smoke-detector"},{pattern:"термоголов|trv|radiator",icon:"mdi:radiator"},{pattern:"чайник|kettle|термопот",icon:"mdi:kettle"},{pattern:"сауна|sauna|harvia|парная|парилк",icon:"mdi:hot-tub"},{pattern:"температ|temperature|thermometer|climate sensor",icon:"mdi:thermometer"},{pattern:"qingping|air monitor|молекул|air quality",icon:"mdi:air-filter"},{pattern:"штор|curtain|blind|shade",icon:"mdi:roller-shade"},{pattern:"розетк|plug|socket|outlet",icon:"mdi:power-socket-de"},{pattern:"выключат|switch",icon:"mdi:light-switch"},{pattern:"лампа|лампочк|bulb|gx53|светильник|rgb|lamp|light strip",icon:"mdi:lightbulb"},{pattern:"камер|camera",icon:"mdi:cctv"},{pattern:"замок|ttlock|lock|sn609|sn9161",icon:"mdi:lock"},{pattern:"ворота|garage|gate",icon:"mdi:garage-variant"},{pattern:"калитк|door|открыт|contact",icon:"mdi:door"},{pattern:"счётчик|счетчик|kws|meter",icon:"mdi:meter-electric"},{pattern:"вводный автомат|breaker|wifimcbn",icon:"mdi:electric-switch"},{pattern:"myheat|котёл|котел|boiler|отоплен|heating",icon:"mdi:water-boiler"},{pattern:"холодильник|fridge",icon:"mdi:fridge"},{pattern:"стиральн|washer|washing",icon:"mdi:washing-machine"},{pattern:"сушилк|dryer",icon:"mdi:tumble-dryer"},{pattern:"пылесос|vacuum|dreame|roborock",icon:"mdi:robot-vacuum"},{pattern:"soundbar",icon:"mdi:soundbar"},{pattern:"колонк|станц|speaker|яндекс|yandex|алиса|alice",icon:"mdi:speaker"},{pattern:"tv|телевизор|hyundaitv|mitv|television",icon:"mdi:television"},{pattern:"keenetic|роутер|router|mesh|access point",icon:"mdi:router-wireless"},{pattern:"ибп|ups|kirpich",icon:"mdi:battery-charging-high"},{pattern:"slzb|координат|zigbee|coordinator",icon:"mdi:zigbee"},{pattern:"motion|движен|presence|присутств",icon:"mdi:motion-sensor"},{pattern:"humidity|влажн",icon:"mdi:water-percent"}];function Jt(t){const e=[];for(const i of t)if(i&&"string"==typeof i.pattern&&i.icon)try{e.push({re:new RegExp(i.pattern,"i"),icon:i.icon})}catch{}return e}const Zt=Jt(Xt),Qt={temperature:"mdi:thermometer",humidity:"mdi:water-percent",motion:"mdi:motion-sensor",occupancy:"mdi:motion-sensor",presence:"mdi:motion-sensor",door:"mdi:door",window:"mdi:window-closed",garage_door:"mdi:garage-variant",smoke:"mdi:smoke-detector",moisture:"mdi:water-alert",gas:"mdi:gas-cylinder",power:"mdi:meter-electric",energy:"mdi:meter-electric",illuminance:"mdi:brightness-5",co2:"mdi:molecule-co2",pm25:"mdi:air-filter",battery:"mdi:battery"},te="mdi:chip";function ee(t,e,i){const s=((t||"")+" "+(e||"")).toLowerCase();for(const{re:t,icon:e}of i??Zt)if(t.test(s))return e;return te}const ie=["light","switch","cover","valve","lock","climate","fan","media_player","camera","vacuum","humidifier","water_heater","alarm_control_panel","sensor","binary_sensor","event","button","number","select","update"];var se=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,ne=Math.ceil,oe=Math.floor,re="[BigNumber Error] ",ae=re+"Number primitive has more than 15 significant digits: ",le=1e14,ce=14,he=9007199254740991,de=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],ue=1e7,pe=1e9;function _e(t){var e=0|t;return t>0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t){const e=Math.max(0,Math.min(120,(t-40)/140*120));return`hsl(${Math.round(e)}, 85%, 55%)`}function ai(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function li(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function ci(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function di(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function ui(t){const e=[],i=new Set;for(const s of t||[]){const t=hi(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function _i(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of ui(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function gi(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function mi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function fi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function yi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function bi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function $i(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!vi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||Si(t)||t[0]}function Si(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(wi(s,t,e))return s;for(let s=0;sCi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Ci(e,t,i)))}function Pi(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ai(t,e,i){for(let s=0;s1&&fi(i[0],i[i.length-1],e)&&i.pop(),i}function Fi(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(fi(s,n,i))return null;const o=Ai(t,s,i),r=Ai(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!wi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ii(r,i)};let c,h;if(o===r){const r=Ii([...e],i);if(r.length<3||Pi(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ii(a,i),h=r}else c=Ii([...l(s,o,n,r),...[...a].reverse()],i),h=Ii([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Pi(c)<=i||Pi(h)<=i||Math.abs(Pi(c)+Pi(h)-Pi(t))>Math.max(i,1e-6*Pi(t))?null:[c,h]}function Ei(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function zi(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function Oi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Hi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Xi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Yi(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Ji(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Zi(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Qi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Vi;const o=(e?.attr||"").trim(),r=Ji(t,i,o||null);if(null===r)return Vi;return Zi(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function ts(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Yi(e);return n?(o=!0,s(n.entity||"")?Qi(i,n):Vi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Ki);return t>=0?n.slice(0,t)+Vi+n.slice(t+2):n?`${n} ${Vi}`:Vi}const l=Qi(i,e),c=n.indexOf(Ki);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const es=20;function is(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function ss(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ns="#55606c",os=.55,rs={c:"#607d8b",a:.18};function as(t,e=rs){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function ls(t,e){const i=as(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?as(s,i):i}function cs(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ns),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):os,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:as(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function hs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const ds={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function us(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(ds)){const s=ds[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function ps(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function _s(t,e,i,s,n,o,r,a=rs){const l=function(t,e,i,s,n,o,r,a=rs){if("custom"===t)return as(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:ps(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const gs={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},ms=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function fs(t){for(const e of[...Object.values(gs),...ms])if(t===e[0]||t===e[1])return e;return null}function vs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?fs(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=gs[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=fs(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function ys(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const bs=1/2.2;function ws(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ks(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function xs(t,e,i){const s=ks(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:ws(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=ys(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function $s(t,e,i){return"on"===t?.state?xs(t,e,i):null}function Ss(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,bs));return Math.max(0,Math.min(1,s))}function Ms(t){return t.startsWith("light.")||t.startsWith("switch.")}function Cs(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Ds(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ts(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=Is(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function Is(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Fs(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Es(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function zs(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function Os(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Hs(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Ns(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ls=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Bs(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ls.has(e)}function qs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const js={availability:"available",status:"alarm",activity:"none"},Ws=new Set(["motion","vibration","sound"]),Us=new Set(["occupancy","presence"]),Gs=new Set(["door","window","garage_door","opening"]),Vs=new Set(["running","power"]),Ks=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ys=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Xs=new Set([...Ys,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Js=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Zs=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Qs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,tn=t=>String(t??"").trim().toLowerCase(),en=t=>tn(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),sn=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),nn=new Set(["wifi","connection","signal","battery"]);function on(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>tn(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(en).filter(Boolean);if(r.some(t=>t.split("_").some(t=>nn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of sn)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const rn=(t,e)=>null!=on(t,e);function an(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(tn).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=tn(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function ln(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=tn(t?.[e]);if(Ys.has(i)||Js.has(i))return i}return""}function cn(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n=String(e||"").split(".")[0],o=tn(i?.attributes?.device_class),r={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Bs(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return Ws.has(o)?{...r,edge:"rising"}:Us.has(o)?{...r,activity:"on"===s?"presence":"none"}:Gs.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Vs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=ln(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(tn):[],n=!Js.has(s)&&(Zs.has(s)||Ys.has(s)||e.includes(s));return(t?Ys.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=ln(i.attributes);return Ys.has(a)||Ys.has(s)&&!Js.has(s)?{...r,status:"working",activity:"running"}:r}function hn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>an(t,e));if(!(s.length>1&&!!n))return e.map(e=>cn(t,e));const o=e.find(e=>e!==n&&rn(t,e)),r=cn(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?tn(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=ln(i?.attributes);return Ys.has(o)||Xs.has(s)&&!Js.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:cn(t,e),status:"neutral",activity:"none",edge:"none"}})}function dn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return js;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function un(t,e){if(!(t=>!!t&&!Qs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const pn=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},_n=(t,e)=>{const i={rev:0,configRev:pn(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function gn(t,e=0){return _n(t,e).snapshot}function mn(t,e,i,s){const n=_n(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Dn(i,"id"),o=Dn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Pn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Tn(t,e)},80))}async function Rn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Pn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Pn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function An(t,e){const i=Cn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Tn(t,i),Rn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function In(t){const e=Cn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Pn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function Fn(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=xn.get(t);return e||(e=$n++,xn.set(t,e)),e}function En(t,e=In(t)){return[e.revision,e.access,Fn(e.devices),Fn(e.entities)].join(":")}function zn(t){return!!t&&null==t.disabled_by}function On(t,e=In(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))zn(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!zn(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!zn(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!zn(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!zn(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function Hn(t,e=In(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Nn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Ln(){if(Mn)return Mn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem(Sn)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Mn=i,Mn}catch{return{}}}function Bn(t,e,i=In(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Nn(a,o);if(!zn(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>zn(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!zn(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!zn(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Ln()[t]||null}(e);if("device"===n){const e=r[o],i=Nn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function qn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!zn(s))continue;const n=t.devices?.[s.device_id];n&&!zn(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function jn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function Wn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Un=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Gn=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Vn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Un){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Gn(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=tn(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return Ws.has(i)||Us.has(i)||Gs.has(i)||Vs.has(i)||"moving"===i||Ks.has(i)}(t,e.eid));if(o.length)return Gn(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Gn(r),s=e.find(e=>an(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=on(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Gn(o.filter(i=>on(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Gn(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Gn(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Kn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>Wn(t,e.eid));if(i)return i.eid}const o=Vn(t,e);return o.find(Ms)||o[0]}function Yn(t,e,i=[]){return[...new Set(Xn(t,e,i))].filter(t=>Ms(t))}function Xn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Jn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Zn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ms),s=t.primary&&Ms(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ms(t)))]}function Qn(t){const e=Zn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function to(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Qn(e),via:"forced"}]}const i=e.primary||Vn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const eo=new WeakMap,io=new WeakMap;function so(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function no(t){const e=so(t),i=eo.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ms):e.controls.filter(Ms)),s=Qn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return eo.set(t,a),a}function oo(t){return no(t).incomingByMarker}function ro(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&to(t,e).length>0}function ao(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=ro(t,e)?to(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function lo(t,e,i,s){if(null!=i)return lo(t,e,null,s).filter(t=>Jn(t.device,i));const n=so(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=vn(s),a=io.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=no(e),u=null==i?l:l.filter(t=>Jn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ao(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ms):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&yn(i.device.marker)&&(i.on=bn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Jn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ms(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return io.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function co(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function ho(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function uo(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return zi(i)}function po(t,e){for(const i of e){if(!Wn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function _o(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function go(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function mo(t,e){for(const i of e){if(!go(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function fo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!zn(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!zn(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function vo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function yo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function bo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function wo(t,e,i,s,n){const o=Yn(e.binding,e.controls,t.entities).filter(t=>!bo(i,t,s)).filter(t=>"active"===Bn(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function ko(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function xo(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),n=Hn(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=yo(r),g=fo(s,p).filter(t=>!bo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=qn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Bn(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=jn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=vo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Kn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=po(s,_)),C.primary&&go(s,C.primary)&&(C.hum=mo(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Bn(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=ko(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?vo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Kn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=po(s,g)),f.primary&&go(s,f.primary)&&(f.hum=mo(s,g)),wo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(bo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=ko(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=vo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=po(s,v.entities)),v.entities.length&&go(s,l)&&(v.hum=mo(s,v.entities)),wo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};wo(r,t,n,_,i),k.push(r)}}return k}function $o(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=yo(i);return"device"===n?r.devices.has(o):"entity"===n&&bo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?po(t,e):mo(t,e)}return null}const So=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return zi(s)}function Co(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=po(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Do={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function To(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const Po=new WeakMap;function Ro(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ao(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Io(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Fo(t){return t.replaceAll("_"," ")}function Eo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function zo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function Oo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Io(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(No(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ji(t,i.entity_id);n=s?Zi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Fo(i.attribute)} · ${Io(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?No(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ji(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Eo(o,100/255);if("volume_level"===i)return Eo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Eo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=uo(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:zo(i)}}function Ho(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Wn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&go(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function No(t,e){const i=t?.entities?.[e];if(i&&!zn(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||zn(s)}function Lo(t,e){return No(t,e)&&!!t?.states?.[e]}function Bo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=Po.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=lo(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Ro(i);if(r.some(t=>t.key===s))return;const n=Oo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!Lo(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Do[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==uo(t,e.entities)||c({kind:"derived_lqi"}),Po.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function qo(t,e,i){const s=Ho(t,e);if(s&&i.some(t=>t.key===Ro(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function jo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function Wo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Uo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Go(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` ${"none"!==i.kind&&"dot"!==i.reducedMotionIndicator?j``:G} ${"dot"===i.reducedMotionIndicator?j``:G} ${e.newDevice?j``:G} ${t.haDisabled?j``:G} ${null!=t.lqiText?j`${t.lqiText}`:G} - `}function Go(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Vo=new WeakMap;function Ko(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Vo.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Vo.set(e,i)),i}function Yo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Xo(t,e){const i=Ko(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Yo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Jo(t){const e=Ko(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Zo(t,e,i=Jo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Qo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Zo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function tr(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function er(t,e,i,s=Jo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return Qo(t,n.platform||r,"entity-platform",s,o)}var ir={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const sr={en:ir,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function nr(t,e){if(e&&e in sr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function or(t,e,i){return is(sr[t][e]??ir[e]??e,i)}function rr(t,e){const i=sr[t][e]??sr.en[e];return"string"==typeof i&&i.trim().length>0}class ar extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Xo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return nr(this.hass)}_t(t,e){return or(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Jo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=er(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Qo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return tr(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(er(t,e,i,s));return c.some(Boolean)?tr(c):tr((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Qo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Jo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=er(this.hass,t,this.registry,Jo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",qo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",Do(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
+ `}function Vo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Ko=new WeakMap;function Yo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Ko.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Ko.set(e,i)),i}function Xo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Jo(t,e){const i=Yo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Xo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Zo(t){const e=Yo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Qo(t,e,i=Zo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function tr(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Qo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function er(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ir(t,e,i,s=Zo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return tr(t,n.platform||r,"entity-platform",s,o)}var sr={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const nr={en:sr,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function or(t,e){if(e&&e in nr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function rr(t,e,i){return ss(nr[t][e]??sr[e]??e,i)}function ar(t,e){const i=nr[t][e]??nr.en[e];return"string"==typeof i&&i.trim().length>0}class lr extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Jo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return or(this.hass)}_t(t,e){return rr(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Zo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=ir(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return tr(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return er(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(ir(t,e,i,s));return c.some(Boolean)?er(c):er((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return tr(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Zo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ir(this.hass,t,this.registry,Zo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",jo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=Wo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4183,7 +4268,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -4225,7 +4310,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("continuous"===this._demoKind?"marker.preview.stop_continuous":"marker.preview.demo_continuous")}
`:G} -
`}}ar.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},ar.styles=[Kt,o` +
`}}lr.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},lr.styles=[Kt,o` :host { display: block; min-width: 0; } .devicepreview { margin: 4px 0 14px; @@ -4256,6 +4341,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 pointer-events: none; container-type: inline-size; --icon-size: 54px; + --device-base-size: 48.6px; } .previewfit { position: absolute; left: 50%; top: 50%; transform-origin: center; } .previewstage .dev { left: 0; top: 0; cursor: default; } @@ -4291,20 +4377,20 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 .previewstage { min-height: 142px; } .previewfacts > div { grid-template-columns: minmax(0, 1fr); gap: 2px; } } - `],customElements.get("hp-device-preview")||customElements.define("hp-device-preview",ar);const lr=(t,e)=>[t[0]-e[0],t[1]-e[1]],cr=(t,e)=>[t[0]+e[0],t[1]+e[1]],hr=(t,e)=>t[0]*e[0]+t[1]*e[1],dr=t=>Math.hypot(t[0],t[1]);function ur(t){let e=0;for(let i=0;it[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}([a[0]+r[0]*l,a[1]+r[1]*l],t)&&(r=[-r[0],-r[1]]),r}function gr(t,e,i,s){const n=s||_r(t,e),o=(e+1)%t.length;return t.map((t,s)=>s===e||s===o?[t[0]+n[0]*i,t[1]+n[1]*i]:[...t])}function mr(t,e,i,s){const n=[],o=lr(i,e),r=dr(o);if(rs||h>s)continue;const d=hr(lr(o,e),a),u=hr(lr(l,e),a),p=Math.max(0,Math.min(d,u)),_=Math.min(r,Math.max(d,u));_-p>s&&n.push([[e[0]+a[0]*p,e[1]+a[1]*p],[e[0]+a[0]*_,e[1]+a[1]*_]])}return n}function fr(t,e,i,s,n){const o=mr(t,e,i,n);if(!o.length)return null;const r=t=>o.some(([e,i])=>pr(t,e,i)<=n),a=t.length,l=[];for(let o=0;on||f>n)continue;const v=hr(lr(e,c),p),y=hr(lr(i,c),p),b=Math.max(0,Math.min(v,y)),w=Math.min(u,Math.max(v,y));if(!(w-b<=n)){if(b>n&&bn&&wdr(lr(i,t[(s+1)%t.length]))>e);for(let t=0;t<2;t++)i=i.filter((t,s)=>{const n=i[(s-1+i.length)%i.length],o=i[(s+1)%i.length],r=(t[0]-n[0])*(o[1]-n[1])-(t[1]-n[1])*(o[0]-n[0]),a=dr(lr(o,n))||1;return Math.abs(r)/a>e});return i.length>=3?i:t}function yr(t){const e=t.length;if(e<3)return!1;for(let i=0;i(t[0]-n[0])*a[1]-(t[1]-n[1])*a[0],c=t=>(t[0]-n[0])*a[0]+(t[1]-n[1])*a[1],h=i,d=r-i;for(const e of t){const t=Math.abs(l(e));if(t<=i)continue;const n=c(e);n<=h||n>=d||tMath.abs(r+(t-u)/m*(a-r));s=Math.min(s,f(_),f(g))}}return s}function wr(t,e,i){if(Ci(t,e,i))return!0;if(Mi(t,e,i)||Mi(e,t,i))return!1;let s=0;try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]);for(const t of i)t?.[0]&&(s+=Ti(t[0]))}catch{return!1}return s>Math.max(1e-7,i*i)}function kr(t,e,i,s,n){const o=[i.n[0]*s,i.n[1]*s],r={polys:{},openings:{},movedSpans:{}};if(Math.abs(s)<1e-9)return r;for(const e of t){if(e.id===i.roomId){r.polys[e.id]=gr(e.poly,i.edge,s,i.n),r.movedSpans[e.id]=[[cr(i.a,o),cr(i.b,o)]];continue}const t=mr(e.poly,i.a,i.b,n);if(!t.length)continue;const a=fr(e.poly,i.a,i.b,o,n);a&&(r.polys[e.id]=a,r.movedSpans[e.id]=t.map(([t,e])=>[cr(t,o),cr(e,o)]))}for(const t of e)pr([t.x,t.y],i.a,i.b)<=n&&(r.openings[t.id]=[t.x+o[0],t.y+o[1]]);return r}function xr(t,e,i){for(const s of e)for(let e=0;ei)continue;const c=(t.x-n[0])*l[0]+(t.y-n[1])*l[1];if(c-t.length/2>=-i&&c+t.length/2<=a+i)return!0}return!1}function $r(t,e,i){return t.filter(t=>e.some(e=>{for(let s=0;sa.polys[t.id]||t.poly;for(const e of l){const s=t.find(t=>t.id===e),n=a.polys[e];if(!yr(n))return!1;const l=ur(s.poly),h=ur(n);if(Math.abs(h)t.find(t=>t.id===e).poly),d=t.map(c);for(const t of $r(e,h,2*r)){const e=a.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,d,2*r))return!1}return!0}function Mr(t,e,i,s,n,o){const r=t=>[s[0]+(t[0]-s[0])*n,s[1]+(t[1]-s[1])*n],a={poly:t.poly.map(r),openings:{}};for(const s of e){let e=!1;for(let i=0;i{for(let e=0;et.id===i);if(!l)return!1;const c=t.filter(t=>t.id!==i).map(t=>t.poly),h=Mr(l,e,c,s,n,2*a),d=h.poly,u=function(t){const e=function(t){const e=[...t].sort((t,e)=>t[0]-e[0]||t[1]-e[1]);if(e.length<3)return e;const i=(t,e,i)=>(e[0]-t[0])*(i[1]-t[1])-(e[1]-t[1])*(i[0]-t[0]),s=[];for(const t of e){for(;s.length>=2&&i(s[s.length-2],s[s.length-1],t)<=0;)s.pop();s.push(t)}const n=[];for(let t=e.length-1;t>=0;t--){const s=e[t];for(;n.length>=2&&i(n[n.length-2],n[n.length-1],s)<=0;)n.pop();n.push(s)}return s.pop(),n.pop(),s.concat(n)}(t);if(e.length<3)return 0;let i=1/0;for(let t=0;tt.id===i?d:t.poly);for(const t of $r(e,[l.poly],2*a)){const e=h.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,p,2*a))return!1}return!0}function Dr(t,e,i){const s=i/e;return Ti(t)*s*s/1e4}function Tr(t,e){return e?`${Math.round(10.7639*t)} ft²`:`${(Math.round(10*t)/10).toFixed(1)} m²`}function Pr(t){const e=t%360;return e<0?e+360:e}function Rr(t,e){const i=function(t,e){return Pr(t+e)}(t,e)*Math.PI/180;return[Math.sin(i),-Math.cos(i)]}const Ar=Object.freeze({dawn:Object.freeze({top:"#aabdd1",bottom:"#e8c8b7",horizon:"rgba(255,201,156,.56)",sun:"rgba(255,188,125,.78)",vignette:"rgba(65,72,99,.21)",outlineNear:"rgba(74,57,61,.25)",outlineMid:"rgba(255,238,224,.40)",outlineFar:"rgba(255,224,202,.18)"}),day:Object.freeze({top:"#dce9ef",bottom:"#cbdce3",horizon:"rgba(255,245,220,.45)",sun:"rgba(255,239,190,.72)",vignette:"rgba(65,91,105,.16)",outlineNear:"rgba(45,62,71,.28)",outlineMid:"rgba(255,255,255,.42)",outlineFar:"rgba(255,255,255,.20)"}),dusk:Object.freeze({top:"#48536c",bottom:"#9a7380",horizon:"rgba(242,156,114,.34)",sun:"rgba(255,167,113,.55)",vignette:"rgba(20,26,44,.39)",outlineNear:"rgba(238,219,225,.40)",outlineMid:"rgba(229,207,218,.26)",outlineFar:"rgba(215,190,205,.12)"}),night:Object.freeze({top:"#111a27",bottom:"#1f2f3e",horizon:"rgba(79,120,151,.16)",sun:"rgba(169,208,231,0)",vignette:"rgba(3,8,14,.58)",outlineNear:"rgba(218,238,249,.56)",outlineMid:"rgba(174,215,238,.30)",outlineFar:"rgba(136,194,226,.14)"})}),Ir=t=>"number"==typeof t&&Number.isFinite(t),Fr=(t,e,i)=>Math.min(i,Math.max(e,t));function Er(t){return t.elevation<=-6?"night":t.elevation>=6?"day":t.rising?"dawn":"dusk"}function zr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;return e>=300&&e<480?"dawn":e>=480&&e<1080?"day":e>=1080&&e<1260?"dusk":"night"}function Or(t){const e=Er(t),i=t.azimuth*Math.PI/180;return{sunX:50-42*Math.sin(i),sunY:78-Fr(t.elevation,0,90)/90*64,sunOpacity:"night"===e?0:Fr((t.elevation+6)/12,0,1)}}function Hr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;if(e<300||e>=1260)return{sunX:50,sunY:78,sunOpacity:0};const i=(e-300)/960,s=(e-300)/120,n=(1260-e)/120;return{sunX:8+84*i,sunY:78-64*Math.sin(i*Math.PI),sunOpacity:Math.max(.18,Math.min(s,n,1))}}function Nr(t,e=new Date){const i=function(t){const e=t?.states?.["sun.sun"]?.attributes;return e&&Ir(e.azimuth)&&Ir(e.elevation)&&"boolean"==typeof e.rising?{azimuth:Pr(e.azimuth),elevation:e.elevation,rising:e.rising}:null}(t);if(i)return{phase:Er(i),source:"sun",...Or(i)};const s="number"==typeof e?e:function(t=new Date){return 60*t.getHours()+t.getMinutes()}(e);return{phase:zr(s),source:"clock",...Hr(s)}}function Lr(t){return`${t.source}|${t.phase}|${t.sunX.toFixed(2)}|${t.sunY.toFixed(2)}|`+t.sunOpacity.toFixed(3)}const Br=[[-90,"#070c14"],[-12,"#070c14"],[-4,"#131a28"],[0,"#4a3527"],[10,"#e8ddcf"],[30,"#ffffff"],[90,"#ffffff"]],qr=t=>Math.min(1,Math.max(0,t));function jr(t,e,i=6){const s=t.angle*Math.PI/180,n=[Math.sin(s),-Math.cos(s)],o=s=>{const o=[t.x+n[0]*i*s,t.y+n[1]*i*s];return e.find(t=>t.poly.length>=3&&fi(o,t.poly))||null},r=o(1),a=o(-1);return r&&a?null:r||a?r?{normal:[-n[0],-n[1]],roomId:r.id}:{normal:n,roomId:a.id}:null}function Wr(t,e,i){return i>0&&t[0]*e[0]+t[1]*e[1]>.05}function Ur(t,e,i,s){return[[t[0],t[1]],[e[0],e[1]],[e[0]+i[0]*s,e[1]+i[1]*s],[t[0]+i[0]*s,t[1]+i[1]*s]]}function Gr(t,e){try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]),s=[];for(const t of i){const e=t?.[0];!Array.isArray(e)||e.length<4||s.push(e.slice(0,e.length-1).map(t=>[t[0],t[1]]))}return s}catch{return[]}}function Vr(t,e,i,s,n,o,r){if(!(s>0))return[];const a=Rr(i,n),l=[-a[0],-a[1]],c=function(t){const e=Math.min(90,Math.max(0,t));return.7*(.8+1.7*Math.pow(1-e/90,1.6))}(s),h=[];for(const i of e){if(!(i.length>0))continue;const e=jr(i,t);if(!e||!Wr(e.normal,a,s))continue;const n=t.find(t=>t.id===e.roomId);if(!n)continue;const d=o&&o[e.roomId]||n.poly,u=i.angle*Math.PI/180,p=i.length/2,_=[-e.normal[0],-e.normal[1]],g=Math.max(0,r?.[i.id]||0),m=i.x+_[0]*g/2,f=i.y+_[1]*g/2,v=Math.cos(u)*p,y=Math.sin(u)*p,b=[m-v,f-y],w=[m+v,f+y],k=c*i.length,x=Gr(Ur(b,w,l,k),d);if(!x.length)continue;const $=l[0]*_[0]+l[1]*_[1];h.push({openingId:i.id,roomId:e.roomId,polys:x,a:b,b:w,dir:l,len:k,normal:_,depth:k*$})}return h}const Kr=t=>"number"==typeof t&&Number.isInteger(t)&&t>=0&&t<=359?t:null;function Yr(t,e){const i=Kr(e?.north_deg);return null!==i?i:Kr(t?.north_deg)}function Xr(t,e){const i=t=>"static"===t||"daynight"===t?t:null;return i(e?.bg_mode)??i(t?.bg_mode)??"static"}function Jr(t,e){const i=e?.sun_rays;return"boolean"==typeof i?i:!0===t?.sun_rays}function Zr(t){const e=t?.states?.["sun.sun"]?.attributes,i=Number(e?.azimuth),s=Number(e?.elevation);return Number.isFinite(i)&&Number.isFinite(s)?{azimuth:i,elevation:s}:null}const Qr=["dawn","day","dusk","night"];function ta(t){if(!t)return"";const e=Ar[t.phase];return[`--hp-day-cycle-outline-near:${e.outlineNear}`,`--hp-day-cycle-outline-mid:${e.outlineMid}`,`--hp-day-cycle-outline-far:${e.outlineFar}`].join(";")}function ea(t,e=1){if(!t)return G;const i=[`--hp-day-cycle-sun-x:${t.sunX.toFixed(2)}%`,`--hp-day-cycle-sun-y:${t.sunY.toFixed(2)}%`,`--hp-day-cycle-sun-opacity:${t.sunOpacity.toFixed(3)}`,`opacity:${Math.min(1,Math.max(0,e)).toFixed(4)}`].join(";");return j``}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Wu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Wu(t,t=>t.classList.contains("editor-secondary")),s=Wu(t,t=>!!t.dataset.editorGroup),n=Wu(t,t=>!!t.dataset.editorPalette),o=Wu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Gu=t=>t.stopPropagation(),Vu=4.166666666666667e-9;function Ku(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Ql)*Ql;return Math.abs(e-t)<=Vu?t:e}const Yu=(t,e,i,s)=>Math.hypot(i-t,s-e),Xu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Ju=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Yu(t+c,e+h,n+d,o+u),Yu(t-c,e-h,n-d,o-u)),_=Math.max(Yu(t+c,e+h,n-d,o-u),Yu(t-c,e-h,n+d,o+u));return Math.min(p,_)},Zu=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Qu=t=>JSON.parse(JSON.stringify(t)),tp=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),ep=(t,e,i)=>Math.min(i,Math.max(e,t)),ip=t=>Kl({spaces:[t]})[0],sp=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of ci(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=Qa(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=sp(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>sp(t.a,t.b,a).localeCompare(sp(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Ia(u,t.a,t.b,e,s,a))}return u}const op=t=>{const e=[];for(const i of t||[]){const t=ci(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&tp(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(tp(n,"segments")&&(delete n.segments,e++),tp(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Wl&&t<=Ul&&(tp(n,"plan_scale_x")||(n.plan_scale_x=t),tp(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);tp(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?ep(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)tp(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&tp(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(tp(t,"width")){const i=Number(t.width);(tp(t,"width_cm")||Number.isFinite(i))&&(tp(t,"width_cm")||(t.width_cm=Number(ep(i/Zl*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(tp(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),tp(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(ep(ts*es(t)/Zl*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(tp(t,"scale")||tp(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1]));if(!(tp(t,"entity")||tp(t,"attr")||tp(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Yi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=ip(t);if(!e)continue;if(!zc(t.open_spans).length){const i=Bc(e.rooms,null,ql,.02*Zl,!0);i.length&&(t.open_spans=qc(i,ql),a++)}}const l=Qu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=Zu(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Vu||s))return;n++,t>r&&(r=t);const o=t*Jl*e;o>a&&(a=o,l=i)};for(const t of i){const e=Zu(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Ku(e+n),a=Ku(i+o),l=Ku(e),c=Ku(i),h=Math.max(Ql,r-l),d=Math.max(Ql,a-c);t=Xu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Ku(s.a[0]),Ku(s.a[1])],r=[Ku(s.b[0]),Ku(s.b[1])];let a=Math.max(Yu(s.a[0],s.a[1],n[0],n[1]),Yu(s.b[0],s.b[1],r[0],r[1]));const l=Yu(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Vu&&s+e/2<=l+Vu});l>Vu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Ku(s.center[0]),Ku(s.center[1])],n=Yu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Ku(s.x1),Ku(s.y1)],i=[Ku(s.x2),Ku(s.y2)];t=Math.max(Yu(s.x1,s.y1,e[0],e[1]),Yu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Ku(s.x),i=Ku(s.y);if(null!=s.w&&null!=s.h){const n=Ku(s.x+s.w),o=Ku(s.y+s.h),r=Math.max(Ql,n-e),a=Math.max(Ql,o-i);t=Xu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Yu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Vu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Ju(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=ui([s.x,s.y],t.rooms||[],.025,{step:Ql,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Ju(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Ku(i.x),r=Ku(i.y),a=Yu(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=ip(e),r=ip(s);if(!o||!r)continue;const a=op(o.rooms),c=op(r.rooms),_=.02*Zl;let g=Xc(zc(e.open_spans),a,c,ql);const m=g.length;g=Yc(g,r.rooms,ql,_),g=g.map(t=>{const e=Fc(t,ql),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Oc(o,t).d<=4*_&&Oc(i,t).d<=4*_&&Oc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Nc(i,d,u,Zl,2*_),g=Nc(n,d,u,Zl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Zl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Zl){h.moved++;const t=m/ql;t>h.maxShift&&(h.maxShift=t);const e=m/Zl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ic(p,g,ql)}),g=Yc(g,r.rooms,ql,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Fc(t,ql));g.length?s.open_spans=g:delete s.open_spans,jc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Aa(e.walls,a,c,Ql,ql);y=np(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=il(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=Pa(y,s.rooms||[],Ql,1,f.map(t=>[t[0]/ql,t[1]/ql,t[2]/ql,t[3]/ql])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class ap{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const lp=new WeakMap;const cp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function hp(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return cp(c,i,0)&&cp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&cp(c,s,8)&&cp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const dp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},up=t=>Math.max(0,Math.min(1,t)),pp=(t,e,i)=>t+(e-t)*i,_p=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function gp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function mp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function fp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function vp(t,e,i){const s=fp(t),n=fp(e);if(!s||!n)return i<.5?t:e;const o=up(i);return`rgba(${Math.round(pp(s[0],n[0],o))}, ${Math.round(pp(s[1],n[1],o))}, ${Math.round(pp(s[2],n[2],o))}, ${pp(s[3],n[3],o).toFixed(3)})`}function yp(t,e,i){const s=(t=>{const e=up(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,_p(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=up((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:yp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const wp="houseplan_card_labs_v1",kp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function xp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function $p(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Pp(t,e,i,s=kp){const n=function(t,e=kp){const i=xp(t),s=new Map;if(!i||!Mp(e))return s;for(const t of e){const e=xp(t.since),n=xp(t.expires);$p(i,e)>=0&&$p(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Mp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Tp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Tp(Cp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Dp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Rp={active:Object.freeze([]),space:""},Ap="",Ip=!1,Fp="";const Ep=new Set;function zp(){if("undefined"==typeof window)return Rp;const t=Pp(window.location,function(){try{return window.localStorage.getItem(wp)}catch{return null}}(),Ap);void 0!==t.persist&&function(t){try{window.localStorage.setItem(wp,t)}catch{}}(t.persist),Rp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Ep)t(Rp);return Rp}function Op(){zp()}function Hp(t){return Ap=t,"undefined"==typeof window?Rp:(Ip||(Ip=!0,window.addEventListener("hashchange",Op),window.addEventListener("popstate",Op)),zp())}const Np=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Lp=64;function Bp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function qp(t,e,i=Np){if(!(Bp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function jp(t,e=Np){if(!Bp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Wp(t=Np){return`matrix(${function(t=Np){if(!Bp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Up(t,e=Np){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[qp(t,-o,e),qp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Gp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Vp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Vp(i)>0===s?i:[...i].reverse()}function Yp(t,e,i){return t.length?`M ${t.map(t=>Gp(qp(t,i,e))).join(" L ")} Z`:""}function Xp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Jp(t,e,i=Np){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Kp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Vp(t))>=1e-9)).filter(t=>t.length&&Vp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Vp(e[0]))-Math.abs(Vp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function Zp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const Qp=t=>t.every(Number.isFinite);function t_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function e_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],t_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:t_(s,t.angle,a,l),quarterVector:t_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const i_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function s_(t,e,i=Np){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=qp(e.hinge,e.bottom,i),r=qp(n,e.bottom,i),a=qp(n,e.top,i),l=qp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${i_(o)} L ${i_(r)} L ${i_(a)} L ${i_(l)} Z`,shadowD:`M ${i_(qp(e.hinge,0,i))} L ${i_(qp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const n_={window:120,door:90,passage:90,gate:300};function o_(t){return n_[t]}function r_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function a_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=r_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function l_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function c_(t){const e=a_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=r_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(l_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(l_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function h_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const d_="1.65.0-beta.8",u_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},p_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},__=2e3,g_=1e3,m_=1500,f_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},v_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},y_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},b_=new Map;let w_=0;const k_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let x_=1e4;const $_="houseplan_card_layout_v1",S_="houseplan_card_cfg_v1",M_="houseplan_card_zoom_v1",C_="houseplan_card_nav_v1",D_="houseplan_card_kiosk_v1",T_="houseplan_card_view_v1",P_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",R_=1e3,A_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],I_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},F_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),E_=2e3,z_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},O_=t=>{history.pushState(null,"",t),z_(window,"location-changed",{replace:!1})},H_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},N_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class L_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=_n(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Nu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...ia},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new bp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Uu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new ap(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++w_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Fu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=An(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Mn(t);e&&(Tn(t,e),Pn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new rh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=H_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem($_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=H_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=f_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=f_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Bl(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Sl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=f_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>E_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||_a];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Lr(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:cs(this._settings,{bgColor:null})||null,northDeg:Yr(this._settings,{}),bgMode:Xr(this._settings,{}),sunRays:Jr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=rp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:gp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=zi(this._baseVb(),s/Math.max(1,n)),r=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:gp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new ih(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(T_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?jp(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?qp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Dp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,lp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=th(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=lp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=hp(t).catch(()=>!1).then(t=>(i.resolved=t,t)),lp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>Rs(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Ep.add(e);const i=Hp(t);return"undefined"==typeof window&&e(i),()=>{Ep.delete(e)}}(d_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of b_.values())for(const e of t)clearTimeout(e.evict);b_.clear(),x_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of b_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:b_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(T_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Hp(d_);try{const t=JSON.parse(localStorage.getItem(D_)||"null");this._kioskScale={icon:Es(t?.icon),font:Es(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(S_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||sh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||sh(this._layout),this._virtualLights=_n(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=k_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=b_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Jc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Jc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=b_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},x_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?qp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&F_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=k_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=b_.get(i)||[];for(s.push(this._warmSlot),b_.set(i,s),this._warmTrim(s);b_.size>8;){const t=b_.keys().next().value;if(void 0===t||t===i)break;for(const e of b_.get(t)||[])clearTimeout(e.evict);b_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>x_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=sh(this._serverCfg),this._layoutContentFingerprint=sh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(vn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(S_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:mn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Kl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return nh([this._cfgRev,this._cfgContentFingerprint||sh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||sh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Gu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Gu(t,t=>t.classList.contains("editor-secondary")),s=Gu(t,t=>!!t.dataset.editorGroup),n=Gu(t,t=>!!t.dataset.editorPalette),o=Gu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ku=t=>t.stopPropagation(),Yu=4.166666666666667e-9;function Xu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/tc)*tc;return Math.abs(e-t)<=Yu?t:e}const Ju=(t,e,i,s)=>Math.hypot(i-t,s-e),Zu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Qu=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Ju(t+c,e+h,n+d,o+u),Ju(t-c,e-h,n-d,o-u)),_=Math.max(Ju(t+c,e+h,n-d,o-u),Ju(t-c,e-h,n+d,o+u));return Math.min(p,_)},tp=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const ep=t=>JSON.parse(JSON.stringify(t)),ip=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),sp=(t,e,i)=>Math.min(i,Math.max(e,t)),np=t=>Yl({spaces:[t]})[0],op=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of hi(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=tl(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=op(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>op(t.a,t.b,a).localeCompare(op(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Fa(u,t.a,t.b,e,s,a))}return u}const ap=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&ip(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(ip(n,"segments")&&(delete n.segments,e++),ip(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Ul&&t<=Gl&&(ip(n,"plan_scale_x")||(n.plan_scale_x=t),ip(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);ip(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?sp(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)ip(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&ip(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(ip(t,"width")){const i=Number(t.width);(ip(t,"width_cm")||Number.isFinite(i))&&(ip(t,"width_cm")||(t.width_cm=Number(sp(i/Ql*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(ip(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),ip(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(sp(es*is(t)/Ql*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(ip(t,"scale")||ip(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(ip(t,"entity")||ip(t,"attr")||ip(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Xi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=np(t);if(!e)continue;if(!Oc(t.open_spans).length){const i=qc(e.rooms,null,jl,.02*Ql,!0);i.length&&(t.open_spans=jc(i,jl),a++)}}const l=ep(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=tp(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Yu||s))return;n++,t>r&&(r=t);const o=t*Zl*e;o>a&&(a=o,l=i)};for(const t of i){const e=tp(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Xu(e+n),a=Xu(i+o),l=Xu(e),c=Xu(i),h=Math.max(tc,r-l),d=Math.max(tc,a-c);t=Zu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Xu(s.a[0]),Xu(s.a[1])],r=[Xu(s.b[0]),Xu(s.b[1])];let a=Math.max(Ju(s.a[0],s.a[1],n[0],n[1]),Ju(s.b[0],s.b[1],r[0],r[1]));const l=Ju(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Yu&&s+e/2<=l+Yu});l>Yu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Xu(s.center[0]),Xu(s.center[1])],n=Ju(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Xu(s.x1),Xu(s.y1)],i=[Xu(s.x2),Xu(s.y2)];t=Math.max(Ju(s.x1,s.y1,e[0],e[1]),Ju(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Xu(s.x),i=Xu(s.y);if(null!=s.w&&null!=s.h){const n=Xu(s.x+s.w),o=Xu(s.y+s.h),r=Math.max(tc,n-e),a=Math.max(tc,o-i);t=Zu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Ju(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Yu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:tc,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Qu(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Xu(i.x),r=Xu(i.y),a=Ju(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=np(e),r=np(s);if(!o||!r)continue;const a=ap(o.rooms),c=ap(r.rooms),_=.02*Ql;let g=Jc(Oc(e.open_spans),a,c,jl);const m=g.length;g=Xc(g,r.rooms,jl,_),g=g.map(t=>{const e=Ec(t,jl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Hc(o,t).d<=4*_&&Hc(i,t).d<=4*_&&Hc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Lc(i,d,u,Ql,2*_),g=Lc(n,d,u,Ql,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Ql)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Ql){h.moved++;const t=m/jl;t>h.maxShift&&(h.maxShift=t);const e=m/Ql*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Fc(p,g,jl)}),g=Xc(g,r.rooms,jl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ec(t,jl));g.length?s.open_spans=g:delete s.open_spans,Wc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Ia(e.walls,a,c,tc,jl);y=rp(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=sl(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=Ra(y,s.rooms||[],tc,1,f.map(t=>[t[0]/jl,t[1]/jl,t[2]/jl,t[3]/jl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class cp{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const hp=new WeakMap;const dp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function up(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return dp(c,i,0)&&dp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&dp(c,s,8)&&dp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const pp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},_p=t=>Math.max(0,Math.min(1,t)),gp=(t,e,i)=>t+(e-t)*i,mp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function fp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function vp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function yp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function bp(t,e,i){const s=yp(t),n=yp(e);if(!s||!n)return i<.5?t:e;const o=_p(i);return`rgba(${Math.round(gp(s[0],n[0],o))}, ${Math.round(gp(s[1],n[1],o))}, ${Math.round(gp(s[2],n[2],o))}, ${gp(s[3],n[3],o).toFixed(3)})`}function wp(t,e,i){const s=(t=>{const e=_p(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,mp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=_p((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:wp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const xp="houseplan_card_labs_v1",$p=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function Sp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function Mp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Ap(t,e,i,s=$p){const n=function(t,e=$p){const i=Sp(t),s=new Map;if(!i||!Dp(e))return s;for(const t of e){const e=Sp(t.since),n=Sp(t.expires);Mp(i,e)>=0&&Mp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Dp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Rp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Rp(Tp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Pp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Ip={active:Object.freeze([]),space:""},Fp="",Ep=!1,zp="";const Op=new Set;function Hp(){if("undefined"==typeof window)return Ip;const t=Ap(window.location,function(){try{return window.localStorage.getItem(xp)}catch{return null}}(),Fp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(xp,t)}catch{}}(t.persist),Ip={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Op)t(Ip);return Ip}function Np(){Hp()}function Lp(t){return Fp=t,"undefined"==typeof window?Ip:(Ep||(Ep=!0,window.addEventListener("hashchange",Np),window.addEventListener("popstate",Np)),Hp())}const Bp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),qp=64;function jp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Wp(t,e,i=Bp){if(!(jp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Up(t,e=Bp){if(!jp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Gp(t=Bp){return`matrix(${function(t=Bp){if(!jp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Vp(t,e=Bp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[Wp(t,-o,e),Wp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Kp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Yp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Yp(i)>0===s?i:[...i].reverse()}function Jp(t,e,i){return t.length?`M ${t.map(t=>Kp(Wp(t,i,e))).join(" L ")} Z`:""}function Zp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Qp(t,e,i=Bp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Xp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Yp(t))>=1e-9)).filter(t=>t.length&&Yp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Yp(e[0]))-Math.abs(Yp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function t_(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const e_=t=>t.every(Number.isFinite);function i_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function s_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],i_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:i_(s,t.angle,a,l),quarterVector:i_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const n_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function o_(t,e,i=Bp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Wp(e.hinge,e.bottom,i),r=Wp(n,e.bottom,i),a=Wp(n,e.top,i),l=Wp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${n_(o)} L ${n_(r)} L ${n_(a)} L ${n_(l)} Z`,shadowD:`M ${n_(Wp(e.hinge,0,i))} L ${n_(Wp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const r_={window:120,door:90,passage:90,gate:300};function a_(t){return r_[t]}function l_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function c_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=l_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function h_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function d_(t){const e=c_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=l_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(h_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(h_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function u_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const p_="1.65.0-beta.8",__={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},g_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},m_=2e3,f_=1e3,v_=1500,y_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},b_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},w_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},k_=new Map;let x_=0;const $_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let S_=1e4;const M_="houseplan_card_layout_v1",C_="houseplan_card_cfg_v1",D_="houseplan_card_zoom_v1",T_="houseplan_card_nav_v1",P_="houseplan_card_kiosk_v1",R_="houseplan_card_view_v1",A_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",I_=1e3,F_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],E_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},z_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),O_=2e3,H_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},N_=t=>{history.pushState(null,"",t),H_(window,"location-changed",{replace:!1})},L_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},B_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class q_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Bu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...sa},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new kp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Vu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new cp(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++x_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+zu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new ah(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=L_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(M_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=L_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=y_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?Sl:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?Sl:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=y_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&ql(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Ml(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=y_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>O_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||ga];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Br(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Xr(this._settings,{}),bgMode:Jr(this._settings,{}),sunRays:Zr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=lp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:fp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),r=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:fp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new sh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(R_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Up(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Wp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Pp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,hp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=eh(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=hp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=up(t).catch(()=>!1).then(t=>(i.resolved=t,t)),hp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Op.add(e);const i=Lp(t);return"undefined"==typeof window&&e(i),()=>{Op.delete(e)}}(p_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of k_.values())for(const e of t)clearTimeout(e.evict);k_.clear(),S_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of k_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:k_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(D_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(R_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Lp(p_);try{const t=JSON.parse(localStorage.getItem(P_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(C_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||nh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||nh(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=$_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=k_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Zc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Zc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=k_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},S_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?Wp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&z_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=$_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=k_.get(i)||[];for(s.push(this._warmSlot),k_.set(i,s),this._warmTrim(s);k_.size>8;){const t=k_.keys().next().value;if(void 0===t||t===i)break;for(const e of k_.get(t)||[])clearTimeout(e.evict);k_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>S_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=nh(this._serverCfg),this._layoutContentFingerprint=nh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(C_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Yl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return oh([this._cfgRev,this._cfgContentFingerprint||nh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||nh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4754,8 +4840,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t(t?"continuity.restore_connection":"continuity.restore_plan")} ${"recovery-error"===this._continuity.state?j``:G} -
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Kl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?ah(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return ah(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=vo(o),d=mo(s,c).filter(t=>!yo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=Bn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Ln(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=qn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===fo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return ds(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=sh(n),r=o!==(this._cfgContentFingerprint||sh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=gn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);fn(e)!==fn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=sh(t);a=s!==(this._layoutContentFingerprint||sh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=sh(n)!==(this._cfgContentFingerprint||sh(this._serverCfg))||sh(s?.layout??{})!==(this._layoutContentFingerprint||sh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem($_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=bn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(sh(e)!==(this._cfgContentFingerprint||sh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=Rn(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return An(this.hass)}get _planHass(){const t=this._haRegistry,e=Fn(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=zn(this.hass,t),n=On(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+Fu)>t?1:0)).join("|"),i=fn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of gi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Ki(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,Qi(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!yo(s,t,vo(this._markers))))}const h=ao(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(vu(t.id,e),_u(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?bh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=fu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Ln(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=An(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&O_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else O_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,Rs(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=sh(i);s!==(this._layoutContentFingerprint||sh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=Fn(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+nr(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=ko({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Ln(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Nn(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Sn=s;try{localStorage.setItem($n,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(z_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=ho(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return Ei(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*gc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Oi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ec(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*R_,y:i.y*R_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ec(_c(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:sc(n/R_),y:sc(o/R_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return cu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(vu(t.id,e));return s||_u(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,pu({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=po(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:uo(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Ls(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&_o(this.hass,t.primary)?go(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,z_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Yh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!ed(t))return;const e=t=>{const e=ed(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=bn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&id(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return or(nr(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=nr(this.hass,this._config?.language);return rr(i,t)&&rr(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=rc([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=rc("line"===t.kind?[[t.x1*R_,t.y1*i],[t.x2*R_,t.y2*i]]:"text"===t.kind?[[t.x*R_,t.y*i]]:ha({x:t.x*R_,y:t.y*i,w:t.w*R_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=rc(i);t&&e.push(t)}}return lc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:R_,h:R_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=uc(this._contentItems(t));let n=s.all||pc(t),o=this._showFar?n:s.core||pc(t);return e&&e.id===t.id&&i&&e.grow&&(o=I_(e.rect,o),n=I_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=Zp(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=Zp(e,-1)}else e=Zp(e,t?1:0);else for(const i of t)e=Zp(e,i.codePointAt(0)||0);else e=Zp(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Np,wallHeight:Lp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?ul(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=hl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||ml(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?hd(i.partitionHost,s):e.length||"gate"===t.type?bl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(Qp([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[e_(t,0,[-i,0],[i,0],o,0,.88*e),e_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[e_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),e_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[e_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return Qp([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Up({rect:n?I_(i,n):i,wallHeight:Lp,openingHeight:Lp,floorDepth:10}),r=function(t,e=Np,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Kp(l[t],t>0);if(!(c.length<3||Math.abs(Vp(c))<1e-9)){s.push(Yp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Jp(s.floor,10),openings:s.openings,frame:o};return y_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?qp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=jp([t.x,t.y]),i=jp([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Up({rect:this._frameOf().rect,wallHeight:Lp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
+
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Yl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?lh(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return lh(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=yo(o),d=fo(s,c).filter(t=>!bo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=qn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Bn(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=jn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===vo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return us(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=nh(n),r=o!==(this._cfgContentFingerprint||nh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=mn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);vn(e)!==vn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=nh(t);a=s!==(this._layoutContentFingerprint||nh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=nh(n)!==(this._cfgContentFingerprint||nh(this._serverCfg))||nh(s?.layout??{})!==(this._layoutContentFingerprint||nh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=wn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(nh(e)!==(this._cfgContentFingerprint||nh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=An(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return In(this.hass)}get _planHass(){const t=this._haRegistry,e=En(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=On(this.hass,t),n=Hn(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+zu)>t?1:0)).join("|"),i=vn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of mi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Yi(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,ts(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!bo(s,t,yo(this._markers))))}const h=lo(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(yu(t.id,e),gu(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?wh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=vu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Bn(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=In(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&N_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else N_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,As(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=nh(i);s!==(this._layoutContentFingerprint||nh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=En(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+or(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=xo({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Bn(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Ln(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Mn=s;try{localStorage.setItem(Sn,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(H_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=uo(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return zi(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*mc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Hi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ic(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*I_,y:i.y*I_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ic(gc(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:nc(n/I_),y:nc(o/I_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return hu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(yu(t.id,e));return s||gu(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,_u({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=_o(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:po(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Bs(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&go(this.hass,t.primary)?mo(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,H_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Xh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!id(t))return;const e=t=>{const e=id(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=wn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&sd(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return rr(or(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=or(this.hass,this._config?.language);return ar(i,t)&&ar(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=ac([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=ac("line"===t.kind?[[t.x1*I_,t.y1*i],[t.x2*I_,t.y2*i]]:"text"===t.kind?[[t.x*I_,t.y*i]]:da({x:t.x*I_,y:t.y*i,w:t.w*I_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=ac(i);t&&e.push(t)}}return cc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:I_,h:I_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=pc(this._contentItems(t));let n=s.all||_c(t),o=this._showFar?n:s.core||_c(t);return e&&e.id===t.id&&i&&e.grow&&(o=E_(e.rect,o),n=E_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=t_(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=t_(e,-1)}else e=t_(e,t?1:0);else for(const i of t)e=t_(e,i.codePointAt(0)||0);else e=t_(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Bp,wallHeight:qp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?pl(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=dl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||fl(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?dd(i.partitionHost,s):e.length||"gate"===t.type?wl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(e_([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[s_(t,0,[-i,0],[i,0],o,0,.88*e),s_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[s_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),s_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[s_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return e_([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Vp({rect:n?E_(i,n):i,wallHeight:qp,openingHeight:qp,floorDepth:10}),r=function(t,e=Bp,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Xp(l[t],t>0);if(!(c.length<3||Math.abs(Yp(c))<1e-9)){s.push(Jp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Qp(s.floor,10),openings:s.openings,frame:o};return w_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?Wp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=Up([t.x,t.y]),i=Up([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Vp({rect:this._frameOf().rect,wallHeight:qp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
${this._t("canvas.far_objects",{n:this._outliers})} @@ -4763,7 +4849,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 style="left:${a.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:zi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=zi(s,this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Jc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=zi(this._baseVb(),this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=zi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(M_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=zi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&O_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},N_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ic(this._drag.ox+r),c=ic(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(P_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(P_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(P_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Zl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return ai(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,R_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return di(t?.rooms||[]).map(t=>[t[0]*R_,t[1]*e,t[2]*R_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(C_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(C_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?qp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=fa(_a,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?fa(_a,this._imperial):this._drawWallField}get _drawWallCm(){const t=f_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:fa(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Sd(this._path,this._draftSegmentCms,_a),i=e.length;if((t.partitions||[]).length+i>E_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=E_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ic(ri(t[0],e)),ic(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Xl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=yl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(pd(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>pd(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(wd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!kd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Hs([e[0],e[1]],t);if(r>i.tolerance)continue;const l=xd(o,e,i.gridStep);!wd(l,n,s)&&kd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return mi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Yl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Sl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Ml(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=zc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Pa(t.walls,t.rooms||[],Ql,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&bi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&Ci(t,i)})}_pointInRoom(t,e){return e.poly?fi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!yr(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>E_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Ti(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/R_,t[1]/R_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:$d,s=Gd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Pd(t.a,i),s=Pd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Pd(t.a,i),Pd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Rd(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Dd(g);if(!(m>i*i))continue;const f=Ad(Id(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=ci(t);if(!t.id||!e)continue;const i=Ii(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Ti(s)>=Ti(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Ti(a))-Math.abs(e.area-Ti(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Sl(i),angle:0},o=(s.wall_columns||[]).find(t=>Bl(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/R_,e[1]/R_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Ml(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:fa(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),N_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Nl(n,Pl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Nl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Yl*R_-Math.min(...n),Math.min(Yl*R_-Math.max(...n),i[0])),Math.max(-Yl*R_-Math.min(...o),Math.min(Yl*R_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/R_,n.a[1]/R_],t.b=[n.b[0]/R_,n.b[1]/R_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=rd(t,[n],R_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,ud(t,i,R_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/R_,(n.center[1]+e.delta[1])/R_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),N_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Ml(e.angle),angle:Ml(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Ml(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?ci(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/R_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/R_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*R_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:_r(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),N_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Sr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=kr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Cr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Cr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Mr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=vr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Pa(n.walls,n.rooms||[],Ql,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&ol(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||n,r=xi(o),a=u.length?Ol(zl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Tr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&ol([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||t,l=xi(a),c=this._physicalBodiesR(),h=c.length?Ol(zl(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Tr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Zc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(D_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&N_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},B_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=sc(this._drag.ox+r),c=sc(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(A_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(A_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(A_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Ql}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,I_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*I_,t[1]*e,t[2]*I_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(T_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(T_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Wp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=va(ga,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?va(ga,this._imperial):this._drawWallField}get _drawWallCm(){const t=y_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?Sl:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?Sl:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:va(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Md(this._path,this._draftSegmentCms,ga),i=e.length;if((t.partitions||[]).length+i>O_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=O_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[sc(ai(t[0],e)),sc(ai(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Jl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=bl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(_d(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>_d(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(kd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!xd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Ns([e[0],e[1]],t);if(r>i.tolerance)continue;const l=$d(o,e,i.gridStep);!kd(l,n,s)&&xd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Xl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Ml(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Cl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Oc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Ra(t.walls,t.rooms||[],tc,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!br(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>O_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/I_,t[1]/I_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:Sd,s=Vd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Rd(t.a,i),s=Rd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Rd(t.a,i),Rd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Ad(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Td(g);if(!(m>i*i))continue;const f=Id(Fd(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Fi(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Pi(a))-Math.abs(e.area-Pi(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange(Sl);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Ml(i),angle:0},o=(s.wall_columns||[]).find(t=>ql(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/I_,e[1]/I_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Cl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:va(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),B_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Ll(n,Rl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Ll(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Xl*I_-Math.min(...n),Math.min(Xl*I_-Math.max(...n),i[0])),Math.max(-Xl*I_-Math.min(...o),Math.min(Xl*I_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/I_,n.a[1]/I_],t.b=[n.b[0]/I_,n.b[1]/I_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ad(t,[n],I_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,pd(t,i,I_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/I_,(n.center[1]+e.delta[1])/I_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),B_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Cl(e.angle),angle:Cl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Cl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/I_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/I_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*I_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:gr(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),B_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Mr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=xr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Dr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Dr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Cr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=yr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Ra(n.walls,n.rooms||[],tc,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&rl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||n,r=$i(o),a=u.length?Hl(Ol(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Pr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&rl([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||t,l=$i(a),c=this._physicalBodiesR(),h=c.length?Hl(Ol(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Pr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4773,7 +4859,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @pointercancel=${t=>this._rszPointerCancel(t)} - @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*R_,ry:t.y*e,rlen:t.length*R_};if(!t.host)return[s];const n=rd(t,i.partitions,R_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=rd(n,t.partitions,R_,this._cellCm,this._gridPitch);i.resolved&&s.push(cd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=tl(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&dd(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?hd(t.partitionHost,i):bl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return R_}_decorResolvedStyle(t){return function(t,e,i,s=ia){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:sa(o?.opacity,s.opacity),widthCm:la(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?sa(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,ia)}_decorWidthUnits(t){return((t,e,i,s=ia.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return ra(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:ra(s,e,i)})(t,this._cellCm,this._gridPitch,ia.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:aa(ts*es(t),this._cellCm,this._gridPitch)}return aa(ts,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return ts;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?ra(e,this._cellCm,this._gridPitch):ts*es(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(__,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Yl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH,angle:na(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*R_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(da(t))}for(const t of e.rooms){const e=ci(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},N_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:sc(e[0]/R_),y:sc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:aa(ts,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-na(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=R_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=sc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ca(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ca(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},N_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*R_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/R_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Yl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(na(i?zs([i.x1*R_,i.y1*this._decorH],[i.x2*R_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:aa(Math.hypot((i.x2-i.x1)*R_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:aa(s.w,this._cellCm,this._gridPitch),sizeHCm:aa(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Yi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:sa(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Yi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:sa(t.opacity),size_cm:Number(Math.max(.1,Math.min(__,t.sizeCm)).toFixed(4)),...na(t.angle)?{angle:na(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:sa(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:sa(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ca(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*R_,s=(e.y1+e.y2)/2*this._decorH,o=ra(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=na(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:sc(c[0]/R_),y1:sc(c[1]/this._decorH),x2:sc(h[0]/R_),y2:sc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*R_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ri(ra(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ri(ra(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*R_+i/2,l=e.y*this._decorH+s/2,c=na(t.angle),h=oa({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:sc(h[0]/R_),y:sc(h[1]/this._decorH),w:o/R_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*R_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*R_,(t.y+t.h/2)*this._decorH]:[t.x*R_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(__,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},N_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=sc(s[0]/R_),o=sc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=ua(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(__,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*R_,s=t.y1*this._decorH,n=t.x2*R_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=xc(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=R_,o=this._decorH,r=Dc(Sc(i.w,this._cellCm,this._gridPitch,n)),a=Dc(Sc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ac(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:sc(h/n-r/2),y:sc(d/o-a/2),w:r,h:a,...ca(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=R_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ac(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=sc(c),h=sc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=R_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=oa(e,i.angle,t=>this._snap(t));return{...i,x:sc(o[0]/s),y:sc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Yl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Yl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=R_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}> + @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*I_,ry:t.y*e,rlen:t.length*I_};if(!t.host)return[s];const n=ad(t,i.partitions,I_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=ad(n,t.partitions,I_,this._cellCm,this._gridPitch);i.resolved&&s.push(hd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=el(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&ud(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?dd(t.partitionHost,i):wl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return I_}_decorResolvedStyle(t){return function(t,e,i,s=sa){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:na(o?.opacity,s.opacity),widthCm:ca(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?na(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,sa)}_decorWidthUnits(t){return((t,e,i,s=sa.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return aa(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:aa(s,e,i)})(t,this._cellCm,this._gridPitch,sa.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:la(es*is(t),this._cellCm,this._gridPitch)}return la(es,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return es;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?aa(e,this._cellCm,this._gridPitch):es*is(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(m_,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Xl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH,angle:oa(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*I_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(ua(t))}for(const t of e.rooms){const e=hi(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},B_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:nc(e[0]/I_),y:nc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:la(es,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-oa(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=I_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=nc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ha(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ha(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},B_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*I_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/I_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Xl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(oa(i?Os([i.x1*I_,i.y1*this._decorH],[i.x2*I_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:la(Math.hypot((i.x2-i.x1)*I_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:la(s.w,this._cellCm,this._gridPitch),sizeHCm:la(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Xi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:na(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Xi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:na(t.opacity),size_cm:Number(Math.max(.1,Math.min(m_,t.sizeCm)).toFixed(4)),...oa(t.angle)?{angle:oa(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:na(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:na(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ha(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*I_,s=(e.y1+e.y2)/2*this._decorH,o=aa(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=oa(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:nc(c[0]/I_),y1:nc(c[1]/this._decorH),x2:nc(h[0]/I_),y2:nc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*I_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ai(aa(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ai(aa(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*I_+i/2,l=e.y*this._decorH+s/2,c=oa(t.angle),h=ra({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:nc(h[0]/I_),y:nc(h[1]/this._decorH),w:o/I_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*I_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*I_,(t.y+t.h/2)*this._decorH]:[t.x*I_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(m_,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},B_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=nc(s[0]/I_),o=nc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=pa(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(m_,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*I_,s=t.y1*this._decorH,n=t.x2*I_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=$c(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=I_,o=this._decorH,r=Tc(Mc(i.w,this._cellCm,this._gridPitch,n)),a=Tc(Mc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ic(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:nc(h/n-r/2),y:nc(d/o-a/2),w:r,h:a,...ha(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=I_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ic(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=nc(c),h=nc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=I_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=ra(e,i.angle,t=>this._snap(t));return{...i,x:nc(o[0]/s),y:nc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Xl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Xl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=I_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}>
${this._t("furn.title")} @@ -4783,16 +4869,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- ${bc.map(e=>j` + ${wc.map(e=>j`
${this._t(`furn.group_${e}`)}
- ${$c(e).map(e=>j``)}
`)} @@ -4808,7 +4894,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._furnPalette={...t,h:this._furnFieldToCm(Number(e.target.value))}} /> ${this._t("furn.place_hint")}
`:j`
${this._t("furn.pick_hint")}
`} -
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...jl(t.plan_aspect,R_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Gl(t,R_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:na(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:aa(e.w,this._cellCm,this._gridPitch),heightCm:aa(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=na(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Ul,Math.max(e.w*Wl,ri(ra(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Ul,Math.max(e.h*Wl,ri(ra(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=oa({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/R_,(a[1]-e.y)/R_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(sc(t).toFixed(6)),o.plan_y=Number(sc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Ul,Math.max(Wl,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Ul,Math.max(Wl,s)).toFixed(6));const r=na(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},N_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/R_,(o[1]-s.y)/R_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=na(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=ua(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Wl),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=oa(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/R_,(l[1]-s.y)/R_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=na(e.angle),a=2.2*i;return W` +
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...Wl(t.plan_aspect,I_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Vl(t,I_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:oa(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:la(e.w,this._cellCm,this._gridPitch),heightCm:la(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=oa(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Gl,Math.max(e.w*Ul,ai(aa(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Gl,Math.max(e.h*Ul,ai(aa(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=ra({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/I_,(a[1]-e.y)/I_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(nc(t).toFixed(6)),o.plan_y=Number(nc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Gl,Math.max(Ul,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Gl,Math.max(Ul,s)).toFixed(6));const r=oa(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},B_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/I_,(o[1]-s.y)/I_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=oa(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=pa(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Ul),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=ra(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/I_,(l[1]-s.y)/I_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=oa(e.angle),a=2.2*i;return W` {e.stopPropagation(),e.preventDefault(),this._bdStart(e,[t,n])}}>`})} - `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];return W` + `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];return W` ${[t,i].map((t,e)=>W`this._dtStart(t,"scale",void 0,e)}> @@ -4833,7 +4919,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 cx="${t<0?i.x:i.x+i.w}" cy="${e<0?i.y:i.y+i.h}" r="${s.toFixed(1)}" @pointerdown=${i=>this._dtStart(i,"scale",[t,e])}>`)} - `}_renderDecorLayer(){const t=R_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``}_renderDecorLayer(){const t=I_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Pc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Rc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W` ${s?W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:Qi(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:ts(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=ra(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=aa(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W``;else{const i=Math.min(r.a[0],r.b[0]),s=Math.min(r.a[1],r.b[1]),n=Math.abs(r.b[0]-r.a[0]),a=Math.abs(r.b[1]-r.a[1]);o="rect"===r.kind?W``:W``}}return W`${n}${o}`}get _editorToolbarGroups(){return"plan"!==this._mode?[]:[{id:"opening",label:this._t("markup.opening"),icon:"mdi:door",activeItemId:"opening"===this._tool?this._openingPreset?.type:void 0,items:[{id:"window",label:this._t("opening.window"),icon:"mdi:window-closed-variant",role:"tool",invoke:()=>this._activateOpeningPlacement("window")},{id:"door",label:this._t("opening.door"),icon:"mdi:door-open",role:"tool",invoke:()=>this._activateOpeningPlacement("door")},{id:"passage",label:this._t("opening.passage"),icon:"mdi:arch",role:"tool",invoke:()=>this._activateOpeningPlacement("passage")},{id:"gate",label:this._t("opening.gate"),icon:"mdi:gate",role:"tool",invoke:()=>this._activateOpeningPlacement("gate")}]}]}_renderEditorGroupLauncher(t){return this._editorSecondary.renderGroupLauncher(t,this._editorToolbarGroups,this._editorSecondaryCopy)}get _editorSecondaryContextId(){const t=`editor:${this._mode}:${this._space}:${this._cfgEpoch}`,e=this._editorSecondary.activeGroup(this._editorToolbarGroups);if(e)return`${t}:group:${e.id}:${this._editorSecondary.groupGeneration}`;if("plan"===this._mode){const e=this._physicalSel;return e?`${t}:selection:${e.kind}:${e.id}:${e.segment??""}`:`${t}:tool:${this._tool}:${this._path.length}:${this._openWallAnchor?1:0}`}return"decor"===this._mode?"furniture"===this._decorTool?`${t}:palette:furniture:${this._furnPalette?.symbol||"none"}`:"select"===this._decorTool&&this._decorSel?`${t}:selection:decor:${this._decorSel}`:`${t}:tool:${this._decorTool}:${this._bdMoved?1:0}:${this._bdDrag?1:0}`:`${t}:none`}_runEditorContext(t,e){this._editorSecondary.runContext(t,this._editorSecondaryContextId,e)}_renderEditorGroupModel(t){return this._editorSecondary.renderGroupModel(t,this._editorSecondaryContextId,this._editorSecondaryCopy)}_renderDrawWallControl(){return j``}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j`
@@ -5013,8 +5099,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``}_setFillColor(t,e){const i=this._settingsDialog;this._settingsDialog={...i,colors:{...i.colors,[t]:{...i.colors[t],...e}}}}async _saveSettingsDialog(){const t=this._settingsDialog;if(t&&!t.busy){this._settingsDialog={...t,busy:!0};try{const e=this._serverCfg,i=JSON.stringify(t.colors)===JSON.stringify(ds),s={...e.settings};i?delete s.fill_colors:s.fill_colors=t.colors;const n=this._imperial?30.48*t.glowRadius:100*t.glowRadius;Number.isFinite(n)&&n>0&&300!==Math.round(n)?s.glow_radius_cm=Math.round(n):delete s.glow_radius_cm,t.bgColor?s.bg_color=t.bgColor:delete s.bg_color,null!==t.northDeg&&Number.isInteger(t.northDeg)&&t.northDeg>=0&&t.northDeg<=359?s.north_deg=t.northDeg:delete s.north_deg,s.bg_mode=t.bgMode,t.sunRays?s.sun_rays=!0:delete s.sun_rays,delete s.weather_entity,this._serverCfg={...e,settings:s},await this._saveConfigNow(),this._settingsDialog=null,this.requestUpdate(),this._showToast(this._t("gs.saved"))}catch(t){this._settingsDialog&&(this._settingsDialog={...this._settingsDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}}_boolInput(t,e,i=!1){const s=t=>e(!!t.target.checked);return customElements.get("ha-switch")?j``:j``}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``:j``}_renderColorRow(t,e){const i=this._settingsDialog.colors[t];return j`
{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?ul(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Yd(t));else for(const t of h)f.push(...Yd(t));for(const{poly:t}of e)for(const e of s.length?Ds(t,s,m):Yd(t))f.push(e);const y={occluders:Kd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:ci(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Fs(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=ao(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=lo(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=xs(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Ll([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:$s(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=v_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Zd([f.x,f.y],m,r,96);b={lit:t.length>=3?El([t],a):[]},y_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&ol(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||i,o=this._cleanFloor(e,s,t).path,r=Di(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` +
`}get _glowRadiusCm(){const t=Number(this._settings.glow_radius_cm);return Number.isFinite(t)&&t>0?t:300}get _imperial(){return"mi"===this.hass?.config?.unit_system?.length}get _glowRadiusPlaceholder(){const t=this._glowRadiusCm;return this._imperial?String(Math.round(t/30.48*10)/10):String(t/100)}_glowTransition(t,e){let i=this._glowRenderedSources.get(t);if(e){const e=this._glowFadeTimers.get(t);if(null!=e&&(clearTimeout(e),this._glowFadeTimers.delete(t)),null==i){this._suspendGlowFeatherForTransition(),i=++this._glowSourceSeq,this._glowRenderedSources.set(t,i),this._glowEnteringSources.add(t);const e=requestAnimationFrame(()=>{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?pl(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Xd(t));else for(const t of h)f.push(...Xd(t));for(const{poly:t}of e)for(const e of s.length?Ts(t,s,m):Xd(t))f.push(e);const y={occluders:Yd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:hi(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Es(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=lo(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=co(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=$s(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Bl([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:Ss(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=b_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Qd([f.x,f.y],m,r,96);b={lit:t.length>=3?zl([t],a):[]},w_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&rl(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||i,o=this._cleanFloor(e,s,t).path,r=Ti(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` ${Mt(p,t=>t.key,t=>{const e=t.domId,i=t.geometry;return W` ${""} - ${A_.map(([e,i])=>W` + ${F_.map(([e,i])=>W` `)} @@ -5435,7 +5521,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("gs.glow_radius")} {const e=f_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> + @input=${t=>{const e=y_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> ${this._imperial?this._t("gs.unit_ft"):this._t("gs.unit_m")}
@@ -5458,7 +5544,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._settingsDialog.bgColor?j``:j`${this._t("gs.bg_theme")}`} `:j`
${this._t("gs.bg_daynight_hint")}
`} - ${Zr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`} + ${Qr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`}
${this._renderCompass()}
@@ -5510,14 +5596,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
`:G} -
${this._t("gs.about_version",{v:d_})}
+
${this._t("gs.about_version",{v:p_})}
${this._t("gs.about_github")} ${this._t("gs.about_telegram")}
- @@ -5567,7 +5653,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.busy?"…":this._t("btn.save")}
- `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(D_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j` + `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(P_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j`
${this._rangeInput(50,300,5,Math.round(100*t[e]),t=>this._saveKioskScale({[e]:t/100}))} ${Math.round(100*t[e])}% @@ -5624,13 +5710,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._spaceDialog?this._renderSpaceDialog():G} ${this._importDialog?this._renderImportDialog():G} ${this._toast?j``:G} - `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Ap||Hp(t);const e=Rp,i=e.active.join(",");if(!i||i===Fp)return;Fp=i;const s=new Map(kp.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(d_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=this._viewOr(this._baseVb()),b=this._floorView(y),w=this._editing?"":this._stageBg(d),k=this._opMeasureView,x=this._decorMeasure,$=this._bdLive,S=this._furnLive,M="view"===this._mode?this._editorChromeMode:this._mode,C=this._roomHoverPaths(s),D=s.bg?this._display(s.bg.href):"",T=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,P=this._modeTransitionVisual,R=this._dayCycleState(),A=P?.viewWeight??("view"===this._mode?1:0),I=this._modeTransition.state?.from.presentedMode,F=!this._markup||!!P&&("view"===P.presentedMode||"devices"===P.presentedMode||"view"===I||"devices"===I),E=P?.stageColor||w,z=P?.sceneBrightness??1;return j` + `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Fp||Lp(t);const e=Ip,i=e.active.join(",");if(!i||i===zp)return;zp=i;const s=new Map($p.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(p_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=bu(v),b=this._viewOr(this._baseVb()),w=this._floorView(b),k=this._editing?"":this._stageBg(d),x=this._opMeasureView,$=this._decorMeasure,S=this._bdLive,M=this._furnLive,C="view"===this._mode?this._editorChromeMode:this._mode,D=this._roomHoverPaths(s),T=s.bg?this._display(s.bg.href):"",P=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,R=this._modeTransitionVisual,A=this._dayCycleState(),I=R?.viewWeight??("view"===this._mode?1:0),F=this._modeTransition.state?.from.presentedMode,E=!this._markup||!!R&&("view"===R.presentedMode||"devices"===R.presentedMode||"view"===F||"devices"===F),z=R?.stageColor||k,O=R?.sceneBrightness??1;return j`
- ${"plan"===M?this._renderMarkupBar():"devices"===M?this._renderDevicesBar():this._renderDecorBar()} + style=${R?`opacity:${R.toolbarContentOpacity}`:G}> + ${"plan"===C?this._renderMarkupBar():"devices"===C?this._renderDevicesBar():this._renderDecorBar()}
`:G} -
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -5715,35 +5801,35 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerleave=${t=>this._stagePointerLeave(t)} @pointerup=${t=>this._stagePointerUp(t)} @pointercancel=${t=>this._stagePointerCancel(t)}> - ${ea(R,A)} + ${ia(A,I)} ${this._renderEditorSecondary()}
+ style="${1!==O?`filter:brightness(${O.toFixed(3)})`:""}"> ${a&&u?.structural?W``:G} + transform=${u?.structural?Gp():G}> ${""} ${this._wallHatchDefs(d.color)}${W`${this._paperShapes(s.rooms).map(t=>"path"in t?W``:"poly"in t?W``:W``)}`} ${this._editing?this._renderMarkupDefs(o):G} ${""} - ${this._editing&&!this._markup&&this._gridLevels()?W``:G} - ${s.bg&&D?W`this._onBackdropLoaded(s.bg.href,D)} + ${this._editing&&!this._markup&&this._gridLevels()?W``:G} + ${s.bg&&T?W`this._onBackdropLoaded(s.bg.href,T)} transform=${s.bg.angle?`rotate(${s.bg.angle} ${s.bg.x+s.bg.w/2} ${s.bg.y+s.bg.h/2})`:G} @dblclick=${t=>this._openBackdropDialog(t)} preserveAspectRatio="none" />`:G} ${""} ${d.hideDecor&&"decor"!==this._mode?G:this._renderDecorLayer()} - ${(()=>{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,ci(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Is(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&ol(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||g,y=v?Di(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,hi(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Fs(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&rl(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||g,y=v?Ti(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @@ -5766,74 +5852,74 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 x="${e.x}" y="${e.y}" width="${e.w}" height="${e.h}" rx="${.03*Math.min(e.w,e.h)}" @pointerenter=${t=>{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @pointermove=${l} - @pointerleave=${()=>this._clearTransientHover()}>`,M=p.length&&g?Ds(g,p,.02*this._gridPitch):null,C=M?W`this._clearTransientHover()}>`,M=p.length&&g?Ts(g,p,.02*this._gridPitch):null,C=M?W``:G;return W`${S}${C}`})})()} - ${this._renderRoomHoverFill(C)} + ${this._renderRoomHoverFill(D)} ${this._renderOpeningTunnelFills(s,_)} ${this._renderGlowBaseRooms(s,g)} ${this._renderOpeningTunnelFills(s,g,"glow-base")} - ${F?this._renderGlowLayer(s,d):G} + ${E?this._renderGlowLayer(s,d):G} ${this._renderSunRays(s)} ${this._editing?W`${this._renderAlignGuides()}`:G} + opacity="${R?.editorWeight??1}">${this._renderAlignGuides()}`:G} ${this._markup?W`${this._renderMarkupLayer(o)}`:G} + opacity="${R?.editorWeight??1}">${this._renderMarkupLayer(o)}`:G} ${""} ${""} ${this._editing?G:this._renderOpenWalls(d)} ${this._renderWallBodies(d)} ${this._markup?W`${this._renderPlanSnapOverlay()}`:G} + opacity="${R?.editorWeight??1}">${this._renderPlanSnapOverlay()}`:G} ${this._markup?W`${this._renderOpeningPlacementPreview()}`:G} - ${k?.guide?this._renderOpeningCenterTick(k.guide):G} - ${this._renderRoomHoverOutline(C)} + opacity="${R?.editorWeight??1}">${this._renderOpeningPlacementPreview()}`:G} + ${x?.guide?this._renderOpeningCenterTick(x.guide):G} + ${this._renderRoomHoverOutline(D)} ${""} ${this._editing?this._renderOpenWalls(d):G} ${d.hideOpenings&&!this._markup||u&&!u.floorSymbols?G:this._renderOpenings(d)} ${this._renderWallThickUi()} - ${this._markup&&"resize"===this._tool?this._renderResizeLayer(y):G} + ${this._markup&&"resize"===this._tool?this._renderResizeLayer(b):G} ${""} - ${this._renderBackdropFrame(y)} - ${this._renderTextFrame(y)} + ${this._renderBackdropFrame(b)} + ${this._renderTextFrame(b)} ${a&&u?.structural?W` - `:G} ${""} -
- ${c.map(t=>this._renderDevice(t,y,m))} - ${this._renderVacuums(c,y)} - ${this._renderVacFit(y)} - ${this._renderOpeningLocks(y)} - ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,y,d)):G} - ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,y)):G} +
+ ${c.map(t=>this._renderDevice(t,b,m))} + ${this._renderVacuums(c,b)} + ${this._renderVacFit(b)} + ${this._renderOpeningLocks(b)} + ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,b,d)):G} + ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,b)):G}
- ${this._measureAnchor?j`
${this._renderMeasureLabel(y)}
`:G} + ${this._measureAnchor?j`
${this._renderMeasureLabel(b)}
`:G} ${this._rszLive?j`
${this._rszLive.map(t=>j`
${t.text}
`)}
`:G} - ${k?j`
${k.labels.map(t=>j`
${t.text}
`)}
`:G} + ${x?j`
${x.labels.map(t=>j`
${t.text}
`)}
`:G} + style="left:${((t.x-b.x)/b.w*100).toFixed(2)}%;top:${((t.y-b.y)/b.h*100).toFixed(2)}%">${t.text}
`)}
`:G} ${this._wallDialog?j`
${this._renderWallThickDialog()}
`:G} - ${x?j`
${x.text}
`:G} - ${S?j`
${S.map(t=>j`
${t.text}
`)}
`:G} ${$?j`
${$.text}
`:G} + ${M?j`
${M.map(t=>j`
${t.text}
`)}
`:G} + ${S?j`
${$.text}
`:G} + style="left:${((S.x-b.x)/b.w*100).toFixed(2)}%;top:${((S.y-b.y)/b.h*100).toFixed(2)}%">${S.text}
`:G} ${this._zoom>1?j`
${Math.round(100*this._zoom)}%
`:G} ${this._renderFarHint()} @@ -5883,7 +5969,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${null!=this._tip.temp?j`${this._t("tip.temp_avg")} ${this._tip.temp}°`:G} ${null!=this._tip.hum?j`${this._t("tip.hum_avg")} ${this._tip.hum}%`:G} ${null!=this._tip.lqi?j`${this._t("tip.lqi")} - ${this._tip.lqi}`:G} + ${this._tip.lqi}
`:G} `:G} ${this._kiosk&&!this._hasFixedFloor&&this._kioskDots&&this._model.length>1?j`
${this._model.map(t=>j``)} @@ -5914,7 +6000,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G} ${this._toast?j``:G} - `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=wh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=wh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=ao(this._planHass,this._devices,null,this._virtualLights)){const i=cu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:uu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Eu(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Ou(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=ao(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Li(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&zu(a,r,o,window.clearTimeout.bind(window)):(a=Eu(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Li(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Hu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Li(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Sh(this.hass.states[i||""]?.state),n=bh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Ph(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?bh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(kh).filter(Boolean)),s=new Set;for(const e of t){const t=kh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j` + `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=kh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=kh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=lo(this._planHass,this._devices,null,this._virtualLights)){const i=hu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:pu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Ou(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Nu(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=lo(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Bi(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&Hu(a,r,o,window.clearTimeout.bind(window)):(a=Ou(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Bi(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Lu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Bi(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Mh(this.hass.states[i||""]?.state),n=wh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Rh(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?wh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(xh).filter(Boolean)),s=new Set;for(const e of t){const t=xh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j`
@@ -5974,28 +6060,28 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${u.length?j`
${is(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} + ${u.length?j`
${ss(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} `:G} - `}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:ci(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=gh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=xh(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:ai(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Dh(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Dh(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Ch(c),[d,u]=dh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Ch(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=bh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Th(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=bh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Ch(s.p0),[a,l]=dh(r,e[0],e[1]),[c,h]=dh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Th(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=bh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Ch(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>dh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=dh(s,t.cx,t.cy);n.push(W` - ${t.name}`)}let a=G;if(i.pos){const[e,n]=dh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W``}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:hi(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=mh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=$h(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:li(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Th(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Th(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Dh(c),[d,u]=uh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Dh(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=wh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Ph(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=wh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Dh(s.p0),[a,l]=uh(r,e[0],e[1]),[c,h]=uh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Ph(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=wh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Dh(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>uh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=uh(s,t.cx,t.cy);n.push(W` + ${t.name}`)}let a=G;if(i.pos){const[e,n]=uh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W` `)}}return j`this._vacFitPointer(e,t)} @pointermove=${e=>this._vacFitPointer(e,t)} @pointerup=${e=>this._vacFitPointer(e,t)} - @pointercancel=${e=>this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Li(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??bh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Ph(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=dh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=vh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:yh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=dh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=dh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=dh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Bi(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??wh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Rh(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=uh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=yh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:bh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=uh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=uh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=uh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
{t.stopPropagation();const e=this._vacEntity(i);e&&this._openMoreInfo(e)}}>
`)}return this._vacLastView=e,n.length&&!this._vacRaf&&this._vacRafLoop(),n.length||o.length?j` ${o.length?W`${o}`:G} - ${n}`:G}_renderDevice(t,e,i=!0){const s=this._pos(t),n=this._scenePoint([s.x,s.y]),o=(n[0]-e.x)/e.w*100,r=(n[1]-e.y)/e.h*100,a=this._devicePresentation(t,i),l=[`left:${o}%`,`top:${r}%`,...jo(a)],c=a.disabledReason,h=a.haDisabled?this._t(`marker.ha_disabled_${c}`):t.userHidden?this._t("marker.hidden_ghost"):t.name,d=nu(a),u="view"===this._mode||"devices"===this._mode,p=[h,a.haDisabled?"":this._t(`marker.state_a11y_${d}`),"none"!==a.pulse.kind?this._t(`marker.pulse_a11y_${a.pulse.reason}`):"",a.valueFullText||a.valueText||"",Do(a.valueBadge),null!=a.lqiText&&a.lqiBand?this._t(`marker.lqi_a11y_${a.lqiBand}`,{value:a.lqiText}):""].filter(Boolean).join(", "),_=[t.model,a.valueBadge?.fullText||"",null!=a.lqiText?"LQI "+a.lqiText:""].filter(Boolean).join(" · ");return j`
this._clickDevice(e,t)} @keydown=${e=>this._keyDevice(e,t)} @@ -6020,16 +6106,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerup=${e=>this._pointerUp(e,t)} @pointercancel=${e=>this._pointerUp(e,t)} > - ${Uo(a,{newDevice:this._newIds.has(t.id),newDeviceTitle:this._t("device.new"),disabledTitle:a.haDisabled?h:""})} -
`}_roomArea(t){const e=ci(t);if(!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._spaceWalls,n=s.length&&t.id&&ol(i.rooms,t.id,s,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||e,o=this._cleanFloor(t,n),r=this._cellCm/this._gridPitch;return Tr(o.area*r*r/1e4,"mi"===this._renderPlanHass?.config?.unit_system?.length)}_roomTemp(t){const e=t.settings?.temp_source;return e?xo(this._renderPlanHass,e,"temp",this._markers):t.area?this._climate().get(t.area)?.temp??null:null}_roomHum(t){const e=t.settings?.hum_source;return e?xo(this._renderPlanHass,e,"hum",this._markers):t.area?this._climate().get(t.area)?.hum??null:null}_climate(){const t=this._serverCfg?.markers,e=this._renderPlanHass,i=this._climateCache;if(i&&i.h===e&&i.r===this._iconRules&&i.mk===t)return i.m;const s=function(t,e,i){const s=new Map;if(!t?.entities)return s;const n=vo(i),o=new Set;for(const t of i||[]){if(t?.removed||!0!==t?.use_climate_temp)continue;const e=(t.binding||"").indexOf(":");e>0&&o.add(t.binding.slice(e+1))}const r=new Map;for(const[e,i]of Object.entries(t.entities)){if(i.device_id&&n.devices.has(i.device_id)||!i.device_id&&n.entities.has(e))continue;const s=i.device_id?t.devices?.[i.device_id]:null,a=i.area_id||s?.area_id||null;if(!a)continue;if(i.entity_category)continue;if(!(o.size>0&&e.startsWith("climate.")&&(o.has(e)||i.device_id&&o.has(i.device_id)))){if(Yt.has(i.platform))continue;if($o.test(e))continue}let l=r.get(a);l||(l=new Map,r.set(a,l));const c=i.device_id||e;let h=l.get(c);if(!h){const n=t.states?.[e];h={name:(s?s.name_by_user||s.name:i.name||n?.attributes?.friendly_name||e)||e,model:s?.model,ents:[]},l.set(c,h)}h.ents.push(e)}for(const[i,n]of r){const r=[],a=[];for(const[i,s]of n){const n=fo(t,s.name,s.model,s.ents,e),l="mdi:thermometer"===n||"mdi:air-filter"===n;if(l){const e=uo(t,s.ents);null!=e&&r.push(e)}if(o.size>0&&(o.has(i)||s.ents.some(t=>o.has(t)))){const e=po(t,s.ents);null!=e&&r.push(e)}if(l||"mdi:water-percent"===n){const e=go(t,s.ents);null!=e&&a.push(e)}}(r.length||a.length)&&s.set(i,{temp:r.length?Math.round(r.reduce((t,e)=>t+e,0)/r.length*10)/10:null,hum:a.length?Math.round(a.reduce((t,e)=>t+e,0)/a.length):null})}return s}(e,this._iconRules,t);return this._climateCache={h:e,r:this._iconRules,mk:t,m:s},s}_resetRoomDialogFields(){this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1}_openRoomEdit(t){if(!t.id)return;this._roomEditId=t.id,this._nameSel=t.name||"",this._areaSel=t.area||"",this._roomFill="glow"===t.settings?.fill_mode?"":t.settings?.fill_mode||"";const e=t.settings?.custom_fill;this._roomCustomFill=e&&"object"==typeof e?rs(e,ls(this._curSpaceCfg).customFill):null,this._roomTempSrc=t.settings?.temp_source||"",this._roomHumSrc=t.settings?.hum_source||"",this._roomNameScale=Es(t.settings?.name_scale),this._roomLabelScale=Es(t.settings?.label_scale),this._roomSrcOpen=null,this._roomSrcFilter="",this._roomDialog=!0}_roomSettingsFromDialog(){const t={};return this._roomFill&&(t.fill_mode=this._roomFill),this._roomCustomFill&&(t.custom_fill=this._roomCustomFill),this._roomTempSrc&&(t.temp_source=this._roomTempSrc),this._roomHumSrc&&(t.hum_source=this._roomHumSrc),1!==this._roomNameScale&&(t.name_scale=this._roomNameScale),1!==this._roomLabelScale&&(t.label_scale=this._roomLabelScale),Object.keys(t).length?t:null}_saveRoomEdit(){const t=this._curSpaceCfg,e=t?.rooms.find(t=>t.id===this._roomEditId);if(!e)return this._roomDialog=!1,void(this._roomEditId=null);e.name=this._nameSel.trim()||e.name,e.area=this._areaSel||null;const i=e.settings||{},s={...i};this._roomFill?s.fill_mode=this._roomFill:delete s.fill_mode,this._roomCustomFill?s.custom_fill=this._roomCustomFill:delete s.custom_fill,"glow"===i.fill_mode&&"boolean"!=typeof i.glow&&(s.glow=!0),this._roomTempSrc?s.temp_source=this._roomTempSrc:delete s.temp_source,this._roomHumSrc?s.hum_source=this._roomHumSrc:delete s.hum_source,1!==this._roomNameScale?s.name_scale=this._roomNameScale:delete s.name_scale,1!==this._roomLabelScale?s.label_scale=this._roomLabelScale:delete s.label_scale,Object.keys(s).length?e.settings=s:delete e.settings,this._saveConfig(),this._roomDialog=!1,this._roomEditId=null,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate(),this._showToast(this._t("toast.room_updated"))}_roomSrcCandidates(){const t=this._planHass,e=vo(this._markers),i=this._roomSrcFilter.trim().toLowerCase(),s=[];for(const n of Object.values(t.devices)){if("service"===n.entry_type)continue;if(e.devices.has(n.id))continue;const t=(n.name_by_user||n.name||n.id).trim();i&&!t.toLowerCase().includes(i)||s.push({value:"device:"+n.id,label:t,sub:n.model||this._t("marker.sub_device")})}for(const[n,o]of Object.entries(t.entities)){if(!n.startsWith("sensor.")||o.hidden)continue;if(yo(t,n,e))continue;const r=o.name||t.states[n]?.attributes?.friendly_name||n;i&&!(r+" "+n).toLowerCase().includes(i)||s.push({value:"entity:"+n,label:r,sub:n})}return s.sort((t,e)=>t.label.localeCompare(e.label)),s.slice(0,200)}_roomSrcLabel(t){const e=t.indexOf(":"),i=t.slice(0,e),s=t.slice(e+1);return"device"===i?this._fullRegistryHass.devices[s]?.name_by_user||this._fullRegistryHass.devices[s]?.name||s:this._fullRegistryHass.entities[s]?.name||this.hass.states[s]?.attributes?.friendly_name||s}_labelPos(t,e){const i=this._layout["rl_"+(t.id||"")];if(i&&i.s===e)return{x:i.x*R_,y:i.y*R_};const s=this._snap(this._roomCenter(t));return{x:s[0],y:s[1]}}_labelDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=this._labelPos(e,i);this._drag={id:"rl_"+(e.id||""),sx:t.clientX,sy:t.clientY,ox:s.x,oy:s.y,moved:!1},N_(t),this._tip=null}_labelMove(t,e,i){const s="rl_"+(e.id||"");if(!this._drag||this._drag.id!==s)return;const n=this._stageEl;if(!n)return;const o=this._spaceModelById(i);if(!o)return;const r=o.vb,a=n.getBoundingClientRect(),l=this._viewOr(r),c=(t.clientX-this._drag.sx)/a.width*l.w,h=(t.clientY-this._drag.sy)/a.height*l.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0);const d=ic(this._drag.ox+c),u=ic(this._drag.oy+h);this._savePos({id:s,space:i},d,u)}_labelUp(t){const e="rl_"+(t.id||"");if(!this._drag||this._drag.id!==e)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&window.setTimeout(()=>this._drag=null,0)}_labelScale(t){const e=this._layout["rl_"+(t.id||"")]?.k;return"number"==typeof e&&Number.isFinite(e)?Math.min(3,Math.max(.5,e)):1}_rlResizeDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=t.target.closest(".roomlabel");if(!s)return;const n=s.getBoundingClientRect(),o=n.left+n.width/2,r=n.top+n.height/2,a=Math.max(8,Math.hypot(t.clientX-o,t.clientY-r));this._rlResize={id:"rl_"+(e.id||""),space:i,k0:this._labelScale(e),cx:o,cy:r,d0:a},N_(t)}_rlResizeMove(t){const e=this._rlResize;if(!e)return;t.stopPropagation();const i=Math.max(8,Math.hypot(t.clientX-e.cx,t.clientY-e.cy)),s=Math.min(3,Math.max(.5,e.k0*(i/e.d0))),n=this._layout[e.id];if(n)this._layout={...this._layout,[e.id]:{...n,k:s}};else{const t=e.id.slice(3),i=this._spaceModelById(e.space);if(!i)return;const n=i.rooms.find(e=>e.id===t);if(!n)return;const o=this._labelPos(n,e.space);this._layout={...this._layout,[e.id]:{s:e.space,x:o.x/R_,y:o.y/R_,k:s}}}this._dirtyPos.add(e.id)}_rlResizeUp(){this._rlResize&&(this._rlResize=null,this._persistLayout())}_renderRoomGear(t,e,i){if(!t.id)return G;let s=null;if(t.poly?(s=this._gearPtCache.get(t.poly)||null,s||(s=xi(t.poly),this._gearPtCache.set(t.poly,s))):null!=t.x&&null!=t.y&&(s=[t.x+(t.w||0)/2,t.y+(t.h||0)/2]),!s)return G;const n=(s[0]-i.x)/i.w*100,o=(s[1]-i.y)/i.h*100;return j``}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=ao(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
`}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=lo(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
this._labelDown(i,t,e.id)} @pointermove=${i=>this._labelMove(i,t,e.id)} @pointerup=${()=>this._labelUp(t)} @@ -6044,13 +6130,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=zs(e,i),r=Math.round(10*o)/10,a=Os(o);return j`
- ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=zs(t.a,t.b);return{x:o,y:r,on45:Os(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Tr(aa(Math.abs(s-e),this._cellCm,this._gridPitch)*aa(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=R_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=ci(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e +
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),r=Math.round(10*o)/10,a=Hs(o);return j`
+ ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:r,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Pr(la(Math.abs(s-e),this._cellCm,this._gridPitch)*la(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=I_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,r,a]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} `}_renderOpeningCenterTick(t){const e=(t.angle+90)*Math.PI/180;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return _i(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!yo(this._fullRegistryHass,t,vo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!yo(this._renderPlanHass,t,vo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=An(t)){return!!e&&"active"===Ln(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:_i(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return gi(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!bo(this._fullRegistryHass,t,yo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!bo(this._renderPlanHass,t,yo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=In(t)){return!!e&&"active"===Bn(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:gi(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W` `}_renderOpenings(t){const e=this._openingsR;if(!e.length)return W``;const i=this._spaceModel();if(!i)return W``;const s=t.color,n=this._spaceWalls,o=this._openPairs().flatMap(t=>t.segs),r=this._openingWallIndexFor(i,o).value;return W`${e.map(t=>{if(t.orphanReason)return W`! - `;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=tu(l);return W``;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=eu(l);return W` - ${eu(l)} + ${iu(l)} this._opClick(e,t)} @@ -6081,10 +6167,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${e=>this._opPointerMove(e,t)} @pointerup=${e=>this._opPointerUp(e,t)} @pointercancel=${e=>this._opPointerUp(e,t)}> - `})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
`})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
{t.stopPropagation(),"view"===this._mode&&(this._openingInfo=e)}}> - +
`})}`}_lockAction(t,e){if(this._openingEntityAvailable(t)){if("unlock"===e){const e=this.hass?.states?.[t]?.attributes?.friendly_name||t;if(!confirm(this._t("confirm.unlock",{name:e})))return}this.hass?.callService?.("lock",e,{entity_id:t})}}_renderOpeningInfoCard(){const t=this._openingInfo,e="passage"!==t.type&&t.contact&&this._openingEntityAvailable(t.contact)?t.contact:null,i=("door"===t.type||"gate"===t.type)&&t.lock&&this._openingEntityAvailable(t.lock)?t.lock:null,s=e?this.hass.states[e]?.state:null,n=this._openingAmt(t),o=i?this.hass.states[i]?.state:null,r="door"===t.type?"opening.door":"gate"===t.type?"opening.gate":"passage"===t.type?"opening.passage":"opening.window",a="door"===t.type?"mdi:door":"gate"===t.type?"mdi:gate":"passage"===t.type?"mdi:arch":"mdi:window-closed-variant",l="gate"===t.type?n>0?"mdi:gate-open":"mdi:gate":n>0?"mdi:door-open":"mdi:door-closed",c=(t,e,i,s="")=>j`
${e}${i}
`;return j`this._openingInfo=null}> @@ -6105,7 +6195,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_renderOpeningDialog(){const t=this._openingDialog,e=this._spaceModel()?.partitions||[],i=t.id?this._curSpaceCfg?.openings?.find(e=>e.id===t.id):null,s={id:t.id||"preview",type:t.type,x:t.x/R_,y:t.y/this._spaceH,angle:t.angle,length:i&&!t.lengthTouched?i.length:this._cmToUnits(Math.max(20,t.lengthCm))/R_,...t.host?{host:t.host}:{}},n=ld(i,s),o=t.host?n?ad(s,e,R_,this._cellCm,this._gridPitch):rd(s,e,R_,this._cellCm,this._gridPitch):null,r="does-not-fit-jamb"===o?.reason,a=t.host?e.find(e=>e.id===t.host.id):null,l=a?ai(a.cm/2,this._imperial):"",c=!!t.host&&!o?.resolved&&!r,h="gate"===t.type?"mdi:gate":"window"===t.type?"mdi:window-closed-variant":"passage"===t.type?"mdi:arch":"mdi:door",d=(t,e,i)=>j`i(t.target.value)}> ${t.map(t=>j``)} `;return j` {const i=f_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> + @input=${e=>{const i=y_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> ${"passage"===t.type&&(t.contact||t.lock)?j`
@@ -6170,7 +6260,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=fc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=fc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` + `}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=vc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=vc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` @@ -6184,34 +6274,34 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - `}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=va(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W``}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=ya(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`this._physicalDown(e,"partition",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Pl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Rl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalDown(e,"column",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Tl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Pl(u.base,this._cellCm,this._gridPitch);return t?W`this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Pl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Rl(u.base,this._cellCm,this._gridPitch);return t?W``:G})(),_=(()=>{const i=this._physicalSel;if(!i)return G;if("draft"===i.kind){const e=t.room_drafts.find(t=>t.id===i.id);return e?W` t.join(",")).join(" ")}> ${e.points.map(t=>W``)} - `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Tl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` + `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Pl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` - `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Pl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` + `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Rl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` - `;const h=va(l.cm,this._cellCm,this._gridPitch),d=Ml(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` + `;const h=ya(l.cm,this._cellCm,this._gridPitch),d=Cl(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` @@ -6219,7 +6309,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}>
- `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=va(5,this._cellCm,this._gridPitch),s=va(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=ya(5,this._cellCm,this._gridPitch),s=ya(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(va(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=sl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:va(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Hs(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return La([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Cs(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>va(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||_a:l||_a,this._cellCm,this._gridPitch)/2):[],d=c?Ba(c,va(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(ya(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=nl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:ya(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Ba([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>ya(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||ga:l||ga,this._cellCm,this._gridPitch)/2):[],d=c?qa(c,ya(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} - ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Pl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} + ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Rl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} ${d?W` `:G} ${u?W` @@ -6263,7 +6353,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628

${this._t("confirm.delete_partition_openings_body",{count:t.openings.length})}

    - ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:ai(t.length*R_/this._gridPitch*this._cellCm,e)})}
  • `)} + ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:li(t.length*I_/this._gridPitch*this._cellCm,e)})}
  • `)}
@@ -6287,8 +6377,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
this._physicalDialog={...t,cm:e.target.value}} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}
${e&&"square"===t.shape?j` @@ -6411,12 +6501,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of ao(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Xi(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ss).filter(t=>this._planEntityAvailable(t));return j``}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of lo(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Ji(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ms).filter(t=>this._planEntityAvailable(t));return j`
${(()=>{const e=this._cardEntities(t);return e.length?j`
- ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Xi(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
- + ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Ji(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
+ ${s} ${"toggle"===e?j``:"open"===e?j`
`:G} ${i&&!this._cardEntities(t).length?j`
${this._t("info.state")}${i}
`:G} - ${Hi(t.link)?j`
${this._t("info.link")} - ${t.link}
`:G} + ${Ni(t.link)?j`
${this._t("info.link")} + ${t.link}
`:G} ${t.description?j`
${t.description}
`:G} ${t.pdfs&&t.pdfs.length?j`
${this._t("info.manuals")} - ${t.pdfs.map(t=>j` + ${t.pdfs.map(t=>j` ${t.name}`)}
`:G} ${s.length?j`
${this._t("info.controls")} @@ -6448,7 +6538,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
- `}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=Bs(t.room),i=Fi(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Yn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=f_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return ko({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return Qh({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!ed(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Yh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Lo(this._planHass,s,n),r=Bo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return lo(ao(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&oo(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Jn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Jn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Jn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ss(e)&&!s.has(e)&&Kn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=ks(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?ls(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?_u(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Lo(this._planHass,o,l):[],p=o?Bo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Po(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return Qn(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Jn(o):[],P=o&&Zn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Wh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j``}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=qs(t.room),i=Ei(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=y_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return xo({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return td({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!id(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Xh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Bo(this._planHass,s,n),r=qo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return co(lo(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&ro(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Zn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Zn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Zn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ms(e)&&!s.has(e)&&Yn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=xs(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?cs(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?gu(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Bo(this._planHass,o,l):[],p=o?qo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Ro(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return to(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Zn(o):[],P=o&&Qn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Uh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j`this._markerDialog=null}>
@@ -6471,7 +6561,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
@@ -6496,7 +6586,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._markerDialog={...t,bindingFilter:e.target.value}} />
${i.map(e=>j`
{const i={...t,binding:e.value,bindingOpen:!1,controls:Yn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> + @click=${()=>{const i={...t,binding:e.value,bindingOpen:!1,controls:Xn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> ${e.label}${e.sub}
`)} ${i.length?G:j`
${this._t("marker.nothing_found")}
`} @@ -6519,7 +6609,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -6692,12 +6782,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 -

${this._t(p_[t.display])}

+

${this._t(g_[t.display])}

${"static_icon"===t.display&&this._bindingHasAlarm(t.binding)?j`
${this._t("marker.static_alarm_warning")} @@ -6719,7 +6809,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._help("marker.value_badge_source.help")}
this._spaceDialog=ch(t,"file")} /> + @change=${()=>this._spaceDialog=hh(t,"file")} /> ${this._t("space.source_file")} ${"file"===t.source?j`
@@ -6866,25 +6956,25 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.pickSaved?this._renderServerPlans(t):G}`:G}
- {const i=f_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(g_,i)):t.cellCm}}} /> + @input=${e=>{const i=y_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(f_,i)):t.cellCm}}} /> ${this._t("space.scale_unit")}
-
`:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=ls(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j``:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=cs(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j`
@@ -7073,7 +7163,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${[["","fill.inherit"],...ji.map(t=>[t,"fill."+t])].map(([t,e])=>j`
- ${this._renderCardPreview(ls(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)} + ${this._renderCardPreview(cs(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)}
@@ -7117,4 +7207,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("btn.save")} `}
- `}}L_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},L_.ZOOM_MAX=8,L_.ZOOM_MIN=1/3,L_.styles=[Kt,ju],customElements.get("houseplan-card")||customElements.define("houseplan-card",L_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${d_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); + `}}q_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},q_.ZOOM_MAX=8,q_.ZOOM_MIN=1/3,q_.styles=[Kt,Uu],customElements.get("houseplan-card")||customElements.define("houseplan-card",q_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${p_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); diff --git a/demo/capture_device_icon_reference.mjs b/demo/capture_device_icon_reference.mjs index 07bfb30e..375546a2 100644 --- a/demo/capture_device_icon_reference.mjs +++ b/demo/capture_device_icon_reference.mjs @@ -87,10 +87,10 @@ async function runtimePng(theme, row, size) { 'sel', 'lock-locked', 'lock-unlocked', ]); node.classList.add(`theme-${themeName}`, ...classes); - node.style.setProperty('--icon-size', `${px}px`); + node.style.setProperty('--device-base-size', `${px}px`); node.style.setProperty('--dev-scale', '1'); node.querySelector('.device-core')?.style.setProperty('transition', 'none'); - node.querySelector('.device-shell')?.style.setProperty('transition', 'none'); + node.querySelector('.device-shell-frame')?.style.setProperty('transition', 'none'); if (clearValues) node.querySelectorAll('.value-badge').forEach((value) => value.remove()); node.blur(); }, { @@ -113,7 +113,7 @@ async function runtimePng(theme, row, size) { node.querySelector('.lqi')?.style.setProperty('display', 'none'); }); const clip = await page.$eval(selector(row.id), (node) => { - const shell = node.querySelector('.device-shell').getBoundingClientRect(); + const shell = node.querySelector('.device-shell-frame').getBoundingClientRect(); const pad = 22; return { x: Math.max(0, shell.left - pad), diff --git a/demo/smoke_device_icon_design.mjs b/demo/smoke_device_icon_design.mjs index 3a71ac98..e14eb367 100644 --- a/demo/smoke_device_icon_design.mjs +++ b/demo/smoke_device_icon_design.mjs @@ -81,6 +81,7 @@ await page.evaluate(async () => { ['d_tv', marker('d_tv', { display: 'value' })], ['d_temp', marker('d_temp', { display: 'badge', + tap_action: 'more-info', value_badge: { enabled: true, source: { kind: 'entity_state', entity_id: 'sensor.living_temp' }, @@ -138,7 +139,7 @@ await page.waitForTimeout(220); const selector = (id) => `.dev[data-id="${id}"]`; const beforeUnavailable = await page.$eval(selector('d_kettle'), (node) => ({ core: getComputedStyle(node.querySelector('.device-core')).backgroundColor, - shell: getComputedStyle(node.querySelector('.device-shell')).borderColor, + shell: getComputedStyle(node.querySelector('.device-shell-frame')).borderColor, opacity: getComputedStyle(node).opacity, })); await page.hover(selector('d_kettle')); @@ -148,7 +149,7 @@ await page.hover(selector('d_kettle')); await page.waitForTimeout(220); const afterUnavailable = await page.$eval(selector('d_kettle'), (node) => ({ core: getComputedStyle(node.querySelector('.device-core')).backgroundColor, - shell: getComputedStyle(node.querySelector('.device-shell')).borderColor, + shell: getComputedStyle(node.querySelector('.device-shell-frame')).borderColor, opacity: getComputedStyle(node).opacity, })); @@ -157,19 +158,73 @@ await page.waitForTimeout(220); const ordinaryHover = await page.$eval(selector('d_tv'), (node) => ({ core: getComputedStyle(node.querySelector('.device-core')).backgroundColor, glyph: getComputedStyle(node.querySelector('.device-core')).color, - shell: getComputedStyle(node.querySelector('.device-shell')).borderColor, + shell: getComputedStyle(node.querySelector('.device-shell-frame')).borderColor, })); await page.$eval(selector('d_tv'), (node) => { node.querySelector('.device-core').style.transition = 'none'; - node.querySelector('.device-shell').style.transition = 'none'; + node.querySelector('.device-shell-frame').style.transition = 'none'; node.classList.remove('theme-dark'); node.classList.add('theme-light'); }); const lightHover = await page.$eval(selector('d_tv'), (node) => ({ core: getComputedStyle(node.querySelector('.device-core')).backgroundColor, glyph: getComputedStyle(node.querySelector('.device-core')).color, - shell: getComputedStyle(node.querySelector('.device-shell')).borderColor, + shell: getComputedStyle(node.querySelector('.device-shell-frame')).borderColor, })); +await page.evaluate(() => { + const c = window.__card; + window.__capsuleActionCount = 0; + window.__capsuleOriginalMoreInfo = c._openMoreInfo; + c._openMoreInfo = () => { window.__capsuleActionCount++; }; +}); +const capsulePositions = []; +for (const [index, position] of ['right', 'bottom', 'left', 'top'].entries()) { + await page.mouse.move(1, 1); + await page.$eval(selector('d_temp'), (node, nextPosition) => { + const shell = node.querySelector('.device-shell'); + const badge = node.querySelector('.value-badge'); + for (const name of ['right', 'bottom', 'left', 'top']) { + shell.classList.remove(`pos-${name}`); + badge.classList.remove(`pos-${name}`); + } + shell.classList.add(`pos-${nextPosition}`); + badge.classList.add(`pos-${nextPosition}`); + }, position); + const valuePoint = await page.$eval(selector('d_temp'), (node, nextPosition) => { + const value = node.querySelector('.value-badge').getBoundingClientRect(); + const center = { x: value.left + value.width / 2, y: value.top + value.height / 2 }; + if (nextPosition === 'right') center.x = value.right - 1; + if (nextPosition === 'left') center.x = value.left + 1; + if (nextPosition === 'bottom') center.y = value.bottom - 1; + if (nextPosition === 'top') center.y = value.top + 1; + return center; + }, position); + await page.mouse.move(valuePoint.x, valuePoint.y); + await page.waitForTimeout(220); + const hover = await page.$eval(selector('d_temp'), (node, point) => { + return { + core: getComputedStyle(node.querySelector('.device-core')).backgroundColor, + hovered: node.matches(':hover'), + target: node.getRootNode().elementFromPoint(point.x, point.y)?.className || '', + }; + }, valuePoint); + await page.mouse.click(valuePoint.x, valuePoint.y); + const actionCount = await page.evaluate(() => window.__capsuleActionCount); + capsulePositions.push({ position, hover, actionAccepted: actionCount === index + 1 }); +} +const capsuleCorePoint = await page.$eval(selector('d_temp'), (node) => { + const core = node.querySelector('.device-core').getBoundingClientRect(); + return { x: core.left + core.width / 2, y: core.top + core.height / 2 }; +}); +await page.mouse.click(capsuleCorePoint.x, capsuleCorePoint.y); +const capsuleActions = await page.evaluate(() => { + const c = window.__card; + const count = window.__capsuleActionCount; + c._openMoreInfo = window.__capsuleOriginalMoreInfo; + delete window.__capsuleOriginalMoreInfo; + delete window.__capsuleActionCount; + return count; +}); await page.$eval(selector('d_tv'), (node) => { node.classList.remove('theme-light'); node.classList.add('theme-dark'); @@ -177,34 +232,48 @@ await page.$eval(selector('d_tv'), (node) => { await page.mouse.move(1, 1); await page.waitForTimeout(220); -const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, ordinaryHover, lightHover, reference }) => { +const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, ordinaryHover, lightHover, capsulePositions, capsuleActions, reference }) => { const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; const node = (id) => sr().querySelector(`.dev[data-id="${id}"]`); const rect = (element) => element?.getBoundingClientRect(); const light = node('d_light1'); const lightShell = light?.querySelector('.device-shell'); + const lightFrame = light?.querySelector('.device-shell-frame'); const lightCore = light?.querySelector('.device-core'); - const shellRect = rect(lightShell); + const shellRect = rect(lightFrame); const coreRect = rect(lightCore); const presence = node('d_motion'); const unavailable = node('d_kettle'); const text = node('d_tv'); + const lqiSamples = ['d_temp', 'd_motion', 'd_window', 'd_lamp'].map((id) => { + const marker = node(id); + const label = marker?.querySelector('.lqi'); + const value = Number(label?.textContent?.trim()); + if (!label || !Number.isFinite(value)) return null; + const hue = Math.max(0, Math.min(120, Math.round(((value - 40) / 140) * 120))); + const probe = document.createElement('span'); + probe.style.color = `hsl(${hue}, 85%, 55%)`; + sr().append(probe); + const expected = getComputedStyle(probe).color; + probe.remove(); + return { value, actual: getComputedStyle(label).color, expected }; + }).filter(Boolean); const textCoreRect = rect(text?.querySelector('.device-core')); const textCoreRadius = parseFloat( getComputedStyle(text?.querySelector('.device-core')).borderTopLeftRadius, ); const double = node('d_temp'); - const doubleShellRect = rect(double?.querySelector('.device-shell')); + const doubleShellRect = rect(double?.querySelector('.device-shell-frame')); const doubleCoreRect = rect(double?.querySelector('.device-core')); const doubleValueRect = rect(double?.querySelector('.value-badge')); const pseudo = getComputedStyle(light, '::before'); lightCore.style.transition = 'none'; - lightShell.style.transition = 'none'; + lightFrame.style.transition = 'none'; text.querySelector('.device-core').style.transition = 'none'; - text.querySelector('.device-shell').style.transition = 'none'; + text.querySelector('.device-shell-frame').style.transition = 'none'; const coreStyle = getComputedStyle(lightCore); - const activeShellStyle = getComputedStyle(lightShell); + const activeShellStyle = getComputedStyle(lightFrame); const valueRadius = parseFloat(getComputedStyle(double?.querySelector('.value-badge')).borderTopLeftRadius); const coreRadiusText = coreStyle.borderTopLeftRadius; const radiusIsHalf = (value, rectangle) => value.endsWith('%') @@ -213,14 +282,14 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, const lockNode = node('d_lock'); lockNode.querySelector('.device-core').style.transition = 'none'; - lockNode.querySelector('.device-shell').style.transition = 'none'; + lockNode.querySelector('.device-shell-frame').style.transition = 'none'; const darkThemeClassProjected = lockNode.classList.contains('theme-dark'); const darkThemeCore = getComputedStyle(lockNode.querySelector('.device-core')).backgroundColor; const darkLockGlyph = getComputedStyle(lockNode.querySelector('.device-core')).color; - const darkLockShell = getComputedStyle(lockNode.querySelector('.device-shell')).borderColor; + const darkLockShell = getComputedStyle(lockNode.querySelector('.device-shell-frame')).borderColor; const originalLockClasses = lockNode.className; const originalLockStyle = lockNode.getAttribute('style') || ''; - lockNode.style.setProperty('--icon-size', '56px'); + lockNode.style.setProperty('--device-base-size', '50.4px'); lockNode.style.setProperty('--dev-scale', '1'); const stateClasses = [ 'theme-light', 'theme-dark', 'on', 'open', 'alarm', 'unavail', 'virtual', @@ -230,7 +299,7 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, lockNode.classList.remove(...stateClasses); lockNode.classList.add(`theme-${theme}`, ...classes); const core = getComputedStyle(lockNode.querySelector('.device-core')); - const shell = getComputedStyle(lockNode.querySelector('.device-shell')); + const shell = getComputedStyle(lockNode.querySelector('.device-shell-frame')); return { core: core.backgroundColor, glyph: core.color, @@ -254,19 +323,24 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, const originalLightStyle = light.getAttribute('style') || ''; const originalDoubleStyle = double.getAttribute('style') || ''; - const sizeMatrix = [32, 56, 96].map((size) => { - light.style.setProperty('--icon-size', `${size}px`); + const sizeMatrix = [ + { configured: 32, effective: 28.8 }, + { configured: 56, effective: 50.4 }, + { configured: 96, effective: 86.4 }, + ].map(({ configured, effective }) => { + light.style.setProperty('--device-base-size', `${effective}px`); light.style.setProperty('--dev-scale', '1'); - double.style.setProperty('--icon-size', `${size}px`); + double.style.setProperty('--device-base-size', `${effective}px`); double.style.setProperty('--dev-scale', '1'); const sizedCore = rect(light.querySelector('.device-core')); - const sizedShell = rect(light.querySelector('.device-shell')); + const sizedShell = rect(light.querySelector('.device-shell-frame')); const sizedIcon = rect(light.querySelector('ha-icon')); const sizedValue = rect(double.querySelector('.value-badge')); const iconSvg = light.querySelector('ha-icon')?.shadowRoot?.querySelector('svg'); const pathBox = iconSvg?.querySelector('path')?.getBBox(); return { - requested: size, + configured, + effective, core: sizedCore?.width || 0, shell: sizedShell?.width || 0, coreRadius: getComputedStyle(light.querySelector('.device-core')).borderTopLeftRadius, @@ -283,23 +357,23 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, light.classList.remove('theme-dark'); light.classList.add('theme-light'); const lightActiveGlyph = getComputedStyle(lightCore).color; - const lightActiveShell = getComputedStyle(lightShell).borderColor; + const lightActiveShell = getComputedStyle(lightFrame).borderColor; light.classList.remove('theme-light'); light.classList.add('theme-dark'); - const defaultShell = getComputedStyle(text.querySelector('.device-shell')).borderColor; + const defaultShell = getComputedStyle(text.querySelector('.device-shell-frame')).borderColor; text.classList.remove('theme-dark'); text.classList.add('theme-light'); const lightThemeCore = getComputedStyle(text.querySelector('.device-core')).backgroundColor; text.classList.remove('theme-light'); text.classList.add('theme-dark'); text.classList.add('sel'); - const selectedShell = getComputedStyle(text.querySelector('.device-shell')).borderColor; + const selectedShell = getComputedStyle(text.querySelector('.device-shell-frame')).borderColor; const selectedCoreDecoration = getComputedStyle(text.querySelector('.device-core')).boxShadow; text.classList.remove('sel'); - text.focus(); + text.focus({ focusVisible: true }); const focusVisibleMatched = text.matches(':focus-visible'); - const focusShell = getComputedStyle(text.querySelector('.device-shell')).borderColor; + const focusShell = getComputedStyle(text.querySelector('.device-shell-frame')).borderColor; const focusCoreDecoration = getComputedStyle(text.querySelector('.device-core')).boxShadow; text.blur(); @@ -378,6 +452,8 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, valueRadius, lightActiveGlyph, lightActiveShell, + lightClasses: light.className, + lightShellVariable: getComputedStyle(light).getPropertyValue('--device-shell-stroke'), lightThemeCore, focusVisibleMatched, focusShell, @@ -388,26 +464,29 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, reference, lightHover, ordinaryHover, + capsulePositions, + capsuleActions, + lqiSamples, }, referenceAssetsLoaded: Object.values(reference).every((theme) => Object.values(theme) .every((state) => state.core.startsWith('rgb') && state.glyph.startsWith('rgb') && state.shell.startsWith('rgb'))), geometryMatchesAt32_56_96: sizeMatrix.every((sample) => - Math.abs(sample.core - sample.requested * 0.9) <= 0.5 + Math.abs(sample.core - sample.effective) <= 0.5 && Math.abs(sample.shell / sample.core - 1.26875) < 0.03 && sample.coreRadius === '50%' && Math.abs(sample.valueHeight / sample.core - 0.7875) < 0.015 && Math.abs(sample.valueRadius - sample.valueHeight / 2) <= 0.5 - && Math.abs(sample.iconViewport / sample.core - 0.5) < 0.01 - && Math.abs(sample.paintedWidth / sample.core - 0.416667) < 0.015 - && Math.abs(sample.paintedHeight / sample.core - 0.416667) < 0.015), + && Math.abs(sample.iconViewport / sample.core - 0.55) < 0.01 + && Math.abs(sample.paintedWidth / sample.core - 0.458333) < 0.015 + && Math.abs(sample.paintedHeight / sample.core - 0.458333) < 0.015), referenceStateMatrixMatches: ['light', 'dark'].every((theme) => ['default', 'active', 'lock', 'unlock', 'alert'].every((state) => stateMatrix[theme][state].core === reference[theme][state].core && stateMatrix[theme][state].glyph === reference[theme][state].glyph && stateMatrix[theme][state].shell === reference[theme][state].shell && Math.abs(stateMatrix[theme][state].shellWidth - - Math.max(1, Math.floor(reference[theme][state].shellWidth * 56 * 0.9))) <= 0.5)), + - Math.max(1, Math.floor(reference[theme][state].shellWidth * 50.4))) <= 0.5)), referenceHoverMatches: lightHover.core === reference.light.hover.core && lightHover.glyph === reference.light.hover.glyph && lightHover.shell === reference.light.default.shell @@ -426,8 +505,8 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, && Math.abs(textCoreRadius - textCoreRect.height / 2) <= 0.5, valueBadgeIsPill: !!doubleValueRect && Math.abs(valueRadius - doubleValueRect.height / 2) <= 0.5, - packageShadowColor: getComputedStyle(lightShell).boxShadow.includes('37, 40, 45'), - noBackdropBlur: getComputedStyle(lightShell).backdropFilter === 'none', + packageShadowColor: getComputedStyle(lightFrame).boxShadow.includes('37, 40, 45'), + noBackdropBlur: getComputedStyle(lightFrame).backdropFilter === 'none', activeUsesPackageAmber: getComputedStyle(lightCore).backgroundColor === 'rgb(240, 160, 12)' && activeShellStyle.borderColor === 'rgb(240, 160, 12)' && getComputedStyle(lightCore).color === 'rgb(37, 37, 37)', @@ -459,8 +538,18 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, lqiBandsProjected: node('d_temp')?.getAttribute('data-lqi-band') === 'low' && node('d_window')?.getAttribute('data-lqi-band') === 'mid' && node('d_lamp')?.getAttribute('data-lqi-band') === 'high', + lqiUsesContinuousComputedColor: lqiSamples.length >= 3 + && lqiSamples.every((sample) => sample.actual === sample.expected) + && lqiSamples.some((sample) => sample.value > 41 && sample.value < 179 + && sample.actual !== 'rgb(240, 160, 12)'), unavailableHasNoHoverOrMotion: JSON.stringify(beforeUnavailable) === JSON.stringify(afterUnavailable) && beforeUnavailable.opacity === '0.35' && !unavailable.querySelector('.device-pulse'), + valueCapsuleOwnsHoverAndActionAtEveryPosition: capsulePositions.length === 4 + && capsulePositions.every(({ hover, actionAccepted }) => hover.hovered + && hover.core === 'rgb(12, 130, 240)' + && String(hover.target).includes('device-shell-frame') + && actionAccepted) + && capsuleActions === 5, unavailableAriaIsReadable: /unavailable/i.test(aria) && /LQI|signal/i.test(aria), textIsComplete: text?.querySelector('.valtext')?.textContent === 'A very long localized device value without clipping' @@ -474,7 +563,7 @@ const result = await page.evaluate(async ({ beforeUnavailable, afterUnavailable, editorKeyboardOpensSettings, planNotInTabOrder, }; -}, { beforeUnavailable, afterUnavailable, ordinaryHover, lightHover, reference }); +}, { beforeUnavailable, afterUnavailable, ordinaryHover, lightHover, capsulePositions, capsuleActions, reference }); const { __debug, ...out } = result; if (Object.values(out).some((value) => value !== true)) { diff --git a/demo/smoke_device_icon_pixel_alignment.mjs b/demo/smoke_device_icon_pixel_alignment.mjs new file mode 100644 index 00000000..f3bc1b3d --- /dev/null +++ b/demo/smoke_device_icon_pixel_alignment.mjs @@ -0,0 +1,186 @@ +// Issue #213: dense fractional geometry plus painted-centroid proof at common DPRs. +import { launch, checkAll, finish } from './serve.mjs'; + +const dprs = [1, 1.25, 1.5, 2]; +const paintedSizes = [24, 24.25, 31.75, 32, 47.25, 50.4, 55.75, 63.25, 79.75, 95.5, 111.75, 112]; +const evidence = []; + +for (const dpr of dprs) { + const { page, browser } = await launch( + { width: 980, height: 760 }, dpr, [], { colorScheme: 'light' }, + ); + await page.evaluate(async () => { + const c = window.__card; + c.hass = { ...c.hass, themes: { ...(c.hass.themes || {}), darkMode: false } }; + c._regSignature = ''; + c._maybeRebuildDevices(); + c._setMode('view'); + c.requestUpdate(); + await c.updateComplete; + await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve))); + const root = c.shadowRoot || c.renderRoot; + const marker = root.querySelector('.dev[data-id="d_light1"]'); + const layer = marker.closest('.devlayer'); + for (const node of layer.children) { + if (node !== marker) node.style.display = 'none'; + } + for (const node of layer.parentElement.children) { + if (node !== layer) node.style.visibility = 'hidden'; + } + marker.className = 'dev theme-light'; + marker.style.left = '50%'; + marker.style.top = '50%'; + marker.style.setProperty('--dev-scale', '1'); + marker.style.setProperty('--device-face-bg', 'rgb(0 255 0)'); + marker.style.setProperty('--device-face-fg', 'rgb(0 255 0)'); + marker.style.setProperty('--device-shell-stroke', 'rgb(255 0 0)'); + for (const extra of marker.querySelectorAll( + '.device-pulse, .activity-dot, .newdot, .habadge, .lqi, .device-sections', + )) extra.style.display = 'none'; + marker.querySelector('ha-icon').style.visibility = 'hidden'; + marker.querySelector('.device-core').style.transition = 'none'; + marker.querySelector('.device-core').style.boxShadow = 'none'; + const frame = marker.querySelector('.device-shell-frame'); + frame.style.transition = 'none'; + frame.style.boxShadow = 'none'; + frame.style.border = '0'; + // A solid diagnostic shell makes the alpha-weighted centroid stable even + // when the production stroke is only one sparse physical pixel wide. + frame.style.background = 'rgb(255 0 0)'; + root.querySelector('.stage').style.background = 'rgb(0 0 255)'; + }); + + const dense = await page.evaluate(async () => { + const root = window.__card.shadowRoot || window.__card.renderRoot; + const marker = root.querySelector('.dev[data-id="d_light1"]'); + const core = marker.querySelector('.device-core'); + const frame = marker.querySelector('.device-shell-frame'); + let maxDx = 0; + let maxDy = 0; + let maxSizeError = 0; + let samples = 0; + for (let quarter = 24 * 4; quarter <= 112 * 4; quarter++) { + const size = quarter / 4; + marker.style.setProperty('--device-base-size', `${size}px`); + // A style/layout read is intentional: this smoke enumerates browser + // quantisation, production has no per-marker measurement loop. + const a = core.getBoundingClientRect(); + const b = frame.getBoundingClientRect(); + maxDx = Math.max(maxDx, Math.abs((a.left + a.width / 2) - (b.left + b.width / 2))); + maxDy = Math.max(maxDy, Math.abs((a.top + a.height / 2) - (b.top + b.height / 2))); + maxSizeError = Math.max(maxSizeError, Math.abs(a.width - size), Math.abs(a.height - size)); + samples++; + } + return { samples, maxDx, maxDy, maxSizeError }; + }); + + const painted = []; + for (const size of paintedSizes) { + const clip = await page.evaluate(async (nextSize) => { + const root = window.__card.shadowRoot || window.__card.renderRoot; + const marker = root.querySelector('.dev[data-id="d_light1"]'); + marker.style.setProperty('--device-base-size', `${nextSize}px`); + await new Promise((resolve) => requestAnimationFrame(resolve)); + const r = marker.querySelector('.device-core').getBoundingClientRect(); + const cx = r.left + r.width / 2; + const cy = r.top + r.height / 2; + // Fixed integer clip bounds remove screenshot-crop quantisation from the + // centroid comparison; all tested shells fit with a generous margin. + return { x: Math.floor(cx - 85), y: Math.floor(cy - 85), width: 170, height: 170 }; + }, size); + await page.evaluate(() => { + const marker = (window.__card.shadowRoot || window.__card.renderRoot) + .querySelector('.dev[data-id="d_light1"]'); + marker.querySelector('.device-core').style.visibility = 'hidden'; + marker.querySelector('.device-shell-frame').style.visibility = 'visible'; + }); + const shellPng = await page.screenshot({ type: 'png', clip }); + await page.evaluate(() => { + const marker = (window.__card.shadowRoot || window.__card.renderRoot) + .querySelector('.dev[data-id="d_light1"]'); + marker.querySelector('.device-core').style.visibility = 'visible'; + marker.querySelector('.device-shell-frame').style.visibility = 'hidden'; + }); + const corePng = await page.screenshot({ type: 'png', clip }); + await page.evaluate(() => { + const marker = (window.__card.shadowRoot || window.__card.renderRoot) + .querySelector('.dev[data-id="d_light1"]'); + marker.querySelector('.device-shell-frame').style.visibility = 'visible'; + }); + const centroid = await page.evaluate(async ({ shellBase64, coreBase64 }) => { + const point = async (base64, channel) => { + const raw = atob(base64); + const bytes = Uint8Array.from(raw, (char) => char.charCodeAt(0)); + const bitmap = await createImageBitmap(new Blob([bytes], { type: 'image/png' })); + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const context = canvas.getContext('2d', { willReadFrequently: true }); + context.drawImage(bitmap, 0, 0); + const pixels = context.getImageData(0, 0, bitmap.width, bitmap.height).data; + let weight = 0, weightedX = 0, weightedY = 0; + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + for (let y = 0; y < bitmap.height; y++) for (let x = 0; x < bitmap.width; x++) { + const i = (y * bitmap.width + x) * 4; + const [r, g, b, a] = [pixels[i], pixels[i + 1], pixels[i + 2], pixels[i + 3]]; + const primary = channel === 'red' ? r : g; + const other = channel === 'red' ? Math.max(g, b) : Math.max(r, b); + const sample = Math.max(0, primary - other) * a / 255; + weight += sample; weightedX += x * sample; weightedY += y * sample; + if (sample > 0) { + minX = Math.min(minX, x); minY = Math.min(minY, y); + maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); + } + } + return { + x: weightedX / weight, y: weightedY / weight, weight, + boundsX: (minX + maxX) / 2, boundsY: (minY + maxY) / 2, + }; + }; + // Capture each paint layer in isolation. Subtracting the large core from + // a one-pixel annulus amplifies harmless edge AA into a false centroid. + const red = await point(shellBase64, 'red'); + const green = await point(coreBase64, 'green'); + return { + dx: Math.abs(red.x - green.x), + dy: Math.abs(red.y - green.y), + boundsDx: Math.abs(red.boundsX - green.boundsX), + boundsDy: Math.abs(red.boundsY - green.boundsY), + redWeight: red.weight, + greenWeight: green.weight, + }; + }, { shellBase64: shellPng.toString('base64'), coreBase64: corePng.toString('base64') }); + painted.push({ size, ...centroid }); + } + + const mutant = await page.evaluate(async () => { + const root = window.__card.shadowRoot || window.__card.renderRoot; + const marker = root.querySelector('.dev[data-id="d_light1"]'); + marker.style.setProperty('--device-base-size', '50.4px'); + const frame = marker.querySelector('.device-shell-frame'); + frame.style.transform = 'translateX(1px)'; + await new Promise((resolve) => requestAnimationFrame(resolve)); + const core = marker.querySelector('.device-core').getBoundingClientRect(); + const shell = frame.getBoundingClientRect(); + return Math.abs((core.left + core.width / 2) - (shell.left + shell.width / 2)); + }); + + evidence.push({ dpr, dense, painted, mutant }); + await browser.close(); +} + +const result = { + denseQuarterPixelMatrixCovers24To112: evidence.every((row) => row.dense.samples === 353), + domCentresShareOneLayoutQuantum: evidence.every((row) => + row.dense.maxDx <= 0.02 && row.dense.maxDy <= 0.02 && row.dense.maxSizeError <= 0.02), + paintedCentroidsStayWithinCalibratedHalfCssPixel: evidence.every((row) => row.painted.every((sample) => + sample.redWeight > 0 && sample.greenWeight > 0 + && sample.dx <= row.dpr / 2 + 0.1 && sample.dy <= row.dpr / 2 + 0.1)), + paintedSupportStaysWithinOneRasterPixel: evidence.every((row) => row.painted.every((sample) => + sample.boundsDx <= 1.01 && sample.boundsDy <= 1.01)), + onePixelNudgeMutantIsDetected: evidence.every((row) => row.mutant >= 0.98), +}; + +if (Object.values(result).some((value) => value !== true)) { + console.error(`pixel alignment evidence: ${JSON.stringify(evidence, null, 2)}`); +} +checkAll(result); +await finish(null, result); diff --git a/demo/smoke_device_preview_parity.mjs b/demo/smoke_device_preview_parity.mjs index fac13369..cc56ef14 100644 --- a/demo/smoke_device_preview_parity.mjs +++ b/demo/smoke_device_preview_parity.mjs @@ -165,11 +165,13 @@ const res = await page.evaluate(async () => { const staticNode = card.renderRoot.querySelector('.dev[data-id="d_light1"]'); const staticFace = face(staticNode); const staticBadgeFace = face(card.renderRoot.querySelector('.dev[data-id="d_temp"]')); - const visualFactorParity = [ + const resolvedBaseContract = [ sr().querySelector('.dev[data-id="d_light1"]'), persistedPreview?.renderRoot?.querySelector('.dev'), staticNode, - ].every((node) => getComputedStyle(node).getPropertyValue('--device-visual-factor').trim() === '0.9'); + ].every((node) => node + && getComputedStyle(node).getPropertyValue('--device-visual-factor').trim() === '' + && parseFloat(getComputedStyle(node).getPropertyValue('--device-base-size')) > 0); return { allFacesPresent: !!planFace && !!previewFace && !!staticFace, @@ -186,7 +188,7 @@ const res = await page.evaluate(async () => { badgeBounds, valueBadgePlanPreviewParity: JSON.stringify(planBadgeFace) === JSON.stringify(persistedPreviewFace), valueBadgePlanStaticParity: JSON.stringify(planBadgeFace) === JSON.stringify(staticBadgeFace), - visualFactorParity, + resolvedBaseContract, bottomBadgeLqiStacked, staticBindingHook: staticNode?.getAttribute('data-binding-status') === 'active', }; diff --git a/demo/smoke_hidden_flag.mjs b/demo/smoke_hidden_flag.mjs index a26be969..2d6f61d9 100644 --- a/demo/smoke_hidden_flag.mjs +++ b/demo/smoke_hidden_flag.mjs @@ -44,7 +44,7 @@ Object.assign(out, await page.evaluate(async () => { o.ghostHasNoState = !!g && !g.classList.contains('on') && !g.classList.contains('open') && !g.classList.contains('unavail') && !g.classList.contains('alarm'); // и он синий, а не тёмный — отличим от недоступного устройства - const ghostShell = g?.querySelector('.device-shell'); + const ghostShell = g?.querySelector('.device-shell-frame'); o.ghostIsBlue = !!ghostShell && getComputedStyle(ghostShell).borderStyle.includes('dashed') && getComputedStyle(ghostShell).borderColor !== 'rgb(255, 255, 255)'; // тумблер локальный: конфиг не трогается diff --git a/demo/smoke_opening_binding.mjs b/demo/smoke_opening_binding.mjs index 3ff93abb..9cef3a10 100644 --- a/demo/smoke_opening_binding.mjs +++ b/demo/smoke_opening_binding.mjs @@ -43,6 +43,33 @@ const out = await page.evaluate(async () => { const contactValues = c._contactCandidates().map((item) => item.value); const lockValues = c._lockCandidates().map((item) => item.value); const openings = c._openingsR; + const lockBadge = sr().querySelector('.oplock'); + const originalLockClass = lockBadge?.className || ''; + const lockVisual = (theme, state) => { + lockBadge.className = `oplock theme-${theme} ${state}`; + const shell = lockBadge.querySelector('.oplock-shell'); + const core = lockBadge.querySelector('.oplock-core'); + const icon = lockBadge.querySelector('ha-icon'); + const shellStyle = getComputedStyle(shell); + const coreStyle = getComputedStyle(core); + const shellRect = shell.getBoundingClientRect(); + const coreRect = core.getBoundingClientRect(); + const iconRect = icon.getBoundingClientRect(); + return { + shell: shellStyle.borderColor, + core: coreStyle.backgroundColor, + glyph: coreStyle.color, + shellCoreRatio: shellRect.width / coreRect.width, + glyphCoreRatio: iconRect.width / coreRect.width, + footprint: shellRect.width, + }; + }; + const lockVisualMatrix = Object.fromEntries(['light', 'dark'].map((theme) => [theme, { + locked: lockVisual(theme, 'locked'), + unlocked: lockVisual(theme, 'unlocked'), + unknown: lockVisual(theme, 'unknown'), + }])); + if (lockBadge) lockBadge.className = originalLockClass; const result = { entityTombstoneCandidate: contactValues.includes('binary_sensor.window'), deviceTombstoneCandidate: lockValues.includes('lock.front_door'), @@ -55,6 +82,27 @@ const out = await page.evaluate(async () => { sharedContactDrivesBoth: openings.length === 2 && openings.every((opening) => c._openingAmt(opening) === 1), sharedLockRendersTwice: sr().querySelectorAll('.oplock').length === 2, + openingLockUsesPackageGeometryAndStates: + Object.values(lockVisualMatrix).every((theme) => Object.values(theme).every((state) => + Math.abs(state.shellCoreRatio - 1.26875) < 0.03 + && Math.abs(state.glyphCoreRatio - 0.55) < 0.03 + && state.footprint > 0)) + && lockVisualMatrix.light.locked.core === 'rgb(0, 0, 0)' + && lockVisualMatrix.light.locked.shell === 'rgb(0, 0, 0)' + && lockVisualMatrix.light.locked.glyph === 'rgb(255, 255, 255)' + && lockVisualMatrix.dark.locked.core === 'rgb(37, 37, 37)' + && lockVisualMatrix.dark.locked.shell === 'rgb(37, 37, 37)' + && lockVisualMatrix.dark.locked.glyph === 'rgb(255, 255, 255)' + && lockVisualMatrix.light.unlocked.core === 'rgb(240, 160, 12)' + && lockVisualMatrix.light.unlocked.shell === 'rgb(240, 160, 12)' + && lockVisualMatrix.light.unlocked.glyph === 'rgb(255, 255, 255)' + && lockVisualMatrix.dark.unlocked.core === 'rgb(240, 160, 12)' + && lockVisualMatrix.dark.unlocked.shell === 'rgb(240, 160, 12)' + && lockVisualMatrix.dark.unlocked.glyph === 'rgb(37, 37, 37)' + && lockVisualMatrix.light.unknown.core === 'rgb(255, 255, 255)' + && lockVisualMatrix.light.unknown.shell === 'rgb(188, 188, 188)' + && lockVisualMatrix.dark.unknown.core === 'rgb(37, 37, 37)' + && lockVisualMatrix.dark.unknown.shell === 'rgba(37, 37, 37, 0.75)', deletionKeepsOpeningFields: JSON.stringify(openingRefs()) === refsBefore, }; diff --git a/demo/smoke_vacuum.mjs b/demo/smoke_vacuum.mjs index 77797197..80b3933d 100644 --- a/demo/smoke_vacuum.mjs +++ b/demo/smoke_vacuum.mjs @@ -40,12 +40,17 @@ const out = await page.evaluate(async () => { // vs a NEUTRAL badge: the robot's own base is yellow while cleaning const devEl = sr().querySelector('.dev:not(.on)'); const devCore = devEl.querySelector('.device-core'); - const devShell = devEl.querySelector('.device-shell'); + const devShell = devEl.querySelector('.device-shell-frame'); const pcs = getComputedStyle(puck); o.puckPlateMatchesDev = pcs.backgroundColor === getComputedStyle(devCore).backgroundColor && pcs.borderTopColor === getComputedStyle(devShell).borderTopColor; - o.puck80pct = Math.abs(puck.getBoundingClientRect().width - - devCore.getBoundingClientRect().width * 0.8) < 2; + const originalScale = devEl.style.getPropertyValue('--dev-scale'); + devEl.style.setProperty('--dev-scale', '1'); + const puckWidth = parseFloat(getComputedStyle(puck).width); + const deviceCoreWidth = devCore.getBoundingClientRect().width; + if (originalScale) devEl.style.setProperty('--dev-scale', originalScale); + else devEl.style.removeProperty('--dev-scale'); + o.puck80pct = Math.abs(puckWidth - deviceCoreWidth * 0.8) < 0.5; o.noWedge = !sr().querySelector('.vacwedge'); // owner 2026-07-31: no heading arrow // the glyph is DEAD centre (owner report: it floated on the text baseline) const pr = puck.getBoundingClientRect(); diff --git a/demo/srv/assets/houseplan-card.js b/demo/srv/assets/houseplan-card.js index a767e7be..28e542b4 100755 --- a/demo/srv/assets/houseplan-card.js +++ b/demo/srv/assets/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function ai(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function li(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function hi(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function di(t){const e=[],i=new Set;for(const s of t||[]){const t=ci(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function pi(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of di(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function _i(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function gi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function mi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function vi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function yi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function xi(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!fi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||$i(t)||t[0]}function $i(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(bi(s,t,e))return s;for(let s=0;sMi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Mi(e,t,i)))}function Ti(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ri(t,e,i){for(let s=0;s1&&mi(i[0],i[i.length-1],e)&&i.pop(),i}function Ii(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(mi(s,n,i))return null;const o=Ri(t,s,i),r=Ri(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!bi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ai(r,i)};let c,h;if(o===r){const r=Ai([...e],i);if(r.length<3||Ti(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ai(a,i),h=r}else c=Ai([...l(s,o,n,r),...[...a].reverse()],i),h=Ai([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Ti(c)<=i||Ti(h)<=i||Math.abs(Ti(c)+Ti(h)-Ti(t))>Math.max(i,1e-6*Ti(t))?null:[c,h]}function Fi(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function Ei(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function zi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Oi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Yi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Ki(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Xi(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Ji(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Zi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Gi;const o=(e?.attr||"").trim(),r=Xi(t,i,o||null);if(null===r)return Gi;return Ji(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function Qi(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Ki(e);return n?(o=!0,s(n.entity||"")?Zi(i,n):Gi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Vi);return t>=0?n.slice(0,t)+Gi+n.slice(t+2):n?`${n} ${Gi}`:Gi}const l=Zi(i,e),c=n.indexOf(Vi);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const ts=20;function es(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function is(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ss="#55606c",ns=.55,os={c:"#607d8b",a:.18};function rs(t,e=os){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function as(t,e){const i=rs(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?rs(s,i):i}function ls(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ss),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):ns,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:rs(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function cs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const hs={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function ds(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(hs)){const s=hs[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function us(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function ps(t,e,i,s,n,o,r,a=os){const l=function(t,e,i,s,n,o,r,a=os){if("custom"===t)return rs(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:us(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const _s={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},gs=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function ms(t){for(const e of[...Object.values(_s),...gs])if(t===e[0]||t===e[1])return e;return null}function fs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?ms(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=_s[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=ms(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function vs(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const ys=1/2.2;function bs(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ws(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function ks(t,e,i){const s=ws(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:bs(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=vs(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function xs(t,e,i){return"on"===t?.state?ks(t,e,i):null}function $s(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,ys));return Math.max(0,Math.min(1,s))}function Ss(t){return t.startsWith("light.")||t.startsWith("switch.")}function Ms(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Cs(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ds(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=As(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function As(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Is(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Fs(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function Es(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function zs(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Os(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Hs(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ns=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Ls(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ns.has(e)}function Bs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const qs={availability:"available",status:"alarm",activity:"none"},js=new Set(["motion","vibration","sound"]),Ws=new Set(["occupancy","presence"]),Us=new Set(["door","window","garage_door","opening"]),Gs=new Set(["running","power"]),Vs=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ks=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Ys=new Set([...Ks,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Xs=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Js=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Zs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,Qs=t=>String(t??"").trim().toLowerCase(),tn=t=>Qs(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),en=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),sn=new Set(["wifi","connection","signal","battery"]);function nn(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>Qs(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(tn).filter(Boolean);if(r.some(t=>t.split("_").some(t=>sn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of en)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const on=(t,e)=>null!=nn(t,e);function rn(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(Qs).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=Qs(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function an(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=Qs(t?.[e]);if(Ks.has(i)||Xs.has(i))return i}return""}function ln(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n=String(e||"").split(".")[0],o=Qs(i?.attributes?.device_class),r={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Ls(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return js.has(o)?{...r,edge:"rising"}:Ws.has(o)?{...r,activity:"on"===s?"presence":"none"}:Us.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Gs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=an(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(Qs):[],n=!Xs.has(s)&&(Js.has(s)||Ks.has(s)||e.includes(s));return(t?Ks.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=an(i.attributes);return Ks.has(a)||Ks.has(s)&&!Xs.has(s)?{...r,status:"working",activity:"running"}:r}function cn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>rn(t,e));if(!(s.length>1&&!!n))return e.map(e=>ln(t,e));const o=e.find(e=>e!==n&&on(t,e)),r=ln(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?Qs(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=an(i?.attributes);return Ks.has(o)||Ys.has(s)&&!Xs.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:ln(t,e),status:"neutral",activity:"none",edge:"none"}})}function hn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return qs;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function dn(t,e){if(!(t=>!!t&&!Zs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const un=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},pn=(t,e)=>{const i={rev:0,configRev:un(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function _n(t,e=0){return pn(t,e).snapshot}function gn(t,e,i,s){const n=pn(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Cn(i,"id"),o=Cn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Tn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Dn(t,e)},80))}async function Pn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Tn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Tn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function Rn(t,e){const i=Mn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Dn(t,i),Pn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function An(t){const e=Mn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Tn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function In(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=kn.get(t);return e||(e=xn++,kn.set(t,e)),e}function Fn(t,e=An(t)){return[e.revision,e.access,In(e.devices),In(e.entities)].join(":")}function En(t){return!!t&&null==t.disabled_by}function zn(t,e=An(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))En(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!En(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!En(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!En(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!En(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function On(t,e=An(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Hn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Nn(){if(Sn)return Sn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem($n)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Sn=i,Sn}catch{return{}}}function Ln(t,e,i=An(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Hn(a,o);if(!En(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>En(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!En(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!En(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Nn()[t]||null}(e);if("device"===n){const e=r[o],i=Hn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function Bn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!En(s))continue;const n=t.devices?.[s.device_id];n&&!En(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function qn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function jn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Wn=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Un=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Gn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Wn){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Un(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=Qs(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return js.has(i)||Ws.has(i)||Us.has(i)||Gs.has(i)||"moving"===i||Vs.has(i)}(t,e.eid));if(o.length)return Un(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Un(r),s=e.find(e=>rn(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=nn(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Un(o.filter(i=>nn(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Un(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Un(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Vn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>jn(t,e.eid));if(i)return i.eid}const o=Gn(t,e);return o.find(Ss)||o[0]}function Kn(t,e,i=[]){return[...new Set(Yn(t,e,i))].filter(t=>Ss(t))}function Yn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Xn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Jn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ss),s=t.primary&&Ss(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ss(t)))]}function Zn(t){const e=Jn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function Qn(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Zn(e),via:"forced"}]}const i=e.primary||Gn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const to=new WeakMap,eo=new WeakMap;function io(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function so(t){const e=io(t),i=to.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ss):e.controls.filter(Ss)),s=Zn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return to.set(t,a),a}function no(t){return so(t).incomingByMarker}function oo(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&Qn(t,e).length>0}function ro(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=oo(t,e)?Qn(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function ao(t,e,i,s){if(null!=i)return ao(t,e,null,s).filter(t=>Xn(t.device,i));const n=io(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=fn(s),a=eo.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=so(e),u=null==i?l:l.filter(t=>Xn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ro(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ss):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&vn(i.device.marker)&&(i.on=yn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Xn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ss(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return eo.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function lo(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function co(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function ho(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return Ei(i)}function uo(t,e){for(const i of e){if(!jn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function po(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function _o(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function go(t,e){for(const i of e){if(!_o(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function mo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!En(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!En(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function fo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function vo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function yo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function bo(t,e,i,s,n){const o=Kn(e.binding,e.controls,t.entities).filter(t=>!yo(i,t,s)).filter(t=>"active"===Ln(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function wo(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function ko(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),n=On(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=vo(r),g=mo(s,p).filter(t=>!yo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=Bn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Ln(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=qn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=fo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Vn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=uo(s,_)),C.primary&&_o(s,C.primary)&&(C.hum=go(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Ln(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=wo(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?fo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Vn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=uo(s,g)),f.primary&&_o(s,f.primary)&&(f.hum=go(s,g)),bo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(yo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=wo(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=fo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=uo(s,v.entities)),v.entities.length&&_o(s,l)&&(v.hum=go(s,v.entities)),bo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};bo(r,t,n,_,i),k.push(r)}}return k}function xo(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=vo(i);return"device"===n?r.devices.has(o):"entity"===n&&yo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?uo(t,e):go(t,e)}return null}const $o=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function So(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=ho(t,n.entities);null!=e&&s.push(e)}return Ei(s)}function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Co={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function Do(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const To=new WeakMap;function Po(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ro(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Ao(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Io(t){return t.replaceAll("_"," ")}function Fo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Eo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function zo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Ao(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Ho(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Xi(t,i.entity_id);n=s?Ji(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Io(i.attribute)} · ${Ao(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Ho(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Xi(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Fo(o,100/255);if("volume_level"===i)return Fo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Fo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=ho(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Eo(i)}}function Oo(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>jn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&_o(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Ho(t,e){const i=t?.entities?.[e];if(i&&!En(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||En(s)}function No(t,e){return Ho(t,e)&&!!t?.states?.[e]}function Lo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=To.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=ao(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Po(i);if(r.some(t=>t.key===s))return;const n=zo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!No(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Co[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==ho(t,e.entities)||c({kind:"derived_lqi"}),To.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function Bo(t,e,i){const s=Oo(t,e);if(s&&i.some(t=>t.key===Po(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function qo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function jo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Wo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Uo(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` + `,Yt=new Set(["hacs","sun","backup","hassio","met","telegram_bot","mobile_app","systemmonitor","better_thermostat","adaptive_lighting","yandex_pogoda","upnp_serial_number"]),Xt=[{pattern:"протечк|leak|water sensor",icon:"mdi:water-alert"},{pattern:"клапан|valve",icon:"mdi:pipe-valve"},{pattern:"дым|smoke",icon:"mdi:smoke-detector"},{pattern:"термоголов|trv|radiator",icon:"mdi:radiator"},{pattern:"чайник|kettle|термопот",icon:"mdi:kettle"},{pattern:"сауна|sauna|harvia|парная|парилк",icon:"mdi:hot-tub"},{pattern:"температ|temperature|thermometer|climate sensor",icon:"mdi:thermometer"},{pattern:"qingping|air monitor|молекул|air quality",icon:"mdi:air-filter"},{pattern:"штор|curtain|blind|shade",icon:"mdi:roller-shade"},{pattern:"розетк|plug|socket|outlet",icon:"mdi:power-socket-de"},{pattern:"выключат|switch",icon:"mdi:light-switch"},{pattern:"лампа|лампочк|bulb|gx53|светильник|rgb|lamp|light strip",icon:"mdi:lightbulb"},{pattern:"камер|camera",icon:"mdi:cctv"},{pattern:"замок|ttlock|lock|sn609|sn9161",icon:"mdi:lock"},{pattern:"ворота|garage|gate",icon:"mdi:garage-variant"},{pattern:"калитк|door|открыт|contact",icon:"mdi:door"},{pattern:"счётчик|счетчик|kws|meter",icon:"mdi:meter-electric"},{pattern:"вводный автомат|breaker|wifimcbn",icon:"mdi:electric-switch"},{pattern:"myheat|котёл|котел|boiler|отоплен|heating",icon:"mdi:water-boiler"},{pattern:"холодильник|fridge",icon:"mdi:fridge"},{pattern:"стиральн|washer|washing",icon:"mdi:washing-machine"},{pattern:"сушилк|dryer",icon:"mdi:tumble-dryer"},{pattern:"пылесос|vacuum|dreame|roborock",icon:"mdi:robot-vacuum"},{pattern:"soundbar",icon:"mdi:soundbar"},{pattern:"колонк|станц|speaker|яндекс|yandex|алиса|alice",icon:"mdi:speaker"},{pattern:"tv|телевизор|hyundaitv|mitv|television",icon:"mdi:television"},{pattern:"keenetic|роутер|router|mesh|access point",icon:"mdi:router-wireless"},{pattern:"ибп|ups|kirpich",icon:"mdi:battery-charging-high"},{pattern:"slzb|координат|zigbee|coordinator",icon:"mdi:zigbee"},{pattern:"motion|движен|presence|присутств",icon:"mdi:motion-sensor"},{pattern:"humidity|влажн",icon:"mdi:water-percent"}];function Jt(t){const e=[];for(const i of t)if(i&&"string"==typeof i.pattern&&i.icon)try{e.push({re:new RegExp(i.pattern,"i"),icon:i.icon})}catch{}return e}const Zt=Jt(Xt),Qt={temperature:"mdi:thermometer",humidity:"mdi:water-percent",motion:"mdi:motion-sensor",occupancy:"mdi:motion-sensor",presence:"mdi:motion-sensor",door:"mdi:door",window:"mdi:window-closed",garage_door:"mdi:garage-variant",smoke:"mdi:smoke-detector",moisture:"mdi:water-alert",gas:"mdi:gas-cylinder",power:"mdi:meter-electric",energy:"mdi:meter-electric",illuminance:"mdi:brightness-5",co2:"mdi:molecule-co2",pm25:"mdi:air-filter",battery:"mdi:battery"},te="mdi:chip";function ee(t,e,i){const s=((t||"")+" "+(e||"")).toLowerCase();for(const{re:t,icon:e}of i??Zt)if(t.test(s))return e;return te}const ie=["light","switch","cover","valve","lock","climate","fan","media_player","camera","vacuum","humidifier","water_heater","alarm_control_panel","sensor","binary_sensor","event","button","number","select","update"];var se=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,ne=Math.ceil,oe=Math.floor,re="[BigNumber Error] ",ae=re+"Number primitive has more than 15 significant digits: ",le=1e14,ce=14,he=9007199254740991,de=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],ue=1e7,pe=1e9;function _e(t){var e=0|t;return t>0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t){const e=Math.max(0,Math.min(120,(t-40)/140*120));return`hsl(${Math.round(e)}, 85%, 55%)`}function ai(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function li(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function ci(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function di(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function ui(t){const e=[],i=new Set;for(const s of t||[]){const t=hi(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function _i(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of ui(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function gi(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function mi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function fi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function yi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function bi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function $i(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!vi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||Si(t)||t[0]}function Si(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(wi(s,t,e))return s;for(let s=0;sCi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Ci(e,t,i)))}function Pi(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ai(t,e,i){for(let s=0;s1&&fi(i[0],i[i.length-1],e)&&i.pop(),i}function Fi(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(fi(s,n,i))return null;const o=Ai(t,s,i),r=Ai(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!wi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ii(r,i)};let c,h;if(o===r){const r=Ii([...e],i);if(r.length<3||Pi(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ii(a,i),h=r}else c=Ii([...l(s,o,n,r),...[...a].reverse()],i),h=Ii([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Pi(c)<=i||Pi(h)<=i||Math.abs(Pi(c)+Pi(h)-Pi(t))>Math.max(i,1e-6*Pi(t))?null:[c,h]}function Ei(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function zi(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function Oi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Hi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Xi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Yi(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Ji(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Zi(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Qi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Vi;const o=(e?.attr||"").trim(),r=Ji(t,i,o||null);if(null===r)return Vi;return Zi(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function ts(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Yi(e);return n?(o=!0,s(n.entity||"")?Qi(i,n):Vi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Ki);return t>=0?n.slice(0,t)+Vi+n.slice(t+2):n?`${n} ${Vi}`:Vi}const l=Qi(i,e),c=n.indexOf(Ki);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const es=20;function is(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function ss(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ns="#55606c",os=.55,rs={c:"#607d8b",a:.18};function as(t,e=rs){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function ls(t,e){const i=as(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?as(s,i):i}function cs(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ns),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):os,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:as(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function hs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const ds={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function us(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(ds)){const s=ds[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function ps(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function _s(t,e,i,s,n,o,r,a=rs){const l=function(t,e,i,s,n,o,r,a=rs){if("custom"===t)return as(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:ps(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const gs={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},ms=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function fs(t){for(const e of[...Object.values(gs),...ms])if(t===e[0]||t===e[1])return e;return null}function vs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?fs(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=gs[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=fs(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function ys(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const bs=1/2.2;function ws(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ks(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function xs(t,e,i){const s=ks(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:ws(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=ys(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function $s(t,e,i){return"on"===t?.state?xs(t,e,i):null}function Ss(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,bs));return Math.max(0,Math.min(1,s))}function Ms(t){return t.startsWith("light.")||t.startsWith("switch.")}function Cs(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Ds(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ts(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=Is(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function Is(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Fs(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Es(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function zs(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function Os(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Hs(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Ns(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ls=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Bs(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ls.has(e)}function qs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const js={availability:"available",status:"alarm",activity:"none"},Ws=new Set(["motion","vibration","sound"]),Us=new Set(["occupancy","presence"]),Gs=new Set(["door","window","garage_door","opening"]),Vs=new Set(["running","power"]),Ks=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ys=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Xs=new Set([...Ys,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Js=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Zs=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Qs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,tn=t=>String(t??"").trim().toLowerCase(),en=t=>tn(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),sn=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),nn=new Set(["wifi","connection","signal","battery"]);function on(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>tn(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(en).filter(Boolean);if(r.some(t=>t.split("_").some(t=>nn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of sn)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const rn=(t,e)=>null!=on(t,e);function an(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(tn).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=tn(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function ln(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=tn(t?.[e]);if(Ys.has(i)||Js.has(i))return i}return""}function cn(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n=String(e||"").split(".")[0],o=tn(i?.attributes?.device_class),r={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Bs(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return Ws.has(o)?{...r,edge:"rising"}:Us.has(o)?{...r,activity:"on"===s?"presence":"none"}:Gs.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Vs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=ln(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(tn):[],n=!Js.has(s)&&(Zs.has(s)||Ys.has(s)||e.includes(s));return(t?Ys.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=ln(i.attributes);return Ys.has(a)||Ys.has(s)&&!Js.has(s)?{...r,status:"working",activity:"running"}:r}function hn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>an(t,e));if(!(s.length>1&&!!n))return e.map(e=>cn(t,e));const o=e.find(e=>e!==n&&rn(t,e)),r=cn(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?tn(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=ln(i?.attributes);return Ys.has(o)||Xs.has(s)&&!Js.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:cn(t,e),status:"neutral",activity:"none",edge:"none"}})}function dn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return js;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function un(t,e){if(!(t=>!!t&&!Qs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const pn=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},_n=(t,e)=>{const i={rev:0,configRev:pn(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function gn(t,e=0){return _n(t,e).snapshot}function mn(t,e,i,s){const n=_n(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Dn(i,"id"),o=Dn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Pn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Tn(t,e)},80))}async function Rn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Pn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Pn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function An(t,e){const i=Cn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Tn(t,i),Rn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function In(t){const e=Cn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Pn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function Fn(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=xn.get(t);return e||(e=$n++,xn.set(t,e)),e}function En(t,e=In(t)){return[e.revision,e.access,Fn(e.devices),Fn(e.entities)].join(":")}function zn(t){return!!t&&null==t.disabled_by}function On(t,e=In(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))zn(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!zn(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!zn(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!zn(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!zn(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function Hn(t,e=In(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Nn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Ln(){if(Mn)return Mn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem(Sn)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Mn=i,Mn}catch{return{}}}function Bn(t,e,i=In(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Nn(a,o);if(!zn(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>zn(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!zn(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!zn(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Ln()[t]||null}(e);if("device"===n){const e=r[o],i=Nn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function qn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!zn(s))continue;const n=t.devices?.[s.device_id];n&&!zn(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function jn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function Wn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Un=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Gn=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Vn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Un){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Gn(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=tn(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return Ws.has(i)||Us.has(i)||Gs.has(i)||Vs.has(i)||"moving"===i||Ks.has(i)}(t,e.eid));if(o.length)return Gn(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Gn(r),s=e.find(e=>an(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=on(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Gn(o.filter(i=>on(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Gn(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Gn(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Kn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>Wn(t,e.eid));if(i)return i.eid}const o=Vn(t,e);return o.find(Ms)||o[0]}function Yn(t,e,i=[]){return[...new Set(Xn(t,e,i))].filter(t=>Ms(t))}function Xn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Jn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Zn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ms),s=t.primary&&Ms(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ms(t)))]}function Qn(t){const e=Zn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function to(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Qn(e),via:"forced"}]}const i=e.primary||Vn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const eo=new WeakMap,io=new WeakMap;function so(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function no(t){const e=so(t),i=eo.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ms):e.controls.filter(Ms)),s=Qn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return eo.set(t,a),a}function oo(t){return no(t).incomingByMarker}function ro(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&to(t,e).length>0}function ao(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=ro(t,e)?to(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function lo(t,e,i,s){if(null!=i)return lo(t,e,null,s).filter(t=>Jn(t.device,i));const n=so(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=vn(s),a=io.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=no(e),u=null==i?l:l.filter(t=>Jn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ao(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ms):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&yn(i.device.marker)&&(i.on=bn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Jn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ms(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return io.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function co(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function ho(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function uo(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return zi(i)}function po(t,e){for(const i of e){if(!Wn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function _o(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function go(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function mo(t,e){for(const i of e){if(!go(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function fo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!zn(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!zn(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function vo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function yo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function bo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function wo(t,e,i,s,n){const o=Yn(e.binding,e.controls,t.entities).filter(t=>!bo(i,t,s)).filter(t=>"active"===Bn(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function ko(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function xo(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),n=Hn(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=yo(r),g=fo(s,p).filter(t=>!bo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=qn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Bn(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=jn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=vo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Kn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=po(s,_)),C.primary&&go(s,C.primary)&&(C.hum=mo(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Bn(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=ko(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?vo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Kn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=po(s,g)),f.primary&&go(s,f.primary)&&(f.hum=mo(s,g)),wo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(bo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=ko(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=vo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=po(s,v.entities)),v.entities.length&&go(s,l)&&(v.hum=mo(s,v.entities)),wo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};wo(r,t,n,_,i),k.push(r)}}return k}function $o(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=yo(i);return"device"===n?r.devices.has(o):"entity"===n&&bo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?po(t,e):mo(t,e)}return null}const So=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return zi(s)}function Co(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=po(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Do={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function To(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const Po=new WeakMap;function Ro(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ao(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Io(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Fo(t){return t.replaceAll("_"," ")}function Eo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function zo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function Oo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Io(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(No(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ji(t,i.entity_id);n=s?Zi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Fo(i.attribute)} · ${Io(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?No(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ji(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Eo(o,100/255);if("volume_level"===i)return Eo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Eo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=uo(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:zo(i)}}function Ho(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Wn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&go(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function No(t,e){const i=t?.entities?.[e];if(i&&!zn(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||zn(s)}function Lo(t,e){return No(t,e)&&!!t?.states?.[e]}function Bo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=Po.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=lo(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Ro(i);if(r.some(t=>t.key===s))return;const n=Oo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!Lo(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Do[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==uo(t,e.entities)||c({kind:"derived_lqi"}),Po.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function qo(t,e,i){const s=Ho(t,e);if(s&&i.some(t=>t.key===Ro(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function jo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function Wo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Uo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Go(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` ${"none"!==i.kind&&"dot"!==i.reducedMotionIndicator?j``:G} ${"dot"===i.reducedMotionIndicator?j``:G} ${e.newDevice?j``:G} ${t.haDisabled?j``:G} ${null!=t.lqiText?j`${t.lqiText}`:G} - `}function Go(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Vo=new WeakMap;function Ko(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Vo.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Vo.set(e,i)),i}function Yo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Xo(t,e){const i=Ko(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Yo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Jo(t){const e=Ko(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Zo(t,e,i=Jo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Qo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Zo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function tr(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function er(t,e,i,s=Jo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return Qo(t,n.platform||r,"entity-platform",s,o)}var ir={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const sr={en:ir,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function nr(t,e){if(e&&e in sr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function or(t,e,i){return is(sr[t][e]??ir[e]??e,i)}function rr(t,e){const i=sr[t][e]??sr.en[e];return"string"==typeof i&&i.trim().length>0}class ar extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Xo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return nr(this.hass)}_t(t,e){return or(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Jo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=er(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Qo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return tr(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(er(t,e,i,s));return c.some(Boolean)?tr(c):tr((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Qo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Jo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=er(this.hass,t,this.registry,Jo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",qo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",Do(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
+ `}function Vo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Ko=new WeakMap;function Yo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Ko.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Ko.set(e,i)),i}function Xo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Jo(t,e){const i=Yo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Xo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Zo(t){const e=Yo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Qo(t,e,i=Zo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function tr(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Qo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function er(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ir(t,e,i,s=Zo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return tr(t,n.platform||r,"entity-platform",s,o)}var sr={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const nr={en:sr,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function or(t,e){if(e&&e in nr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function rr(t,e,i){return ss(nr[t][e]??sr[e]??e,i)}function ar(t,e){const i=nr[t][e]??nr.en[e];return"string"==typeof i&&i.trim().length>0}class lr extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Jo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return or(this.hass)}_t(t,e){return rr(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Zo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=ir(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return tr(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return er(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(ir(t,e,i,s));return c.some(Boolean)?er(c):er((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return tr(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Zo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ir(this.hass,t,this.registry,Zo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",jo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=Wo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4183,7 +4268,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -4225,7 +4310,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("continuous"===this._demoKind?"marker.preview.stop_continuous":"marker.preview.demo_continuous")}
`:G} -
`}}ar.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},ar.styles=[Kt,o` +
`}}lr.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},lr.styles=[Kt,o` :host { display: block; min-width: 0; } .devicepreview { margin: 4px 0 14px; @@ -4256,6 +4341,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 pointer-events: none; container-type: inline-size; --icon-size: 54px; + --device-base-size: 48.6px; } .previewfit { position: absolute; left: 50%; top: 50%; transform-origin: center; } .previewstage .dev { left: 0; top: 0; cursor: default; } @@ -4291,20 +4377,20 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 .previewstage { min-height: 142px; } .previewfacts > div { grid-template-columns: minmax(0, 1fr); gap: 2px; } } - `],customElements.get("hp-device-preview")||customElements.define("hp-device-preview",ar);const lr=(t,e)=>[t[0]-e[0],t[1]-e[1]],cr=(t,e)=>[t[0]+e[0],t[1]+e[1]],hr=(t,e)=>t[0]*e[0]+t[1]*e[1],dr=t=>Math.hypot(t[0],t[1]);function ur(t){let e=0;for(let i=0;it[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}([a[0]+r[0]*l,a[1]+r[1]*l],t)&&(r=[-r[0],-r[1]]),r}function gr(t,e,i,s){const n=s||_r(t,e),o=(e+1)%t.length;return t.map((t,s)=>s===e||s===o?[t[0]+n[0]*i,t[1]+n[1]*i]:[...t])}function mr(t,e,i,s){const n=[],o=lr(i,e),r=dr(o);if(rs||h>s)continue;const d=hr(lr(o,e),a),u=hr(lr(l,e),a),p=Math.max(0,Math.min(d,u)),_=Math.min(r,Math.max(d,u));_-p>s&&n.push([[e[0]+a[0]*p,e[1]+a[1]*p],[e[0]+a[0]*_,e[1]+a[1]*_]])}return n}function fr(t,e,i,s,n){const o=mr(t,e,i,n);if(!o.length)return null;const r=t=>o.some(([e,i])=>pr(t,e,i)<=n),a=t.length,l=[];for(let o=0;on||f>n)continue;const v=hr(lr(e,c),p),y=hr(lr(i,c),p),b=Math.max(0,Math.min(v,y)),w=Math.min(u,Math.max(v,y));if(!(w-b<=n)){if(b>n&&bn&&wdr(lr(i,t[(s+1)%t.length]))>e);for(let t=0;t<2;t++)i=i.filter((t,s)=>{const n=i[(s-1+i.length)%i.length],o=i[(s+1)%i.length],r=(t[0]-n[0])*(o[1]-n[1])-(t[1]-n[1])*(o[0]-n[0]),a=dr(lr(o,n))||1;return Math.abs(r)/a>e});return i.length>=3?i:t}function yr(t){const e=t.length;if(e<3)return!1;for(let i=0;i(t[0]-n[0])*a[1]-(t[1]-n[1])*a[0],c=t=>(t[0]-n[0])*a[0]+(t[1]-n[1])*a[1],h=i,d=r-i;for(const e of t){const t=Math.abs(l(e));if(t<=i)continue;const n=c(e);n<=h||n>=d||tMath.abs(r+(t-u)/m*(a-r));s=Math.min(s,f(_),f(g))}}return s}function wr(t,e,i){if(Ci(t,e,i))return!0;if(Mi(t,e,i)||Mi(e,t,i))return!1;let s=0;try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]);for(const t of i)t?.[0]&&(s+=Ti(t[0]))}catch{return!1}return s>Math.max(1e-7,i*i)}function kr(t,e,i,s,n){const o=[i.n[0]*s,i.n[1]*s],r={polys:{},openings:{},movedSpans:{}};if(Math.abs(s)<1e-9)return r;for(const e of t){if(e.id===i.roomId){r.polys[e.id]=gr(e.poly,i.edge,s,i.n),r.movedSpans[e.id]=[[cr(i.a,o),cr(i.b,o)]];continue}const t=mr(e.poly,i.a,i.b,n);if(!t.length)continue;const a=fr(e.poly,i.a,i.b,o,n);a&&(r.polys[e.id]=a,r.movedSpans[e.id]=t.map(([t,e])=>[cr(t,o),cr(e,o)]))}for(const t of e)pr([t.x,t.y],i.a,i.b)<=n&&(r.openings[t.id]=[t.x+o[0],t.y+o[1]]);return r}function xr(t,e,i){for(const s of e)for(let e=0;ei)continue;const c=(t.x-n[0])*l[0]+(t.y-n[1])*l[1];if(c-t.length/2>=-i&&c+t.length/2<=a+i)return!0}return!1}function $r(t,e,i){return t.filter(t=>e.some(e=>{for(let s=0;sa.polys[t.id]||t.poly;for(const e of l){const s=t.find(t=>t.id===e),n=a.polys[e];if(!yr(n))return!1;const l=ur(s.poly),h=ur(n);if(Math.abs(h)t.find(t=>t.id===e).poly),d=t.map(c);for(const t of $r(e,h,2*r)){const e=a.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,d,2*r))return!1}return!0}function Mr(t,e,i,s,n,o){const r=t=>[s[0]+(t[0]-s[0])*n,s[1]+(t[1]-s[1])*n],a={poly:t.poly.map(r),openings:{}};for(const s of e){let e=!1;for(let i=0;i{for(let e=0;et.id===i);if(!l)return!1;const c=t.filter(t=>t.id!==i).map(t=>t.poly),h=Mr(l,e,c,s,n,2*a),d=h.poly,u=function(t){const e=function(t){const e=[...t].sort((t,e)=>t[0]-e[0]||t[1]-e[1]);if(e.length<3)return e;const i=(t,e,i)=>(e[0]-t[0])*(i[1]-t[1])-(e[1]-t[1])*(i[0]-t[0]),s=[];for(const t of e){for(;s.length>=2&&i(s[s.length-2],s[s.length-1],t)<=0;)s.pop();s.push(t)}const n=[];for(let t=e.length-1;t>=0;t--){const s=e[t];for(;n.length>=2&&i(n[n.length-2],n[n.length-1],s)<=0;)n.pop();n.push(s)}return s.pop(),n.pop(),s.concat(n)}(t);if(e.length<3)return 0;let i=1/0;for(let t=0;tt.id===i?d:t.poly);for(const t of $r(e,[l.poly],2*a)){const e=h.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,p,2*a))return!1}return!0}function Dr(t,e,i){const s=i/e;return Ti(t)*s*s/1e4}function Tr(t,e){return e?`${Math.round(10.7639*t)} ft²`:`${(Math.round(10*t)/10).toFixed(1)} m²`}function Pr(t){const e=t%360;return e<0?e+360:e}function Rr(t,e){const i=function(t,e){return Pr(t+e)}(t,e)*Math.PI/180;return[Math.sin(i),-Math.cos(i)]}const Ar=Object.freeze({dawn:Object.freeze({top:"#aabdd1",bottom:"#e8c8b7",horizon:"rgba(255,201,156,.56)",sun:"rgba(255,188,125,.78)",vignette:"rgba(65,72,99,.21)",outlineNear:"rgba(74,57,61,.25)",outlineMid:"rgba(255,238,224,.40)",outlineFar:"rgba(255,224,202,.18)"}),day:Object.freeze({top:"#dce9ef",bottom:"#cbdce3",horizon:"rgba(255,245,220,.45)",sun:"rgba(255,239,190,.72)",vignette:"rgba(65,91,105,.16)",outlineNear:"rgba(45,62,71,.28)",outlineMid:"rgba(255,255,255,.42)",outlineFar:"rgba(255,255,255,.20)"}),dusk:Object.freeze({top:"#48536c",bottom:"#9a7380",horizon:"rgba(242,156,114,.34)",sun:"rgba(255,167,113,.55)",vignette:"rgba(20,26,44,.39)",outlineNear:"rgba(238,219,225,.40)",outlineMid:"rgba(229,207,218,.26)",outlineFar:"rgba(215,190,205,.12)"}),night:Object.freeze({top:"#111a27",bottom:"#1f2f3e",horizon:"rgba(79,120,151,.16)",sun:"rgba(169,208,231,0)",vignette:"rgba(3,8,14,.58)",outlineNear:"rgba(218,238,249,.56)",outlineMid:"rgba(174,215,238,.30)",outlineFar:"rgba(136,194,226,.14)"})}),Ir=t=>"number"==typeof t&&Number.isFinite(t),Fr=(t,e,i)=>Math.min(i,Math.max(e,t));function Er(t){return t.elevation<=-6?"night":t.elevation>=6?"day":t.rising?"dawn":"dusk"}function zr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;return e>=300&&e<480?"dawn":e>=480&&e<1080?"day":e>=1080&&e<1260?"dusk":"night"}function Or(t){const e=Er(t),i=t.azimuth*Math.PI/180;return{sunX:50-42*Math.sin(i),sunY:78-Fr(t.elevation,0,90)/90*64,sunOpacity:"night"===e?0:Fr((t.elevation+6)/12,0,1)}}function Hr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;if(e<300||e>=1260)return{sunX:50,sunY:78,sunOpacity:0};const i=(e-300)/960,s=(e-300)/120,n=(1260-e)/120;return{sunX:8+84*i,sunY:78-64*Math.sin(i*Math.PI),sunOpacity:Math.max(.18,Math.min(s,n,1))}}function Nr(t,e=new Date){const i=function(t){const e=t?.states?.["sun.sun"]?.attributes;return e&&Ir(e.azimuth)&&Ir(e.elevation)&&"boolean"==typeof e.rising?{azimuth:Pr(e.azimuth),elevation:e.elevation,rising:e.rising}:null}(t);if(i)return{phase:Er(i),source:"sun",...Or(i)};const s="number"==typeof e?e:function(t=new Date){return 60*t.getHours()+t.getMinutes()}(e);return{phase:zr(s),source:"clock",...Hr(s)}}function Lr(t){return`${t.source}|${t.phase}|${t.sunX.toFixed(2)}|${t.sunY.toFixed(2)}|`+t.sunOpacity.toFixed(3)}const Br=[[-90,"#070c14"],[-12,"#070c14"],[-4,"#131a28"],[0,"#4a3527"],[10,"#e8ddcf"],[30,"#ffffff"],[90,"#ffffff"]],qr=t=>Math.min(1,Math.max(0,t));function jr(t,e,i=6){const s=t.angle*Math.PI/180,n=[Math.sin(s),-Math.cos(s)],o=s=>{const o=[t.x+n[0]*i*s,t.y+n[1]*i*s];return e.find(t=>t.poly.length>=3&&fi(o,t.poly))||null},r=o(1),a=o(-1);return r&&a?null:r||a?r?{normal:[-n[0],-n[1]],roomId:r.id}:{normal:n,roomId:a.id}:null}function Wr(t,e,i){return i>0&&t[0]*e[0]+t[1]*e[1]>.05}function Ur(t,e,i,s){return[[t[0],t[1]],[e[0],e[1]],[e[0]+i[0]*s,e[1]+i[1]*s],[t[0]+i[0]*s,t[1]+i[1]*s]]}function Gr(t,e){try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]),s=[];for(const t of i){const e=t?.[0];!Array.isArray(e)||e.length<4||s.push(e.slice(0,e.length-1).map(t=>[t[0],t[1]]))}return s}catch{return[]}}function Vr(t,e,i,s,n,o,r){if(!(s>0))return[];const a=Rr(i,n),l=[-a[0],-a[1]],c=function(t){const e=Math.min(90,Math.max(0,t));return.7*(.8+1.7*Math.pow(1-e/90,1.6))}(s),h=[];for(const i of e){if(!(i.length>0))continue;const e=jr(i,t);if(!e||!Wr(e.normal,a,s))continue;const n=t.find(t=>t.id===e.roomId);if(!n)continue;const d=o&&o[e.roomId]||n.poly,u=i.angle*Math.PI/180,p=i.length/2,_=[-e.normal[0],-e.normal[1]],g=Math.max(0,r?.[i.id]||0),m=i.x+_[0]*g/2,f=i.y+_[1]*g/2,v=Math.cos(u)*p,y=Math.sin(u)*p,b=[m-v,f-y],w=[m+v,f+y],k=c*i.length,x=Gr(Ur(b,w,l,k),d);if(!x.length)continue;const $=l[0]*_[0]+l[1]*_[1];h.push({openingId:i.id,roomId:e.roomId,polys:x,a:b,b:w,dir:l,len:k,normal:_,depth:k*$})}return h}const Kr=t=>"number"==typeof t&&Number.isInteger(t)&&t>=0&&t<=359?t:null;function Yr(t,e){const i=Kr(e?.north_deg);return null!==i?i:Kr(t?.north_deg)}function Xr(t,e){const i=t=>"static"===t||"daynight"===t?t:null;return i(e?.bg_mode)??i(t?.bg_mode)??"static"}function Jr(t,e){const i=e?.sun_rays;return"boolean"==typeof i?i:!0===t?.sun_rays}function Zr(t){const e=t?.states?.["sun.sun"]?.attributes,i=Number(e?.azimuth),s=Number(e?.elevation);return Number.isFinite(i)&&Number.isFinite(s)?{azimuth:i,elevation:s}:null}const Qr=["dawn","day","dusk","night"];function ta(t){if(!t)return"";const e=Ar[t.phase];return[`--hp-day-cycle-outline-near:${e.outlineNear}`,`--hp-day-cycle-outline-mid:${e.outlineMid}`,`--hp-day-cycle-outline-far:${e.outlineFar}`].join(";")}function ea(t,e=1){if(!t)return G;const i=[`--hp-day-cycle-sun-x:${t.sunX.toFixed(2)}%`,`--hp-day-cycle-sun-y:${t.sunY.toFixed(2)}%`,`--hp-day-cycle-sun-opacity:${t.sunOpacity.toFixed(3)}`,`opacity:${Math.min(1,Math.max(0,e)).toFixed(4)}`].join(";");return j``}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Wu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Wu(t,t=>t.classList.contains("editor-secondary")),s=Wu(t,t=>!!t.dataset.editorGroup),n=Wu(t,t=>!!t.dataset.editorPalette),o=Wu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Gu=t=>t.stopPropagation(),Vu=4.166666666666667e-9;function Ku(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Ql)*Ql;return Math.abs(e-t)<=Vu?t:e}const Yu=(t,e,i,s)=>Math.hypot(i-t,s-e),Xu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Ju=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Yu(t+c,e+h,n+d,o+u),Yu(t-c,e-h,n-d,o-u)),_=Math.max(Yu(t+c,e+h,n-d,o-u),Yu(t-c,e-h,n+d,o+u));return Math.min(p,_)},Zu=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Qu=t=>JSON.parse(JSON.stringify(t)),tp=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),ep=(t,e,i)=>Math.min(i,Math.max(e,t)),ip=t=>Kl({spaces:[t]})[0],sp=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of ci(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=Qa(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=sp(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>sp(t.a,t.b,a).localeCompare(sp(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Ia(u,t.a,t.b,e,s,a))}return u}const op=t=>{const e=[];for(const i of t||[]){const t=ci(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&tp(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(tp(n,"segments")&&(delete n.segments,e++),tp(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Wl&&t<=Ul&&(tp(n,"plan_scale_x")||(n.plan_scale_x=t),tp(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);tp(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?ep(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)tp(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&tp(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(tp(t,"width")){const i=Number(t.width);(tp(t,"width_cm")||Number.isFinite(i))&&(tp(t,"width_cm")||(t.width_cm=Number(ep(i/Zl*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(tp(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),tp(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(ep(ts*es(t)/Zl*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(tp(t,"scale")||tp(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1]));if(!(tp(t,"entity")||tp(t,"attr")||tp(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Yi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=ip(t);if(!e)continue;if(!zc(t.open_spans).length){const i=Bc(e.rooms,null,ql,.02*Zl,!0);i.length&&(t.open_spans=qc(i,ql),a++)}}const l=Qu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=Zu(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Vu||s))return;n++,t>r&&(r=t);const o=t*Jl*e;o>a&&(a=o,l=i)};for(const t of i){const e=Zu(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Ku(e+n),a=Ku(i+o),l=Ku(e),c=Ku(i),h=Math.max(Ql,r-l),d=Math.max(Ql,a-c);t=Xu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Ku(s.a[0]),Ku(s.a[1])],r=[Ku(s.b[0]),Ku(s.b[1])];let a=Math.max(Yu(s.a[0],s.a[1],n[0],n[1]),Yu(s.b[0],s.b[1],r[0],r[1]));const l=Yu(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Vu&&s+e/2<=l+Vu});l>Vu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Ku(s.center[0]),Ku(s.center[1])],n=Yu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Ku(s.x1),Ku(s.y1)],i=[Ku(s.x2),Ku(s.y2)];t=Math.max(Yu(s.x1,s.y1,e[0],e[1]),Yu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Ku(s.x),i=Ku(s.y);if(null!=s.w&&null!=s.h){const n=Ku(s.x+s.w),o=Ku(s.y+s.h),r=Math.max(Ql,n-e),a=Math.max(Ql,o-i);t=Xu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Yu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Vu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Ju(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=ui([s.x,s.y],t.rooms||[],.025,{step:Ql,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Ju(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Ku(i.x),r=Ku(i.y),a=Yu(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=ip(e),r=ip(s);if(!o||!r)continue;const a=op(o.rooms),c=op(r.rooms),_=.02*Zl;let g=Xc(zc(e.open_spans),a,c,ql);const m=g.length;g=Yc(g,r.rooms,ql,_),g=g.map(t=>{const e=Fc(t,ql),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Oc(o,t).d<=4*_&&Oc(i,t).d<=4*_&&Oc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Nc(i,d,u,Zl,2*_),g=Nc(n,d,u,Zl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Zl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Zl){h.moved++;const t=m/ql;t>h.maxShift&&(h.maxShift=t);const e=m/Zl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ic(p,g,ql)}),g=Yc(g,r.rooms,ql,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Fc(t,ql));g.length?s.open_spans=g:delete s.open_spans,jc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Aa(e.walls,a,c,Ql,ql);y=np(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=il(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=Pa(y,s.rooms||[],Ql,1,f.map(t=>[t[0]/ql,t[1]/ql,t[2]/ql,t[3]/ql])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class ap{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const lp=new WeakMap;const cp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function hp(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return cp(c,i,0)&&cp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&cp(c,s,8)&&cp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const dp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},up=t=>Math.max(0,Math.min(1,t)),pp=(t,e,i)=>t+(e-t)*i,_p=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function gp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function mp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function fp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function vp(t,e,i){const s=fp(t),n=fp(e);if(!s||!n)return i<.5?t:e;const o=up(i);return`rgba(${Math.round(pp(s[0],n[0],o))}, ${Math.round(pp(s[1],n[1],o))}, ${Math.round(pp(s[2],n[2],o))}, ${pp(s[3],n[3],o).toFixed(3)})`}function yp(t,e,i){const s=(t=>{const e=up(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,_p(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=up((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:yp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const wp="houseplan_card_labs_v1",kp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function xp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function $p(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Pp(t,e,i,s=kp){const n=function(t,e=kp){const i=xp(t),s=new Map;if(!i||!Mp(e))return s;for(const t of e){const e=xp(t.since),n=xp(t.expires);$p(i,e)>=0&&$p(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Mp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Tp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Tp(Cp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Dp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Rp={active:Object.freeze([]),space:""},Ap="",Ip=!1,Fp="";const Ep=new Set;function zp(){if("undefined"==typeof window)return Rp;const t=Pp(window.location,function(){try{return window.localStorage.getItem(wp)}catch{return null}}(),Ap);void 0!==t.persist&&function(t){try{window.localStorage.setItem(wp,t)}catch{}}(t.persist),Rp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Ep)t(Rp);return Rp}function Op(){zp()}function Hp(t){return Ap=t,"undefined"==typeof window?Rp:(Ip||(Ip=!0,window.addEventListener("hashchange",Op),window.addEventListener("popstate",Op)),zp())}const Np=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Lp=64;function Bp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function qp(t,e,i=Np){if(!(Bp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function jp(t,e=Np){if(!Bp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Wp(t=Np){return`matrix(${function(t=Np){if(!Bp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Up(t,e=Np){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[qp(t,-o,e),qp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Gp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Vp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Vp(i)>0===s?i:[...i].reverse()}function Yp(t,e,i){return t.length?`M ${t.map(t=>Gp(qp(t,i,e))).join(" L ")} Z`:""}function Xp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Jp(t,e,i=Np){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Kp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Vp(t))>=1e-9)).filter(t=>t.length&&Vp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Vp(e[0]))-Math.abs(Vp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function Zp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const Qp=t=>t.every(Number.isFinite);function t_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function e_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],t_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:t_(s,t.angle,a,l),quarterVector:t_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const i_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function s_(t,e,i=Np){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=qp(e.hinge,e.bottom,i),r=qp(n,e.bottom,i),a=qp(n,e.top,i),l=qp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${i_(o)} L ${i_(r)} L ${i_(a)} L ${i_(l)} Z`,shadowD:`M ${i_(qp(e.hinge,0,i))} L ${i_(qp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const n_={window:120,door:90,passage:90,gate:300};function o_(t){return n_[t]}function r_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function a_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=r_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function l_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function c_(t){const e=a_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=r_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(l_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(l_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function h_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const d_="1.65.0-beta.8",u_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},p_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},__=2e3,g_=1e3,m_=1500,f_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},v_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},y_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},b_=new Map;let w_=0;const k_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let x_=1e4;const $_="houseplan_card_layout_v1",S_="houseplan_card_cfg_v1",M_="houseplan_card_zoom_v1",C_="houseplan_card_nav_v1",D_="houseplan_card_kiosk_v1",T_="houseplan_card_view_v1",P_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",R_=1e3,A_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],I_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},F_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),E_=2e3,z_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},O_=t=>{history.pushState(null,"",t),z_(window,"location-changed",{replace:!1})},H_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},N_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class L_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=_n(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Nu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...ia},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new bp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Uu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new ap(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++w_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Fu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=An(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Mn(t);e&&(Tn(t,e),Pn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new rh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=H_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem($_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=H_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=f_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=f_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Bl(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Sl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=f_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>E_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||_a];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Lr(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:cs(this._settings,{bgColor:null})||null,northDeg:Yr(this._settings,{}),bgMode:Xr(this._settings,{}),sunRays:Jr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=rp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:gp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=zi(this._baseVb(),s/Math.max(1,n)),r=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:gp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new ih(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(T_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?jp(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?qp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Dp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,lp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=th(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=lp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=hp(t).catch(()=>!1).then(t=>(i.resolved=t,t)),lp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>Rs(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Ep.add(e);const i=Hp(t);return"undefined"==typeof window&&e(i),()=>{Ep.delete(e)}}(d_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of b_.values())for(const e of t)clearTimeout(e.evict);b_.clear(),x_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of b_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:b_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(T_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Hp(d_);try{const t=JSON.parse(localStorage.getItem(D_)||"null");this._kioskScale={icon:Es(t?.icon),font:Es(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(S_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||sh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||sh(this._layout),this._virtualLights=_n(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=k_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=b_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Jc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Jc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=b_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},x_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?qp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&F_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=k_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=b_.get(i)||[];for(s.push(this._warmSlot),b_.set(i,s),this._warmTrim(s);b_.size>8;){const t=b_.keys().next().value;if(void 0===t||t===i)break;for(const e of b_.get(t)||[])clearTimeout(e.evict);b_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>x_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=sh(this._serverCfg),this._layoutContentFingerprint=sh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(vn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(S_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:mn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Kl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return nh([this._cfgRev,this._cfgContentFingerprint||sh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||sh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Gu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Gu(t,t=>t.classList.contains("editor-secondary")),s=Gu(t,t=>!!t.dataset.editorGroup),n=Gu(t,t=>!!t.dataset.editorPalette),o=Gu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ku=t=>t.stopPropagation(),Yu=4.166666666666667e-9;function Xu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/tc)*tc;return Math.abs(e-t)<=Yu?t:e}const Ju=(t,e,i,s)=>Math.hypot(i-t,s-e),Zu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Qu=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Ju(t+c,e+h,n+d,o+u),Ju(t-c,e-h,n-d,o-u)),_=Math.max(Ju(t+c,e+h,n-d,o-u),Ju(t-c,e-h,n+d,o+u));return Math.min(p,_)},tp=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const ep=t=>JSON.parse(JSON.stringify(t)),ip=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),sp=(t,e,i)=>Math.min(i,Math.max(e,t)),np=t=>Yl({spaces:[t]})[0],op=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of hi(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=tl(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=op(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>op(t.a,t.b,a).localeCompare(op(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Fa(u,t.a,t.b,e,s,a))}return u}const ap=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&ip(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(ip(n,"segments")&&(delete n.segments,e++),ip(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Ul&&t<=Gl&&(ip(n,"plan_scale_x")||(n.plan_scale_x=t),ip(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);ip(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?sp(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)ip(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&ip(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(ip(t,"width")){const i=Number(t.width);(ip(t,"width_cm")||Number.isFinite(i))&&(ip(t,"width_cm")||(t.width_cm=Number(sp(i/Ql*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(ip(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),ip(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(sp(es*is(t)/Ql*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(ip(t,"scale")||ip(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(ip(t,"entity")||ip(t,"attr")||ip(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Xi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=np(t);if(!e)continue;if(!Oc(t.open_spans).length){const i=qc(e.rooms,null,jl,.02*Ql,!0);i.length&&(t.open_spans=jc(i,jl),a++)}}const l=ep(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=tp(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Yu||s))return;n++,t>r&&(r=t);const o=t*Zl*e;o>a&&(a=o,l=i)};for(const t of i){const e=tp(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Xu(e+n),a=Xu(i+o),l=Xu(e),c=Xu(i),h=Math.max(tc,r-l),d=Math.max(tc,a-c);t=Zu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Xu(s.a[0]),Xu(s.a[1])],r=[Xu(s.b[0]),Xu(s.b[1])];let a=Math.max(Ju(s.a[0],s.a[1],n[0],n[1]),Ju(s.b[0],s.b[1],r[0],r[1]));const l=Ju(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Yu&&s+e/2<=l+Yu});l>Yu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Xu(s.center[0]),Xu(s.center[1])],n=Ju(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Xu(s.x1),Xu(s.y1)],i=[Xu(s.x2),Xu(s.y2)];t=Math.max(Ju(s.x1,s.y1,e[0],e[1]),Ju(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Xu(s.x),i=Xu(s.y);if(null!=s.w&&null!=s.h){const n=Xu(s.x+s.w),o=Xu(s.y+s.h),r=Math.max(tc,n-e),a=Math.max(tc,o-i);t=Zu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Ju(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Yu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:tc,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Qu(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Xu(i.x),r=Xu(i.y),a=Ju(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=np(e),r=np(s);if(!o||!r)continue;const a=ap(o.rooms),c=ap(r.rooms),_=.02*Ql;let g=Jc(Oc(e.open_spans),a,c,jl);const m=g.length;g=Xc(g,r.rooms,jl,_),g=g.map(t=>{const e=Ec(t,jl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Hc(o,t).d<=4*_&&Hc(i,t).d<=4*_&&Hc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Lc(i,d,u,Ql,2*_),g=Lc(n,d,u,Ql,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Ql)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Ql){h.moved++;const t=m/jl;t>h.maxShift&&(h.maxShift=t);const e=m/Ql*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Fc(p,g,jl)}),g=Xc(g,r.rooms,jl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ec(t,jl));g.length?s.open_spans=g:delete s.open_spans,Wc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Ia(e.walls,a,c,tc,jl);y=rp(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=sl(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=Ra(y,s.rooms||[],tc,1,f.map(t=>[t[0]/jl,t[1]/jl,t[2]/jl,t[3]/jl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class cp{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const hp=new WeakMap;const dp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function up(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return dp(c,i,0)&&dp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&dp(c,s,8)&&dp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const pp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},_p=t=>Math.max(0,Math.min(1,t)),gp=(t,e,i)=>t+(e-t)*i,mp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function fp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function vp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function yp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function bp(t,e,i){const s=yp(t),n=yp(e);if(!s||!n)return i<.5?t:e;const o=_p(i);return`rgba(${Math.round(gp(s[0],n[0],o))}, ${Math.round(gp(s[1],n[1],o))}, ${Math.round(gp(s[2],n[2],o))}, ${gp(s[3],n[3],o).toFixed(3)})`}function wp(t,e,i){const s=(t=>{const e=_p(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,mp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=_p((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:wp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const xp="houseplan_card_labs_v1",$p=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function Sp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function Mp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Ap(t,e,i,s=$p){const n=function(t,e=$p){const i=Sp(t),s=new Map;if(!i||!Dp(e))return s;for(const t of e){const e=Sp(t.since),n=Sp(t.expires);Mp(i,e)>=0&&Mp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Dp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Rp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Rp(Tp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Pp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Ip={active:Object.freeze([]),space:""},Fp="",Ep=!1,zp="";const Op=new Set;function Hp(){if("undefined"==typeof window)return Ip;const t=Ap(window.location,function(){try{return window.localStorage.getItem(xp)}catch{return null}}(),Fp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(xp,t)}catch{}}(t.persist),Ip={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Op)t(Ip);return Ip}function Np(){Hp()}function Lp(t){return Fp=t,"undefined"==typeof window?Ip:(Ep||(Ep=!0,window.addEventListener("hashchange",Np),window.addEventListener("popstate",Np)),Hp())}const Bp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),qp=64;function jp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Wp(t,e,i=Bp){if(!(jp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Up(t,e=Bp){if(!jp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Gp(t=Bp){return`matrix(${function(t=Bp){if(!jp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Vp(t,e=Bp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[Wp(t,-o,e),Wp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Kp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Yp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Yp(i)>0===s?i:[...i].reverse()}function Jp(t,e,i){return t.length?`M ${t.map(t=>Kp(Wp(t,i,e))).join(" L ")} Z`:""}function Zp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Qp(t,e,i=Bp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Xp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Yp(t))>=1e-9)).filter(t=>t.length&&Yp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Yp(e[0]))-Math.abs(Yp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function t_(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const e_=t=>t.every(Number.isFinite);function i_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function s_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],i_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:i_(s,t.angle,a,l),quarterVector:i_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const n_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function o_(t,e,i=Bp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Wp(e.hinge,e.bottom,i),r=Wp(n,e.bottom,i),a=Wp(n,e.top,i),l=Wp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${n_(o)} L ${n_(r)} L ${n_(a)} L ${n_(l)} Z`,shadowD:`M ${n_(Wp(e.hinge,0,i))} L ${n_(Wp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const r_={window:120,door:90,passage:90,gate:300};function a_(t){return r_[t]}function l_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function c_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=l_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function h_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function d_(t){const e=c_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=l_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(h_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(h_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function u_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const p_="1.65.0-beta.8",__={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},g_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},m_=2e3,f_=1e3,v_=1500,y_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},b_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},w_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},k_=new Map;let x_=0;const $_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let S_=1e4;const M_="houseplan_card_layout_v1",C_="houseplan_card_cfg_v1",D_="houseplan_card_zoom_v1",T_="houseplan_card_nav_v1",P_="houseplan_card_kiosk_v1",R_="houseplan_card_view_v1",A_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",I_=1e3,F_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],E_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},z_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),O_=2e3,H_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},N_=t=>{history.pushState(null,"",t),H_(window,"location-changed",{replace:!1})},L_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},B_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class q_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Bu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...sa},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new kp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Vu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new cp(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++x_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+zu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new ah(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=L_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(M_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=L_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=y_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?Sl:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?Sl:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=y_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&ql(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Ml(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=y_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>O_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||ga];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Br(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Xr(this._settings,{}),bgMode:Jr(this._settings,{}),sunRays:Zr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=lp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:fp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),r=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:fp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new sh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(R_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Up(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Wp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Pp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,hp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=eh(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=hp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=up(t).catch(()=>!1).then(t=>(i.resolved=t,t)),hp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Op.add(e);const i=Lp(t);return"undefined"==typeof window&&e(i),()=>{Op.delete(e)}}(p_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of k_.values())for(const e of t)clearTimeout(e.evict);k_.clear(),S_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of k_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:k_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(D_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(R_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Lp(p_);try{const t=JSON.parse(localStorage.getItem(P_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(C_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||nh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||nh(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=$_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=k_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Zc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Zc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=k_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},S_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?Wp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&z_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=$_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=k_.get(i)||[];for(s.push(this._warmSlot),k_.set(i,s),this._warmTrim(s);k_.size>8;){const t=k_.keys().next().value;if(void 0===t||t===i)break;for(const e of k_.get(t)||[])clearTimeout(e.evict);k_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>S_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=nh(this._serverCfg),this._layoutContentFingerprint=nh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(C_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Yl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return oh([this._cfgRev,this._cfgContentFingerprint||nh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||nh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4754,8 +4840,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t(t?"continuity.restore_connection":"continuity.restore_plan")} ${"recovery-error"===this._continuity.state?j``:G} -
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Kl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?ah(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return ah(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=vo(o),d=mo(s,c).filter(t=>!yo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=Bn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Ln(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=qn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===fo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return ds(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=sh(n),r=o!==(this._cfgContentFingerprint||sh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=gn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);fn(e)!==fn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=sh(t);a=s!==(this._layoutContentFingerprint||sh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=sh(n)!==(this._cfgContentFingerprint||sh(this._serverCfg))||sh(s?.layout??{})!==(this._layoutContentFingerprint||sh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem($_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=bn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(sh(e)!==(this._cfgContentFingerprint||sh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=Rn(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return An(this.hass)}get _planHass(){const t=this._haRegistry,e=Fn(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=zn(this.hass,t),n=On(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+Fu)>t?1:0)).join("|"),i=fn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of gi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Ki(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,Qi(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!yo(s,t,vo(this._markers))))}const h=ao(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(vu(t.id,e),_u(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?bh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=fu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Ln(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=An(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&O_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else O_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,Rs(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=sh(i);s!==(this._layoutContentFingerprint||sh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=Fn(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+nr(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=ko({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Ln(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Nn(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Sn=s;try{localStorage.setItem($n,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(z_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=ho(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return Ei(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*gc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Oi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ec(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*R_,y:i.y*R_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ec(_c(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:sc(n/R_),y:sc(o/R_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return cu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(vu(t.id,e));return s||_u(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,pu({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=po(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:uo(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Ls(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&_o(this.hass,t.primary)?go(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,z_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Yh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!ed(t))return;const e=t=>{const e=ed(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=bn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&id(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return or(nr(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=nr(this.hass,this._config?.language);return rr(i,t)&&rr(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=rc([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=rc("line"===t.kind?[[t.x1*R_,t.y1*i],[t.x2*R_,t.y2*i]]:"text"===t.kind?[[t.x*R_,t.y*i]]:ha({x:t.x*R_,y:t.y*i,w:t.w*R_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=rc(i);t&&e.push(t)}}return lc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:R_,h:R_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=uc(this._contentItems(t));let n=s.all||pc(t),o=this._showFar?n:s.core||pc(t);return e&&e.id===t.id&&i&&e.grow&&(o=I_(e.rect,o),n=I_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=Zp(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=Zp(e,-1)}else e=Zp(e,t?1:0);else for(const i of t)e=Zp(e,i.codePointAt(0)||0);else e=Zp(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Np,wallHeight:Lp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?ul(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=hl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||ml(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?hd(i.partitionHost,s):e.length||"gate"===t.type?bl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(Qp([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[e_(t,0,[-i,0],[i,0],o,0,.88*e),e_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[e_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),e_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[e_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return Qp([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Up({rect:n?I_(i,n):i,wallHeight:Lp,openingHeight:Lp,floorDepth:10}),r=function(t,e=Np,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Kp(l[t],t>0);if(!(c.length<3||Math.abs(Vp(c))<1e-9)){s.push(Yp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Jp(s.floor,10),openings:s.openings,frame:o};return y_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?qp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=jp([t.x,t.y]),i=jp([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Up({rect:this._frameOf().rect,wallHeight:Lp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
+
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Yl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?lh(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return lh(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=yo(o),d=fo(s,c).filter(t=>!bo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=qn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Bn(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=jn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===vo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return us(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=nh(n),r=o!==(this._cfgContentFingerprint||nh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=mn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);vn(e)!==vn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=nh(t);a=s!==(this._layoutContentFingerprint||nh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=nh(n)!==(this._cfgContentFingerprint||nh(this._serverCfg))||nh(s?.layout??{})!==(this._layoutContentFingerprint||nh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=wn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(nh(e)!==(this._cfgContentFingerprint||nh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=An(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return In(this.hass)}get _planHass(){const t=this._haRegistry,e=En(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=On(this.hass,t),n=Hn(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+zu)>t?1:0)).join("|"),i=vn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of mi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Yi(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,ts(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!bo(s,t,yo(this._markers))))}const h=lo(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(yu(t.id,e),gu(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?wh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=vu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Bn(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=In(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&N_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else N_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,As(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=nh(i);s!==(this._layoutContentFingerprint||nh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=En(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+or(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=xo({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Bn(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Ln(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Mn=s;try{localStorage.setItem(Sn,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(H_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=uo(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return zi(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*mc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Hi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ic(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*I_,y:i.y*I_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ic(gc(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:nc(n/I_),y:nc(o/I_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return hu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(yu(t.id,e));return s||gu(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,_u({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=_o(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:po(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Bs(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&go(this.hass,t.primary)?mo(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,H_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Xh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!id(t))return;const e=t=>{const e=id(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=wn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&sd(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return rr(or(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=or(this.hass,this._config?.language);return ar(i,t)&&ar(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=ac([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=ac("line"===t.kind?[[t.x1*I_,t.y1*i],[t.x2*I_,t.y2*i]]:"text"===t.kind?[[t.x*I_,t.y*i]]:da({x:t.x*I_,y:t.y*i,w:t.w*I_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=ac(i);t&&e.push(t)}}return cc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:I_,h:I_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=pc(this._contentItems(t));let n=s.all||_c(t),o=this._showFar?n:s.core||_c(t);return e&&e.id===t.id&&i&&e.grow&&(o=E_(e.rect,o),n=E_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=t_(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=t_(e,-1)}else e=t_(e,t?1:0);else for(const i of t)e=t_(e,i.codePointAt(0)||0);else e=t_(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Bp,wallHeight:qp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?pl(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=dl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||fl(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?dd(i.partitionHost,s):e.length||"gate"===t.type?wl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(e_([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[s_(t,0,[-i,0],[i,0],o,0,.88*e),s_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[s_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),s_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[s_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return e_([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Vp({rect:n?E_(i,n):i,wallHeight:qp,openingHeight:qp,floorDepth:10}),r=function(t,e=Bp,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Xp(l[t],t>0);if(!(c.length<3||Math.abs(Yp(c))<1e-9)){s.push(Jp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Qp(s.floor,10),openings:s.openings,frame:o};return w_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?Wp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=Up([t.x,t.y]),i=Up([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Vp({rect:this._frameOf().rect,wallHeight:qp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
${this._t("canvas.far_objects",{n:this._outliers})} @@ -4763,7 +4849,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 style="left:${a.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:zi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=zi(s,this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Jc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=zi(this._baseVb(),this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=zi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(M_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=zi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&O_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},N_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ic(this._drag.ox+r),c=ic(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(P_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(P_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(P_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Zl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return ai(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,R_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return di(t?.rooms||[]).map(t=>[t[0]*R_,t[1]*e,t[2]*R_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(C_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(C_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?qp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=fa(_a,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?fa(_a,this._imperial):this._drawWallField}get _drawWallCm(){const t=f_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:fa(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Sd(this._path,this._draftSegmentCms,_a),i=e.length;if((t.partitions||[]).length+i>E_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=E_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ic(ri(t[0],e)),ic(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Xl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=yl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(pd(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>pd(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(wd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!kd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Hs([e[0],e[1]],t);if(r>i.tolerance)continue;const l=xd(o,e,i.gridStep);!wd(l,n,s)&&kd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return mi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Yl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Sl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Ml(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=zc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Pa(t.walls,t.rooms||[],Ql,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&bi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&Ci(t,i)})}_pointInRoom(t,e){return e.poly?fi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!yr(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>E_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Ti(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/R_,t[1]/R_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:$d,s=Gd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Pd(t.a,i),s=Pd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Pd(t.a,i),Pd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Rd(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Dd(g);if(!(m>i*i))continue;const f=Ad(Id(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=ci(t);if(!t.id||!e)continue;const i=Ii(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Ti(s)>=Ti(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Ti(a))-Math.abs(e.area-Ti(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Sl(i),angle:0},o=(s.wall_columns||[]).find(t=>Bl(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/R_,e[1]/R_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Ml(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:fa(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),N_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Nl(n,Pl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Nl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Yl*R_-Math.min(...n),Math.min(Yl*R_-Math.max(...n),i[0])),Math.max(-Yl*R_-Math.min(...o),Math.min(Yl*R_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/R_,n.a[1]/R_],t.b=[n.b[0]/R_,n.b[1]/R_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=rd(t,[n],R_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,ud(t,i,R_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/R_,(n.center[1]+e.delta[1])/R_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),N_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Ml(e.angle),angle:Ml(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Ml(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?ci(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/R_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/R_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*R_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:_r(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),N_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Sr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=kr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Cr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Cr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Mr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=vr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Pa(n.walls,n.rooms||[],Ql,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&ol(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||n,r=xi(o),a=u.length?Ol(zl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Tr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&ol([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||t,l=xi(a),c=this._physicalBodiesR(),h=c.length?Ol(zl(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Tr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Zc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(D_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&N_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},B_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=sc(this._drag.ox+r),c=sc(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(A_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(A_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(A_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Ql}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,I_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*I_,t[1]*e,t[2]*I_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(T_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(T_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Wp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=va(ga,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?va(ga,this._imperial):this._drawWallField}get _drawWallCm(){const t=y_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?Sl:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?Sl:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:va(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Md(this._path,this._draftSegmentCms,ga),i=e.length;if((t.partitions||[]).length+i>O_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=O_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[sc(ai(t[0],e)),sc(ai(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Jl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=bl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(_d(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>_d(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(kd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!xd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Ns([e[0],e[1]],t);if(r>i.tolerance)continue;const l=$d(o,e,i.gridStep);!kd(l,n,s)&&xd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Xl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Ml(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Cl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Oc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Ra(t.walls,t.rooms||[],tc,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!br(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>O_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/I_,t[1]/I_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:Sd,s=Vd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Rd(t.a,i),s=Rd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Rd(t.a,i),Rd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Ad(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Td(g);if(!(m>i*i))continue;const f=Id(Fd(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Fi(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Pi(a))-Math.abs(e.area-Pi(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange(Sl);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Ml(i),angle:0},o=(s.wall_columns||[]).find(t=>ql(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/I_,e[1]/I_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Cl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:va(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),B_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Ll(n,Rl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Ll(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Xl*I_-Math.min(...n),Math.min(Xl*I_-Math.max(...n),i[0])),Math.max(-Xl*I_-Math.min(...o),Math.min(Xl*I_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/I_,n.a[1]/I_],t.b=[n.b[0]/I_,n.b[1]/I_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ad(t,[n],I_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,pd(t,i,I_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/I_,(n.center[1]+e.delta[1])/I_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),B_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Cl(e.angle),angle:Cl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Cl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/I_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/I_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*I_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:gr(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),B_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Mr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=xr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Dr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Dr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Cr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=yr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Ra(n.walls,n.rooms||[],tc,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&rl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||n,r=$i(o),a=u.length?Hl(Ol(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Pr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&rl([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||t,l=$i(a),c=this._physicalBodiesR(),h=c.length?Hl(Ol(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Pr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4773,7 +4859,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @pointercancel=${t=>this._rszPointerCancel(t)} - @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*R_,ry:t.y*e,rlen:t.length*R_};if(!t.host)return[s];const n=rd(t,i.partitions,R_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=rd(n,t.partitions,R_,this._cellCm,this._gridPitch);i.resolved&&s.push(cd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=tl(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&dd(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?hd(t.partitionHost,i):bl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return R_}_decorResolvedStyle(t){return function(t,e,i,s=ia){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:sa(o?.opacity,s.opacity),widthCm:la(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?sa(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,ia)}_decorWidthUnits(t){return((t,e,i,s=ia.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return ra(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:ra(s,e,i)})(t,this._cellCm,this._gridPitch,ia.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:aa(ts*es(t),this._cellCm,this._gridPitch)}return aa(ts,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return ts;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?ra(e,this._cellCm,this._gridPitch):ts*es(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(__,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Yl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH,angle:na(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*R_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(da(t))}for(const t of e.rooms){const e=ci(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},N_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:sc(e[0]/R_),y:sc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:aa(ts,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-na(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=R_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=sc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ca(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ca(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},N_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*R_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/R_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Yl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(na(i?zs([i.x1*R_,i.y1*this._decorH],[i.x2*R_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:aa(Math.hypot((i.x2-i.x1)*R_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:aa(s.w,this._cellCm,this._gridPitch),sizeHCm:aa(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Yi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:sa(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Yi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:sa(t.opacity),size_cm:Number(Math.max(.1,Math.min(__,t.sizeCm)).toFixed(4)),...na(t.angle)?{angle:na(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:sa(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:sa(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ca(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*R_,s=(e.y1+e.y2)/2*this._decorH,o=ra(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=na(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:sc(c[0]/R_),y1:sc(c[1]/this._decorH),x2:sc(h[0]/R_),y2:sc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*R_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ri(ra(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ri(ra(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*R_+i/2,l=e.y*this._decorH+s/2,c=na(t.angle),h=oa({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:sc(h[0]/R_),y:sc(h[1]/this._decorH),w:o/R_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*R_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*R_,(t.y+t.h/2)*this._decorH]:[t.x*R_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(__,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},N_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=sc(s[0]/R_),o=sc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=ua(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(__,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*R_,s=t.y1*this._decorH,n=t.x2*R_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=xc(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=R_,o=this._decorH,r=Dc(Sc(i.w,this._cellCm,this._gridPitch,n)),a=Dc(Sc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ac(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:sc(h/n-r/2),y:sc(d/o-a/2),w:r,h:a,...ca(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=R_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ac(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=sc(c),h=sc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=R_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=oa(e,i.angle,t=>this._snap(t));return{...i,x:sc(o[0]/s),y:sc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Yl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Yl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=R_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}> + @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*I_,ry:t.y*e,rlen:t.length*I_};if(!t.host)return[s];const n=ad(t,i.partitions,I_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=ad(n,t.partitions,I_,this._cellCm,this._gridPitch);i.resolved&&s.push(hd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=el(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&ud(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?dd(t.partitionHost,i):wl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return I_}_decorResolvedStyle(t){return function(t,e,i,s=sa){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:na(o?.opacity,s.opacity),widthCm:ca(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?na(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,sa)}_decorWidthUnits(t){return((t,e,i,s=sa.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return aa(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:aa(s,e,i)})(t,this._cellCm,this._gridPitch,sa.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:la(es*is(t),this._cellCm,this._gridPitch)}return la(es,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return es;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?aa(e,this._cellCm,this._gridPitch):es*is(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(m_,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Xl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH,angle:oa(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*I_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(ua(t))}for(const t of e.rooms){const e=hi(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},B_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:nc(e[0]/I_),y:nc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:la(es,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-oa(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=I_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=nc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ha(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ha(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},B_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*I_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/I_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Xl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(oa(i?Os([i.x1*I_,i.y1*this._decorH],[i.x2*I_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:la(Math.hypot((i.x2-i.x1)*I_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:la(s.w,this._cellCm,this._gridPitch),sizeHCm:la(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Xi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:na(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Xi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:na(t.opacity),size_cm:Number(Math.max(.1,Math.min(m_,t.sizeCm)).toFixed(4)),...oa(t.angle)?{angle:oa(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:na(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:na(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ha(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*I_,s=(e.y1+e.y2)/2*this._decorH,o=aa(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=oa(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:nc(c[0]/I_),y1:nc(c[1]/this._decorH),x2:nc(h[0]/I_),y2:nc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*I_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ai(aa(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ai(aa(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*I_+i/2,l=e.y*this._decorH+s/2,c=oa(t.angle),h=ra({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:nc(h[0]/I_),y:nc(h[1]/this._decorH),w:o/I_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*I_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*I_,(t.y+t.h/2)*this._decorH]:[t.x*I_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(m_,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},B_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=nc(s[0]/I_),o=nc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=pa(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(m_,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*I_,s=t.y1*this._decorH,n=t.x2*I_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=$c(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=I_,o=this._decorH,r=Tc(Mc(i.w,this._cellCm,this._gridPitch,n)),a=Tc(Mc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ic(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:nc(h/n-r/2),y:nc(d/o-a/2),w:r,h:a,...ha(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=I_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ic(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=nc(c),h=nc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=I_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=ra(e,i.angle,t=>this._snap(t));return{...i,x:nc(o[0]/s),y:nc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Xl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Xl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=I_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}>
${this._t("furn.title")} @@ -4783,16 +4869,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- ${bc.map(e=>j` + ${wc.map(e=>j`
${this._t(`furn.group_${e}`)}
- ${$c(e).map(e=>j``)}
`)} @@ -4808,7 +4894,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._furnPalette={...t,h:this._furnFieldToCm(Number(e.target.value))}} /> ${this._t("furn.place_hint")}
`:j`
${this._t("furn.pick_hint")}
`} -
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...jl(t.plan_aspect,R_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Gl(t,R_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:na(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:aa(e.w,this._cellCm,this._gridPitch),heightCm:aa(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=na(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Ul,Math.max(e.w*Wl,ri(ra(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Ul,Math.max(e.h*Wl,ri(ra(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=oa({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/R_,(a[1]-e.y)/R_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(sc(t).toFixed(6)),o.plan_y=Number(sc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Ul,Math.max(Wl,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Ul,Math.max(Wl,s)).toFixed(6));const r=na(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},N_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/R_,(o[1]-s.y)/R_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=na(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=ua(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Wl),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=oa(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/R_,(l[1]-s.y)/R_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=na(e.angle),a=2.2*i;return W` +
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...Wl(t.plan_aspect,I_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Vl(t,I_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:oa(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:la(e.w,this._cellCm,this._gridPitch),heightCm:la(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=oa(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Gl,Math.max(e.w*Ul,ai(aa(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Gl,Math.max(e.h*Ul,ai(aa(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=ra({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/I_,(a[1]-e.y)/I_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(nc(t).toFixed(6)),o.plan_y=Number(nc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Gl,Math.max(Ul,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Gl,Math.max(Ul,s)).toFixed(6));const r=oa(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},B_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/I_,(o[1]-s.y)/I_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=oa(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=pa(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Ul),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=ra(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/I_,(l[1]-s.y)/I_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=oa(e.angle),a=2.2*i;return W` {e.stopPropagation(),e.preventDefault(),this._bdStart(e,[t,n])}}>`})} - `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];return W` + `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];return W` ${[t,i].map((t,e)=>W`this._dtStart(t,"scale",void 0,e)}> @@ -4833,7 +4919,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 cx="${t<0?i.x:i.x+i.w}" cy="${e<0?i.y:i.y+i.h}" r="${s.toFixed(1)}" @pointerdown=${i=>this._dtStart(i,"scale",[t,e])}>`)} - `}_renderDecorLayer(){const t=R_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``}_renderDecorLayer(){const t=I_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Pc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Rc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W` ${s?W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:Qi(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:ts(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=ra(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=aa(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W``;else{const i=Math.min(r.a[0],r.b[0]),s=Math.min(r.a[1],r.b[1]),n=Math.abs(r.b[0]-r.a[0]),a=Math.abs(r.b[1]-r.a[1]);o="rect"===r.kind?W``:W``}}return W`${n}${o}`}get _editorToolbarGroups(){return"plan"!==this._mode?[]:[{id:"opening",label:this._t("markup.opening"),icon:"mdi:door",activeItemId:"opening"===this._tool?this._openingPreset?.type:void 0,items:[{id:"window",label:this._t("opening.window"),icon:"mdi:window-closed-variant",role:"tool",invoke:()=>this._activateOpeningPlacement("window")},{id:"door",label:this._t("opening.door"),icon:"mdi:door-open",role:"tool",invoke:()=>this._activateOpeningPlacement("door")},{id:"passage",label:this._t("opening.passage"),icon:"mdi:arch",role:"tool",invoke:()=>this._activateOpeningPlacement("passage")},{id:"gate",label:this._t("opening.gate"),icon:"mdi:gate",role:"tool",invoke:()=>this._activateOpeningPlacement("gate")}]}]}_renderEditorGroupLauncher(t){return this._editorSecondary.renderGroupLauncher(t,this._editorToolbarGroups,this._editorSecondaryCopy)}get _editorSecondaryContextId(){const t=`editor:${this._mode}:${this._space}:${this._cfgEpoch}`,e=this._editorSecondary.activeGroup(this._editorToolbarGroups);if(e)return`${t}:group:${e.id}:${this._editorSecondary.groupGeneration}`;if("plan"===this._mode){const e=this._physicalSel;return e?`${t}:selection:${e.kind}:${e.id}:${e.segment??""}`:`${t}:tool:${this._tool}:${this._path.length}:${this._openWallAnchor?1:0}`}return"decor"===this._mode?"furniture"===this._decorTool?`${t}:palette:furniture:${this._furnPalette?.symbol||"none"}`:"select"===this._decorTool&&this._decorSel?`${t}:selection:decor:${this._decorSel}`:`${t}:tool:${this._decorTool}:${this._bdMoved?1:0}:${this._bdDrag?1:0}`:`${t}:none`}_runEditorContext(t,e){this._editorSecondary.runContext(t,this._editorSecondaryContextId,e)}_renderEditorGroupModel(t){return this._editorSecondary.renderGroupModel(t,this._editorSecondaryContextId,this._editorSecondaryCopy)}_renderDrawWallControl(){return j``}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j`
@@ -5013,8 +5099,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``}_setFillColor(t,e){const i=this._settingsDialog;this._settingsDialog={...i,colors:{...i.colors,[t]:{...i.colors[t],...e}}}}async _saveSettingsDialog(){const t=this._settingsDialog;if(t&&!t.busy){this._settingsDialog={...t,busy:!0};try{const e=this._serverCfg,i=JSON.stringify(t.colors)===JSON.stringify(ds),s={...e.settings};i?delete s.fill_colors:s.fill_colors=t.colors;const n=this._imperial?30.48*t.glowRadius:100*t.glowRadius;Number.isFinite(n)&&n>0&&300!==Math.round(n)?s.glow_radius_cm=Math.round(n):delete s.glow_radius_cm,t.bgColor?s.bg_color=t.bgColor:delete s.bg_color,null!==t.northDeg&&Number.isInteger(t.northDeg)&&t.northDeg>=0&&t.northDeg<=359?s.north_deg=t.northDeg:delete s.north_deg,s.bg_mode=t.bgMode,t.sunRays?s.sun_rays=!0:delete s.sun_rays,delete s.weather_entity,this._serverCfg={...e,settings:s},await this._saveConfigNow(),this._settingsDialog=null,this.requestUpdate(),this._showToast(this._t("gs.saved"))}catch(t){this._settingsDialog&&(this._settingsDialog={...this._settingsDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}}_boolInput(t,e,i=!1){const s=t=>e(!!t.target.checked);return customElements.get("ha-switch")?j``:j``}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``:j``}_renderColorRow(t,e){const i=this._settingsDialog.colors[t];return j`
{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?ul(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Yd(t));else for(const t of h)f.push(...Yd(t));for(const{poly:t}of e)for(const e of s.length?Ds(t,s,m):Yd(t))f.push(e);const y={occluders:Kd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:ci(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Fs(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=ao(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=lo(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=xs(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Ll([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:$s(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=v_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Zd([f.x,f.y],m,r,96);b={lit:t.length>=3?El([t],a):[]},y_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&ol(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||i,o=this._cleanFloor(e,s,t).path,r=Di(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` +
`}get _glowRadiusCm(){const t=Number(this._settings.glow_radius_cm);return Number.isFinite(t)&&t>0?t:300}get _imperial(){return"mi"===this.hass?.config?.unit_system?.length}get _glowRadiusPlaceholder(){const t=this._glowRadiusCm;return this._imperial?String(Math.round(t/30.48*10)/10):String(t/100)}_glowTransition(t,e){let i=this._glowRenderedSources.get(t);if(e){const e=this._glowFadeTimers.get(t);if(null!=e&&(clearTimeout(e),this._glowFadeTimers.delete(t)),null==i){this._suspendGlowFeatherForTransition(),i=++this._glowSourceSeq,this._glowRenderedSources.set(t,i),this._glowEnteringSources.add(t);const e=requestAnimationFrame(()=>{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?pl(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Xd(t));else for(const t of h)f.push(...Xd(t));for(const{poly:t}of e)for(const e of s.length?Ts(t,s,m):Xd(t))f.push(e);const y={occluders:Yd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:hi(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Es(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=lo(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=co(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=$s(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Bl([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:Ss(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=b_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Qd([f.x,f.y],m,r,96);b={lit:t.length>=3?zl([t],a):[]},w_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&rl(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||i,o=this._cleanFloor(e,s,t).path,r=Ti(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` ${Mt(p,t=>t.key,t=>{const e=t.domId,i=t.geometry;return W` ${""} - ${A_.map(([e,i])=>W` + ${F_.map(([e,i])=>W` `)} @@ -5435,7 +5521,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("gs.glow_radius")} {const e=f_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> + @input=${t=>{const e=y_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> ${this._imperial?this._t("gs.unit_ft"):this._t("gs.unit_m")}
@@ -5458,7 +5544,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._settingsDialog.bgColor?j``:j`${this._t("gs.bg_theme")}`}
`:j`
${this._t("gs.bg_daynight_hint")}
`} - ${Zr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`} + ${Qr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`}
${this._renderCompass()}
@@ -5510,14 +5596,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
`:G} -
${this._t("gs.about_version",{v:d_})}
+
${this._t("gs.about_version",{v:p_})}
${this._t("gs.about_github")} ${this._t("gs.about_telegram")}
- @@ -5567,7 +5653,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.busy?"…":this._t("btn.save")}
- `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(D_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j` + `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(P_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j`
${this._rangeInput(50,300,5,Math.round(100*t[e]),t=>this._saveKioskScale({[e]:t/100}))} ${Math.round(100*t[e])}% @@ -5624,13 +5710,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._spaceDialog?this._renderSpaceDialog():G} ${this._importDialog?this._renderImportDialog():G} ${this._toast?j``:G} - `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Ap||Hp(t);const e=Rp,i=e.active.join(",");if(!i||i===Fp)return;Fp=i;const s=new Map(kp.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(d_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=this._viewOr(this._baseVb()),b=this._floorView(y),w=this._editing?"":this._stageBg(d),k=this._opMeasureView,x=this._decorMeasure,$=this._bdLive,S=this._furnLive,M="view"===this._mode?this._editorChromeMode:this._mode,C=this._roomHoverPaths(s),D=s.bg?this._display(s.bg.href):"",T=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,P=this._modeTransitionVisual,R=this._dayCycleState(),A=P?.viewWeight??("view"===this._mode?1:0),I=this._modeTransition.state?.from.presentedMode,F=!this._markup||!!P&&("view"===P.presentedMode||"devices"===P.presentedMode||"view"===I||"devices"===I),E=P?.stageColor||w,z=P?.sceneBrightness??1;return j` + `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Fp||Lp(t);const e=Ip,i=e.active.join(",");if(!i||i===zp)return;zp=i;const s=new Map($p.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(p_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=bu(v),b=this._viewOr(this._baseVb()),w=this._floorView(b),k=this._editing?"":this._stageBg(d),x=this._opMeasureView,$=this._decorMeasure,S=this._bdLive,M=this._furnLive,C="view"===this._mode?this._editorChromeMode:this._mode,D=this._roomHoverPaths(s),T=s.bg?this._display(s.bg.href):"",P=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,R=this._modeTransitionVisual,A=this._dayCycleState(),I=R?.viewWeight??("view"===this._mode?1:0),F=this._modeTransition.state?.from.presentedMode,E=!this._markup||!!R&&("view"===R.presentedMode||"devices"===R.presentedMode||"view"===F||"devices"===F),z=R?.stageColor||k,O=R?.sceneBrightness??1;return j`
- ${"plan"===M?this._renderMarkupBar():"devices"===M?this._renderDevicesBar():this._renderDecorBar()} + style=${R?`opacity:${R.toolbarContentOpacity}`:G}> + ${"plan"===C?this._renderMarkupBar():"devices"===C?this._renderDevicesBar():this._renderDecorBar()}
`:G}
-
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -5715,35 +5801,35 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerleave=${t=>this._stagePointerLeave(t)} @pointerup=${t=>this._stagePointerUp(t)} @pointercancel=${t=>this._stagePointerCancel(t)}> - ${ea(R,A)} + ${ia(A,I)} ${this._renderEditorSecondary()}
+ style="${1!==O?`filter:brightness(${O.toFixed(3)})`:""}"> ${a&&u?.structural?W``:G} + transform=${u?.structural?Gp():G}> ${""} ${this._wallHatchDefs(d.color)}${W`${this._paperShapes(s.rooms).map(t=>"path"in t?W``:"poly"in t?W``:W``)}`} ${this._editing?this._renderMarkupDefs(o):G} ${""} - ${this._editing&&!this._markup&&this._gridLevels()?W``:G} - ${s.bg&&D?W`this._onBackdropLoaded(s.bg.href,D)} + ${this._editing&&!this._markup&&this._gridLevels()?W``:G} + ${s.bg&&T?W`this._onBackdropLoaded(s.bg.href,T)} transform=${s.bg.angle?`rotate(${s.bg.angle} ${s.bg.x+s.bg.w/2} ${s.bg.y+s.bg.h/2})`:G} @dblclick=${t=>this._openBackdropDialog(t)} preserveAspectRatio="none" />`:G} ${""} ${d.hideDecor&&"decor"!==this._mode?G:this._renderDecorLayer()} - ${(()=>{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,ci(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Is(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&ol(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||g,y=v?Di(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,hi(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Fs(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&rl(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||g,y=v?Ti(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @@ -5766,74 +5852,74 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 x="${e.x}" y="${e.y}" width="${e.w}" height="${e.h}" rx="${.03*Math.min(e.w,e.h)}" @pointerenter=${t=>{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @pointermove=${l} - @pointerleave=${()=>this._clearTransientHover()}>`,M=p.length&&g?Ds(g,p,.02*this._gridPitch):null,C=M?W`this._clearTransientHover()}>`,M=p.length&&g?Ts(g,p,.02*this._gridPitch):null,C=M?W``:G;return W`${S}${C}`})})()} - ${this._renderRoomHoverFill(C)} + ${this._renderRoomHoverFill(D)} ${this._renderOpeningTunnelFills(s,_)} ${this._renderGlowBaseRooms(s,g)} ${this._renderOpeningTunnelFills(s,g,"glow-base")} - ${F?this._renderGlowLayer(s,d):G} + ${E?this._renderGlowLayer(s,d):G} ${this._renderSunRays(s)} ${this._editing?W`${this._renderAlignGuides()}`:G} + opacity="${R?.editorWeight??1}">${this._renderAlignGuides()}`:G} ${this._markup?W`${this._renderMarkupLayer(o)}`:G} + opacity="${R?.editorWeight??1}">${this._renderMarkupLayer(o)}`:G} ${""} ${""} ${this._editing?G:this._renderOpenWalls(d)} ${this._renderWallBodies(d)} ${this._markup?W`${this._renderPlanSnapOverlay()}`:G} + opacity="${R?.editorWeight??1}">${this._renderPlanSnapOverlay()}`:G} ${this._markup?W`${this._renderOpeningPlacementPreview()}`:G} - ${k?.guide?this._renderOpeningCenterTick(k.guide):G} - ${this._renderRoomHoverOutline(C)} + opacity="${R?.editorWeight??1}">${this._renderOpeningPlacementPreview()}`:G} + ${x?.guide?this._renderOpeningCenterTick(x.guide):G} + ${this._renderRoomHoverOutline(D)} ${""} ${this._editing?this._renderOpenWalls(d):G} ${d.hideOpenings&&!this._markup||u&&!u.floorSymbols?G:this._renderOpenings(d)} ${this._renderWallThickUi()} - ${this._markup&&"resize"===this._tool?this._renderResizeLayer(y):G} + ${this._markup&&"resize"===this._tool?this._renderResizeLayer(b):G} ${""} - ${this._renderBackdropFrame(y)} - ${this._renderTextFrame(y)} + ${this._renderBackdropFrame(b)} + ${this._renderTextFrame(b)} ${a&&u?.structural?W` - `:G} ${""} -
- ${c.map(t=>this._renderDevice(t,y,m))} - ${this._renderVacuums(c,y)} - ${this._renderVacFit(y)} - ${this._renderOpeningLocks(y)} - ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,y,d)):G} - ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,y)):G} +
+ ${c.map(t=>this._renderDevice(t,b,m))} + ${this._renderVacuums(c,b)} + ${this._renderVacFit(b)} + ${this._renderOpeningLocks(b)} + ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,b,d)):G} + ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,b)):G}
- ${this._measureAnchor?j`
${this._renderMeasureLabel(y)}
`:G} + ${this._measureAnchor?j`
${this._renderMeasureLabel(b)}
`:G} ${this._rszLive?j`
${this._rszLive.map(t=>j`
${t.text}
`)}
`:G} - ${k?j`
${k.labels.map(t=>j`
${t.text}
`)}
`:G} + ${x?j`
${x.labels.map(t=>j`
${t.text}
`)}
`:G} + style="left:${((t.x-b.x)/b.w*100).toFixed(2)}%;top:${((t.y-b.y)/b.h*100).toFixed(2)}%">${t.text}
`)}
`:G} ${this._wallDialog?j`
${this._renderWallThickDialog()}
`:G} - ${x?j`
${x.text}
`:G} - ${S?j`
${S.map(t=>j`
${t.text}
`)}
`:G} ${$?j`
${$.text}
`:G} + ${M?j`
${M.map(t=>j`
${t.text}
`)}
`:G} + ${S?j`
${$.text}
`:G} + style="left:${((S.x-b.x)/b.w*100).toFixed(2)}%;top:${((S.y-b.y)/b.h*100).toFixed(2)}%">${S.text}
`:G}
${this._zoom>1?j`
${Math.round(100*this._zoom)}%
`:G} ${this._renderFarHint()} @@ -5883,7 +5969,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${null!=this._tip.temp?j`${this._t("tip.temp_avg")} ${this._tip.temp}°`:G} ${null!=this._tip.hum?j`${this._t("tip.hum_avg")} ${this._tip.hum}%`:G} ${null!=this._tip.lqi?j`${this._t("tip.lqi")} - ${this._tip.lqi}`:G} + ${this._tip.lqi}`:G}
`:G} ${this._kiosk&&!this._hasFixedFloor&&this._kioskDots&&this._model.length>1?j`
${this._model.map(t=>j``)} @@ -5914,7 +6000,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G} ${this._toast?j``:G} - `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=wh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=wh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=ao(this._planHass,this._devices,null,this._virtualLights)){const i=cu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:uu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Eu(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Ou(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=ao(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Li(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&zu(a,r,o,window.clearTimeout.bind(window)):(a=Eu(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Li(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Hu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Li(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Sh(this.hass.states[i||""]?.state),n=bh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Ph(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?bh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(kh).filter(Boolean)),s=new Set;for(const e of t){const t=kh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j` + `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=kh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=kh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=lo(this._planHass,this._devices,null,this._virtualLights)){const i=hu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:pu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Ou(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Nu(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=lo(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Bi(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&Hu(a,r,o,window.clearTimeout.bind(window)):(a=Ou(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Bi(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Lu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Bi(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Mh(this.hass.states[i||""]?.state),n=wh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Rh(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?wh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(xh).filter(Boolean)),s=new Set;for(const e of t){const t=xh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j`
@@ -5974,28 +6060,28 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${u.length?j`
${is(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} + ${u.length?j`
${ss(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} `:G} - `}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:ci(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=gh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=xh(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:ai(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Dh(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Dh(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Ch(c),[d,u]=dh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Ch(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=bh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Th(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=bh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Ch(s.p0),[a,l]=dh(r,e[0],e[1]),[c,h]=dh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Th(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=bh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Ch(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>dh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=dh(s,t.cx,t.cy);n.push(W` - ${t.name}`)}let a=G;if(i.pos){const[e,n]=dh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W``}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:hi(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=mh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=$h(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:li(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Th(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Th(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Dh(c),[d,u]=uh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Dh(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=wh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Ph(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=wh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Dh(s.p0),[a,l]=uh(r,e[0],e[1]),[c,h]=uh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Ph(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=wh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Dh(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>uh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=uh(s,t.cx,t.cy);n.push(W` + ${t.name}`)}let a=G;if(i.pos){const[e,n]=uh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W` `)}}return j`this._vacFitPointer(e,t)} @pointermove=${e=>this._vacFitPointer(e,t)} @pointerup=${e=>this._vacFitPointer(e,t)} - @pointercancel=${e=>this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Li(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??bh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Ph(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=dh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=vh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:yh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=dh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=dh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=dh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Bi(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??wh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Rh(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=uh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=yh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:bh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=uh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=uh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=uh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
{t.stopPropagation();const e=this._vacEntity(i);e&&this._openMoreInfo(e)}}>
`)}return this._vacLastView=e,n.length&&!this._vacRaf&&this._vacRafLoop(),n.length||o.length?j` ${o.length?W`${o}`:G} - ${n}`:G}_renderDevice(t,e,i=!0){const s=this._pos(t),n=this._scenePoint([s.x,s.y]),o=(n[0]-e.x)/e.w*100,r=(n[1]-e.y)/e.h*100,a=this._devicePresentation(t,i),l=[`left:${o}%`,`top:${r}%`,...jo(a)],c=a.disabledReason,h=a.haDisabled?this._t(`marker.ha_disabled_${c}`):t.userHidden?this._t("marker.hidden_ghost"):t.name,d=nu(a),u="view"===this._mode||"devices"===this._mode,p=[h,a.haDisabled?"":this._t(`marker.state_a11y_${d}`),"none"!==a.pulse.kind?this._t(`marker.pulse_a11y_${a.pulse.reason}`):"",a.valueFullText||a.valueText||"",Do(a.valueBadge),null!=a.lqiText&&a.lqiBand?this._t(`marker.lqi_a11y_${a.lqiBand}`,{value:a.lqiText}):""].filter(Boolean).join(", "),_=[t.model,a.valueBadge?.fullText||"",null!=a.lqiText?"LQI "+a.lqiText:""].filter(Boolean).join(" · ");return j`
this._clickDevice(e,t)} @keydown=${e=>this._keyDevice(e,t)} @@ -6020,16 +6106,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerup=${e=>this._pointerUp(e,t)} @pointercancel=${e=>this._pointerUp(e,t)} > - ${Uo(a,{newDevice:this._newIds.has(t.id),newDeviceTitle:this._t("device.new"),disabledTitle:a.haDisabled?h:""})} -
`}_roomArea(t){const e=ci(t);if(!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._spaceWalls,n=s.length&&t.id&&ol(i.rooms,t.id,s,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||e,o=this._cleanFloor(t,n),r=this._cellCm/this._gridPitch;return Tr(o.area*r*r/1e4,"mi"===this._renderPlanHass?.config?.unit_system?.length)}_roomTemp(t){const e=t.settings?.temp_source;return e?xo(this._renderPlanHass,e,"temp",this._markers):t.area?this._climate().get(t.area)?.temp??null:null}_roomHum(t){const e=t.settings?.hum_source;return e?xo(this._renderPlanHass,e,"hum",this._markers):t.area?this._climate().get(t.area)?.hum??null:null}_climate(){const t=this._serverCfg?.markers,e=this._renderPlanHass,i=this._climateCache;if(i&&i.h===e&&i.r===this._iconRules&&i.mk===t)return i.m;const s=function(t,e,i){const s=new Map;if(!t?.entities)return s;const n=vo(i),o=new Set;for(const t of i||[]){if(t?.removed||!0!==t?.use_climate_temp)continue;const e=(t.binding||"").indexOf(":");e>0&&o.add(t.binding.slice(e+1))}const r=new Map;for(const[e,i]of Object.entries(t.entities)){if(i.device_id&&n.devices.has(i.device_id)||!i.device_id&&n.entities.has(e))continue;const s=i.device_id?t.devices?.[i.device_id]:null,a=i.area_id||s?.area_id||null;if(!a)continue;if(i.entity_category)continue;if(!(o.size>0&&e.startsWith("climate.")&&(o.has(e)||i.device_id&&o.has(i.device_id)))){if(Yt.has(i.platform))continue;if($o.test(e))continue}let l=r.get(a);l||(l=new Map,r.set(a,l));const c=i.device_id||e;let h=l.get(c);if(!h){const n=t.states?.[e];h={name:(s?s.name_by_user||s.name:i.name||n?.attributes?.friendly_name||e)||e,model:s?.model,ents:[]},l.set(c,h)}h.ents.push(e)}for(const[i,n]of r){const r=[],a=[];for(const[i,s]of n){const n=fo(t,s.name,s.model,s.ents,e),l="mdi:thermometer"===n||"mdi:air-filter"===n;if(l){const e=uo(t,s.ents);null!=e&&r.push(e)}if(o.size>0&&(o.has(i)||s.ents.some(t=>o.has(t)))){const e=po(t,s.ents);null!=e&&r.push(e)}if(l||"mdi:water-percent"===n){const e=go(t,s.ents);null!=e&&a.push(e)}}(r.length||a.length)&&s.set(i,{temp:r.length?Math.round(r.reduce((t,e)=>t+e,0)/r.length*10)/10:null,hum:a.length?Math.round(a.reduce((t,e)=>t+e,0)/a.length):null})}return s}(e,this._iconRules,t);return this._climateCache={h:e,r:this._iconRules,mk:t,m:s},s}_resetRoomDialogFields(){this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1}_openRoomEdit(t){if(!t.id)return;this._roomEditId=t.id,this._nameSel=t.name||"",this._areaSel=t.area||"",this._roomFill="glow"===t.settings?.fill_mode?"":t.settings?.fill_mode||"";const e=t.settings?.custom_fill;this._roomCustomFill=e&&"object"==typeof e?rs(e,ls(this._curSpaceCfg).customFill):null,this._roomTempSrc=t.settings?.temp_source||"",this._roomHumSrc=t.settings?.hum_source||"",this._roomNameScale=Es(t.settings?.name_scale),this._roomLabelScale=Es(t.settings?.label_scale),this._roomSrcOpen=null,this._roomSrcFilter="",this._roomDialog=!0}_roomSettingsFromDialog(){const t={};return this._roomFill&&(t.fill_mode=this._roomFill),this._roomCustomFill&&(t.custom_fill=this._roomCustomFill),this._roomTempSrc&&(t.temp_source=this._roomTempSrc),this._roomHumSrc&&(t.hum_source=this._roomHumSrc),1!==this._roomNameScale&&(t.name_scale=this._roomNameScale),1!==this._roomLabelScale&&(t.label_scale=this._roomLabelScale),Object.keys(t).length?t:null}_saveRoomEdit(){const t=this._curSpaceCfg,e=t?.rooms.find(t=>t.id===this._roomEditId);if(!e)return this._roomDialog=!1,void(this._roomEditId=null);e.name=this._nameSel.trim()||e.name,e.area=this._areaSel||null;const i=e.settings||{},s={...i};this._roomFill?s.fill_mode=this._roomFill:delete s.fill_mode,this._roomCustomFill?s.custom_fill=this._roomCustomFill:delete s.custom_fill,"glow"===i.fill_mode&&"boolean"!=typeof i.glow&&(s.glow=!0),this._roomTempSrc?s.temp_source=this._roomTempSrc:delete s.temp_source,this._roomHumSrc?s.hum_source=this._roomHumSrc:delete s.hum_source,1!==this._roomNameScale?s.name_scale=this._roomNameScale:delete s.name_scale,1!==this._roomLabelScale?s.label_scale=this._roomLabelScale:delete s.label_scale,Object.keys(s).length?e.settings=s:delete e.settings,this._saveConfig(),this._roomDialog=!1,this._roomEditId=null,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate(),this._showToast(this._t("toast.room_updated"))}_roomSrcCandidates(){const t=this._planHass,e=vo(this._markers),i=this._roomSrcFilter.trim().toLowerCase(),s=[];for(const n of Object.values(t.devices)){if("service"===n.entry_type)continue;if(e.devices.has(n.id))continue;const t=(n.name_by_user||n.name||n.id).trim();i&&!t.toLowerCase().includes(i)||s.push({value:"device:"+n.id,label:t,sub:n.model||this._t("marker.sub_device")})}for(const[n,o]of Object.entries(t.entities)){if(!n.startsWith("sensor.")||o.hidden)continue;if(yo(t,n,e))continue;const r=o.name||t.states[n]?.attributes?.friendly_name||n;i&&!(r+" "+n).toLowerCase().includes(i)||s.push({value:"entity:"+n,label:r,sub:n})}return s.sort((t,e)=>t.label.localeCompare(e.label)),s.slice(0,200)}_roomSrcLabel(t){const e=t.indexOf(":"),i=t.slice(0,e),s=t.slice(e+1);return"device"===i?this._fullRegistryHass.devices[s]?.name_by_user||this._fullRegistryHass.devices[s]?.name||s:this._fullRegistryHass.entities[s]?.name||this.hass.states[s]?.attributes?.friendly_name||s}_labelPos(t,e){const i=this._layout["rl_"+(t.id||"")];if(i&&i.s===e)return{x:i.x*R_,y:i.y*R_};const s=this._snap(this._roomCenter(t));return{x:s[0],y:s[1]}}_labelDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=this._labelPos(e,i);this._drag={id:"rl_"+(e.id||""),sx:t.clientX,sy:t.clientY,ox:s.x,oy:s.y,moved:!1},N_(t),this._tip=null}_labelMove(t,e,i){const s="rl_"+(e.id||"");if(!this._drag||this._drag.id!==s)return;const n=this._stageEl;if(!n)return;const o=this._spaceModelById(i);if(!o)return;const r=o.vb,a=n.getBoundingClientRect(),l=this._viewOr(r),c=(t.clientX-this._drag.sx)/a.width*l.w,h=(t.clientY-this._drag.sy)/a.height*l.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0);const d=ic(this._drag.ox+c),u=ic(this._drag.oy+h);this._savePos({id:s,space:i},d,u)}_labelUp(t){const e="rl_"+(t.id||"");if(!this._drag||this._drag.id!==e)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&window.setTimeout(()=>this._drag=null,0)}_labelScale(t){const e=this._layout["rl_"+(t.id||"")]?.k;return"number"==typeof e&&Number.isFinite(e)?Math.min(3,Math.max(.5,e)):1}_rlResizeDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=t.target.closest(".roomlabel");if(!s)return;const n=s.getBoundingClientRect(),o=n.left+n.width/2,r=n.top+n.height/2,a=Math.max(8,Math.hypot(t.clientX-o,t.clientY-r));this._rlResize={id:"rl_"+(e.id||""),space:i,k0:this._labelScale(e),cx:o,cy:r,d0:a},N_(t)}_rlResizeMove(t){const e=this._rlResize;if(!e)return;t.stopPropagation();const i=Math.max(8,Math.hypot(t.clientX-e.cx,t.clientY-e.cy)),s=Math.min(3,Math.max(.5,e.k0*(i/e.d0))),n=this._layout[e.id];if(n)this._layout={...this._layout,[e.id]:{...n,k:s}};else{const t=e.id.slice(3),i=this._spaceModelById(e.space);if(!i)return;const n=i.rooms.find(e=>e.id===t);if(!n)return;const o=this._labelPos(n,e.space);this._layout={...this._layout,[e.id]:{s:e.space,x:o.x/R_,y:o.y/R_,k:s}}}this._dirtyPos.add(e.id)}_rlResizeUp(){this._rlResize&&(this._rlResize=null,this._persistLayout())}_renderRoomGear(t,e,i){if(!t.id)return G;let s=null;if(t.poly?(s=this._gearPtCache.get(t.poly)||null,s||(s=xi(t.poly),this._gearPtCache.set(t.poly,s))):null!=t.x&&null!=t.y&&(s=[t.x+(t.w||0)/2,t.y+(t.h||0)/2]),!s)return G;const n=(s[0]-i.x)/i.w*100,o=(s[1]-i.y)/i.h*100;return j``}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=ao(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
`}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=lo(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
this._labelDown(i,t,e.id)} @pointermove=${i=>this._labelMove(i,t,e.id)} @pointerup=${()=>this._labelUp(t)} @@ -6044,13 +6130,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=zs(e,i),r=Math.round(10*o)/10,a=Os(o);return j`
- ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=zs(t.a,t.b);return{x:o,y:r,on45:Os(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Tr(aa(Math.abs(s-e),this._cellCm,this._gridPitch)*aa(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=R_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=ci(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e +
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),r=Math.round(10*o)/10,a=Hs(o);return j`
+ ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:r,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Pr(la(Math.abs(s-e),this._cellCm,this._gridPitch)*la(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=I_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,r,a]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} `}_renderOpeningCenterTick(t){const e=(t.angle+90)*Math.PI/180;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return _i(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!yo(this._fullRegistryHass,t,vo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!yo(this._renderPlanHass,t,vo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=An(t)){return!!e&&"active"===Ln(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:_i(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return gi(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!bo(this._fullRegistryHass,t,yo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!bo(this._renderPlanHass,t,yo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=In(t)){return!!e&&"active"===Bn(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:gi(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W` `}_renderOpenings(t){const e=this._openingsR;if(!e.length)return W``;const i=this._spaceModel();if(!i)return W``;const s=t.color,n=this._spaceWalls,o=this._openPairs().flatMap(t=>t.segs),r=this._openingWallIndexFor(i,o).value;return W`${e.map(t=>{if(t.orphanReason)return W`! - `;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=tu(l);return W``;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=eu(l);return W` - ${eu(l)} + ${iu(l)} this._opClick(e,t)} @@ -6081,10 +6167,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${e=>this._opPointerMove(e,t)} @pointerup=${e=>this._opPointerUp(e,t)} @pointercancel=${e=>this._opPointerUp(e,t)}> - `})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
`})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
{t.stopPropagation(),"view"===this._mode&&(this._openingInfo=e)}}> - +
`})}`}_lockAction(t,e){if(this._openingEntityAvailable(t)){if("unlock"===e){const e=this.hass?.states?.[t]?.attributes?.friendly_name||t;if(!confirm(this._t("confirm.unlock",{name:e})))return}this.hass?.callService?.("lock",e,{entity_id:t})}}_renderOpeningInfoCard(){const t=this._openingInfo,e="passage"!==t.type&&t.contact&&this._openingEntityAvailable(t.contact)?t.contact:null,i=("door"===t.type||"gate"===t.type)&&t.lock&&this._openingEntityAvailable(t.lock)?t.lock:null,s=e?this.hass.states[e]?.state:null,n=this._openingAmt(t),o=i?this.hass.states[i]?.state:null,r="door"===t.type?"opening.door":"gate"===t.type?"opening.gate":"passage"===t.type?"opening.passage":"opening.window",a="door"===t.type?"mdi:door":"gate"===t.type?"mdi:gate":"passage"===t.type?"mdi:arch":"mdi:window-closed-variant",l="gate"===t.type?n>0?"mdi:gate-open":"mdi:gate":n>0?"mdi:door-open":"mdi:door-closed",c=(t,e,i,s="")=>j`
${e}${i}
`;return j`this._openingInfo=null}> @@ -6105,7 +6195,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_renderOpeningDialog(){const t=this._openingDialog,e=this._spaceModel()?.partitions||[],i=t.id?this._curSpaceCfg?.openings?.find(e=>e.id===t.id):null,s={id:t.id||"preview",type:t.type,x:t.x/R_,y:t.y/this._spaceH,angle:t.angle,length:i&&!t.lengthTouched?i.length:this._cmToUnits(Math.max(20,t.lengthCm))/R_,...t.host?{host:t.host}:{}},n=ld(i,s),o=t.host?n?ad(s,e,R_,this._cellCm,this._gridPitch):rd(s,e,R_,this._cellCm,this._gridPitch):null,r="does-not-fit-jamb"===o?.reason,a=t.host?e.find(e=>e.id===t.host.id):null,l=a?ai(a.cm/2,this._imperial):"",c=!!t.host&&!o?.resolved&&!r,h="gate"===t.type?"mdi:gate":"window"===t.type?"mdi:window-closed-variant":"passage"===t.type?"mdi:arch":"mdi:door",d=(t,e,i)=>j`i(t.target.value)}> ${t.map(t=>j``)} `;return j` {const i=f_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> + @input=${e=>{const i=y_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> ${"passage"===t.type&&(t.contact||t.lock)?j`
@@ -6170,7 +6260,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
-
`}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=fc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=fc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` +
`}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=vc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=vc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` @@ -6184,34 +6274,34 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - `}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=va(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W``}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=ya(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`this._physicalDown(e,"partition",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Pl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Rl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalDown(e,"column",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Tl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Pl(u.base,this._cellCm,this._gridPitch);return t?W`this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Pl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Rl(u.base,this._cellCm,this._gridPitch);return t?W``:G})(),_=(()=>{const i=this._physicalSel;if(!i)return G;if("draft"===i.kind){const e=t.room_drafts.find(t=>t.id===i.id);return e?W` t.join(",")).join(" ")}> ${e.points.map(t=>W``)} - `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Tl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` + `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Pl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` - `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Pl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` + `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Rl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` - `;const h=va(l.cm,this._cellCm,this._gridPitch),d=Ml(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` + `;const h=ya(l.cm,this._cellCm,this._gridPitch),d=Cl(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` @@ -6219,7 +6309,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}> - `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=va(5,this._cellCm,this._gridPitch),s=va(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=ya(5,this._cellCm,this._gridPitch),s=ya(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(va(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=sl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:va(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Hs(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return La([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Cs(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>va(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||_a:l||_a,this._cellCm,this._gridPitch)/2):[],d=c?Ba(c,va(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(ya(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=nl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:ya(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Ba([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>ya(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||ga:l||ga,this._cellCm,this._gridPitch)/2):[],d=c?qa(c,ya(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} - ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Pl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} + ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Rl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} ${d?W` `:G} ${u?W` @@ -6263,7 +6353,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628

${this._t("confirm.delete_partition_openings_body",{count:t.openings.length})}

    - ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:ai(t.length*R_/this._gridPitch*this._cellCm,e)})}
  • `)} + ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:li(t.length*I_/this._gridPitch*this._cellCm,e)})}
  • `)}
@@ -6287,8 +6377,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
this._physicalDialog={...t,cm:e.target.value}} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}
${e&&"square"===t.shape?j` @@ -6411,12 +6501,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of ao(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Xi(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ss).filter(t=>this._planEntityAvailable(t));return j``}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of lo(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Ji(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ms).filter(t=>this._planEntityAvailable(t));return j`
${(()=>{const e=this._cardEntities(t);return e.length?j`
- ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Xi(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
- + ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Ji(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
+ ${s} ${"toggle"===e?j``:"open"===e?j`
`:G} ${i&&!this._cardEntities(t).length?j`
${this._t("info.state")}${i}
`:G} - ${Hi(t.link)?j`
${this._t("info.link")} - ${t.link}
`:G} + ${Ni(t.link)?j`
${this._t("info.link")} + ${t.link}
`:G} ${t.description?j`
${t.description}
`:G} ${t.pdfs&&t.pdfs.length?j`
${this._t("info.manuals")} - ${t.pdfs.map(t=>j` + ${t.pdfs.map(t=>j` ${t.name}`)}
`:G} ${s.length?j`
${this._t("info.controls")} @@ -6448,7 +6538,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
- `}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=Bs(t.room),i=Fi(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Yn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=f_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return ko({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return Qh({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!ed(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Yh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Lo(this._planHass,s,n),r=Bo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return lo(ao(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&oo(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Jn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Jn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Jn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ss(e)&&!s.has(e)&&Kn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=ks(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?ls(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?_u(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Lo(this._planHass,o,l):[],p=o?Bo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Po(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return Qn(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Jn(o):[],P=o&&Zn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Wh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j``}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=qs(t.room),i=Ei(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=y_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return xo({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return td({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!id(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Xh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Bo(this._planHass,s,n),r=qo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return co(lo(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&ro(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Zn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Zn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Zn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ms(e)&&!s.has(e)&&Yn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=xs(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?cs(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?gu(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Bo(this._planHass,o,l):[],p=o?qo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Ro(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return to(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Zn(o):[],P=o&&Qn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Uh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j`this._markerDialog=null}>
@@ -6471,7 +6561,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
@@ -6496,7 +6586,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._markerDialog={...t,bindingFilter:e.target.value}} />
${i.map(e=>j`
{const i={...t,binding:e.value,bindingOpen:!1,controls:Yn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> + @click=${()=>{const i={...t,binding:e.value,bindingOpen:!1,controls:Xn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> ${e.label}${e.sub}
`)} ${i.length?G:j`
${this._t("marker.nothing_found")}
`} @@ -6519,7 +6609,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -6692,12 +6782,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 -

${this._t(p_[t.display])}

+

${this._t(g_[t.display])}

${"static_icon"===t.display&&this._bindingHasAlarm(t.binding)?j`
${this._t("marker.static_alarm_warning")} @@ -6719,7 +6809,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._help("marker.value_badge_source.help")}
this._spaceDialog=ch(t,"file")} /> + @change=${()=>this._spaceDialog=hh(t,"file")} /> ${this._t("space.source_file")} ${"file"===t.source?j`
@@ -6866,25 +6956,25 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.pickSaved?this._renderServerPlans(t):G}`:G}
- {const i=f_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(g_,i)):t.cellCm}}} /> + @input=${e=>{const i=y_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(f_,i)):t.cellCm}}} /> ${this._t("space.scale_unit")}
-
`:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=ls(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j``:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=cs(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j`
@@ -7073,7 +7163,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${[["","fill.inherit"],...ji.map(t=>[t,"fill."+t])].map(([t,e])=>j`
- ${this._renderCardPreview(ls(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)} + ${this._renderCardPreview(cs(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)}
@@ -7117,4 +7207,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("btn.save")} `}
- `}}L_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},L_.ZOOM_MAX=8,L_.ZOOM_MIN=1/3,L_.styles=[Kt,ju],customElements.get("houseplan-card")||customElements.define("houseplan-card",L_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${d_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); + `}}q_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},q_.ZOOM_MAX=8,q_.ZOOM_MIN=1/3,q_.styles=[Kt,Uu],customElements.get("houseplan-card")||customElements.define("houseplan-card",q_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${p_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); diff --git a/dist/houseplan-card.js b/dist/houseplan-card.js index a767e7be..28e542b4 100755 --- a/dist/houseplan-card.js +++ b/dist/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,m?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=t=>t,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,I=Array.isArray,F="[ \t\n\f\r]",E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${F}(?:([^\\s"'>=/]+)(${F}*=${F}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=E;for(let e=0;e"===l[0]?(r=n??E,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?H:'"'===l[3]?L:N):r===L||r===N?r=H:r===z||r===O?r=E:(r=H,n=void 0);const d=r===H&&t[e+1].startsWith("/>")?" ":"";o+=r===E?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||"")+(2===e?"":3===e?"":"")),s]};class J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=J.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iI(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=J.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new J(t)),e}k(t){I(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=rt,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},xt=(t,e=kt)=>t._$AH=e,$t=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=wt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=wt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(r,p,_),h=St(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else $t(n[u]),u--;else $t(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&$t(t)}return this.ut=r,xt(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Dt,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function ai(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function li(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function hi(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function di(t){const e=[],i=new Set;for(const s of t||[]){const t=ci(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function pi(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of di(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function _i(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function gi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function mi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function vi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function yi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function xi(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!fi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||$i(t)||t[0]}function $i(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(bi(s,t,e))return s;for(let s=0;sMi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Mi(e,t,i)))}function Ti(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ri(t,e,i){for(let s=0;s1&&mi(i[0],i[i.length-1],e)&&i.pop(),i}function Ii(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(mi(s,n,i))return null;const o=Ri(t,s,i),r=Ri(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!bi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ai(r,i)};let c,h;if(o===r){const r=Ai([...e],i);if(r.length<3||Ti(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ai(a,i),h=r}else c=Ai([...l(s,o,n,r),...[...a].reverse()],i),h=Ai([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Ti(c)<=i||Ti(h)<=i||Math.abs(Ti(c)+Ti(h)-Ti(t))>Math.max(i,1e-6*Ti(t))?null:[c,h]}function Fi(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function Ei(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function zi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Oi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Yi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Ki(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Xi(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Ji(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Zi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Gi;const o=(e?.attr||"").trim(),r=Xi(t,i,o||null);if(null===r)return Gi;return Ji(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function Qi(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Ki(e);return n?(o=!0,s(n.entity||"")?Zi(i,n):Gi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Vi);return t>=0?n.slice(0,t)+Gi+n.slice(t+2):n?`${n} ${Gi}`:Gi}const l=Zi(i,e),c=n.indexOf(Vi);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const ts=20;function es(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function is(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ss="#55606c",ns=.55,os={c:"#607d8b",a:.18};function rs(t,e=os){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function as(t,e){const i=rs(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?rs(s,i):i}function ls(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ss),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):ns,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:rs(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function cs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const hs={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function ds(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(hs)){const s=hs[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function us(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function ps(t,e,i,s,n,o,r,a=os){const l=function(t,e,i,s,n,o,r,a=os){if("custom"===t)return rs(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:us(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const _s={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},gs=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function ms(t){for(const e of[...Object.values(_s),...gs])if(t===e[0]||t===e[1])return e;return null}function fs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?ms(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=_s[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=ms(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function vs(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const ys=1/2.2;function bs(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ws(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function ks(t,e,i){const s=ws(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:bs(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=vs(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function xs(t,e,i){return"on"===t?.state?ks(t,e,i):null}function $s(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,ys));return Math.max(0,Math.min(1,s))}function Ss(t){return t.startsWith("light.")||t.startsWith("switch.")}function Ms(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Cs(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ds(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=As(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function As(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Is(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Fs(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function Es(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function zs(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Os(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Hs(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ns=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Ls(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ns.has(e)}function Bs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const qs={availability:"available",status:"alarm",activity:"none"},js=new Set(["motion","vibration","sound"]),Ws=new Set(["occupancy","presence"]),Us=new Set(["door","window","garage_door","opening"]),Gs=new Set(["running","power"]),Vs=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ks=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Ys=new Set([...Ks,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Xs=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Js=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Zs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,Qs=t=>String(t??"").trim().toLowerCase(),tn=t=>Qs(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),en=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),sn=new Set(["wifi","connection","signal","battery"]);function nn(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>Qs(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(tn).filter(Boolean);if(r.some(t=>t.split("_").some(t=>sn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of en)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const on=(t,e)=>null!=nn(t,e);function rn(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(Qs).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=Qs(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function an(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=Qs(t?.[e]);if(Ks.has(i)||Xs.has(i))return i}return""}function ln(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n=String(e||"").split(".")[0],o=Qs(i?.attributes?.device_class),r={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Ls(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return js.has(o)?{...r,edge:"rising"}:Ws.has(o)?{...r,activity:"on"===s?"presence":"none"}:Us.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Gs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=an(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(Qs):[],n=!Xs.has(s)&&(Js.has(s)||Ks.has(s)||e.includes(s));return(t?Ks.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=an(i.attributes);return Ks.has(a)||Ks.has(s)&&!Xs.has(s)?{...r,status:"working",activity:"running"}:r}function cn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>rn(t,e));if(!(s.length>1&&!!n))return e.map(e=>ln(t,e));const o=e.find(e=>e!==n&&on(t,e)),r=ln(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?Qs(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?Qs(i.state):"__missing__",n={eid:e,state:s,availability:Zs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=an(i?.attributes);return Ks.has(o)||Ys.has(s)&&!Xs.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:ln(t,e),status:"neutral",activity:"none",edge:"none"}})}function hn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return qs;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function dn(t,e){if(!(t=>!!t&&!Zs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const un=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},pn=(t,e)=>{const i={rev:0,configRev:un(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function _n(t,e=0){return pn(t,e).snapshot}function gn(t,e,i,s){const n=pn(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Cn(i,"id"),o=Cn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Tn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Dn(t,e)},80))}async function Pn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Tn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Tn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function Rn(t,e){const i=Mn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Dn(t,i),Pn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function An(t){const e=Mn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Tn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function In(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=kn.get(t);return e||(e=xn++,kn.set(t,e)),e}function Fn(t,e=An(t)){return[e.revision,e.access,In(e.devices),In(e.entities)].join(":")}function En(t){return!!t&&null==t.disabled_by}function zn(t,e=An(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))En(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!En(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!En(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!En(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!En(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function On(t,e=An(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Hn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Nn(){if(Sn)return Sn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem($n)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Sn=i,Sn}catch{return{}}}function Ln(t,e,i=An(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Hn(a,o);if(!En(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>En(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!En(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!En(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Nn()[t]||null}(e);if("device"===n){const e=r[o],i=Hn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function Bn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!En(s))continue;const n=t.devices?.[s.device_id];n&&!En(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function qn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function jn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Wn=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Un=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Gn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Wn){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Un(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=Qs(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return js.has(i)||Ws.has(i)||Us.has(i)||Gs.has(i)||"moving"===i||Vs.has(i)}(t,e.eid));if(o.length)return Un(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Un(r),s=e.find(e=>rn(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=nn(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Un(o.filter(i=>nn(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Un(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Un(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Vn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>jn(t,e.eid));if(i)return i.eid}const o=Gn(t,e);return o.find(Ss)||o[0]}function Kn(t,e,i=[]){return[...new Set(Yn(t,e,i))].filter(t=>Ss(t))}function Yn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Xn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Jn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ss),s=t.primary&&Ss(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ss(t)))]}function Zn(t){const e=Jn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function Qn(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Zn(e),via:"forced"}]}const i=e.primary||Gn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const to=new WeakMap,eo=new WeakMap;function io(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function so(t){const e=io(t),i=to.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ss):e.controls.filter(Ss)),s=Zn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return to.set(t,a),a}function no(t){return so(t).incomingByMarker}function oo(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Yn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&Qn(t,e).length>0}function ro(t,e){const i=Kn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=oo(t,e)?Qn(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function ao(t,e,i,s){if(null!=i)return ao(t,e,null,s).filter(t=>Xn(t.device,i));const n=io(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=fn(s),a=eo.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=so(e),u=null==i?l:l.filter(t=>Xn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ro(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ss):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&vn(i.device.marker)&&(i.on=yn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Xn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ss(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return eo.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function lo(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function co(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function ho(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return Ei(i)}function uo(t,e){for(const i of e){if(!jn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function po(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function _o(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function go(t,e){for(const i of e){if(!_o(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function mo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!En(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!En(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function fo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function vo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function yo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function bo(t,e,i,s,n){const o=Kn(e.binding,e.controls,t.entities).filter(t=>!yo(i,t,s)).filter(t=>"active"===Ln(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function wo(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function ko(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),n=On(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=vo(r),g=mo(s,p).filter(t=>!yo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=Bn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Ln(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=qn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=fo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Vn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=uo(s,_)),C.primary&&_o(s,C.primary)&&(C.hum=go(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Ln(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=wo(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?fo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Vn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=uo(s,g)),f.primary&&_o(s,f.primary)&&(f.hum=go(s,g)),bo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(yo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=wo(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=fo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=uo(s,v.entities)),v.entities.length&&_o(s,l)&&(v.hum=go(s,v.entities)),bo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};bo(r,t,n,_,i),k.push(r)}}return k}function xo(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=vo(i);return"device"===n?r.devices.has(o):"entity"===n&&yo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?uo(t,e):go(t,e)}return null}const $o=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function So(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=ho(t,n.entities);null!=e&&s.push(e)}return Ei(s)}function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Co={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function Do(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const To=new WeakMap;function Po(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ro(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Ao(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Io(t){return t.replaceAll("_"," ")}function Fo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Eo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function zo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Ao(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Ho(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Xi(t,i.entity_id);n=s?Ji(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Io(i.attribute)} · ${Ao(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Ho(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Xi(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Fo(o,100/255);if("volume_level"===i)return Fo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Fo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=ho(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Eo(i)}}function Oo(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>jn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&_o(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Ho(t,e){const i=t?.entities?.[e];if(i&&!En(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||En(s)}function No(t,e){return Ho(t,e)&&!!t?.states?.[e]}function Lo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=To.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=ao(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Po(i);if(r.some(t=>t.key===s))return;const n=zo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!No(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Co[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==ho(t,e.entities)||c({kind:"derived_lqi"}),To.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function Bo(t,e,i){const s=Oo(t,e);if(s&&i.some(t=>t.key===Po(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function qo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function jo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Wo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Uo(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` + `,Yt=new Set(["hacs","sun","backup","hassio","met","telegram_bot","mobile_app","systemmonitor","better_thermostat","adaptive_lighting","yandex_pogoda","upnp_serial_number"]),Xt=[{pattern:"протечк|leak|water sensor",icon:"mdi:water-alert"},{pattern:"клапан|valve",icon:"mdi:pipe-valve"},{pattern:"дым|smoke",icon:"mdi:smoke-detector"},{pattern:"термоголов|trv|radiator",icon:"mdi:radiator"},{pattern:"чайник|kettle|термопот",icon:"mdi:kettle"},{pattern:"сауна|sauna|harvia|парная|парилк",icon:"mdi:hot-tub"},{pattern:"температ|temperature|thermometer|climate sensor",icon:"mdi:thermometer"},{pattern:"qingping|air monitor|молекул|air quality",icon:"mdi:air-filter"},{pattern:"штор|curtain|blind|shade",icon:"mdi:roller-shade"},{pattern:"розетк|plug|socket|outlet",icon:"mdi:power-socket-de"},{pattern:"выключат|switch",icon:"mdi:light-switch"},{pattern:"лампа|лампочк|bulb|gx53|светильник|rgb|lamp|light strip",icon:"mdi:lightbulb"},{pattern:"камер|camera",icon:"mdi:cctv"},{pattern:"замок|ttlock|lock|sn609|sn9161",icon:"mdi:lock"},{pattern:"ворота|garage|gate",icon:"mdi:garage-variant"},{pattern:"калитк|door|открыт|contact",icon:"mdi:door"},{pattern:"счётчик|счетчик|kws|meter",icon:"mdi:meter-electric"},{pattern:"вводный автомат|breaker|wifimcbn",icon:"mdi:electric-switch"},{pattern:"myheat|котёл|котел|boiler|отоплен|heating",icon:"mdi:water-boiler"},{pattern:"холодильник|fridge",icon:"mdi:fridge"},{pattern:"стиральн|washer|washing",icon:"mdi:washing-machine"},{pattern:"сушилк|dryer",icon:"mdi:tumble-dryer"},{pattern:"пылесос|vacuum|dreame|roborock",icon:"mdi:robot-vacuum"},{pattern:"soundbar",icon:"mdi:soundbar"},{pattern:"колонк|станц|speaker|яндекс|yandex|алиса|alice",icon:"mdi:speaker"},{pattern:"tv|телевизор|hyundaitv|mitv|television",icon:"mdi:television"},{pattern:"keenetic|роутер|router|mesh|access point",icon:"mdi:router-wireless"},{pattern:"ибп|ups|kirpich",icon:"mdi:battery-charging-high"},{pattern:"slzb|координат|zigbee|coordinator",icon:"mdi:zigbee"},{pattern:"motion|движен|presence|присутств",icon:"mdi:motion-sensor"},{pattern:"humidity|влажн",icon:"mdi:water-percent"}];function Jt(t){const e=[];for(const i of t)if(i&&"string"==typeof i.pattern&&i.icon)try{e.push({re:new RegExp(i.pattern,"i"),icon:i.icon})}catch{}return e}const Zt=Jt(Xt),Qt={temperature:"mdi:thermometer",humidity:"mdi:water-percent",motion:"mdi:motion-sensor",occupancy:"mdi:motion-sensor",presence:"mdi:motion-sensor",door:"mdi:door",window:"mdi:window-closed",garage_door:"mdi:garage-variant",smoke:"mdi:smoke-detector",moisture:"mdi:water-alert",gas:"mdi:gas-cylinder",power:"mdi:meter-electric",energy:"mdi:meter-electric",illuminance:"mdi:brightness-5",co2:"mdi:molecule-co2",pm25:"mdi:air-filter",battery:"mdi:battery"},te="mdi:chip";function ee(t,e,i){const s=((t||"")+" "+(e||"")).toLowerCase();for(const{re:t,icon:e}of i??Zt)if(t.test(s))return e;return te}const ie=["light","switch","cover","valve","lock","climate","fan","media_player","camera","vacuum","humidifier","water_heater","alarm_control_panel","sensor","binary_sensor","event","button","number","select","update"];var se=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,ne=Math.ceil,oe=Math.floor,re="[BigNumber Error] ",ae=re+"Number primitive has more than 15 significant digits: ",le=1e14,ce=14,he=9007199254740991,de=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],ue=1e7,pe=1e9;function _e(t){var e=0|t;return t>0||t===e?e:e-1}function ge(t){for(var e,i,s=1,n=t.length,o=t[0]+"";sc^i?1:-1;for(a=(l=n.length)<(c=o.length)?l:c,r=0;ro[r]^i?1:-1;return l==c?0:l>c^i?1:-1}function fe(t,e,i,s){if(ti||t!==oe(t))throw Error(re+(s||"Argument")+("number"==typeof t?ti?" out of range: ":" not an integer: ":" not a primitive number: ")+String(t))}function ve(t){var e=t.c.length-1;return _e(t.e/ce)==e&&t.c[e]%2!=0}function ye(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function be(t,e,i){var s,n;if(e<0){for(n=i+".";++e;n+=i);t=n+t}else if(++e>(s=t.length)){for(n=i,e-=s;--e;n+=i);t+=n}else ey?u.c=u.e=null:t.e=10;l/=10,a++);return void(a>y?u.c=u.e=null:(u.e=a,u.c=[t]))}d=String(t)}else{if(!se.test(d=String(t)))return n(u,d,c);u.s=45==d.charCodeAt(0)?(d=d.slice(1),-1):1}(a=d.indexOf("."))>-1&&(d=d.replace(".","")),(l=d.search(/e/i))>0?(a<0&&(a=l),a+=+d.slice(l+1),d=d.substring(0,l)):a<0&&(a=d.length)}else{if(fe(e,2,$.length,"Base"),10==e&&S)return P(u=new M(t),_+u.e+1,g);if(d=String(t),c="number"==typeof t){if(0*t!=0)return n(u,d,c,e);if(u.s=1/t<0?(d=d.slice(1),-1):1,M.DEBUG&&d.replace(/^0\.0*|\./,"").length>15)throw Error(ae+t)}else u.s=45===d.charCodeAt(0)?(d=d.slice(1),-1):1;for(i=$.slice(0,e),a=l=0,h=d.length;la){a=h;continue}}else if(!r&&(d==d.toUpperCase()&&(d=d.toLowerCase())||d==d.toLowerCase()&&(d=d.toUpperCase()))){r=!0,l=-1,a=0;continue}return n(u,String(t),c,e)}c=!1,(a=(d=s(d,e,10,u.s)).indexOf("."))>-1?d=d.replace(".",""):a=d.length}for(l=0;48===d.charCodeAt(l);l++);for(h=d.length;48===d.charCodeAt(--h););if(d=d.slice(l,++h)){if(h-=l,c&&M.DEBUG&&h>15&&(t>he||t!==oe(t)))throw Error(ae+u.s*t);if((a=a-l-1)>y)u.c=u.e=null;else if(a=f)?ye(l,r):be(l,r,"0");else if(o=(t=P(new M(t),e,i)).e,a=(l=ge(t.c)).length,1==s||2==s&&(e<=o||o<=m)){for(;ar),l=be(l,o,"0"),o+1>a){if(--e>0)for(l+=".";e--;l+="0");}else if((e+=o-a)>0)for(o+1==a&&(l+=".");e--;l+="0");return t.s<0&&n?"-"+l:l}function D(t,e){for(var i,s,n=1,o=new M(t[0]);n=10;n/=10,s++);return(i=s+i*ce-1)>y?t.c=t.e=null:i=10;a/=10,n++);if((o=e-n)<0)o+=ce,r=e,l=d[c=0],h=oe(l/u[n-r-1]%10);else if((c=ne((o+1)/ce))>=d.length){if(!s)break t;for(;d.length<=c;d.push(0));l=h=0,n=1,r=(o%=ce)-ce+1}else{for(l=a=d[c],n=1;a>=10;a/=10,n++);h=(r=(o%=ce)-ce+n)<0?0:oe(l/u[n-r-1]%10)}if(s=s||e<0||null!=d[c+1]||(r<0?l:l%u[n-r-1]),s=i<4?(h||s)&&(0==i||i==(t.s<0?3:2)):h>5||5==h&&(4==i||s||6==i&&(o>0?r>0?l/u[n-r]:0:d[c-1])%10&1||i==(t.s<0?8:7)),e<1||!d[0])return d.length=0,s?(e-=t.e+1,d[0]=u[(ce-e%ce)%ce],t.e=-e||0):d[0]=t.e=0,t;if(0==o?(d.length=c,a=1,c--):(d.length=c+1,a=u[ce-o],d[c]=r>0?oe(l/u[n-r]%u[r])*a:0),s)for(;;){if(0==c){for(o=1,r=d[0];r>=10;r/=10,o++);for(r=d[0]+=a,a=1;r>=10;r/=10,a++);o!=a&&(t.e++,d[0]==le&&(d[0]=1));break}if(d[c]+=a,d[c]!=le)break;d[c--]=0,a=1}for(o=d.length;0===d[--o];d.pop());}t.e>y?t.c=t.e=null:t.e=f?ye(e,i):be(e,i,"0"),t.s<0?"-"+e:e)}return M.clone=t,M.ROUND_UP=0,M.ROUND_DOWN=1,M.ROUND_CEIL=2,M.ROUND_FLOOR=3,M.ROUND_HALF_UP=4,M.ROUND_HALF_DOWN=5,M.ROUND_HALF_EVEN=6,M.ROUND_HALF_CEIL=7,M.ROUND_HALF_FLOOR=8,M.EUCLID=9,M.config=M.set=function(t){var e,i;if(null!=t){if("object"!=typeof t)throw Error(re+"Object expected: "+t);if(t.hasOwnProperty(e="DECIMAL_PLACES")&&(fe(i=t[e],0,pe,e),_=i),t.hasOwnProperty(e="ROUNDING_MODE")&&(fe(i=t[e],0,8,e),g=i),t.hasOwnProperty(e="EXPONENTIAL_AT")&&((i=t[e])&&i.pop?(fe(i[0],-pe,0,e),fe(i[1],0,pe,e),m=i[0],f=i[1]):(fe(i,-pe,pe,e),m=-(f=i<0?-i:i))),t.hasOwnProperty(e="RANGE"))if((i=t[e])&&i.pop)fe(i[0],-pe,-1,e),fe(i[1],1,pe,e),v=i[0],y=i[1];else{if(fe(i,-pe,pe,e),!i)throw Error(re+e+" cannot be zero: "+i);v=-(y=i<0?-i:i)}if(t.hasOwnProperty(e="CRYPTO")){if((i=t[e])!==!!i)throw Error(re+e+" not true or false: "+i);if(i){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw b=!i,Error(re+"crypto unavailable");b=i}else b=i}if(t.hasOwnProperty(e="MODULO_MODE")&&(fe(i=t[e],0,9,e),w=i),t.hasOwnProperty(e="POW_PRECISION")&&(fe(i=t[e],0,pe,e),k=i),t.hasOwnProperty(e="FORMAT")){if("object"!=typeof(i=t[e]))throw Error(re+e+" not an object: "+i);x=i}if(t.hasOwnProperty(e="ALPHABET")){if("string"!=typeof(i=t[e])||/^.?$|[+\-.\s]|(.).*\1/.test(i))throw Error(re+e+" invalid: "+i);S="0123456789"==i.slice(0,10),$=i}}return{DECIMAL_PLACES:_,ROUNDING_MODE:g,EXPONENTIAL_AT:[m,f],RANGE:[v,y],CRYPTO:b,MODULO_MODE:w,POW_PRECISION:k,FORMAT:x,ALPHABET:$}},M.isBigNumber=function(t){if(!t||!0!==t._isBigNumber)return!1;if(!M.DEBUG)return!0;var e,i,s=t.c,n=t.e,o=t.s;t:if("[object Array]"=={}.toString.call(s)){if((1===o||-1===o)&&n>=-pe&&n<=pe&&n===oe(n)){if(0===s[0]){if(0===n&&1===s.length)return!0;break t}if((e=(n+1)%ce)<1&&(e+=ce),String(s[0]).length==e){for(e=0;e=le||i!==oe(i))break t;if(0!==i)return!0}}}else if(null===s&&null===n&&(null===o||1===o||-1===o))return!0;throw Error(re+"Invalid BigNumber: "+t)},M.maximum=M.max=function(){return D(arguments,-1)},M.minimum=M.min=function(){return D(arguments,1)},M.random=(o=9007199254740992,r=Math.random()*o&2097151?function(){return oe(Math.random()*o)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)},function(t){var e,i,s,n,o,a=0,l=[],c=new M(p);if(null==t?t=_:fe(t,0,pe),n=ne(t/ce),b)if(crypto.getRandomValues){for(e=crypto.getRandomValues(new Uint32Array(n*=2));a>>11))>=9e15?(i=crypto.getRandomValues(new Uint32Array(2)),e[a]=i[0],e[a+1]=i[1]):(l.push(o%1e14),a+=2);a=n/2}else{if(!crypto.randomBytes)throw b=!1,Error(re+"crypto unavailable");for(e=crypto.randomBytes(n*=7);a=9e15?crypto.randomBytes(7).copy(e,a):(l.push(o%1e14),a+=7);a=n/7}if(!b)for(;a=10;o/=10,a++);ai-1&&(null==r[n+1]&&(r[n+1]=0),r[n+1]+=r[n]/i|0,r[n]%=i)}return r.reverse()}return function(s,n,o,r,a){var l,c,h,d,u,p,m,f,v=s.indexOf("."),y=_,b=g;for(v>=0&&(d=k,k=0,s=s.replace(".",""),p=(f=new M(n)).pow(s.length-v),k=d,f.c=e(be(ge(p.c),p.e,"0"),10,o,t),f.e=f.c.length),h=d=(m=e(s,n,o,a?(l=$,t):(l=t,$))).length;0==m[--d];m.pop());if(!m[0])return l.charAt(0);if(v<0?--h:(p.c=m,p.e=h,p.s=r,m=(p=i(p,f,y,b,o)).c,u=p.r,h=p.e),v=m[c=h+y+1],d=o/2,u=u||c<0||null!=m[c+1],u=b<4?(null!=v||u)&&(0==b||b==(p.s<0?3:2)):v>d||v==d&&(4==b||u||6==b&&1&m[c-1]||b==(p.s<0?8:7)),c<1||!m[0])s=u?be(l.charAt(1),-y,l.charAt(0)):l.charAt(0);else{if(m.length=c,u)for(--o;++m[--c]>o;)m[c]=0,c||(++h,m=[1].concat(m));for(d=m.length;!m[--d];);for(v=0,s="";v<=d;s+=l.charAt(m[v++]));s=be(s,h,l.charAt(0))}return s}}(),i=function(){function t(t,e,i){var s,n,o,r,a=0,l=t.length,c=e%ue,h=e/ue|0;for(t=t.slice();l--;)a=((n=c*(o=t[l]%ue)+(s=h*o+(r=t[l]/ue|0)*c)%ue*ue+a)/i|0)+(s/ue|0)+h*r,t[l]=n%i;return a&&(t=[a].concat(t)),t}function e(t,e,i,s){var n,o;if(i!=s)o=i>s?1:-1;else for(n=o=0;ne[n]?1:-1;break}return o}function i(t,e,i,s){for(var n=0;i--;)t[i]-=n,n=t[i]1;t.splice(0,1));}return function(s,n,o,r,a){var l,c,h,d,u,p,_,g,m,f,v,y,b,w,k,x,$,S=s.s==n.s?1:-1,C=s.c,D=n.c;if(!(C&&C[0]&&D&&D[0]))return new M(s.s&&n.s&&(C?!D||C[0]!=D[0]:D)?C&&0==C[0]||!D?0*S:S/0:NaN);for(m=(g=new M(S)).c=[],S=o+(c=s.e-n.e)+1,a||(a=le,c=_e(s.e/ce)-_e(n.e/ce),S=S/ce|0),h=0;D[h]==(C[h]||0);h++);if(D[h]>(C[h]||0)&&c--,S<0)m.push(1),d=!0;else{for(w=C.length,x=D.length,h=0,S+=2,(u=oe(a/(D[0]+1)))>1&&(D=t(D,u,a),C=t(C,u,a),x=D.length,w=C.length),b=x,v=(f=C.slice(0,x)).length;v=a/2&&k++;do{if(u=0,(l=e(D,f,x,v))<0){if(y=f[0],x!=v&&(y=y*a+(f[1]||0)),(u=oe(y/k))>1)for(u>=a&&(u=a-1),_=(p=t(D,u,a)).length,v=f.length;1==e(p,f,_,v);)u--,i(p,x<_?$:D,_,a),_=p.length,l=1;else 0==u&&(l=u=1),_=(p=D.slice()).length;if(_=10;S/=10,h++);P(g,o+(g.e=h+c*ce-1)+1,r,d)}else g.e=c,g.r=+d;return g}}(),a=/^(-?)0([xbo])(?=\w[\w.]*$)/i,l=/^([^.]+)\.$/,c=/^\.([^.]+)$/,h=/^-?(Infinity|NaN)$/,d=/^\s*\+(?=[\w.])|^\s+|\s+$/g,n=function(t,e,i,s){var n,o=i?e:e.replace(d,"");if(h.test(o))t.s=isNaN(o)?null:o<0?-1:1;else{if(!i&&(o=o.replace(a,function(t,e,i){return n="x"==(i=i.toLowerCase())?16:"b"==i?2:8,s&&s!=n?t:e}),s&&(n=s,o=o.replace(l,"$1").replace(c,"0.$1")),e!=o))return new M(o,n);if(M.DEBUG)throw Error(re+"Not a"+(s?" base "+s:"")+" number: "+e);t.s=null}t.c=t.e=null},u.absoluteValue=u.abs=function(){var t=new M(this);return t.s<0&&(t.s=1),t},u.comparedTo=function(t,e){return me(this,new M(t,e))},u.decimalPlaces=u.dp=function(t,e){var i,s,n,o=this;if(null!=t)return fe(t,0,pe),null==e?e=g:fe(e,0,8),P(new M(o),t+o.e+1,e);if(!(i=o.c))return null;if(s=((n=i.length-1)-_e(this.e/ce))*ce,n=i[n])for(;n%10==0;n/=10,s--);return s<0&&(s=0),s},u.dividedBy=u.div=function(t,e){return i(this,new M(t,e),_,g)},u.dividedToIntegerBy=u.idiv=function(t,e){return i(this,new M(t,e),0,1)},u.exponentiatedBy=u.pow=function(t,e){var i,s,n,o,r,a,l,c,h=this;if((t=new M(t)).c&&!t.isInteger())throw Error(re+"Exponent not an integer: "+R(t));if(null!=e&&(e=new M(e)),r=t.e>14,!h.c||!h.c[0]||1==h.c[0]&&!h.e&&1==h.c.length||!t.c||!t.c[0])return c=new M(Math.pow(+R(h),r?t.s*(2-ve(t)):+R(t))),e?c.mod(e):c;if(a=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new M(NaN);(s=!a&&h.isInteger()&&e.isInteger())&&(h=h.mod(e))}else{if(t.e>9&&(h.e>0||h.e<-1||(0==h.e?h.c[0]>1||r&&h.c[1]>=24e7:h.c[0]<8e13||r&&h.c[0]<=9999975e7)))return o=h.s<0&&ve(t)?-0:0,h.e>-1&&(o=1/o),new M(a?1/o:o);k&&(o=ne(k/ce+2))}for(r?(i=new M(.5),a&&(t.s=1),l=ve(t)):l=(n=Math.abs(+R(t)))%2,c=new M(p);;){if(l){if(!(c=c.times(h)).c)break;o?c.c.length>o&&(c.c.length=o):s&&(c=c.mod(e))}if(n){if(0===(n=oe(n/2)))break;l=n%2}else if(P(t=t.times(i),t.e+1,1),t.e>14)l=ve(t);else{if(0===(n=+R(t)))break;l=n%2}h=h.times(h),o?h.c&&h.c.length>o&&(h.c.length=o):s&&(h=h.mod(e))}return s?c:(a&&(c=p.div(c)),e?c.mod(e):o?P(c,k,g,void 0):c)},u.integerValue=function(t){var e=new M(this);return null==t?t=g:fe(t,0,8),P(e,e.e+1,t)},u.isEqualTo=u.eq=function(t,e){return 0===me(this,new M(t,e))},u.isFinite=function(){return!!this.c},u.isGreaterThan=u.gt=function(t,e){return me(this,new M(t,e))>0},u.isGreaterThanOrEqualTo=u.gte=function(t,e){return 1===(e=me(this,new M(t,e)))||0===e},u.isInteger=function(){return!!this.c&&_e(this.e/ce)>this.c.length-2},u.isLessThan=u.lt=function(t,e){return me(this,new M(t,e))<0},u.isLessThanOrEqualTo=u.lte=function(t,e){return-1===(e=me(this,new M(t,e)))||0===e},u.isNaN=function(){return!this.s},u.isNegative=function(){return this.s<0},u.isPositive=function(){return this.s>0},u.isZero=function(){return!!this.c&&0==this.c[0]},u.minus=function(t,e){var i,s,n,o,r=this,a=r.s;if(e=(t=new M(t,e)).s,!a||!e)return new M(NaN);if(a!=e)return t.s=-e,r.plus(t);var l=r.e/ce,c=t.e/ce,h=r.c,d=t.c;if(!l||!c){if(!h||!d)return h?(t.s=-e,t):new M(d?r:NaN);if(!h[0]||!d[0])return d[0]?(t.s=-e,t):new M(h[0]?r:3==g?-0:0)}if(l=_e(l),c=_e(c),h=h.slice(),a=l-c){for((o=a<0)?(a=-a,n=h):(c=l,n=d),n.reverse(),e=a;e--;n.push(0));n.reverse()}else for(s=(o=(a=h.length)<(e=d.length))?a:e,a=e=0;e0)for(;e--;h[i++]=0);for(e=le-1;s>a;){if(h[--s]=0;){for(i=0,u=y[n]%m,p=y[n]/m|0,o=n+(r=l);o>n;)i=((c=u*(c=v[--r]%m)+(a=p*c+(h=v[r]/m|0)*u)%m*m+_[o]+i)/g|0)+(a/m|0)+p*h,_[o--]=c%g;_[o]=i}return i?++s:_.splice(0,1),T(t,_,s)},u.negated=function(){var t=new M(this);return t.s=-t.s||null,t},u.plus=function(t,e){var i,s=this,n=s.s;if(e=(t=new M(t,e)).s,!n||!e)return new M(NaN);if(n!=e)return t.s=-e,s.minus(t);var o=s.e/ce,r=t.e/ce,a=s.c,l=t.c;if(!o||!r){if(!a||!l)return new M(n/0);if(!a[0]||!l[0])return l[0]?t:new M(a[0]?s:0*n)}if(o=_e(o),r=_e(r),a=a.slice(),n=o-r){for(n>0?(r=o,i=l):(n=-n,i=a),i.reverse();n--;i.push(0));i.reverse()}for((n=a.length)-(e=l.length)<0&&(i=l,l=a,a=i,e=n),n=0;e;)n=(a[--e]=a[e]+l[e]+n)/le|0,a[e]=le===a[e]?0:a[e]%le;return n&&(a=[n].concat(a),++r),T(t,a,r)},u.precision=u.sd=function(t,e){var i,s,n,o=this;if(null!=t&&t!==!!t)return fe(t,1,pe),null==e?e=g:fe(e,0,8),P(new M(o),t,e);if(!(i=o.c))return null;if(s=(n=i.length-1)*ce+1,n=i[n]){for(;n%10==0;n/=10,s--);for(n=i[0];n>=10;n/=10,s++);}return t&&o.e+1>s&&(s=o.e+1),s},u.shiftedBy=function(t){return fe(t,-9007199254740991,he),this.times("1e"+t)},u.squareRoot=u.sqrt=function(){var t,e,s,n,o,r=this,a=r.c,l=r.s,c=r.e,h=_+4,d=new M("0.5");if(1!==l||!a||!a[0])return new M(!l||l<0&&(!a||a[0])?NaN:a?r:1/0);if(0==(l=Math.sqrt(+R(r)))||l==1/0?(((e=ge(a)).length+c)%2==0&&(e+="0"),l=Math.sqrt(+e),c=_e((c+1)/2)-(c<0||c%2),s=new M(e=l==1/0?"5e"+c:(e=l.toExponential()).slice(0,e.indexOf("e")+1)+c)):s=new M(l+""),s.c[0])for((l=(c=s.e)+h)<3&&(l=0);;)if(o=s,s=d.times(o.plus(i(r,o,h,1))),ge(o.c).slice(0,l)===(e=ge(s.c)).slice(0,l)){if(s.e0&&_>0){for(o=_%a||a,h=p.substr(0,o);o<_;o+=a)h+=c+p.substr(o,a);l>0&&(h+=c+p.slice(o)),u&&(h="-"+h)}s=d?h+(i.decimalSeparator||"")+((l=+i.fractionGroupSize)?d.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(i.fractionGroupSeparator||"")):d):h}return(i.prefix||"")+s+(i.suffix||"")},u.toFraction=function(t){var e,s,n,o,r,a,l,c,h,d,u,_,m=this,f=m.c;if(null!=t&&(!(l=new M(t)).isInteger()&&(l.c||1!==l.s)||l.lt(p)))throw Error(re+"Argument "+(l.isInteger()?"out of range: ":"not an integer: ")+R(l));if(!f)return new M(m);for(e=new M(p),h=s=new M(p),n=c=new M(p),_=ge(f),r=e.e=_.length-m.e-1,e.c[0]=de[(a=r%ce)<0?ce+a:a],t=!t||l.comparedTo(e)>0?r>0?e:h:l,a=y,y=1/0,l=new M(_),c.c[0]=0;d=i(l,e,0,1),1!=(o=s.plus(d.times(n))).comparedTo(t);)s=n,n=o,h=c.plus(d.times(o=h)),c=o,e=l.minus(d.times(o=e)),l=o;return o=i(t.minus(s),n,0,1),c=c.plus(o.times(h)),s=s.plus(o.times(n)),c.s=h.s=m.s,u=i(h,n,r*=2,g).minus(m).abs().comparedTo(i(c,s,r,g).minus(m).abs())<1?[h,n]:[c,s],y=a,u},u.toNumber=function(){return+R(this)},u.toPrecision=function(t,e){return null!=t&&fe(t,1,pe),C(this,t,e,2)},u.toString=function(t){var e,i=this,n=i.s,o=i.e;return null===o?n?(e="Infinity",n<0&&(e="-"+e)):e="NaN":(null==t?e=o<=m||o>=f?ye(ge(i.c),o):be(ge(i.c),o,"0"):10===t&&S?e=be(ge((i=P(new M(i),_+o+1,g)).c),i.e,"0"):(fe(t,2,$.length,"Base"),e=s(be(ge(i.c),o,"0"),10,t,n,!0)),n<0&&i.c[0]&&(e="-"+e)),e},u.valueOf=u.toJSON=function(){return R(this)},u._isBigNumber=!0,u[Symbol.toStringTag]="BigNumber",u[Symbol.for("nodejs.util.inspect.custom")]=u.valueOf,null!=e&&M.set(e),M}(),ke=class{key;left=null;right=null;constructor(t){this.key=t}},xe=class extends ke{constructor(t){super(t)}},$e=class{size=0;modificationCount=0;splayCount=0;splay(t){const e=this.root;if(null==e)return this.compare(t,t),-1;let i=null,s=null,n=null,o=null,r=e;const a=this.compare;let l;for(;;)if(l=a(r.key,t),l>0){let e=r.left;if(null==e)break;if(l=a(e.key,t),l>0&&(r.left=e.right,e.right=r,r=e,e=r.left,null==e))break;null==i?s=r:i.left=r,i=r,r=e}else{if(!(l<0))break;{let e=r.right;if(null==e)break;if(l=a(e.key,t),l<0&&(r.right=e.left,e.left=r,r=e,e=r.right,null==e))break;null==n?o=r:n.right=r,n=r,r=e}}return null!=n&&(n.right=r.left,r.left=o),null!=i&&(i.left=r.right,r.right=s),this.root!==r&&(this.root=r,this.splayCount++),l}splayMin(t){let e=t,i=e.left;for(;null!=i;){const t=i;e.left=t.right,t.right=e,e=t,i=e.left}return e}splayMax(t){let e=t,i=e.right;for(;null!=i;){const t=i;e.right=t.left,t.left=e,e=t,i=e.right}return e}_delete(t){if(null==this.root)return null;if(0!=this.splay(t))return null;let e=this.root;const i=e,s=e.left;if(this.size--,null==s)this.root=e.right;else{const t=e.right;e=this.splayMax(s),e.right=t,this.root=e}return this.modificationCount++,i}addNewRoot(t,e){this.size++,this.modificationCount++;const i=this.root;null!=i?(e<0?(t.left=i,t.right=i.right,i.right=null):(t.right=i,t.left=i.left,i.left=null),this.root=t):this.root=t}_first(){const t=this.root;return null==t?null:(this.root=this.splayMin(t),this.root)}_last(){const t=this.root;return null==t?null:(this.root=this.splayMax(t),this.root)}clear(){this.root=null,this.size=0,this.modificationCount++}has(t){return this.validKey(t)&&0==this.splay(t)}defaultCompare(){return(t,e)=>te?1:0}wrap(){return{getRoot:()=>this.root,setRoot:t=>{this.root=t},getSize:()=>this.size,getModificationCount:()=>this.modificationCount,getSplayCount:()=>this.splayCount,setSplayCount:t=>{this.splayCount=t},splay:t=>this.splay(t),has:t=>this.has(t)}}},Se=class t extends $e{root=null;compare;validKey;constructor(t,e){super(),this.compare=t??this.defaultCompare(),this.validKey=e??(t=>null!=t&&null!=t)}delete(t){return!!this.validKey(t)&&null!=this._delete(t)}deleteAll(t){for(const e of t)this.delete(e)}forEach(t){const e=this[Symbol.iterator]();let i;for(;i=e.next(),!i.done;)t(i.value,i.value,this)}add(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this}addAndReturn(t){const e=this.splay(t);return 0!=e&&this.addNewRoot(new xe(t),e),this.root.key}addAll(t){for(const e of t)this.add(e)}isEmpty(){return null==this.root}isNotEmpty(){return null!=this.root}single(){if(0==this.size)throw"Bad state: No element";if(this.size>1)throw"Bad state: Too many element";return this.root.key}first(){if(0==this.size)throw"Bad state: No element";return this._first().key}last(){if(0==this.size)throw"Bad state: No element";return this._last().key}lastBefore(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)<0)return this.root.key;let e=this.root.left;if(null==e)return null;let i=e.right;for(;null!=i;)e=i,i=e.right;return e.key}firstAfter(t){if(null==t)throw"Invalid arguments(s)";if(null==this.root)return null;if(this.splay(t)>0)return this.root.key;let e=this.root.right;if(null==e)return null;let i=e.left;for(;null!=i;)e=i,i=e.left;return e.key}retainAll(e){const i=new t(this.compare,this.validKey),s=this.modificationCount;for(const t of e){if(s!=this.modificationCount)throw"Concurrent modification during iteration.";this.validKey(t)&&0==this.splay(t)&&i.add(this.root.key)}i.size!=this.size&&(this.root=i.root,this.size=i.size,this.modificationCount++)}lookup(t){if(!this.validKey(t))return null;return 0!=this.splay(t)?null:this.root.key}intersection(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)&&i.add(t);return i}difference(e){const i=new t(this.compare,this.validKey);for(const t of this)e.has(t)||i.add(t);return i}union(t){const e=this.clone();return e.addAll(t),e}clone(){const e=new t(this.compare,this.validKey);return e.size=this.size,e.root=this.copyNode(this.root),e}copyNode(t){if(null==t)return null;const e=new xe(t.key);return function t(e,i){let s,n;do{if(s=e.left,n=e.right,null!=s){const e=new xe(s.key);i.left=e,t(s,e)}if(null!=n){const t=new xe(n.key);i.right=t,e=n,i=t}}while(null!=n)}(t,e),e}toSet(){return this.clone()}entries(){return new De(this.wrap())}keys(){return this[Symbol.iterator]()}values(){return this[Symbol.iterator]()}[Symbol.iterator](){return new Ce(this.wrap())}[Symbol.toStringTag]="[object Set]"},Me=class{tree;path=new Array;modificationCount=null;splayCount;constructor(t){this.tree=t,this.splayCount=t.getSplayCount()}[Symbol.iterator](){return this}next(){return this.moveNext()?{done:!1,value:this.current()}:{done:!0,value:null}}current(){if(!this.path.length)return null;const t=this.path[this.path.length-1];return this.getValue(t)}rebuildPath(t){this.path.splice(0,this.path.length),this.tree.splay(t),this.path.push(this.tree.getRoot()),this.splayCount=this.tree.getSplayCount()}findLeftMostDescendent(t){for(;null!=t;)this.path.push(t),t=t.left}moveNext(){if(this.modificationCount!=this.tree.getModificationCount()){if(null==this.modificationCount){this.modificationCount=this.tree.getModificationCount();let t=this.tree.getRoot();for(;null!=t;)this.path.push(t),t=t.left;return this.path.length>0}throw"Concurrent modification during iteration."}if(!this.path.length)return!1;this.splayCount!=this.tree.getSplayCount()&&this.rebuildPath(this.path[this.path.length-1].key);let t=this.path[this.path.length-1],e=t.right;if(null!=e){for(;null!=e;)this.path.push(e),e=e.left;return!0}for(this.path.pop();this.path.length&&this.path[this.path.length-1].right===t;)t=this.path.pop();return this.path.length>0}},Ce=class extends Me{getValue(t){return t.key}},De=class extends Me{getValue(t){return[t.key,t.key]}},Te=t=>()=>t,Pe=t=>{const e=t?(e,i)=>i.minus(e).abs().isLessThanOrEqualTo(t):Te(!1);return(t,i)=>e(t,i)?0:t.comparedTo(i)};function Re(t){const e=t?(e,i,s,n,o)=>e.exponentiatedBy(2).isLessThanOrEqualTo(n.minus(i).exponentiatedBy(2).plus(o.minus(s).exponentiatedBy(2)).times(t)):Te(!1);return(t,i,s)=>{const n=t.x,o=t.y,r=s.x,a=s.y,l=o.minus(a).times(i.x.minus(r)).minus(n.minus(r).times(i.y.minus(a)));return e(l,n,o,r,a)?0:l.comparedTo(0)}}var Ae=t=>t,Ie=t=>{if(t){const e=new Se(Pe(t)),i=new Se(Pe(t)),s=(t,e)=>e.addAndReturn(t),n=t=>({x:s(t.x,e),y:s(t.y,i)});return n({x:new we(0),y:new we(0)}),n}return Ae},Fe=t=>({set:t=>{Ee=Fe(t)},reset:()=>Fe(t),compare:Pe(t),snap:Ie(t),orient:Re(t)}),Ee=Fe(),ze=(t,e)=>t.ll.x.isLessThanOrEqualTo(e.x)&&e.x.isLessThanOrEqualTo(t.ur.x)&&t.ll.y.isLessThanOrEqualTo(e.y)&&e.y.isLessThanOrEqualTo(t.ur.y),Oe=(t,e)=>{if(e.ur.x.isLessThan(t.ll.x)||t.ur.x.isLessThan(e.ll.x)||e.ur.y.isLessThan(t.ll.y)||t.ur.y.isLessThan(e.ll.y))return null;const i=t.ll.x.isLessThan(e.ll.x)?e.ll.x:t.ll.x,s=t.ur.x.isLessThan(e.ur.x)?t.ur.x:e.ur.x;return{ll:{x:i,y:t.ll.y.isLessThan(e.ll.y)?e.ll.y:t.ll.y},ur:{x:s,y:t.ur.y.isLessThan(e.ur.y)?t.ur.y:e.ur.y}}},He=(t,e)=>t.x.times(e.y).minus(t.y.times(e.x)),Ne=(t,e)=>t.x.times(e.x).plus(t.y.times(e.y)),Le=t=>Ne(t,t).sqrt(),Be=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return He(n,s).div(Le(n)).div(Le(s))},qe=(t,e,i)=>{const s={x:e.x.minus(t.x),y:e.y.minus(t.y)},n={x:i.x.minus(t.x),y:i.y.minus(t.y)};return Ne(n,s).div(Le(n)).div(Le(s))},je=(t,e,i)=>e.y.isZero()?null:{x:t.x.plus(e.x.div(e.y).times(i.minus(t.y))),y:i},We=(t,e,i)=>e.x.isZero()?null:{x:i,y:t.y.plus(e.y.div(e.x).times(i.minus(t.x)))},Ue=class t{point;isLeft;segment;otherSE;consumedBy;static compare(e,i){const s=t.comparePoints(e.point,i.point);return 0!==s?s:(e.point!==i.point&&e.link(i),e.isLeft!==i.isLeft?e.isLeft?1:-1:Qe.compare(e.segment,i.segment))}static comparePoints(t,e){return t.x.isLessThan(e.x)?-1:t.x.isGreaterThan(e.x)?1:t.y.isLessThan(e.y)?-1:t.y.isGreaterThan(e.y)?1:0}constructor(t,e){void 0===t.events?t.events=[this]:t.events.push(this),this.point=t,this.isLeft=e}link(t){if(t.point===this.point)throw new Error("Tried to link already linked events");const e=t.point.events;for(let t=0,i=e.length;t{const s=i.otherSE;e.set(i,{sine:Be(this.point,t.point,s.point),cosine:qe(this.point,t.point,s.point)})};return(t,s)=>{e.has(t)||i(t),e.has(s)||i(s);const{sine:n,cosine:o}=e.get(t),{sine:r,cosine:a}=e.get(s);return n.isGreaterThanOrEqualTo(0)&&r.isGreaterThanOrEqualTo(0)?o.isLessThan(a)?1:o.isGreaterThan(a)?-1:0:n.isLessThan(0)&&r.isLessThan(0)?o.isLessThan(a)?-1:o.isGreaterThan(a)?1:0:r.isLessThan(n)?-1:r.isGreaterThan(n)?1:0}}},Ge=class t{events;poly;_isExteriorRing;_enclosingRing;static factory(e){const i=[];for(let s=0,n=e.length;s0&&(t=i)}let e=t.segment.prevInResult(),i=e?e.prevInResult():null;for(;;){if(!e)return null;if(!i)return e.ringOut;if(i.ringOut!==e.ringOut)return i.ringOut?.enclosingRing()!==e.ringOut?e.ringOut:e.ringOut?.enclosingRing();e=i.prevInResult(),i=e?e.prevInResult():null}}},Ve=class{exteriorRing;interiorRings;constructor(t){this.exteriorRing=t,t.poly=this,this.interiorRings=[]}addInterior(t){this.interiorRings.push(t),t.poly=this}getGeom(){const t=this.exteriorRing.getGeom();if(null===t)return null;const e=[t];for(let t=0,i=this.interiorRings.length;t0?(this.tree.delete(e),i.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&n){const t=s.getIntersection(n);if(null!==t){if(!s.isAnEndpoint(t)){const e=this._splitSafely(s,t);for(let t=0,s=e.length;t0)return-1;const s=e.comparePoint(t.rightSE.point);return 0!==s?s:-1}if(i.isGreaterThan(s)){if(r.isLessThan(a)&&r.isLessThan(c))return-1;if(r.isGreaterThan(a)&&r.isGreaterThan(c))return 1;const i=e.comparePoint(t.leftSE.point);if(0!==i)return i;const s=t.comparePoint(e.rightSE.point);return s<0?1:s>0?-1:1}if(r.isLessThan(a))return-1;if(r.isGreaterThan(a))return 1;if(n.isLessThan(o)){const i=e.comparePoint(t.rightSE.point);if(0!==i)return i}if(n.isGreaterThan(o)){const i=t.comparePoint(e.rightSE.point);if(i<0)return 1;if(i>0)return-1}if(!n.eq(o)){const t=l.minus(r),e=n.minus(i),h=c.minus(a),d=o.minus(s);if(t.isGreaterThan(e)&&h.isLessThan(d))return 1;if(t.isLessThan(e)&&h.isGreaterThan(d))return-1}return n.isGreaterThan(o)?1:n.isLessThan(o)||l.isLessThan(c)?-1:l.isGreaterThan(c)?1:t.ide.id?1:0}constructor(t,e,i,s){this.id=++Ze,this.leftSE=t,t.segment=this,t.otherSE=e,this.rightSE=e,e.segment=this,e.otherSE=t,this.rings=i,this.windings=s}static fromRing(e,i,s){let n,o,r;const a=Ue.comparePoints(e,i);if(a<0)n=e,o=i,r=1;else{if(!(a>0))throw new Error(`Tried to create degenerate segment at [${e.x}, ${e.y}]`);n=i,o=e,r=-1}const l=new Ue(n,!0),c=new Ue(o,!1);return new t(l,c,[s],[r])}replaceRightSE(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}bbox(){const t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t.isLessThan(e)?t:e},ur:{x:this.rightSE.point.x,y:t.isGreaterThan(e)?t:e}}}vector(){return{x:this.rightSE.point.x.minus(this.leftSE.point.x),y:this.rightSE.point.y.minus(this.leftSE.point.y)}}isAnEndpoint(t){return t.x.eq(this.leftSE.point.x)&&t.y.eq(this.leftSE.point.y)||t.x.eq(this.rightSE.point.x)&&t.y.eq(this.rightSE.point.y)}comparePoint(t){return Ee.orient(this.leftSE.point,t,this.rightSE.point)}getIntersection(t){const e=this.bbox(),i=t.bbox(),s=Oe(e,i);if(null===s)return null;const n=this.leftSE.point,o=this.rightSE.point,r=t.leftSE.point,a=t.rightSE.point,l=ze(e,r)&&0===this.comparePoint(r),c=ze(i,n)&&0===t.comparePoint(n),h=ze(e,a)&&0===this.comparePoint(a),d=ze(i,o)&&0===t.comparePoint(o);if(c&&l)return d&&!h?o:!d&&h?a:null;if(c)return h&&n.x.eq(a.x)&&n.y.eq(a.y)?null:n;if(l)return d&&o.x.eq(r.x)&&o.y.eq(r.y)?null:r;if(d&&h)return null;if(d)return o;if(h)return a;const u=((t,e,i,s)=>{if(e.x.isZero())return We(i,s,t.x);if(s.x.isZero())return We(t,e,i.x);if(e.y.isZero())return je(i,s,t.y);if(s.y.isZero())return je(t,e,i.y);const n=He(e,s);if(n.isZero())return null;const o={x:i.x.minus(t.x),y:i.y.minus(t.y)},r=He(o,e).div(n),a=He(o,s).div(n),l=t.x.plus(a.times(e.x)),c=i.x.plus(r.times(s.x)),h=t.y.plus(a.times(e.y)),d=i.y.plus(r.times(s.y));return{x:l.plus(c).div(2),y:h.plus(d).div(2)}})(n,this.vector(),r,t.vector());return null===u?null:ze(s,u)?Ee.snap(u):null}split(e){const i=[],s=void 0!==e.events,n=new Ue(e,!0),o=new Ue(e,!1),r=this.rightSE;this.replaceRightSE(o),i.push(o),i.push(n);const a=new t(n,r,this.rings.slice(),this.windings.slice());return Ue.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Ue.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),s&&(n.checkForConsuming(),o.checkForConsuming()),i}swapEvents(){const t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(let t=0,e=this.windings.length;t0){const t=i;i=s,s=t}if(i.prev===s){const t=i;i=s,s=t}for(let t=0,e=s.rings.length;t1===t.length&&t[0].isSubject;this._isInResult=i(t)!==i(e);break}}return this._isInResult}},ti=class{poly;isExterior;segments;bbox;constructor(t,e,i){if(!Array.isArray(t)||0===t.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=e,this.isExterior=i,this.segments=[],"number"!=typeof t[0][0]||"number"!=typeof t[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");const s=Ee.snap({x:new we(t[0][0]),y:new we(t[0][1])});this.bbox={ll:{x:s.x,y:s.y},ur:{x:s.x,y:s.y}};let n=s;for(let e=1,i=t.length;eJe.run("union",t,e),ni=(t,...e)=>Je.run("intersection",t,e),oi=(t,...e)=>Je.run("difference",t,e);function ri(t){const e=Math.max(0,Math.min(120,(t-40)/140*120));return`hsl(${Math.round(e)}, 85%, 55%)`}function ai(t,e){if(!(Number.isFinite(t)&&e>0))return t;const i=Math.round(t/e)*e;return Math.abs(i-t)<=1e-9*e?t:i}function li(t,e){if(e){const e=t/2.54;let i=Math.floor(e/12),s=Math.round(e-12*i);return 12===s&&(i+=1,s=0),`${i}′ ${s}″`}return`${(t/100).toFixed(2)} m`}function ci(t,e,i=1){const s=t[0].toFixed(i),n=t[1].toFixed(i),o=e[0].toFixed(i),r=e[1].toFixed(i),a=s=3?t.poly:t&&null!=t.x&&null!=t.y&&null!=t.w&&null!=t.h?[[t.x,t.y],[t.x+t.w,t.y],[t.x+t.w,t.y+t.h],[t.x,t.y+t.h]]:null}function di(t){const e=[];for(const i of t||[])i?.poly?.length>=3?e.push({poly:i.poly.map(t=>t.join(",")).join(" ")}):i&&null!=i.x&&null!=i.y&&null!=i.w&&null!=i.h&&e.push({rect:{x:i.x,y:i.y,w:i.w,h:i.h,rx:.03*Math.min(i.w,i.h)}});return e}function ui(t){const e=[],i=new Set;for(const s of t||[]){const t=hi(s);if(t)for(let s=0;s=90?t-=180:t<-90&&(t+=180),s.step&&s.step>0){const i=Math.sqrt(d),o=Math.min(Math.max(s.length||0,0)/2,i/2);let a=Math.round(u*i/s.step)*s.step;Math.abs(u*i-i/2)<=s.step/2&&(a=i/2),a=Math.max(o,Math.min(i-o,a));const l=a/i;n={x:e+l*c,y:r+l*h,angle:t}}else n={x:p[0],y:p[1],angle:t}}}return n}function _i(t,e,i,s,n,o=1){const r=e*Math.PI/180,a=[Math.cos(r),Math.sin(r)];let l=null,c=o;for(const e of ui(s)){const i=[[e[0],e[1]],[e[2],e[3]]],s=e=>Math.abs(a[0]*(e[1]-t[1])-a[1]*(e[0]-t[0]));if(s(i[0])>o||s(i[1])>o)continue;const n=(i[0][0]-t[0])*a[0]+(i[0][1]-t[1])*a[1],r=(i[1][0]-t[0])*a[0]+(i[1][1]-t[1])*a[1],h=Math.min(n,r),d=Math.max(n,r),u=h>0?h:d<0?-d:0;u[t[0]+a[0]*e,t[1]+a[1]*e],m=(h+d)/2;return{wallA:g(h),wallB:g(d),sideA:p,sideB:_,midA:g((h-u)/2),midB:g((u+d)/2),wallCenter:g(m),centered:Math.abs(m)<=n}}function gi(t,e,i=!1){if("passage"===t)return 1;if(null==e||"unavailable"===e||"unknown"===e)return"window"===t?0:1;const s=function(t){return["on","open","home","detected","playing","cleaning"].includes(String(t))}(e)!==!!i;return s?1:0}function mi(t){return"passage"===t.type?[]:[t.contact,t.lock].filter(t=>"string"==typeof t&&t.length>0)}function fi(t,e,i=.001){return Math.abs(t[0]-e[0])t[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}function yi(t,e,i){const s=i[0]-e[0],n=i[1]-e[1],o=s*s+n*n;let r=o?((t[0]-e[0])*s+(t[1]-e[1])*n)/o:0;return r=Math.max(0,Math.min(1,r)),Math.hypot(t[0]-(e[0]+r*s),t[1]-(e[1]+r*n))}function bi(t,e,i=1e-6){if(!e||e.length<2)return!1;for(let s=0;sn&&r<-n||o<-n&&r>n)&&(a>n&&l<-n||a<-n&&l>n)}function $i(t,e=24){const i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1;let c=0,h=0,d=0;for(let e=0;e1e-9?[h/(3*c),d/(3*c)]:[(n+o)/2,(r+a)/2],p=(e,i)=>{const s=((e,i)=>{if(!vi([e,i],t))return-1/0;let s=1/0;for(let n=0;ng&&(g=c,_=[s,l])}if(_){const[t,i]=_,s=(o-n)/e,l=(a-r)/e;for(let e=-4;e<=4;e++)for(let n=-4;n<=4;n++){const o=t+s*e/4,r=i+l*n/4,a=p(o,r);a>g&&(g=a,_=[o,r])}}return _||Si(t)||t[0]}function Si(t,e=1e-6){if(!t||t.length<3)return null;const i=t.length,s=[t.reduce((t,e)=>t+e[0],0)/i,t.reduce((t,e)=>t+e[1],0)/i];if(wi(s,t,e))return s;for(let s=0;sCi(t,e,i));return s.filter(t=>!s.some(e=>e!==t&&Ci(e,t,i)))}function Pi(t){if(!t||t.length<3)return 0;let e=0;for(let i=0;i[t[0],t[1]]),[t[0][0],t[0][1]]]]}function Ai(t,e,i){for(let s=0;s1&&fi(i[0],i[i.length-1],e)&&i.pop(),i}function Fi(t,e,i=1e-6){if(!t||t.length<3||!e||e.length<2)return null;const s=e[0],n=e[e.length-1];if(fi(s,n,i))return null;const o=Ai(t,s,i),r=Ai(t,n,i);if(o<0||r<0)return null;const a=e.slice(1,-1);for(const e of a)if(!wi(e,t,i))return null;for(let i=0;i{const r=[e];let a=(s+1)%t.length;for(let e=0;e<=t.length&&(r.push(t[a]),a!==o);e++)a=(a+1)%t.length;return r.push(n),Ii(r,i)};let c,h;if(o===r){const r=Ii([...e],i);if(r.length<3||Pi(r)<=i)return null;const a=[];for(let i=0;i=0?e:[...e].reverse();for(const t of i)a.push(t)}c=Ii(a,i),h=r}else c=Ii([...l(s,o,n,r),...[...a].reverse()],i),h=Ii([...l(n,r,s,o),...a],i);return c.length<3||h.length<3||Pi(c)<=i||Pi(h)<=i||Math.abs(Pi(c)+Pi(h)-Pi(t))>Math.max(i,1e-6*Pi(t))?null:[c,h]}function Ei(t,e,i){const[s,n]=t.split(":");return"device"===s?n:"entity"===s?"lg_"+n:e&&e.startsWith("v_")?e:i()}function zi(t){return t.length?Math.round(t.reduce((t,e)=>t+e,0)/t.length):null}function Oi(t,e){if(e>t[2]/t[3]){const i=t[3],s=t[3]*e;return{x:t[0]-(s-t[2])/2,y:t[1],w:s,h:i}}const i=t[2],s=t[2]/e;return{x:t[0],y:t[1]-(s-t[3])/2,w:i,h:s}}function Hi(t,e,i,s){if(t.length<2)return;const n=e.x+s,o=e.x+e.w-s,r=e.y+s,a=e.y+e.h-s;for(let e=0;e<60;e++){let e=!1;for(let s=0;s=0)i=e.slice(0,n).trim(),s=e.slice(n+1).trim();else{const t=e.split(".");t.length>2&&(i=t.slice(0,2).join("."),s=t.slice(2).join("."))}return/^[a-z0-9_]+\.[a-z0-9_]+$/.test(i)?n>=0&&!s||s&&!/^[a-zA-Z0-9_.-]+$/.test(s)?null:s?{entity:i,attr:s}:{entity:i}:null}function Xi(t,e){const i=String(t??"").trim(),s=String(e??"").trim(),n=Yi(s?`${i}:${s}`:i);return n?`{${n.entity}${n.attr?`:${n.attr}`:""}}`:""}function Ji(t,e,i){const s=String(e??"").trim();if(!s)return null;const n=t?.states?.[s];if(!n)return null;const o=String(i??"").trim(),r=t=>t.slice(0,60);if(o){const e=function(t){if(null==t)return null;if(Array.isArray(t)){const e=t.map(t=>null==t?"":String(t)).join(", ");return e?e.slice(0,60):null}if("object"==typeof t)return null;const e=String(t);return""===e?null:e.slice(0,60)}(n.attributes?.[o]);if(null===e)return null;const i=t?.formatEntityAttributeValue;if("function"==typeof i)try{const e=i.call(t,n,o);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:e,formatted:!1}}const a=n.state;if(null==a||""===a)return null;const l=t?.formatEntityState;if("function"==typeof l)try{const e=l.call(t,n);if("string"==typeof e&&""!==e)return{text:r(e),formatted:!0}}catch{}return{text:r(String(a)),formatted:!1}}function Zi(t,e,i){const s=String(e??"").trim(),n=String(i??"").trim()||s;if(!n)return t.text;const o=t.formatted&&s?function(t,e){if(!e)return t;const i=t.replace(/\s+$/,"");return i.endsWith(e)?i.slice(0,i.length-e.length).replace(/\s+$/,""):t}(t.text,s):t.text;return`${o} ${n}`}function Qi(t,e){const i=(e?.entity||"").trim();if(!i)return"";const s=t?.states?.[i],n=s?.state;if(!s||null==n||""===n||"unavailable"===n||"unknown"===n)return Vi;const o=(e?.attr||"").trim(),r=Ji(t,i,o||null);if(null===r)return Vi;return Zi(r,o?"":String(s.attributes?.unit_of_measurement??"").trim(),e?.unit)}function ts(t,e,i,s=()=>!0){const n=t??"";let o=!1;const r=n.replace(/\{([^{}\r\n]+)\}/g,(t,e)=>{const n=Yi(e);return n?(o=!0,s(n.entity||"")?Qi(i,n):Vi):t});if(o)return r;const a=(e?.entity||"").trim();if(!a)return n;if(!s(a)){const t=n.indexOf(Ki);return t>=0?n.slice(0,t)+Vi+n.slice(t+2):n?`${n} ${Vi}`:Vi}const l=Qi(i,e),c=n.indexOf(Ki);return c>=0?n.slice(0,c)+l+n.slice(c+2):n?`${n} ${l}`:l}const es=20;function is(t){const e=Number(t?.scale);if(Number.isFinite(e)&&e>0)return Math.min(20,Math.max(.15,e));return{s:.7,m:1,l:1.5}[String(t?.size??"")]??1}function ss(t,e){if(!e)return t;let i=t;for(const[t,s]of Object.entries(e))i=i.split("{"+t+"}").join(String(s));return i}const ns="#55606c",os=.55,rs={c:"#607d8b",a:.18};function as(t,e=rs){const i=t&&"object"==typeof t?t:null,s=i?.a;return{c:Rt(i?.c,e.c),a:"number"==typeof s&&Number.isFinite(s)?Math.min(1,Math.max(0,s)):e.a}}function ls(t,e){const i=as(t),s=e?.settings?.custom_fill;return s&&"object"==typeof s?as(s,i):i}function cs(t){const e=t?.settings||{},i=!t?.plan_url,s="glow"===e.fill_mode;return{showBorders:e.show_borders??i,showNames:e.show_names??i,color:Rt(e.room_color,ns),opacity:"number"==typeof e.room_opacity?Math.min(1,Math.max(0,e.room_opacity)):os,fill:["lqi","light","temp","custom"].includes(e.fill_mode)?e.fill_mode:"none",customFill:as(e.custom_fill),glow:"boolean"==typeof e.glow_enabled?e.glow_enabled:s,tempMin:"number"==typeof e.temp_min?e.temp_min:20,tempMax:"number"==typeof e.temp_max?e.temp_max:25,showLqi:"boolean"==typeof e.show_lqi?e.show_lqi:null,cardFontScale:"number"==typeof e.card_font_scale&&e.card_font_scale>0?Math.min(3,Math.max(.5,e.card_font_scale)):1,labelTemp:!0===e.label_temp,labelHum:!0===e.label_hum,labelLqi:!0===e.label_lqi,labelLight:!0===e.label_light,bgColor:Rt(e.bg_color,null),hideDecor:!0===e.hide_decor,hideOpenings:!0===e.hide_openings}}function hs(t,e){if(e.bgColor)return e.bgColor;const i=t?.bg_color;return Rt(i,"")}const ds={light_on:{c:"#ffd45c",a:.18},light_off:{c:"#9aa0a6",a:.14},light_none:{c:"#6b7480",a:0},temp_cold:{c:"#4fc3f7",a:.18},temp_ok:{c:"#66d17a",a:.18},temp_hot:{c:"#ffd45c",a:.18},lqi_low:{c:"#f25a4a",a:.18},lqi_high:{c:"#4bd28f",a:.18},glow_base:{c:"#0d1b2a",a:.5},glow_light:{c:"#ffd9a0",a:.85},wall_fill:{c:"#ffffff",a:1}};function us(t){const e={},i=t?.fill_colors||{};for(const t of Object.keys(ds)){const s=ds[t],n=i[t];e[t]={c:Rt(n?.c,s.c),a:n&&"number"==typeof n.a?Math.min(1,Math.max(0,n.a)):s.a}}return e}function ps(t,e,i){const s=Math.min(1,Math.max(0,i)),n=[1,3,5].map(e=>parseInt(t.slice(e,e+2),16)),o=[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),r=n.map((t,e)=>Math.round(t+(o[e]-t)*s));return"#"+r.map(t=>t.toString(16).padStart(2,"0")).join("")}function _s(t,e,i,s,n,o,r,a=rs){const l=function(t,e,i,s,n,o,r,a=rs){if("custom"===t)return as(a);if("lqi"===t){if(null==e)return null;const t=(e-40)/140;return{c:ps(r.lqi_low.c,r.lqi_high.c,t),a:r.lqi_low.a+(r.lqi_high.a-r.lqi_low.a)*Math.min(1,Math.max(0,t))}}if("light"===t)return"none"===i?r.light_none.a>0?r.light_none:null:"on"===i?r.light_on:r.light_off;if("temp"===t){if(null==s)return null;const t=Math.min(n,o),e=Math.max(n,o);return se?r.temp_hot:r.temp_ok}return null}(t,e,i,s,n,o,r,a);return l?{color:l.c,opacity:l.a,mode:t}:null}const gs={blind:["mdi:blinds","mdi:blinds-open"],shade:["mdi:blinds","mdi:blinds-open"],shutter:["mdi:window-shutter","mdi:window-shutter-open"],curtain:["mdi:curtains-closed","mdi:curtains"],window:["mdi:window-closed","mdi:window-open"],awning:["mdi:awning-outline","mdi:awning"],door:["mdi:door-closed","mdi:door-open"],garage:["mdi:garage","mdi:garage-open"],gate:["mdi:gate","mdi:gate-open"],damper:["mdi:circle-slice-8","mdi:circle-outline"]},ms=[["mdi:roller-shade-closed","mdi:roller-shade"],["mdi:blinds-horizontal-closed","mdi:blinds-horizontal"],["mdi:garage-variant","mdi:garage-open-variant"],["mdi:door","mdi:door-open"]];function fs(t){for(const e of[...Object.values(gs),...ms])if(t===e[0]||t===e[1])return e;return null}function vs(t,e,i,s,n){if(!s||"unavailable"===s||"unknown"===s)return t;if(n){const i="cover"===e?fs(t):null;return i?"closed"===s?i[0]:i[1]:t}if("binary_sensor"===e){if("door"===i)return"on"===s?"mdi:door-open":"mdi:door-closed";if("window"===i)return"on"===s?"mdi:window-open":"mdi:window-closed";if("garage_door"===i)return"on"===s?"mdi:garage-open-variant":"mdi:garage-variant"}if("cover"===e){const e=gs[String(i||"")];if(e)return"closed"===s?e[0]:e[1];const n=fs(t);return n?"closed"===s?n[0]:n[1]:t}return"lock"===e?"locked"===s?"mdi:lock":"mdi:lock-open-variant":"light"===e&&"mdi:lightbulb"===t&&"on"===s?"mdi:lightbulb-on":t}function ys(t){const e=Math.min(4e4,Math.max(1e3,t))/100,i=e<=66?255:329.698727446*Math.pow(e-60,-.1332047592),s=e<=66?99.4708025861*Math.log(e)-161.1195681661:288.1221695283*Math.pow(e-60,-.0755148492),n=e>=66?255:e<=19?0:138.5177312231*Math.log(e-10)-305.0447927307,o=t=>Math.round(Math.min(255,Math.max(0,t)));return[o(i),o(s),o(n)]}const bs=1/2.2;function ws(t){const e=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);return e?"#"+e.slice(1).map(t=>Math.min(255,Number(t)).toString(16).padStart(2,"0")).join(""):null}function ks(t){if(!t||"object"!=typeof t||Array.isArray(t))return null;const e=t;if(Object.keys(e).some(t=>"c"!==t&&"bri"!==t))return null;const i=Rt(e.c,null);return i?void 0===e.bri||null===e.bri?{c:i}:"number"!=typeof e.bri||!Number.isFinite(e.bri)||e.bri<.01||e.bri>1?null:{c:i,bri:e.bri}:null}function xs(t,e,i){const s=ks(e),n=t?.attributes||{},o=s?.bri??function(t){const e=t?.attributes?.brightness,i="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):Number.NaN;return Number.isFinite(i)?Math.max(0,Math.min(1,i/255)):1}(t);if(s)return{c:s.c,bri:o};const r=Ft(n.rgb_color);if(r)return{c:ws(r)||Rt(i,"#ffd9a0"),bri:o};const a=Number(n.color_temp_kelvin)||(Number(n.color_temp)>0?1e6/Number(n.color_temp):NaN);return Number.isFinite(a)&&a>0?{c:(l=ys(a),"#"+l.slice(0,3).map(t=>Math.min(255,Math.max(0,Math.round(Number(t)||0))).toString(16).padStart(2,"0")).join("")),bri:o}:{c:Rt(i,"#ffd9a0"),bri:o};var l}function $s(t,e,i){return"on"===t?.state?xs(t,e,i):null}function Ss(t,e=1){const i=Math.max(0,Math.min(1,Number.isFinite(t)?t:1)),s=.7*Math.max(0,Math.min(1,Number.isFinite(e)?e:1))*(.4+.6*Math.pow(i,bs));return Math.max(0,Math.min(1,s))}function Ms(t){return t.startsWith("light.")||t.startsWith("switch.")}function Cs(t,e,i=1e-6){const s=[];if(!t||!e||t.length<3||e.length<3)return s;for(let n=0;nu||l>u)continue;const p=(n[0]-o[0])*h+(n[1]-o[1])*d,_=(r[0]-o[0])*h+(r[1]-o[1])*d,g=Math.max(0,Math.min(p,_)),m=Math.min(c,Math.max(p,_));m-g>i&&s.push([o[0]+h*g,o[1]+d*g,o[0]+h*m,o[1]+d*m])}}return s}function Ds(t,e,i=1e-6){const s=[];for(const n of t){const t=[n[0],n[1]],o=[n[2],n[3]],r=o[0]-t[0],a=o[1]-t[1],l=Math.hypot(r,a);if(lo||n>o)continue;const r=(s[0]-t[0])*c+(s[1]-t[1])*h,a=(s[2]-t[0])*c+(s[3]-t[1])*h,u=Math.max(0,Math.min(r,a)),p=Math.min(l,Math.max(r,a));p-u>i&&d.push([u,p])}if(!d.length){s.push([t[0],t[1],o[0],o[1]]);continue}d.sort((t,e)=>t[0]-e[0]);let u=0;for(const[e,n]of d)e-u>i&&s.push([t[0]+c*u,t[1]+h*u,t[0]+c*e,t[1]+h*e]),u=Math.max(u,n);l-u>i&&s.push([t[0]+c*u,t[1]+h*u,o[0],o[1]])}return s}function Ts(t,e,i=1e-6){const s=[];for(let e=0;e{if("string"!=typeof t||!t)return;const i=Is(t);i.startsWith("/api/houseplan/content/")&&e.add(i)};for(const e of t?.spaces||[]){i(e?.plan_url);for(const t of e?.markers||[])for(const e of t?.pdfs||[])i(e?.url)}for(const e of t?.markers||[])for(const t of e?.pdfs||[])i(t?.url);return e}function Is(t){return t?t.startsWith("/houseplan_files/plans/")?"/api/houseplan/content/plans/_/"+t.slice(23):t.startsWith("/houseplan_files/files/")?"/api/houseplan/content/files/"+t.slice(23):t:""}function Fs(t,e){const i=e?.settings?.fill_mode;return"none"===i||"lqi"===i||"light"===i||"temp"===i||"custom"===i?i:t}function Es(t,e){const i=e?.settings;return"boolean"==typeof i?.glow?i.glow:"glow"===i?.fill_mode||t}function zs(t,e=1){const i=Number(t);return Number.isFinite(i)&&i>0?Math.min(3,Math.max(.5,i)):e}function Os(t,e){let i=180*Math.atan2(e[1]-t[1],e[0]-t[0])/Math.PI;return i<0&&(i+=360),i}function Hs(t,e=.5){const i=(t%45+45)%45;return i<=e||45-i<=e}function Ns(t,e){const i=e[2]-e[0],s=e[3]-e[1],n=i*i+s*s;if(!n)return Math.hypot(t[0]-e[0],t[1]-e[1]);let o=((t[0]-e[0])*i+(t[1]-e[1])*s)/n;return o=Math.max(0,Math.min(1,o)),Math.hypot(t[0]-(e[0]+o*i),t[1]-(e[1]+o*s))}const Ls=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);function Bs(t,e){return"alarm_control_panel"===t||"siren"===t||"binary_sensor"===t&&!!e&&Ls.has(e)}function qs(t){if(!t)return null;const e=t.indexOf("#");if(e<=0)return null;const i=t.slice(0,e),s=t.slice(e+1);if(!s)return null;if(s.startsWith("@")){const t=s.slice(1);return t?{space:i,area:null,roomId:t}:null}return{space:i,area:s,roomId:null}}const js={availability:"available",status:"alarm",activity:"none"},Ws=new Set(["motion","vibration","sound"]),Us=new Set(["occupancy","presence"]),Gs=new Set(["door","window","garage_door","opening"]),Vs=new Set(["running","power"]),Ks=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const Ys=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Xs=new Set([...Ys,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),Js=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Zs=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Qs=t=>""===t||"unknown"===t||"unavailable"===t||"__missing__"===t,tn=t=>String(t??"").trim().toLowerCase(),en=t=>tn(t).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),sn=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),nn=new Set(["wifi","connection","signal","battery"]);function on(t,e){const i=t?.entities?.[e]||{};if("config"===i.entity_category)return null;const s=String(e||"").split(".").slice(1).join("."),n=[i.translation_key,i.original_name,i.name],o=[...n,s];n.some(t=>tn(t))||o.push(t?.states?.[e]?.attributes?.friendly_name);const r=o.map(en).filter(Boolean);if(r.some(t=>t.split("_").some(t=>nn.has(t))))return null;let a=null;for(const t of r)for(const[e,i]of sn)(t===e||t.endsWith(`_${e}`))&&(a=null==a?i:Math.min(a,i));return a}const rn=(t,e)=>null!=on(t,e);function an(t,e){if(!e.startsWith("switch."))return!1;const i=t?.entities?.[e]||{},s=t?.states?.[e],n=e.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(n))return!0;if([i.translation_key,i.original_name,i.name].map(tn).some(t=>["power","main power","power switch","питание"].includes(t)))return!0;const o=tn(s?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function ln(t){for(const e of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=tn(t?.[e]);if(Ys.has(i)||Js.has(i))return i}return""}function cn(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n=String(e||"").split(".")[0],o=tn(i?.attributes?.device_class),r={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;if(function(t,e,i){return"alarm_control_panel"===t?"triggered"===i:"on"===i&&Bs(t,e)}(n,o,s))return{...r,status:"alarm"};if("binary_sensor"===n)return Ws.has(o)?{...r,edge:"rising"}:Us.has(o)?{...r,activity:"on"===s?"presence":"none"}:Gs.has(o)?{...r,status:"on"===s?"open":"neutral",edge:"rising"}:"moving"===o?{...r,activity:"on"===s?"transition":"none"}:Vs.has(o)&&"on"===s?{...r,status:"working",activity:"running"}:r;if("cover"===n)return{...r,activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("lock"===n)return{...r,status:"unlocked"===s||"open"===s?"open":"neutral",activity:"locking"===s||"unlocking"===s?"transition":"none",edge:"terminal_transition"};if("valve"===n)return{...r,status:["open","opening","closing"].includes(s)?"open":"neutral",activity:"opening"===s||"closing"===s?"transition":"none",edge:"terminal_transition"};if("climate"===n){const t=ln(i.attributes),e=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(tn):[],n=!Js.has(s)&&(Zs.has(s)||Ys.has(s)||e.includes(s));return(t?Ys.has(t):n)?{...r,status:"working",activity:"running"}:r}if(["light","switch","fan","humidifier"].includes(n))return"on"===s?{...r,status:"working",activity:"running"}:r;if("media_player"===n)return"off"===s?{...r,availability:"unavailable"}:r;if("vacuum"===n)return"cleaning"===s?{...r,status:"working",activity:"running"}:"returning"===s?{...r,status:"working",activity:"transition"}:r;if("script"===n)return"on"===s?{...r,status:"working",activity:"running"}:r;if("automation"===n)return r;if("button"===n||"event"===n)return{...r,edge:"change"};const a=ln(i.attributes);return Ys.has(a)||Ys.has(s)&&!Js.has(s)?{...r,status:"working",activity:"running"}:r}function hn(t,e,i){const s=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category),n=e.find(e=>an(t,e));if(!(s.length>1&&!!n))return e.map(e=>cn(t,e));const o=e.find(e=>e!==n&&rn(t,e)),r=cn(t,n);return"unavailable"===r.availability||"off"===r.state?e.map(e=>({eid:e,state:t?.states?.[e]?tn(t.states[e].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):e.map(e=>{if(e===o)return function(t,e){const i=t?.states?.[e],s=i?tn(i.state):"__missing__",n={eid:e,state:s,availability:Qs(s)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===n.availability)return n;const o=ln(i?.attributes);return Ys.has(o)||Xs.has(s)&&!Js.has(s)?{...n,status:"working",activity:"running"}:n}(t,e);return{...e===n?r:cn(t,e),status:"neutral",activity:"none",edge:"none"}})}function dn(t){if(!t.length)return{availability:"available",status:"neutral",activity:"none"};const e=t.filter(t=>"available"===t.availability);if(!e.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(e.some(t=>"alarm"===t.status))return js;const i=e.some(t=>"working"===t.status)?"working":e.some(t=>"open"===t.status)?"open":"neutral",s=e.some(t=>"transition"===t.activity)?"transition":e.some(t=>"presence"===t.activity)?"presence":e.some(t=>"running"===t.activity)?"running":"none";return{availability:"available",status:i,activity:s}}function un(t,e){if(!(t=>!!t&&!Qs(t))(t)||"unavailable"===e.availability||t===e.state)return null;if("rising"===e.edge)return"off"===t&&"on"===e.state?"event":null;if("change"===e.edge)return"event";if("terminal_transition"===e.edge){const i=new Set([t,e.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const pn=(t,e=0)=>{const i=Number(t);return Number.isInteger(i)&&i>=0?i:e},_n=(t,e)=>{const i={rev:0,configRev:pn(e),off:new Set};if(null==t)return{snapshot:i,valid:!1};const s=t.off;return!Number.isInteger(t.rev)||Number(t.rev)<0||!Number.isInteger(t.config_rev)||Number(t.config_rev)<0||!Array.isArray(s)||s.some(t=>"string"!=typeof t||!t)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(t.rev),configRev:Number(t.config_rev),off:new Set(s)},valid:!0}};function gn(t,e=0){return _n(t,e).snapshot}function mn(t,e,i,s){const n=_n(e,i);return s&&n.valid&&n.snapshot.configRev===i?t.configRev===i&&n.snapshot.rev{try{const[i,s]=await Promise.all([t.callWS({type:"config/device_registry/list"}),t.callWS({type:"config/entity_registry/list"})]),n=Dn(i,"id"),o=Dn(s,"entity_id");if(!n||!o)throw new Error("invalid_registry_response");e.devices=n,e.entities=o,e.authoritative=!0,e.access="full",e.lastSuccess=Date.now(),e.error=void 0}catch(t){e.authoritative=!1,e.access="limited",e.error=function(t){if(t&&"object"==typeof t){const e=t;return String(e.message||e.code||e.error||"registry_unavailable")}return String(t||"registry_unavailable")}(t)}finally{e.revision++,e.loading=void 0,function(t){for(const e of[...t.listeners])try{e()}catch{}}(e)}})()),e.loading}function Pn(t,e){void 0===e.reloadTimer&&(e.reloadTimer=globalThis.setTimeout(()=>{e.reloadTimer=void 0,Tn(t,e)},80))}async function Rn(t,e){if(e.subscribing||e.unsubDevice&&e.unsubEntity)return e.subscribing;const i=t?.connection?.subscribeEvents;return"function"==typeof i?(e.subscribing=(async()=>{try{e.unsubDevice||(e.unsubDevice=await i.call(t.connection,()=>Pn(t,e),"device_registry_updated")),e.unsubEntity||(e.unsubEntity=await i.call(t.connection,()=>Pn(t,e),"entity_registry_updated"))}catch{}finally{0===e.refs&&(e.unsubDevice?.(),e.unsubEntity?.(),e.unsubDevice=void 0,e.unsubEntity=void 0),e.subscribing=void 0}})(),e.subscribing):void 0}function An(t,e){const i=Cn(t);if(!i)return()=>{};const s=0===i.refs;i.refs++,i.listeners.add(e),("pending"===i.access||s)&&Tn(t,i),Rn(t,i);let n=!1;return()=>{n||(n=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function In(t){const e=Cn(t);if(!e)return{revision:0,authoritative:!1,access:"limited",devices:t?.devices||{},entities:t?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=t?.devices||{},s=t?.entities||{};if(e.authoritative){const n=e.liveDevices!==i||e.liveEntities!==s,o=void 0!==e.liveDevices||void 0!==e.liveEntities;if(n&&(e.liveDevices=i,e.liveEntities=s,e.projectedRevision=void 0,o&&Pn(t,e)),e.projectedRevision!==e.revision||!e.projectedDevices||!e.projectedEntities){const t={...e.devices},n={...e.entities};for(const[e,s]of Object.entries(i))Object.prototype.hasOwnProperty.call(t,e)||(t[e]=s);for(const[t,e]of Object.entries(s))Object.prototype.hasOwnProperty.call(n,t)||(n[t]=e);e.projectedDevices=t,e.projectedEntities=n,e.projectedRevision=e.revision}i=e.projectedDevices,s=e.projectedEntities}return{revision:e.revision,authoritative:e.authoritative,access:e.access,devices:i,entities:s,lastSuccess:e.lastSuccess,error:e.error}}function Fn(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return 0;let e=xn.get(t);return e||(e=$n++,xn.set(t,e)),e}function En(t,e=In(t)){return[e.revision,e.access,Fn(e.devices),Fn(e.entities)].join(":")}function zn(t){return!!t&&null==t.disabled_by}function On(t,e=In(t)){const i={},s={},n={};for(const[t,s]of Object.entries(e.devices||{}))zn(s)&&(i[t]=s);for(const[t,i]of Object.entries(e.entities||{})){if(!zn(i))continue;const n=i.device_id?e.devices?.[i.device_id]:null;e.authoritative&&i.device_id&&!n||(n&&!zn(n)||(s[t]=i))}for(const[i,s]of Object.entries(t?.states||{})){const t=e.entities?.[i];if(t&&!zn(t))continue;const o=t?.device_id?e.devices?.[t.device_id]:null;e.authoritative&&t?.device_id&&!o||(o&&!zn(o)||(n[i]=s))}return{...t,devices:i,entities:s,states:n}}function Hn(t,e=In(t)){return{...t,devices:e.devices||{},entities:e.entities||{}}}function Nn(t,e){const i=[];for(const[s,n]of Object.entries(t||{}))n?.device_id===e&&i.push(s);return i}function Ln(){if(Mn)return Mn;if("undefined"==typeof localStorage)return{};try{const t=JSON.parse(localStorage.getItem(Sn)||"{}");if(!t||"object"!=typeof t||Array.isArray(t))return{};const e=Date.now(),i={};for(const[s,n]of Object.entries(t))!n||"active"!==n.kind&&"ha_disabled"!==n.kind||!Number.isFinite(n.ts)||e-n.ts>7776e6||(i[s]=n);return Mn=i,Mn}catch{return{}}}function Bn(t,e,i=In(t)){if(!e||"virtual"===e)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const s=e.indexOf(":");if(s<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const n=e.slice(0,s),o=e.slice(s+1);if("device"!==n&&"entity"!==n||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===n){const t=r[o];if(!t)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const e=Nn(a,o);if(!zn(t))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:e};const i=e.filter(t=>zn(a[t]));return e.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:e}:{kind:"active",enabledEntityIds:i,allEntityIds:e}}const e=a[o];return e&&!zn(e)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!r[e.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:e?.device_id&&!zn(r[e.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:e||t?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(t){return Ln()[t]||null}(e);if("device"===n){const e=r[o],i=Nn(a,o);if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const s=i.filter(t=>{const e=a[t];return null==e?.disabled_by&&(!e.device_id||null==r[e.device_id]?.disabled_by)});if(i.length&&!s.length&&i.every(t=>null!=a[t]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(e||s.some(e=>!!t?.states?.[e]))return{kind:"active",enabledEntityIds:s,allEntityIds:i}}else{const e=a[o];if(null!=e?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(e?.device_id&&null!=r[e.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(e||t?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function qn(t){const e={};for(const[i,s]of Object.entries(t.entities)){if(!s?.device_id||!zn(s))continue;const n=t.devices?.[s.device_id];n&&!zn(n)||(e[s.device_id]=e[s.device_id]||[]).push(i)}return e}function jn(t,e,i){if(e.identifiers?.[0]?.[0])return e.identifiers[0][0];for(const e of i){const i=t.entities[e]?.platform;if(i)return i}return""}function Wn(t,e){if(/_device_temperature$/.test(e))return!1;if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_temperature$/.test(e);const s=i.attributes||{};return"temperature"===s.device_class||/°C|°F/.test(s.unit_of_measurement||"")||/_temperature$/.test(e)}const Un=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],Gn=t=>[...t.filter(t=>!t.reg?.hidden),...t.filter(t=>!!t.reg?.hidden)];function Vn(t,e){const i=e.map(e=>({eid:e,reg:t?.entities?.[e]})).filter(t=>!!t.reg);if(!i.length)return[];const s=i.filter(t=>!t.reg.entity_category),n=s.length?s:i;for(const t of Un){const e=n.filter(e=>e.eid.startsWith(t+"."));if(e.length)return Gn(e).map(t=>t.eid)}const o=n.filter(e=>function(t,e){if(!e.startsWith("binary_sensor."))return!1;const i=tn(t?.states?.[e]?.attributes?.device_class||t?.entities?.[e]?.device_class||t?.entities?.[e]?.original_device_class);return Ws.has(i)||Us.has(i)||Gs.has(i)||Vs.has(i)||"moving"===i||Ks.has(i)}(t,e.eid));if(o.length)return Gn(o).map(t=>t.eid);const r=n.filter(t=>t.eid.startsWith("switch."));if(r.length){const e=Gn(r),s=e.find(e=>an(t,e.eid));if(r.length>1&&s){const e=i.filter(e=>e.eid!==s.eid&&"config"!==e.reg?.entity_category&&null!=on(t,e.eid)),n=e.filter(t=>!t.reg?.entity_category),o=n.length?n:e;for(const e of[0,1,2]){const i=Gn(o.filter(i=>on(t,i.eid)===e));if(i.length)return[i[0].eid,s.eid]}}return[(s||e[0]).eid]}const a=[];for(const t of ie)a.push(...Gn(n.filter(e=>e.eid.startsWith(t+"."))));return a.push(...Gn(n.filter(t=>!ie.includes(t.eid.split(".")[0])))),a.map(t=>t.eid)}function Kn(t,e,i){const s=e.map(e=>({eid:e,reg:t.entities[e],st:t.states[e]})).filter(t=>t.reg),n=[s.filter(t=>!t.reg.hidden&&!t.reg.entity_category),s.filter(t=>!t.reg.entity_category),s.filter(t=>!t.reg.hidden),s];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const e of n){const i=e.find(e=>Wn(t,e.eid));if(i)return i.eid}const o=Vn(t,e);return o.find(Ms)||o[0]}function Yn(t,e,i=[]){return[...new Set(Xn(t,e,i))].filter(t=>Ms(t))}function Xn(t,e,i=[]){const s=t?.startsWith("entity:")?new Set([t.slice(7)]):new Set(i);return(e||[]).filter(t=>"string"==typeof t&&!s.has(t))}function Jn(t,e){if("string"==typeof e)return t.area===e;const i=t.marker?.room_id;return i?!!e.id&&i===e.id:!!e.area&&t.area===e.area}function Zn(t){const e=t.marker?.binding?.startsWith("entity:")?t.marker.binding.slice(7):null,i=t.entities.filter(Ms),s=t.primary&&Ms(t.primary)?t.primary:null;return[...new Set([e,s,...i].filter(t=>!!t&&Ms(t)))]}function Qn(t){const e=Zn(t),i=t.marker?.light_entity;return i&&e.includes(i)?i:e[0]||null}function to(t,e){if(!1===e.marker?.is_light)return[];if(!0===e.marker?.is_light){return[{eid:Qn(e),via:"forced"}]}const i=e.primary||Vn(t,e.entities)[0];return i&&!i.startsWith("light.")?[]:e.entities.filter(e=>e.startsWith("light.")&&!!t.states?.[e]).map(t=>({eid:t,via:"light"}))}const eo=new WeakMap,io=new WeakMap;function so(t){return t.map(t=>[t.id||"",!0===t.hidden?1:0,t.primary||"",[...t.entities].join(","),void 0===t.controls?"":[...t.controls].join(","),t.marker?.id||"",t.marker?.binding||"",t.marker?.is_light,t.marker?.tap_action||"",!0===t.marker?.removed?1:0,t.marker?.light_entity||"",null==t.marker?.controls?"":[...t.marker.controls].join(",")].join("")).join("")}function no(t){const e=so(t),i=eo.get(t);if(i?.fingerprint===e)return i;const s=t.filter(t=>!t.hidden),n=new Map,o=new Map;for(const e of t){o.set(e,Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities));const t=e.hidden||!0!==e.marker?.is_light?null:e.marker?.id||e.id;t&&n.set(String(t),e)}const r=new Map;for(const e of t){const t=o.get(e)||[],i=new Set(void 0===e.controls?t.filter(Ms):e.controls.filter(Ms)),s=Qn(e),a=i.size?[...i]:s?[s]:[];for(const i of t){if(!i.startsWith("marker:"))continue;const t=i.slice(7);if(!t||t===String(e.marker?.id||e.id||""))continue;if(!n.has(t))continue;const s=r.get(t)||{markerId:t,controllers:[],driverEids:[]};s.controllers.push({device:e,driverEids:[...a]}),s.driverEids=[...new Set([...s.driverEids,...a])],r.set(t,s)}}const a={fingerprint:e,visible:s,markerById:n,persistedByDevice:o,incomingByMarker:r};return eo.set(t,a),a}function oo(t){return no(t).incomingByMarker}function ro(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities),s=Xn(e.marker?.binding,e.marker?.controls??e.controls,e.entities);return(null!=e.marker?.is_light||!i.length&&!s.some(t=>t.startsWith("marker:")))&&to(t,e).length>0}function ao(t,e){const i=Yn(e.marker?.binding,e.controls??e.marker?.controls,e.entities).map(t=>({eid:t,via:"controls"})),s=ro(t,e)?to(t,e):[];for(const t of s)t.eid&&i.some(e=>e.eid===t.eid)||i.push(t);return i}function lo(t,e,i,s){if(null!=i)return lo(t,e,null,s).filter(t=>Jn(t.device,i));const n=so(e),o=function(t,e){const i=new Set;for(const t of e){for(const e of t.entities)i.add(e);for(const e of t.controls||t.marker?.controls||[])"string"!=typeof e||e.startsWith("marker:")||i.add(e)}return[...i].sort().map(e=>`${e}:${t?.states?.[e]?.state??""}`).join("|")}(t,e),r=vn(s),a=io.get(e);if(a?.graphFingerprint===n&&a.stateFingerprint===o&&a.virtualLightFingerprint===r&&a.registry===t?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=no(e),u=null==i?l:l.filter(t=>Jn(t,i)),p=new Map,_=new Map;for(const e of u){const i=ao(t,e).filter(t=>"controls"!==t.via);for(const s of i){const i=!0===e.marker?.is_light?String(e.marker?.id||e.id||""):"",n=i?`marker:${i}`:`entity:${s.eid}`,o=s.eid?[s.eid]:[],r={key:n,eid:s.eid||"",stateEids:o,serviceEids:o,device:e,via:s.via,castsGlow:!0,passive:!s.eid,on:!s.eid||"on"===t.states?.[s.eid]?.state};p.set(e,[...p.get(e)||[],r]),s.eid&&_.set(s.eid,r)}}const g=new Map;for(const t of e){const e=h.get(t)||[],i=new Set(void 0===t.controls?e.filter(Ms):t.controls);g.set(t,i)}for(const e of p.values())for(const i of e){if(!i.passive)continue;const e=i.key.slice(7),n=d.get(e);i.on=!n||n.driverEids.some(e=>"on"===t.states?.[e]?.state),!n&&yn(i.device.marker)&&(i.on=bn(i.device.marker,s))}const m=new Map,f=t=>{const e=m.get(t.key);(!e||t.castsGlow&&!e.castsGlow)&&m.set(t.key,t)};for(const e of l){const s=h.get(e)||[],n=null==i||Jn(e,i);for(const i of s){if(i.startsWith("marker:")){const t=c.get(i.slice(7)),e=t?p.get(t):null;if(e)for(const t of e)f(t);continue}if(!Ms(i)||!g.get(e)?.has(i))continue;const s=_.get(i);s?f(s):n&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:e,via:"controls",castsGlow:!1,passive:!1,on:"on"===t.states?.[i]?.state})}for(const t of p.get(e)||[])f(t)}const v=[...m.values()];return io.set(e,{graphFingerprint:n,stateFingerprint:o,virtualLightFingerprint:r,registry:t?.entities,sources:v}),v}function co(t){const e=t.filter(t=>t.castsGlow);return e.find(t=>t.on)||e[0]||null}function ho(t){return t.length?t.some(t=>t.on)?"on":"off":"none"}function uo(t,e){const i=[];for(const s of e){const e=t.states[s];if(!e)continue;const n=(e.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(s)||"lqi"===n){const t=parseFloat(e.state);isNaN(t)||i.push(t);continue}const o=e.attributes?.linkquality??e.attributes?.lqi;if(null!=o){const t=parseFloat(o);isNaN(t)||i.push(t)}}return zi(i)}function po(t,e){for(const i of e){if(!Wn(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(10*s)/10}return null}function _o(t,e){for(const i of e){if(!i.startsWith("climate."))continue;const e=t.states[i];if(!e||"unavailable"===e.state||"unknown"===e.state)continue;const s=parseFloat(e.attributes?.current_temperature);if(Number.isFinite(s))return Math.round(10*s)/10}return null}function go(t,e){if(t.entities?.[e]?.entity_category)return!1;const i=t.states[e];if(!i)return/_humidity$/.test(e);const s=i.attributes||{};return"humidity"===s.device_class||"%"===s.unit_of_measurement&&/_humidity$/.test(e)||/_humidity$/.test(e)}function mo(t,e){for(const i of e){if(!go(t,i))continue;const e=t.states[i];if(!e)continue;const s=parseFloat(e.state);if(!isNaN(s))return Math.round(s)}return null}function fo(t,e){if(!e)return[];const i=[];for(const[e,s]of Object.entries(t.entities)){if(!e.startsWith("light.")||s.hidden||!zn(s))continue;let n=null;if("group"===s.platform)n=s.area_id||null;else{if(!s.device_id)continue;{const e=t.devices[s.device_id];if(!zn(e))continue;if("Group"!==e?.model)continue;n=e.area_id||s.area_id||null}}if(!n)continue;const o=t.states[e];i.push({eid:e,name:s.name||o?.attributes?.friendly_name||e,area:n})}return i}function vo(t,e,i,s,n){const o=ee(e,i,n);if(o!==te)return o;const r=[];for(const e of s){const i=t.states[e]?.attributes?.device_class;i&&r.push(i)}return function(t){for(const e of t){const t=Qt[e];if(t)return t}return null}(r)??te}function yo(t){const e=new Set,i=new Set;for(const s of t||[]){if(!0!==s?.removed)continue;const t=String(s.binding||"").indexOf(":");if(t<1)continue;const n=s.binding.slice(0,t),o=s.binding.slice(t+1);o&&("device"===n?e.add(o):"entity"===n&&i.add(o))}return{devices:e,entities:i}}function bo(t,e,i){if(i.entities.has(e))return!0;const s=t?.entities?.[e]?.device_id;return!!s&&i.devices.has(s)}function wo(t,e,i,s,n){const o=Yn(e.binding,e.controls,t.entities).filter(t=>!bo(i,t,s)).filter(t=>"active"===Bn(i,"entity:"+t,n).kind);t.marker=e,t.controls=o,t.userHidden=!0===e.hidden,t.hidden=t.userHidden||"ha_disabled"===t.bindingStatus?.kind,e.name&&(t.name=e.name),e.icon&&(t.icon=e.icon),null!=e.model&&(t.model=e.model),t.link=e.link??null,t.description=e.description??null,t.pdfs=e.pdfs||[],t.tapAction=e.tap_action??null}function ko(t,e,i,s){if("string"==typeof t.room_id&&t.room_id.length>0&&null===t.area)return{area:"",space:t.space||s};const n=t.area||e||"";return{area:n,space:n&&i[n]||t.space||s}}function xo(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),n=Hn(e,i),{areaToSpace:o,markers:r,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=t,p=!1!==a.group_lights,_=yo(r),g=fo(s,p).filter(t=>!bo(s,t.eid,_)),m=new Set(g.map(t=>t.area)),f=qn(s),v=function(t){const e={};for(const[i,s]of Object.entries(t.entities||{}))s?.device_id&&(e[s.device_id]=e[s.device_id]||[]).push(i);return e}(n),y=new Set;for(const t of r){const[e,i]=t.binding.split(":");"device"!==e&&"entity"!==e||!i||y.add(t.binding)}const b=(t,e)=>r.find(i=>i.binding===t+":"+e),w={},k=[];for(const t of Object.values(s.devices)){const n=t.area_id;if(!n||!o[n])continue;if("service"===t.entry_type)continue;if(y.has("device:"+t.id))continue;const r=Bn(e,"device:"+t.id,i);if("active"!==r.kind)continue;const h=b("device",t.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=f[t.id]||[],g=jn(s,t,_),v=!a.filter_seeded;if(v&&!c){if(l.has(g))continue;if("Group"===t.model)continue;if(/scene/i.test(t.model||""))continue;if(/bridge/i.test((t.model||"")+(t.name||"")))continue;if("myheat"===g&&t.via_device_id)continue}const x=(t.name_by_user||t.name||d("device.unnamed")).trim(),$=x+"|"+n;let S=vo(s,x,t.model,_,u);if(_.some(t=>t.startsWith("lock."))&&(S="mdi:lock"),v&&!c&&p&&"mdi:lightbulb"===S&&m.has(n))continue;w[$]=(w[$]||0)+1;const M=w[$]>1?x+" "+w[$]:x,C={id:t.id,name:M,model:t.model||"",area:n,space:o[n],icon:S,entities:_,allEntities:r.allEntityIds,bindingStatus:r,bindingKind:"device",bindingRef:t.id,pdfs:[]};C.primary=Kn(s,_,S),"mdi:thermometer"!==S&&"mdi:air-filter"!==S||(C.temp=po(s,_)),C.primary&&go(s,C.primary)&&(C.hum=mo(s,_)),k.push(C)}for(const t of g)o[t.area]&&(y.has("entity:"+t.eid)||k.push({id:"lg_"+t.eid,name:t.name,model:d("device.light_group"),area:t.area,space:o[t.area],icon:"mdi:lightbulb-group",entities:[t.eid],allEntities:[t.eid],bindingStatus:{kind:"active",enabledEntityIds:[t.eid],allEntityIds:[t.eid]},primary:t.eid,bindingKind:"entity",bindingRef:t.eid,pdfs:[]}));for(const t of r){if(t.removed)continue;const[r,l]=t.binding.split(":"),c="device"===r||"entity"===r?Bn(e,t.binding,i):null;if(!t.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===r){const e=c;if("unverified"===e.kind)continue;const r=n.devices[l],{area:a,space:p}=ko(t,r?.area_id,o,h),g="active"===e.kind?e.enabledEntityIds:[];let m=r?vo(s,r.name_by_user||r.name||"",r.model,g,u):"mdi:help-circle";g.some(t=>t.startsWith("lock."))&&(m="mdi:lock");const f={id:t.id,name:r?.name_by_user||r?.name||d("device.fallback"),model:r?.model||"",area:a,space:p,icon:m,entities:g,allEntities:e.allEntityIds.length?e.allEntityIds:r&&v[r.id]||[],bindingStatus:e,bindingKind:"device",bindingRef:l};f.primary=Kn(s,g,m),"mdi:thermometer"!==m&&"mdi:air-filter"!==m||(f.temp=po(s,g)),f.primary&&go(s,f.primary)&&(f.hum=mo(s,g)),wo(f,t,n,_,i),k.push(f)}else if("entity"===r){if(bo(n,l,_))continue;const e=c;if("unverified"===e.kind)continue;const r=n.entities[l],a=r?.area_id||r?.device_id&&n.devices[r.device_id]?.area_id||"",{area:d,space:p}=ko(t,a,o,h),g=s.states[l],m=r?.name||g?.attributes?.friendly_name||l;let f=vo(s,m,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:t.id,name:m,model:"",area:d,space:p,icon:f,entities:"active"===e.kind?[l]:[],allEntities:[l],bindingStatus:e,primary:"active"===e.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=po(s,v.entities)),v.entities.length&&go(s,l)&&(v.hum=mo(s,v.entities)),wo(v,t,n,_,i),k.push(v)}else{const e=t.area||"",s=t.space||e&&o[e]||h,r={id:t.id,name:t.name||d("device.virtual"),model:t.model||"",area:e,space:s,icon:t.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};wo(r,t,n,_,i),k.push(r)}}return k}function $o(t,e,i,s){if(!e)return null;if(function(t,e,i){if(!e)return!1;const s=e.indexOf(":");if(s<1)return!1;const n=e.slice(0,s),o=e.slice(s+1),r=yo(i);return"device"===n?r.devices.has(o):"entity"===n&&bo(t,o,r)}(t,e,s))return null;const n=e.indexOf(":");if(n<0)return null;const o=e.slice(0,n),r=e.slice(n+1);if(!r)return null;if("entity"===o){const e=parseFloat(t.states[r]?.state);return Number.isFinite(e)?"temp"===i?Math.round(10*e)/10:Math.round(e):null}if("device"===o){const e=Object.entries(t.entities).filter(([,t])=>t.device_id===r).map(([t])=>t);return"temp"===i?po(t,e):mo(t,e)}return null}const So=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function Mo(t,e,i){const s=[];for(const n of e){if(n.area!==i||n.virtual)continue;const e=uo(t,n.entities);null!=e&&s.push(e)}return zi(s)}function Co(t,e,i){const s=[];for(const n of e){if(n.area!==i)continue;if("mdi:thermometer"!==n.icon&&"mdi:air-filter"!==n.icon)continue;const e=po(t,n.entities);null!=e&&s.push(e)}return s.length?Math.round(s.reduce((t,e)=>t+e,0)/s.length*10)/10:null}const Do={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function To(t){return t?t.sourceLabel?`${t.sourceLabel}: ${t.fullText}`:t.fullText:""}const Po=new WeakMap;function Ro(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Ao(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Io(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Fo(t){return t.replaceAll("_"," ")}function Eo(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function zo(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function Oo(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Io(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(No(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ji(t,i.entity_id);n=s?Zi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Fo(i.attribute)} · ${Io(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?No(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ji(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Eo(o,100/255);if("volume_level"===i)return Eo(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Eo(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=uo(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:zo(i)}}function Ho(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));return i?{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}:null}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Wn(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&go(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function No(t,e){const i=t?.entities?.[e];if(i&&!zn(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||zn(s)}function Lo(t,e){return No(t,e)&&!!t?.states?.[e]}function Bo(t,e,i=[e]){const s=function(t,e){const i=t=>[t.id,t.primary,t.hidden?1:0,t.userHidden?1:0,t.entities.join(","),(t.controls||[]).join(","),t.marker?.binding||"",!0===t.marker?.is_light?1:0,t.marker?.light_entity||"",(t.marker?.controls||[]).join(",")].join("|");return`${i(t)}\n${e.map(i).join("\n")}`}(e,i),n=Po.get(e);if(n&&n.states===(t?.states||null)&&n.entities===(t?.entities||null)&&n.devices===(t?.devices||null)&&n.signature===s)return n.result;const o=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||o.add(t);const r=[],a=lo(t,i),l=a.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),c=i=>{const s=Ro(i);if(r.some(t=>t.key===s))return;const n=Oo(t,e,i,l),o="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";r.push({key:s,source:i,label:n.sourceLabel,technical:o,value:n.text,available:"available"===n.availability})};for(const e of[...o].sort()){if(!Lo(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;c({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Do[i]||[])t in(n?.attributes||{})&&c({kind:"entity_attribute",entity_id:e,attribute:t})}const h=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&h.add(`marker:${e.marker.id}`);const d=new Set(a.map(t=>t.key));for(const t of[...h].sort())d.has(t)&&c({kind:"derived_marker_state",ref:t});return e.virtual||null==uo(t,e.entities)||c({kind:"derived_lqi"}),Po.set(e,{states:t?.states||null,entities:t?.entities||null,devices:t?.devices||null,signature:s,result:r}),r}function qo(t,e,i){const s=Ho(t,e);if(s&&i.some(t=>t.key===Ro(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}function jo(t){return"boolean"==typeof t?.themes?.darkMode?t.themes.darkMode?"theme-dark":"theme-light":""}function Wo(t){const e=[];if(1!==t.scale&&e.push(`--dev-scale:${t.scale}`),"none"!==t.pulse.kind){e.push(`--ripple-scale:${t.pulse.diameterScale}`);const n=(i=t.pulse.color,s=null,"string"==typeof i&&(Pt.test(i)||It.test(i))?i:s);n&&e.push(`--ripple-color:${n}`)}var i,s;return e}function Uo(t){const e=[...String(t)].reduce((t,e)=>/\s/.test(e)?t+.35:t+(e.codePointAt(0)>255?1:.62),0);return e<=8?.45:Math.max(.25,Math.round(3.6/e*1e3)/1e3)}function Go(t,e){const i=t.pulse,s=i.generation%2==0,n=function(t){const e=t.valueBadge;if(!e||!1!==e.configured)return[];const i=[];return null!=t.tempText&&"temperature"!==e.tone&&i.push({kind:"temperature",text:t.tempText,suffix:"°"}),null!=t.humText&&"humidity"!==e.tone&&i.push({kind:"humidity",text:t.humText,suffix:"%"}),i}(t),o=t.valueBadge,r=o?.position||"right",a=!!o||n.length>0,l=["device-shell",null!=t.valueText?"text-shell":"",a?`with-values pos-${r}`:"",n.length?"with-legacy":""].filter(Boolean).join(" ");return j` ${"none"!==i.kind&&"dot"!==i.reducedMotionIndicator?j``:G} ${"dot"===i.reducedMotionIndicator?j``:G} ${e.newDevice?j``:G} ${t.haDisabled?j``:G} ${null!=t.lqiText?j`${t.lqiText}`:G} - `}function Go(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Vo=new WeakMap;function Ko(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Vo.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Vo.set(e,i)),i}function Yo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Xo(t,e){const i=Ko(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Yo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Yo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Jo(t){const e=Ko(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Zo(t,e,i=Jo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Qo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Zo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function tr(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function er(t,e,i,s=Jo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return Qo(t,n.platform||r,"entity-platform",s,o)}var ir={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const sr={en:ir,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function nr(t,e){if(e&&e in sr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function or(t,e,i){return is(sr[t][e]??ir[e]??e,i)}function rr(t,e){const i=sr[t][e]??sr.en[e];return"string"==typeof i&&i.trim().length>0}class ar extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Xo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return nr(this.hass)}_t(t,e){return or(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Jo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=er(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Qo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return tr(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(er(t,e,i,s));return c.some(Boolean)?tr(c):tr((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Qo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Jo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=er(this.hass,t,this.registry,Jo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",qo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",Do(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
+ `}function Vo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Ko=new WeakMap;function Yo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Ko.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Ko.set(e,i)),i}function Xo(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Jo(t,e){const i=Yo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Xo(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Xo(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Zo(t){const e=Yo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Qo(t,e,i=Zo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function tr(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const r=n?s.configEntries[n]:null;return{domain:o,label:Qo(t,o,s,r?.title),configEntryId:n,configEntryTitle:r?.title,confidence:i}}function er(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ir(t,e,i,s=Zo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,r=o?s.configEntries[o]?.domain:"";return tr(t,n.platform||r,"entity-platform",s,o)}var sr={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const nr={en:sr,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function or(t,e){if(e&&e in nr)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function rr(t,e,i){return ss(nr[t][e]??sr[e]??e,i)}function ar(t,e){const i=nr[t][e]??nr.en[e];return"string"==typeof i&&i.trim().length>0}class lr extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Jo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return or(this.hass)}_t(t,e){return rr(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Zo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),r=e.slice(n+1);if("entity"===o){const e=ir(t,r,i,s);return e?[e]:[]}if("device"!==o)return[];const a=i.devices?.[r]||t?.devices?.[r];if(!a)return[];const l=[a.config_entry_id,...Array.isArray(a.config_entries)?a.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return tr(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return er(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===r&&null==n?.disabled_by&&c.push(ir(t,e,i,s));return c.some(Boolean)?er(c):er((Array.isArray(a.identifiers)?a.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return tr(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Zo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ir(this.hass,t,this.registry,Zo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let r=-o/2,a=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(a=Math.max(a,s+t)),"left"===i.valueBadge.position&&(r=Math.min(r,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,a-r),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((r+a)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",jo(this.hass),...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=Wo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge),null!=t.lqiText&&t.lqiBand?this._t(`marker.lqi_a11y_${t.lqiBand}`,{value:t.lqiText}):""].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4183,7 +4268,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -4225,7 +4310,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("continuous"===this._demoKind?"marker.preview.stop_continuous":"marker.preview.demo_continuous")}
`:G} -
`}}ar.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},ar.styles=[Kt,o` +
`}}lr.properties={hass:{attribute:!1},presentation:{attribute:!1},registry:{attribute:!1},deviceName:{attribute:!1}},lr.styles=[Kt,o` :host { display: block; min-width: 0; } .devicepreview { margin: 4px 0 14px; @@ -4256,6 +4341,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 pointer-events: none; container-type: inline-size; --icon-size: 54px; + --device-base-size: 48.6px; } .previewfit { position: absolute; left: 50%; top: 50%; transform-origin: center; } .previewstage .dev { left: 0; top: 0; cursor: default; } @@ -4291,20 +4377,20 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 .previewstage { min-height: 142px; } .previewfacts > div { grid-template-columns: minmax(0, 1fr); gap: 2px; } } - `],customElements.get("hp-device-preview")||customElements.define("hp-device-preview",ar);const lr=(t,e)=>[t[0]-e[0],t[1]-e[1]],cr=(t,e)=>[t[0]+e[0],t[1]+e[1]],hr=(t,e)=>t[0]*e[0]+t[1]*e[1],dr=t=>Math.hypot(t[0],t[1]);function ur(t){let e=0;for(let i=0;it[1]!=l>t[1]&&t[0]<(a-o)*(t[1]-r)/(l-r)+o&&(i=!i)}return i}([a[0]+r[0]*l,a[1]+r[1]*l],t)&&(r=[-r[0],-r[1]]),r}function gr(t,e,i,s){const n=s||_r(t,e),o=(e+1)%t.length;return t.map((t,s)=>s===e||s===o?[t[0]+n[0]*i,t[1]+n[1]*i]:[...t])}function mr(t,e,i,s){const n=[],o=lr(i,e),r=dr(o);if(rs||h>s)continue;const d=hr(lr(o,e),a),u=hr(lr(l,e),a),p=Math.max(0,Math.min(d,u)),_=Math.min(r,Math.max(d,u));_-p>s&&n.push([[e[0]+a[0]*p,e[1]+a[1]*p],[e[0]+a[0]*_,e[1]+a[1]*_]])}return n}function fr(t,e,i,s,n){const o=mr(t,e,i,n);if(!o.length)return null;const r=t=>o.some(([e,i])=>pr(t,e,i)<=n),a=t.length,l=[];for(let o=0;on||f>n)continue;const v=hr(lr(e,c),p),y=hr(lr(i,c),p),b=Math.max(0,Math.min(v,y)),w=Math.min(u,Math.max(v,y));if(!(w-b<=n)){if(b>n&&bn&&wdr(lr(i,t[(s+1)%t.length]))>e);for(let t=0;t<2;t++)i=i.filter((t,s)=>{const n=i[(s-1+i.length)%i.length],o=i[(s+1)%i.length],r=(t[0]-n[0])*(o[1]-n[1])-(t[1]-n[1])*(o[0]-n[0]),a=dr(lr(o,n))||1;return Math.abs(r)/a>e});return i.length>=3?i:t}function yr(t){const e=t.length;if(e<3)return!1;for(let i=0;i(t[0]-n[0])*a[1]-(t[1]-n[1])*a[0],c=t=>(t[0]-n[0])*a[0]+(t[1]-n[1])*a[1],h=i,d=r-i;for(const e of t){const t=Math.abs(l(e));if(t<=i)continue;const n=c(e);n<=h||n>=d||tMath.abs(r+(t-u)/m*(a-r));s=Math.min(s,f(_),f(g))}}return s}function wr(t,e,i){if(Ci(t,e,i))return!0;if(Mi(t,e,i)||Mi(e,t,i))return!1;let s=0;try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]);for(const t of i)t?.[0]&&(s+=Ti(t[0]))}catch{return!1}return s>Math.max(1e-7,i*i)}function kr(t,e,i,s,n){const o=[i.n[0]*s,i.n[1]*s],r={polys:{},openings:{},movedSpans:{}};if(Math.abs(s)<1e-9)return r;for(const e of t){if(e.id===i.roomId){r.polys[e.id]=gr(e.poly,i.edge,s,i.n),r.movedSpans[e.id]=[[cr(i.a,o),cr(i.b,o)]];continue}const t=mr(e.poly,i.a,i.b,n);if(!t.length)continue;const a=fr(e.poly,i.a,i.b,o,n);a&&(r.polys[e.id]=a,r.movedSpans[e.id]=t.map(([t,e])=>[cr(t,o),cr(e,o)]))}for(const t of e)pr([t.x,t.y],i.a,i.b)<=n&&(r.openings[t.id]=[t.x+o[0],t.y+o[1]]);return r}function xr(t,e,i){for(const s of e)for(let e=0;ei)continue;const c=(t.x-n[0])*l[0]+(t.y-n[1])*l[1];if(c-t.length/2>=-i&&c+t.length/2<=a+i)return!0}return!1}function $r(t,e,i){return t.filter(t=>e.some(e=>{for(let s=0;sa.polys[t.id]||t.poly;for(const e of l){const s=t.find(t=>t.id===e),n=a.polys[e];if(!yr(n))return!1;const l=ur(s.poly),h=ur(n);if(Math.abs(h)t.find(t=>t.id===e).poly),d=t.map(c);for(const t of $r(e,h,2*r)){const e=a.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,d,2*r))return!1}return!0}function Mr(t,e,i,s,n,o){const r=t=>[s[0]+(t[0]-s[0])*n,s[1]+(t[1]-s[1])*n],a={poly:t.poly.map(r),openings:{}};for(const s of e){let e=!1;for(let i=0;i{for(let e=0;et.id===i);if(!l)return!1;const c=t.filter(t=>t.id!==i).map(t=>t.poly),h=Mr(l,e,c,s,n,2*a),d=h.poly,u=function(t){const e=function(t){const e=[...t].sort((t,e)=>t[0]-e[0]||t[1]-e[1]);if(e.length<3)return e;const i=(t,e,i)=>(e[0]-t[0])*(i[1]-t[1])-(e[1]-t[1])*(i[0]-t[0]),s=[];for(const t of e){for(;s.length>=2&&i(s[s.length-2],s[s.length-1],t)<=0;)s.pop();s.push(t)}const n=[];for(let t=e.length-1;t>=0;t--){const s=e[t];for(;n.length>=2&&i(n[n.length-2],n[n.length-1],s)<=0;)n.pop();n.push(s)}return s.pop(),n.pop(),s.concat(n)}(t);if(e.length<3)return 0;let i=1/0;for(let t=0;tt.id===i?d:t.poly);for(const t of $r(e,[l.poly],2*a)){const e=h.openings[t.id];if(!xr(e?{...t,x:e[0],y:e[1]}:t,p,2*a))return!1}return!0}function Dr(t,e,i){const s=i/e;return Ti(t)*s*s/1e4}function Tr(t,e){return e?`${Math.round(10.7639*t)} ft²`:`${(Math.round(10*t)/10).toFixed(1)} m²`}function Pr(t){const e=t%360;return e<0?e+360:e}function Rr(t,e){const i=function(t,e){return Pr(t+e)}(t,e)*Math.PI/180;return[Math.sin(i),-Math.cos(i)]}const Ar=Object.freeze({dawn:Object.freeze({top:"#aabdd1",bottom:"#e8c8b7",horizon:"rgba(255,201,156,.56)",sun:"rgba(255,188,125,.78)",vignette:"rgba(65,72,99,.21)",outlineNear:"rgba(74,57,61,.25)",outlineMid:"rgba(255,238,224,.40)",outlineFar:"rgba(255,224,202,.18)"}),day:Object.freeze({top:"#dce9ef",bottom:"#cbdce3",horizon:"rgba(255,245,220,.45)",sun:"rgba(255,239,190,.72)",vignette:"rgba(65,91,105,.16)",outlineNear:"rgba(45,62,71,.28)",outlineMid:"rgba(255,255,255,.42)",outlineFar:"rgba(255,255,255,.20)"}),dusk:Object.freeze({top:"#48536c",bottom:"#9a7380",horizon:"rgba(242,156,114,.34)",sun:"rgba(255,167,113,.55)",vignette:"rgba(20,26,44,.39)",outlineNear:"rgba(238,219,225,.40)",outlineMid:"rgba(229,207,218,.26)",outlineFar:"rgba(215,190,205,.12)"}),night:Object.freeze({top:"#111a27",bottom:"#1f2f3e",horizon:"rgba(79,120,151,.16)",sun:"rgba(169,208,231,0)",vignette:"rgba(3,8,14,.58)",outlineNear:"rgba(218,238,249,.56)",outlineMid:"rgba(174,215,238,.30)",outlineFar:"rgba(136,194,226,.14)"})}),Ir=t=>"number"==typeof t&&Number.isFinite(t),Fr=(t,e,i)=>Math.min(i,Math.max(e,t));function Er(t){return t.elevation<=-6?"night":t.elevation>=6?"day":t.rising?"dawn":"dusk"}function zr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;return e>=300&&e<480?"dawn":e>=480&&e<1080?"day":e>=1080&&e<1260?"dusk":"night"}function Or(t){const e=Er(t),i=t.azimuth*Math.PI/180;return{sunX:50-42*Math.sin(i),sunY:78-Fr(t.elevation,0,90)/90*64,sunOpacity:"night"===e?0:Fr((t.elevation+6)/12,0,1)}}function Hr(t){const e=(Math.floor(Number(t)||0)%1440+1440)%1440;if(e<300||e>=1260)return{sunX:50,sunY:78,sunOpacity:0};const i=(e-300)/960,s=(e-300)/120,n=(1260-e)/120;return{sunX:8+84*i,sunY:78-64*Math.sin(i*Math.PI),sunOpacity:Math.max(.18,Math.min(s,n,1))}}function Nr(t,e=new Date){const i=function(t){const e=t?.states?.["sun.sun"]?.attributes;return e&&Ir(e.azimuth)&&Ir(e.elevation)&&"boolean"==typeof e.rising?{azimuth:Pr(e.azimuth),elevation:e.elevation,rising:e.rising}:null}(t);if(i)return{phase:Er(i),source:"sun",...Or(i)};const s="number"==typeof e?e:function(t=new Date){return 60*t.getHours()+t.getMinutes()}(e);return{phase:zr(s),source:"clock",...Hr(s)}}function Lr(t){return`${t.source}|${t.phase}|${t.sunX.toFixed(2)}|${t.sunY.toFixed(2)}|`+t.sunOpacity.toFixed(3)}const Br=[[-90,"#070c14"],[-12,"#070c14"],[-4,"#131a28"],[0,"#4a3527"],[10,"#e8ddcf"],[30,"#ffffff"],[90,"#ffffff"]],qr=t=>Math.min(1,Math.max(0,t));function jr(t,e,i=6){const s=t.angle*Math.PI/180,n=[Math.sin(s),-Math.cos(s)],o=s=>{const o=[t.x+n[0]*i*s,t.y+n[1]*i*s];return e.find(t=>t.poly.length>=3&&fi(o,t.poly))||null},r=o(1),a=o(-1);return r&&a?null:r||a?r?{normal:[-n[0],-n[1]],roomId:r.id}:{normal:n,roomId:a.id}:null}function Wr(t,e,i){return i>0&&t[0]*e[0]+t[1]*e[1]>.05}function Ur(t,e,i,s){return[[t[0],t[1]],[e[0],e[1]],[e[0]+i[0]*s,e[1]+i[1]*s],[t[0]+i[0]*s,t[1]+i[1]*s]]}function Gr(t,e){try{const i=ni([[...t.map(t=>[t[0],t[1]]),[t[0][0],t[0][1]]]],[[...e.map(t=>[t[0],t[1]]),[e[0][0],e[0][1]]]]),s=[];for(const t of i){const e=t?.[0];!Array.isArray(e)||e.length<4||s.push(e.slice(0,e.length-1).map(t=>[t[0],t[1]]))}return s}catch{return[]}}function Vr(t,e,i,s,n,o,r){if(!(s>0))return[];const a=Rr(i,n),l=[-a[0],-a[1]],c=function(t){const e=Math.min(90,Math.max(0,t));return.7*(.8+1.7*Math.pow(1-e/90,1.6))}(s),h=[];for(const i of e){if(!(i.length>0))continue;const e=jr(i,t);if(!e||!Wr(e.normal,a,s))continue;const n=t.find(t=>t.id===e.roomId);if(!n)continue;const d=o&&o[e.roomId]||n.poly,u=i.angle*Math.PI/180,p=i.length/2,_=[-e.normal[0],-e.normal[1]],g=Math.max(0,r?.[i.id]||0),m=i.x+_[0]*g/2,f=i.y+_[1]*g/2,v=Math.cos(u)*p,y=Math.sin(u)*p,b=[m-v,f-y],w=[m+v,f+y],k=c*i.length,x=Gr(Ur(b,w,l,k),d);if(!x.length)continue;const $=l[0]*_[0]+l[1]*_[1];h.push({openingId:i.id,roomId:e.roomId,polys:x,a:b,b:w,dir:l,len:k,normal:_,depth:k*$})}return h}const Kr=t=>"number"==typeof t&&Number.isInteger(t)&&t>=0&&t<=359?t:null;function Yr(t,e){const i=Kr(e?.north_deg);return null!==i?i:Kr(t?.north_deg)}function Xr(t,e){const i=t=>"static"===t||"daynight"===t?t:null;return i(e?.bg_mode)??i(t?.bg_mode)??"static"}function Jr(t,e){const i=e?.sun_rays;return"boolean"==typeof i?i:!0===t?.sun_rays}function Zr(t){const e=t?.states?.["sun.sun"]?.attributes,i=Number(e?.azimuth),s=Number(e?.elevation);return Number.isFinite(i)&&Number.isFinite(s)?{azimuth:i,elevation:s}:null}const Qr=["dawn","day","dusk","night"];function ta(t){if(!t)return"";const e=Ar[t.phase];return[`--hp-day-cycle-outline-near:${e.outlineNear}`,`--hp-day-cycle-outline-mid:${e.outlineMid}`,`--hp-day-cycle-outline-far:${e.outlineFar}`].join(";")}function ea(t,e=1){if(!t)return G;const i=[`--hp-day-cycle-sun-x:${t.sunX.toFixed(2)}%`,`--hp-day-cycle-sun-y:${t.sunY.toFixed(2)}%`,`--hp-day-cycle-sun-opacity:${t.sunOpacity.toFixed(3)}`,`opacity:${Math.min(1,Math.max(0,e)).toFixed(4)}`].join(";");return j``}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Wu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Wu(t,t=>t.classList.contains("editor-secondary")),s=Wu(t,t=>!!t.dataset.editorGroup),n=Wu(t,t=>!!t.dataset.editorPalette),o=Wu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Gu=t=>t.stopPropagation(),Vu=4.166666666666667e-9;function Ku(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Ql)*Ql;return Math.abs(e-t)<=Vu?t:e}const Yu=(t,e,i,s)=>Math.hypot(i-t,s-e),Xu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Ju=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Yu(t+c,e+h,n+d,o+u),Yu(t-c,e-h,n-d,o-u)),_=Math.max(Yu(t+c,e+h,n-d,o-u),Yu(t-c,e-h,n+d,o+u));return Math.min(p,_)},Zu=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Qu=t=>JSON.parse(JSON.stringify(t)),tp=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),ep=(t,e,i)=>Math.min(i,Math.max(e,t)),ip=t=>Kl({spaces:[t]})[0],sp=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of ci(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=Qa(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=sp(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>sp(t.a,t.b,a).localeCompare(sp(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Ia(u,t.a,t.b,e,s,a))}return u}const op=t=>{const e=[];for(const i of t||[]){const t=ci(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&tp(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(tp(n,"segments")&&(delete n.segments,e++),tp(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Wl&&t<=Ul&&(tp(n,"plan_scale_x")||(n.plan_scale_x=t),tp(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);tp(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?ep(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)tp(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&tp(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(tp(t,"width")){const i=Number(t.width);(tp(t,"width_cm")||Number.isFinite(i))&&(tp(t,"width_cm")||(t.width_cm=Number(ep(i/Zl*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(tp(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),tp(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(ep(ts*es(t)/Zl*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(tp(t,"scale")||tp(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1]));if(!(tp(t,"entity")||tp(t,"attr")||tp(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Yi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=ip(t);if(!e)continue;if(!zc(t.open_spans).length){const i=Bc(e.rooms,null,ql,.02*Zl,!0);i.length&&(t.open_spans=qc(i,ql),a++)}}const l=Qu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=Zu(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Vu||s))return;n++,t>r&&(r=t);const o=t*Jl*e;o>a&&(a=o,l=i)};for(const t of i){const e=Zu(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Ku(e+n),a=Ku(i+o),l=Ku(e),c=Ku(i),h=Math.max(Ql,r-l),d=Math.max(Ql,a-c);t=Xu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Ku(e[0]),Ku(e[1])];return t=Math.max(t,Yu(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Ku(s.a[0]),Ku(s.a[1])],r=[Ku(s.b[0]),Ku(s.b[1])];let a=Math.max(Yu(s.a[0],s.a[1],n[0],n[1]),Yu(s.b[0],s.b[1],r[0],r[1]));const l=Yu(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Vu&&s+e/2<=l+Vu});l>Vu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Ku(s.center[0]),Ku(s.center[1])],n=Yu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Ku(s.x1),Ku(s.y1)],i=[Ku(s.x2),Ku(s.y2)];t=Math.max(Yu(s.x1,s.y1,e[0],e[1]),Yu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Ku(s.x),i=Ku(s.y);if(null!=s.w&&null!=s.h){const n=Ku(s.x+s.w),o=Ku(s.y+s.h),r=Math.max(Ql,n-e),a=Math.max(Ql,o-i);t=Xu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Yu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Vu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Ju(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=ui([s.x,s.y],t.rooms||[],.025,{step:Ql,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Ju(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Ku(i.x),r=Ku(i.y),a=Yu(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=ip(e),r=ip(s);if(!o||!r)continue;const a=op(o.rooms),c=op(r.rooms),_=.02*Zl;let g=Xc(zc(e.open_spans),a,c,ql);const m=g.length;g=Yc(g,r.rooms,ql,_),g=g.map(t=>{const e=Fc(t,ql),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Oc(o,t).d<=4*_&&Oc(i,t).d<=4*_&&Oc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Nc(i,d,u,Zl,2*_),g=Nc(n,d,u,Zl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Zl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Zl){h.moved++;const t=m/ql;t>h.maxShift&&(h.maxShift=t);const e=m/Zl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ic(p,g,ql)}),g=Yc(g,r.rooms,ql,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Fc(t,ql));g.length?s.open_spans=g:delete s.open_spans,jc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Aa(e.walls,a,c,Ql,ql);y=np(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=il(r.rooms,y,f,Ql,Number(s.cell_cm)>0?Number(s.cell_cm):5,Zl,ql),y=Pa(y,s.rooms||[],Ql,1,f.map(t=>[t[0]/ql,t[1]/ql,t[2]/ql,t[3]/ql])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class ap{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const lp=new WeakMap;const cp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function hp(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return cp(c,i,0)&&cp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&cp(c,s,8)&&cp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const dp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},up=t=>Math.max(0,Math.min(1,t)),pp=(t,e,i)=>t+(e-t)*i,_p=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function gp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function mp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function fp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function vp(t,e,i){const s=fp(t),n=fp(e);if(!s||!n)return i<.5?t:e;const o=up(i);return`rgba(${Math.round(pp(s[0],n[0],o))}, ${Math.round(pp(s[1],n[1],o))}, ${Math.round(pp(s[2],n[2],o))}, ${pp(s[3],n[3],o).toFixed(3)})`}function yp(t,e,i){const s=(t=>{const e=up(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,_p(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=up((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:yp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const wp="houseplan_card_labs_v1",kp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function xp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function $p(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Pp(t,e,i,s=kp){const n=function(t,e=kp){const i=xp(t),s=new Map;if(!i||!Mp(e))return s;for(const t of e){const e=xp(t.since),n=xp(t.expires);$p(i,e)>=0&&$p(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Mp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Tp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Tp(Cp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Dp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Rp={active:Object.freeze([]),space:""},Ap="",Ip=!1,Fp="";const Ep=new Set;function zp(){if("undefined"==typeof window)return Rp;const t=Pp(window.location,function(){try{return window.localStorage.getItem(wp)}catch{return null}}(),Ap);void 0!==t.persist&&function(t){try{window.localStorage.setItem(wp,t)}catch{}}(t.persist),Rp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Ep)t(Rp);return Rp}function Op(){zp()}function Hp(t){return Ap=t,"undefined"==typeof window?Rp:(Ip||(Ip=!0,window.addEventListener("hashchange",Op),window.addEventListener("popstate",Op)),zp())}const Np=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Lp=64;function Bp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function qp(t,e,i=Np){if(!(Bp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function jp(t,e=Np){if(!Bp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Wp(t=Np){return`matrix(${function(t=Np){if(!Bp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Up(t,e=Np){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[qp(t,-o,e),qp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Gp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Vp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Vp(i)>0===s?i:[...i].reverse()}function Yp(t,e,i){return t.length?`M ${t.map(t=>Gp(qp(t,i,e))).join(" L ")} Z`:""}function Xp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Jp(t,e,i=Np){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Kp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Vp(t))>=1e-9)).filter(t=>t.length&&Vp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Vp(e[0]))-Math.abs(Vp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function Zp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const Qp=t=>t.every(Number.isFinite);function t_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function e_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],t_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:t_(s,t.angle,a,l),quarterVector:t_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const i_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function s_(t,e,i=Np){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=qp(e.hinge,e.bottom,i),r=qp(n,e.bottom,i),a=qp(n,e.top,i),l=qp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${i_(o)} L ${i_(r)} L ${i_(a)} L ${i_(l)} Z`,shadowD:`M ${i_(qp(e.hinge,0,i))} L ${i_(qp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const n_={window:120,door:90,passage:90,gate:300};function o_(t){return n_[t]}function r_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function a_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=r_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function l_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function c_(t){const e=a_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=r_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(l_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(l_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function h_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const d_="1.65.0-beta.8",u_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},p_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},__=2e3,g_=1e3,m_=1500,f_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},v_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},y_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},b_=new Map;let w_=0;const k_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let x_=1e4;const $_="houseplan_card_layout_v1",S_="houseplan_card_cfg_v1",M_="houseplan_card_zoom_v1",C_="houseplan_card_nav_v1",D_="houseplan_card_kiosk_v1",T_="houseplan_card_view_v1",P_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",R_=1e3,A_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],I_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},F_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),E_=2e3,z_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},O_=t=>{history.pushState(null,"",t),z_(window,"location-changed",{replace:!1})},H_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},N_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class L_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=_n(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Nu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...ia},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new bp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Uu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new ap(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++w_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Fu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=An(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Mn(t);e&&(Tn(t,e),Pn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new rh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=H_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem($_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=H_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=f_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=f_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Bl(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Sl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=f_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>E_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||_a];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Lr(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:cs(this._settings,{bgColor:null})||null,northDeg:Yr(this._settings,{}),bgMode:Xr(this._settings,{}),sunRays:Jr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=rp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:gp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=zi(this._baseVb(),s/Math.max(1,n)),r=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:gp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new ih(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(T_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?jp(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?qp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Dp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,lp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=th(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=lp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=hp(t).catch(()=>!1).then(t=>(i.resolved=t,t)),lp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>Rs(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Ep.add(e);const i=Hp(t);return"undefined"==typeof window&&e(i),()=>{Ep.delete(e)}}(d_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of b_.values())for(const e of t)clearTimeout(e.evict);b_.clear(),x_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of b_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:b_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(T_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Hp(d_);try{const t=JSON.parse(localStorage.getItem(D_)||"null");this._kioskScale={icon:Es(t?.icon),font:Es(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(S_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||sh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||sh(this._layout),this._virtualLights=_n(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=k_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=b_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Jc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Jc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=b_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},x_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?qp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&F_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=k_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=b_.get(i)||[];for(s.push(this._warmSlot),b_.set(i,s),this._warmTrim(s);b_.size>8;){const t=b_.keys().next().value;if(void 0===t||t===i)break;for(const e of b_.get(t)||[])clearTimeout(e.evict);b_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>x_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=sh(this._serverCfg),this._layoutContentFingerprint=sh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(vn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(S_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:mn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Kl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return nh([this._cfgRev,this._cfgContentFingerprint||sh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||sh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Gu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Gu(t,t=>t.classList.contains("editor-secondary")),s=Gu(t,t=>!!t.dataset.editorGroup),n=Gu(t,t=>!!t.dataset.editorPalette),o=Gu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ku=t=>t.stopPropagation(),Yu=4.166666666666667e-9;function Xu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/tc)*tc;return Math.abs(e-t)<=Yu?t:e}const Ju=(t,e,i,s)=>Math.hypot(i-t,s-e),Zu=(t,e,i,s,n,o,r,a)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+r-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+a-(e+s)))),Qu=(t,e,i,s,n,o,r)=>{const a=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*a,h=Math.sin(i*l)*a,d=Math.cos(r*l)*a,u=Math.sin(r*l)*a,p=Math.max(Ju(t+c,e+h,n+d,o+u),Ju(t-c,e-h,n-d,o-u)),_=Math.max(Ju(t+c,e+h,n-d,o-u),Ju(t-c,e-h,n+d,o+u));return Math.min(p,_)},tp=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const ep=t=>JSON.parse(JSON.stringify(t)),ip=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),sp=(t,e,i)=>Math.min(i,Math.max(e,t)),np=t=>Yl({spaces:[t]})[0],op=(t,e,i)=>{const s=i>0?i:1,n=t=>`${(t[0]/s).toFixed(12)},${(t[1]/s).toFixed(12)}`,o=n(t),r=n(e);return o0?r:1,l=Math.max(s*a*.02,1e-9),c=[];for(const e of t||[])for(const t of hi(e)||[])c.push([t[0],t[1]]);for(const t of i||[])Array.isArray(t)&&t.length>=4&&t.slice(0,4).every(Number.isFinite)&&c.push([t[0],t[1]],[t[2],t[3]]);const h=t=>c.some(e=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l),d=new Map;for(const r of t||[]){if(!r?.id)continue;const c=tl(t,r.id,e,i,s,n,o,a);if(c)for(let t=0;t0&&u>0&&r===p&&u!==r))continue;const _=c.poly[s],g=c.poly[(s+1)%c.poly.length],m=Math.hypot(g[0]-_[0],g[1]-_[1]);if(!(m>l&&m<.5*o-1e-9*o))continue;if(h(_)||h(g))continue;const f=op(_,g,a),v=d.get(f);v?v.targets.add(r):d.set(f,{a:[_[0],_[1]],b:[g[0],g[1]],targets:new Set([r])})}}}let u=e.slice();const p=(t,e)=>Math.hypot(t[0]-e[0],t[1]-e[1])<=2*l,_=(t,e)=>{if(!Array.isArray(t.a)||!Array.isArray(t.b)||t.a.length<2||t.b.length<2)return!1;const i=[Number(t.a[0])*a,Number(t.a[1])*a],s=[Number(t.b[0])*a,Number(t.b[1])*a];return!![...i,...s].every(Number.isFinite)&&(p(i,e.a)&&p(s,e.b)||p(i,e.b)&&p(s,e.a))};for(const t of[...d.values()].filter(t=>1===t.targets.size).sort((t,e)=>op(t.a,t.b,a).localeCompare(op(e.a,e.b,a)))){const e=[...t.targets][0],i=u.filter(e=>_(e,t));if(new Set(i.map(t=>t.cm)).size>1)continue;let n=!1;u=u.map(i=>_(i,t)?(n=!0,i.cm===e?i:{...i,cm:e}):i),n||(u=Fa(u,t.a,t.b,e,s,a))}return u}const ap=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&ip(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(ip(n,"segments")&&(delete n.segments,e++),ip(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=Ul&&t<=Gl&&(ip(n,"plan_scale_x")||(n.plan_scale_x=t),ip(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);ip(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?sp(o,.1,1e3):5,e++);const r=Number(n.cell_cm),a=Number.isFinite(r)&&r>0?r:5;for(const t of n.wall_columns||[])if("circle"===t.shape)ip(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&ip(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(ip(t,"width")){const i=Number(t.width);(ip(t,"width_cm")||Number.isFinite(i))&&(ip(t,"width_cm")||(t.width_cm=Number(sp(i/Ql*a,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(ip(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),ip(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(sp(es*is(t)/Ql*a,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(ip(t,"scale")||ip(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(ip(t,"entity")||ip(t,"attr")||ip(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,r=s||n?"":Xi(t.entity,o);if(s||r){if(r){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+r+i.slice(e+2):`${i}${i?" ":""}${r}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let a=r.total;for(const t of i.spaces||[]){const e=np(t);if(!e)continue;if(!Oc(t.open_spans).length){const i=qc(e.rooms,null,jl,.02*Ql,!0);i.length&&(t.open_spans=jc(i,jl),a++)}}const l=ep(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,r=0,a=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=tp(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Yu||s))return;n++,t>r&&(r=t);const o=t*Zl*e;o>a&&(a=o,l=i)};for(const t of i){const e=tp(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,r=Xu(e+n),a=Xu(i+o),l=Xu(e),c=Xu(i),h=Math.max(tc,r-l),d=Math.max(tc,a-c);t=Zu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Xu(e[0]),Xu(e[1])];return t=Math.max(t,Ju(e[0],e[1],i[0],i[1])),i}),r=n.length?[n[0]]:[],a=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Xu(s.a[0]),Xu(s.a[1])],r=[Xu(s.b[0]),Xu(s.b[1])];let a=Math.max(Ju(s.a[0],s.a[1],n[0],n[1]),Ju(s.b[0],s.b[1],r[0],r[1]));const l=Ju(n[0],n[1],r[0],r[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Yu&&s+e/2<=l+Yu});l>Yu&&c?(s.a=n,s.b=r):a=0,p(a,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Xu(s.center[0]),Xu(s.center[1])],n=Ju(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Xu(s.x1),Xu(s.y1)],i=[Xu(s.x2),Xu(s.y2)];t=Math.max(Ju(s.x1,s.y1,e[0],e[1]),Ju(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Xu(s.x),i=Xu(s.y);if(null!=s.w&&null!=s.h){const n=Xu(s.x+s.w),o=Xu(s.y+s.h),r=Math.max(tc,n-e),a=Math.max(tc,o-i);t=Zu(s.x,s.y,s.w,s.h,e,i,r,a),s.w=r,s.h=a}else t=Ju(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const r=n.b[0]-n.a[0],a=n.b[1]-n.a[1];if(Math.hypot(r,a)<=Yu)continue;const l=n.a[0]+r*o,h=n.a[1]+a*o;let d=180*Math.atan2(a,r)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=Qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:tc,length:Number(s.length)||0});if(!n)continue;const r=Number(s.angle),a=!(Number.isFinite(r)&&r===n.angle),l=Qu(s.x,s.y,Number.isFinite(r)?r:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,a&&c++,p(l,e,i,a)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Xu(i.x),r=Xu(i.y),a=Ju(i.x,i.y,n,r);s[t]={...i,x:n,y:r};const l="string"==typeof i.s?i.s:"";p(a,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:r,maxShiftCm:a,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=np(e),r=np(s);if(!o||!r)continue;const a=ap(o.rooms),c=ap(r.rooms),_=.02*Ql;let g=Jc(Oc(e.open_spans),a,c,jl);const m=g.length;g=Xc(g,r.rooms,jl,_),g=g.map(t=>{const e=Ec(t,jl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],r=e[2]-e[0],a=e[3]-e[1],l=Math.hypot(r,a)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(r*s-a*e)/(l*c)<=1e-6&&Hc(o,t).d<=4*_&&Hc(i,t).d<=4*_&&Hc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Lc(i,d,u,Ql,2*_),g=Lc(n,d,u,Ql,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Ql)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Ql){h.moved++;const t=m/jl;t>h.maxShift&&(h.maxShift=t);const e=m/Ql*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Fc(p,g,jl)}),g=Xc(g,r.rooms,jl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ec(t,jl));g.length?s.open_spans=g:delete s.open_spans,Wc(s.rooms||[],r.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Ia(e.walls,a,c,tc,jl);y=rp(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=sl(r.rooms,y,f,tc,Number(s.cell_cm)>0?Number(s.cell_cm):5,Ql,jl),y=Ra(y,s.rooms||[],tc,1,f.map(t=>[t[0]/jl,t[1]/jl,t[2]/jl,t[3]/jl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:a,glowSpacesMigrated:r.glowSpaces,glowRoomsMigrated:r.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class cp{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const hp=new WeakMap;const dp=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function up(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,r=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=r}),a=t.createElement("canvas");a.width=4,a.height=1;const l=a.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return dp(c,i,0)&&dp(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&dp(c,s,8)&&dp(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(r)}}const pp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},_p=t=>Math.max(0,Math.min(1,t)),gp=(t,e,i)=>t+(e-t)*i,mp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function fp(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function vp(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function yp(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function bp(t,e,i){const s=yp(t),n=yp(e);if(!s||!n)return i<.5?t:e;const o=_p(i);return`rgba(${Math.round(gp(s[0],n[0],o))}, ${Math.round(gp(s[1],n[1],o))}, ${Math.round(gp(s[2],n[2],o))}, ${gp(s[3],n[3],o).toFixed(3)})`}function wp(t,e,i){const s=(t=>{const e=_p(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,mp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=_p((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:wp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(r):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(r),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const xp="houseplan_card_labs_v1",$p=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function Sp(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function Mp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function Ap(t,e,i,s=$p){const n=function(t,e=$p){const i=Sp(t),s=new Map;if(!i||!Dp(e))return s;for(const t of e){const e=Sp(t.since),n=Sp(t.expires);Mp(i,e)>=0&&Mp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(Dp(s)?s.map(t=>t.id):[]),r=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let a=!1;const l=t=>{if("off"===t)return r.clear(),void(a=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(a=!0,e||!n.has(i)?r.delete(i):r.add(i))};for(const e of Rp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of Rp(Tp(t.hash)))l(e);const c=Object.freeze([...r].sort());return{active:c,space:Pp(t.hash),persist:a?JSON.stringify(c):void 0,knownUrlOperation:a}}let Ip={active:Object.freeze([]),space:""},Fp="",Ep=!1,zp="";const Op=new Set;function Hp(){if("undefined"==typeof window)return Ip;const t=Ap(window.location,function(){try{return window.localStorage.getItem(xp)}catch{return null}}(),Fp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(xp,t)}catch{}}(t.persist),Ip={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of Op)t(Ip);return Ip}function Np(){Hp()}function Lp(t){return Fp=t,"undefined"==typeof window?Ip:(Ep||(Ep=!0,window.addEventListener("hashchange",Np),window.addEventListener("popstate",Np)),Hp())}const Bp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),qp=64;function jp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Wp(t,e,i=Bp){if(!(jp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],r=t[1]-i.origin[1],a=(o*Math.cos(s)-r*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+r*Math.cos(s))*i.xyScale;return[i.origin[0]+a,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Up(t,e=Bp){if(!jp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Gp(t=Bp){return`matrix(${function(t=Bp){if(!jp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),r=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,r,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-r*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Vp(t,e=Bp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const r=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],a=Math.max(s,n),l=r.flatMap(t=>[Wp(t,-o,e),Wp(t,a,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Kp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Yp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return Yp(i)>0===s?i:[...i].reverse()}function Jp(t,e,i){return t.length?`M ${t.map(t=>Kp(Wp(t,i,e))).join(" L ")} Z`:""}function Zp(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Qp(t,e,i=Bp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Xp(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(Yp(t))>=1e-9)).filter(t=>t.length&&Yp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(Yp(e[0]))-Math.abs(Yp(t[0]))});const n=[],o=[];let r=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:r}}function t_(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const e_=t=>t.every(Number.isFinite);function i_(t,e,i,s){const n=t[0]*i,o=t[1]*s,r=e*Math.PI/180;return[n*Math.cos(r)-o*Math.sin(r),n*Math.sin(r)+o*Math.cos(r)]}function s_(t,e,i,s,n,o,r){const a=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],i_(i,t.angle,a,l));return{leaf:e,hinge:c,closedVector:i_(s,t.angle,a,l),quarterVector:i_([-s[1],s[0]],t.angle,a,l),turnDeg:n,bottom:o,top:r}}const n_=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function o_(t,e,i=Bp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Wp(e.hinge,e.bottom,i),r=Wp(n,e.bottom,i),a=Wp(n,e.top,i),l=Wp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${n_(o)} L ${n_(r)} L ${n_(a)} L ${n_(l)} Z`,shadowD:`M ${n_(Wp(e.hinge,0,i))} L ${n_(Wp(n,0,i))}`,depth:Math.max(o[1],r[1])}})}const r_={window:120,door:90,passage:90,gate:300};function a_(t){return r_[t]}function l_(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function c_(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=l_(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function h_(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function d_(t){const e=c_(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,a=(t[0]-e.a[0])*o+(t[1]-e.a[1])*r,l=Math.max(0,Math.min(n,a)),c=e.a[0]+l*o,h=e.a[1]+l*r;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(o,r);if(!(a>1e-9))return!1;const l=o/a,c=r/a;for(const o of i){if(!o.open&&o.kind)continue;const i=l_(o.a,o.b),r=i.b[0]-i.a[0],a=i.b[1]-i.a[1],h=Math.hypot(r,a);if(!(h>1e-9))continue;const d=r/h,u=a/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(h_),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(h_);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),r=o.filter(t=>t.target.partitionHost);if(r.length){if(1!==new Set(r.map(t=>t.target.partitionHost.id)).size||r.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=r[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),a=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,r=s/n,c=Math.abs(a*r-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*a);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:a,length:l}=n,c=a.b[0]-a.a[0],h=a.b[1]-a.a[1],d=c/l,u=h/l,p=a.partitionHost?a.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=a.a[0]+d*g,y=a.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,x=Math.max(0,w),$=Math.max(0,l-k),S=[a.a[0]+d*(w-x/2),a.a[1]+u*(w-x/2)],M=[a.a[0]+d*(k+$/2),a.a[1]+u*(k+$/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:a,...a.partitionHost?{host:{...a.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:x,midpoint:S},{distance:$,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function u_(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const p_="1.65.0-beta.8",__={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},g_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},m_=2e3,f_=1e3,v_=1500,y_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},b_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},w_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},k_=new Map;let x_=0;const $_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let S_=1e4;const M_="houseplan_card_layout_v1",C_="houseplan_card_cfg_v1",D_="houseplan_card_zoom_v1",T_="houseplan_card_nav_v1",P_="houseplan_card_kiosk_v1",R_="houseplan_card_view_v1",A_="hp-dialog, hp-help, hp-color-opacity, hp-device-preview",I_=1e3,F_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],E_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},z_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),O_=2e3,H_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},N_=t=>{history.pushState(null,"",t),H_(window,"location-changed",{replace:!1})},L_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},B_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class q_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._pointerModality=new Bu(this,()=>this._syncPointerHoverTargets()),this._devicePressAnimations=new Map,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...sa},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this._cancelDevicePressFeedback(),t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new kp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new Vu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new cp(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++x_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"===t.kind)return this._clearTransientHover(!0),this._cancelDevicePressFeedback(),void(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0));if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+zu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{if(this._hasFixedFloor)return;const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new ah(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=L_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(M_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=L_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=y_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?Sl:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?Sl:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=y_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&ql(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const r=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=Ml(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=y_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),r),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],r=s.points.slice(0,n+1),a=s.points.slice(n+1);if(r.length>=2&&o.push({id:s.id,points:r,segments:s.segments.slice(0,n)}),a.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:a,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>O_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||ga];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Br(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Xr(this._settings,{}),bgMode:Jr(this._settings,{}),sunRays:Zr(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=lp(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),r=this.renderRoot.querySelector(".hp-backdrop"),a=this.renderRoot.querySelector(".zoomwrap"),l=a?getComputedStyle(a).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:fp(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:r&&Number(getComputedStyle(r).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),r=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),a=o.w/r,l=o.h/r,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-a/2,y:h-l/2,w:a,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const r=this.renderRoot.querySelector(".editorchrome"),a=r?.querySelector(".editorchrome-inner"),l="view"===i?0:a?.scrollHeight||a?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:fp(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}get _hasFixedFloor(){return!!this._config&&Object.prototype.hasOwnProperty.call(this._config,"floor")}_fixedFloorState(t=this._model,e=this._loadOk){const i=this._config?.floor,s=function(t){if(!t.hasFloor)return{kind:"absent"};const e=t.floor;if("string"==typeof e)return e.length?t.spaceIds.includes(e)?{kind:"valid",id:e,source:"id"}:{kind:"invalid",reason:"unknown-id",value:e}:{kind:"invalid",reason:"empty-id",value:e};if("number"==typeof e){if(!Number.isFinite(e))return{kind:"invalid",reason:"non-finite-index",value:e};if(!Number.isInteger(e))return{kind:"invalid",reason:"fractional-index",value:e};if(e<0)return{kind:"invalid",reason:"negative-index",value:e};const i=t.spaceIds[e];return void 0===i?{kind:"invalid",reason:"out-of-range-index",value:e}:{kind:"valid",id:i,source:"index"}}return{kind:"invalid",reason:"invalid-type",value:e}}({spaceIds:t.map(t=>t.id),hasFloor:this._hasFixedFloor,floor:i});return!this._hasFixedFloor||e?s:"number"==typeof i?"valid"===s.kind||"invalid"===s.kind&&"out-of-range-index"===s.reason?{kind:"pending",value:i}:s:"valid"===s.kind||"invalid"===s.kind&&"unknown-id"!==s.reason?s:{kind:"pending",value:i}}_canCommitSpace(t,e=!1){if(e||!this._hasFixedFloor)return!0;const i=this._fixedFloorState();return"valid"===i.kind&&i.id===t}_commitSpace(t,e=!1){return!!this._canCommitSpace(t,e)&&(t!==this._space&&(this._clearTransientHover(!0),this._cancelDevicePressFeedback()),this._space=t,!0)}_slideTo(t,e){if(t===this._space)return!0;if(!this._canCommitSpace(t))return!1;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return!1;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;return this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._commitSpace(t),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate()),!0}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}_syncCycleTimer(){clearInterval(this._cycleTimer),this._cycleTimer=void 0,this.isConnected&&!this._hasFixedFloor&&this._config?.kiosk&&Number(this._config.cycle)>0&&(this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle)))}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new sh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(R_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Up(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Wp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return Pp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,hp.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=eh(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._pointerModality.connect(this.ownerDocument.defaultView);const i=this.ownerDocument.defaultView?.MutationObserver;i&&(this._pointerHoverObserver=new i(t=>{for(const e of t)for(const t of e.addedNodes)this._syncPointerHoverSubtree(t)}),this._pointerHoverObserver.observe(this.renderRoot,{childList:!0,subtree:!0})),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=hp.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=up(t).catch(()=>!1).then(t=>(i.resolved=t,t)),hp.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._syncCycleTimer(),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){Op.add(e);const i=Lp(t);return"undefined"==typeof window&&e(i),()=>{Op.delete(e)}}(p_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._clearTransientHover(!0),this._cancelDevicePressFeedback(),this._pointerHoverObserver?.disconnect(),this._pointerHoverObserver=void 0,this._pointerModality.disconnect(),this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),r=/^[a-z]$/.test(o),a="z"===o||!r&&"KeyZ"===t.code,l="y"===o||!r&&"KeyY"===t.code,c=n&&(a&&t.shiftKey||l),h=n&&a&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of k_.values())for(const e of t)clearTimeout(e.evict);k_.clear(),S_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of k_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:k_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){const e=this._config,i=!!e&&Object.prototype.hasOwnProperty.call(e,"floor");this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t};(i!==this._hasFixedFloor||e?.floor!==this._config.floor)&&(this._hashApplied=!1,this._navApplied=!1,this._warmVpArmed=!1),this._config.kiosk&&(this._booting=!1,this._bootFading=!1),!this._hasFixedFloor&&t.default_floor&&this._commitSpace(t.default_floor,!0);try{this._zoomBySpace=JSON.parse(localStorage.getItem(D_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(R_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Lp(p_);try{const t=JSON.parse(localStorage.getItem(P_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(C_)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||nh(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||nh(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0)}catch{}this._adoptInitialSpace(this._model,this._loadOk),"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._syncCycleTimer(),this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=$_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=k_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Zc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:r}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,r=0,a=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>r?(o=i,r=t,a=1):t===r&&a++)}return!o||a>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Zc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)),this._warmKey=t,r?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=k_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},S_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);const i=this._fixedFloorState();if(this._hashApplied||!this._model.find(t=>t.id===e.space)||"valid"===i.kind&&i.id!==e.space||this._hasFixedFloor&&"valid"!==i.kind)return void(this._warmVp=null);this._commitSpace(e.space,!0),this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const s=this._effectiveProjection(),n=s===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=n&&e.view?{...e.view}:null,this._viewModeSnap=n&&e.snap?{...e.snap}:null,!n&&e.logicalCenter){const t="iso"===s?Wp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var o;this._tool="openwall"===(o=e.tool)||"closewall"===o?"boundary":"opening"===(o=function(t){return"partition"===t?"draw":t}(o))?"draw":"string"==typeof o&&z_.has(o)?o:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=$_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=k_.get(i)||[];for(s.push(this._warmSlot),k_.set(i,s),this._warmTrim(s);k_.size>8;){const t=k_.keys().next().value;if(void 0===t||t===i)break;for(const e of k_.get(t)||[])clearTimeout(e.evict);k_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>S_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=nh(this._serverCfg),this._layoutContentFingerprint=nh(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(C_,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t,e=this._loadOk){const i=this._fixedFloorState(t,e);return"valid"===i.kind?{id:i.id,source:"fixed"}:this._hasFixedFloor?{id:null,source:"none"}:function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t,e=this._loadOk){const i=this._initialSpaceSelection(t,e);return i.id?(this._commitSpace(i.id,!0),"hash"===i.source&&(this._hashApplied=!0),"saved"===i.source&&(this._navApplied=!0),i):i}_candidateBackdrop(t,e=this._space){const i=Yl(t),s=this._fixedFloorState(i,!0);if(this._hasFixedFloor&&"valid"!==s.kind)return"";const n=this._initialSpaceSelection(i,!0).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===n)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return oh([this._cfgRev,this._cfgContentFingerprint||nh(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||nh(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4754,8 +4840,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t(t?"continuity.restore_connection":"continuity.restore_plan")} ${"recovery-error"===this._continuity.state?j``:G} -
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Kl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?ah(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return ah(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||An(e),s=zn(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=vo(o),d=mo(s,c).filter(t=>!yo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=Bn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Ln(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=qn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===fo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return ds(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=sh(n),r=o!==(this._cfgContentFingerprint||sh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=gn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);fn(e)!==fn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=sh(t);a=s!==(this._layoutContentFingerprint||sh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=sh(n)!==(this._cfgContentFingerprint||sh(this._serverCfg))||sh(s?.layout??{})!==(this._layoutContentFingerprint||sh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem($_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=bn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(sh(e)!==(this._cfgContentFingerprint||sh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=Rn(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return An(this.hass)}get _planHass(){const t=this._haRegistry,e=Fn(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=zn(this.hass,t),n=On(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+Fu)>t?1:0)).join("|"),i=fn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of gi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Ki(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,Qi(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!yo(s,t,vo(this._markers))))}const h=ao(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(vu(t.id,e),_u(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?bh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=fu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Ln(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=An(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&O_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else O_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,Rs(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=sh(i);s!==(this._layoutContentFingerprint||sh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=Fn(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+nr(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=ko({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Ln(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Nn(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Sn=s;try{localStorage.setItem($n,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(z_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=ho(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return Ei(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*gc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Oi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ec(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*R_,y:i.y*R_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ec(_c(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:sc(n/R_),y:sc(o/R_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return cu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(vu(t.id,e));return s||_u(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,pu({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=po(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:uo(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Ls(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&_o(this.hass,t.primary)?go(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,z_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Yh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!ed(t))return;const e=t=>{const e=ed(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=bn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&id(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return or(nr(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=nr(this.hass,this._config?.language);return rr(i,t)&&rr(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=rc([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=rc("line"===t.kind?[[t.x1*R_,t.y1*i],[t.x2*R_,t.y2*i]]:"text"===t.kind?[[t.x*R_,t.y*i]]:ha({x:t.x*R_,y:t.y*i,w:t.w*R_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=rc(i);t&&e.push(t)}}return lc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:R_,h:R_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=uc(this._contentItems(t));let n=s.all||pc(t),o=this._showFar?n:s.core||pc(t);return e&&e.id===t.id&&i&&e.grow&&(o=I_(e.rect,o),n=I_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=Zp(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=Zp(e,-1)}else e=Zp(e,t?1:0);else for(const i of t)e=Zp(e,i.codePointAt(0)||0);else e=Zp(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Np,wallHeight:Lp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?ul(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=hl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||ml(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?hd(i.partitionHost,s):e.length||"gate"===t.type?bl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(Qp([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[e_(t,0,[-i,0],[i,0],o,0,.88*e),e_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[e_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),e_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[e_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return Qp([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Up({rect:n?I_(i,n):i,wallHeight:Lp,openingHeight:Lp,floorDepth:10}),r=function(t,e=Np,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Kp(l[t],t>0);if(!(c.length<3||Math.abs(Vp(c))<1e-9)){s.push(Yp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Jp(s.floor,10),openings:s.openings,frame:o};return y_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?qp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=jp([t.x,t.y]),i=jp([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Up({rect:this._frameOf().rect,wallHeight:Lp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
+
`}houseplanContinuityTrace(){return[...this._continuityHistory,...this._continuity.trace].slice(-80).map(t=>({...t,...t.stage?{stage:[...t.stage]}:{}}))}getCardSize(){return 12}get _norm(){return!(!this._serverCfg||!this._serverCfg.spaces.length)}_cfgFingerprint(){const t=this._serverCfg?.spaces||[];let e=t.length+":";for(const i of t){e+=(i.id||"")+","+(i.plan_aspect||"")+","+(i.plan_url||"").length+","+(i.plan_x??"")+","+(i.plan_y??"")+","+(i.plan_scale??"")+","+(i.plan_scale_x??"")+","+(i.plan_scale_y??"")+","+(i.plan_angle??"")+","+(i.rooms?.length||0)+","+(i.openings?.length||0)+","+(i.decor?.length||0)+";";for(const t of i.rooms||[]){const i=t.poly?.[0],s=t.poly?.[t.poly.length-1];e+=(t.poly?.length||0)+"."+(t.id||"")+"."+(t.open_to||[]).join("+")+"."+(t.area||"")+"."+JSON.stringify(t.settings||0)+"."+(t.x??"")+","+(t.y??"")+","+(t.w??"")+","+(t.h??"")+","+(i?i[0]+"/"+i[1]:"")+","+(s?s[0]+"/"+s[1]:"")+";"}}return e}get _model(){if(!this._serverCfg)return[];const t=this._cfgEpoch+"|"+this._cfgFingerprint();if(this._modelCache&&this._modelCache.key===t)return this._modelCache.model;const e=this._buildModel();return this._modelCache={key:t,model:e},e}_buildModel(){if(!this._serverCfg)return[];const t=this._renderCfg;return Yl(t).map((e,i)=>{const s=t.spaces[i]?.plan_url;return e.bg&&s?{...e,bg:{...e.bg,href:s}}:e})}_spaceModel(){return this._hasFixedFloor?lh(this._model,this._space):(t=this._model,e=this._space,t.find(t=>t.id===e)??t[0]);var t,e}_spaceModelById(t){return lh(this._model,t)}_syncEmptySpaceState(){if(!!this._serverCfg&&0===this._serverCfg.spaces.length){if(!this._emptySpaceStateActive){this._emptySpaceStateActive=!0;for(const t of this._pointers.keys())for(const e of this.renderRoot.querySelectorAll("*"))try{e.hasPointerCapture?.(t)&&e.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null,this._drag=null,this._rlResize=null,this._vacFit=null,this._compassDrag=!1,this._cancelModeTransition(!1),this._mode="view",this._clearGeometryGesture(),this._geometryHistory.clear(),this._resumeDraftBySpace={},this._tip=null,this._hoverRoom=null,this._openingInfo=null,this._closeInfoCard(),this._markerDialog=null,this._physicalDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._roomDialog=!1,"edit"===this._spaceDialog?.mode&&(this._spaceDialog=null),this._editorSecondary.closeForNavigation(),this._saveConfigDebounced.cancel(),this._frame=null,this._planSnapGeometryCache=null,this._decorSnapCache=null,this._commitSpace("",!0)}}else this._emptySpaceStateActive=!1}get _areaToSpace(){const t={};for(const e of this._model)for(const i of e.rooms)i.area&&(t[i.area]={space:e.id,room:i});return t}get _settings(){return this._serverCfg?.settings||{}}get _showAll(){return this._settings.filter_seeded?this._showHidden:!!this._settings.show_all}_toggleShowAll(){if(this._serverCfg){if(this._settings.filter_seeded)return this._showHidden=!this._showHidden,void this.requestUpdate();this._serverCfg={...this._serverCfg,settings:{...this._serverCfg.settings,show_all:!this._settings.show_all}},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}}_seedHiddenDevices(){if(!this._serverCfg||!this._norm||!this._canEdit)return;const t=this._serverCfg,e=function(t){const e=t.hass,i=t.registry||In(e),s=On(e,i),{areaToSpace:n,markers:o,settings:r,excluded:a,iconRules:l}=t,c=!1!==r.group_lights,h=yo(o),d=fo(s,c).filter(t=>!bo(s,t.eid,h)),u=new Set(d.map(t=>t.area)),p=qn(s),_=new Set(o.map(t=>t.binding)),g=[];for(const t of Object.values(s.devices)){const o=t.area_id;if(!o||!n[o])continue;if("service"===t.entry_type)continue;if(_.has("device:"+t.id))continue;if("active"!==Bn(e,"device:"+t.id,i).kind)continue;const r=p[t.id]||[],h=jn(s,t,r);let d=a.has(h)||"Group"===t.model||/scene/i.test(t.model||"")||/bridge/i.test((t.model||"")+(t.name||""))||"myheat"===h&&!!t.via_device_id;if(!d&&c&&u.has(o)){const e=(t.name_by_user||t.name||"").trim();"mdi:lightbulb"===vo(s,e,t.model,r,l)&&(d=!0)}d&&g.push("device:"+t.id)}return g}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,firstSpaceId:this._model[0]?.id||"",iconRules:this._iconRules});if(!e.length&&t.settings?.filter_seeded)return;t.markers=t.markers||[];const i=[];for(const s of e){const e="h"+s.slice(s.indexOf(":")+1);t.markers.push({id:e,binding:s,hidden:!0}),i.push(s.slice(s.indexOf(":")+1))}const s={...t.settings||{},filter_seeded:!0};delete s.show_all,i.length&&Array.isArray(s.new_device_ids)&&(s.new_device_ids=s.new_device_ids.filter(t=>!i.includes(t))),t.settings=s,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate()}get _iconRules(){const t=this._settings.icon_rules;if(!t||!Array.isArray(t)||!t.length)return;const e=JSON.stringify(t);return e!==this._rulesCompiledSrc&&(this._rulesCompiledSrc=e,this._rulesCompiled=Jt(t)),this._rulesCompiled}get _fillColors(){return us(this._settings)}get _excluded(){const t=this._settings.exclude_integrations;return t?new Set(t):Yt}willUpdate(t){t.has("_serverCfg")&&this._cfgEpoch++,this._syncEmptySpaceState(),t.has("hass")&&this.hass&&(this._hassSequence++,this._renderSnapshotAt=Date.now(),this._continuity.note("hass-snapshot"),this._ensureHaRegistryAuthority(),this._planHassMemo=null,this._hookConnection(),!this._loadOk&&!this._loading&&this._loadTries<8&&this._loadFromServer(),this._maybeRebuildDevices(),this._vacTick(),this._activityTick()),this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._continuity.refreshCompleteFrame(this._visualFrameFingerprint()),this._captureRenderDeviceSnapshot()}updated(){this._pruneDevicePressFeedback(),this._syncDayCycleClock(),this._warmSnapshot(),this._dtMeasure();const t=this._stageEl;t&&!this._roViewport&&(this._roViewport=new ResizeObserver(()=>this._refitView()),this._roViewport.observe(t)),t&&this._booting&&!this._bootTimer&&this._bootWatch();const e=this.renderRoot.querySelector(".hdr");if(e&&t&&!this._roHdr){const i=()=>{const e=this.renderRoot.querySelector("ha-card");if(!e)return;const i=t.getBoundingClientRect().top-e.getBoundingClientRect().top,s=Math.min(Math.max(e.getBoundingClientRect().top,0),120),n=Math.round(i+s);n>=0&&n!==this._hdrH&&(this._hdrH=n),n>=0&&!this._booting&&!this._config?.kiosk&&t.clientHeight>0&&this._warmPatch({hdrH:n,stageH:t.clientHeight})};this._roHdr=new ResizeObserver(()=>requestAnimationFrame(i)),this._roHdr.observe(e),this._onWinResize=()=>requestAnimationFrame(i),window.addEventListener("resize",this._onWinResize),i()}if(t&&!this._view&&this._refitView(),this._editorSecondary.afterRender(),this._settleContinuityFrame(),this._serverStorage&&this._loadOk&&0===this._model.length&&!this._spaceDialog&&!this._importDialog&&!this._onboardingShown){this._onboardingShown=!0;const t=function(t){const e=t?.floors;if(!e||"object"!=typeof e)return[];const i=[];for(const t of Object.values(e))t&&t.floor_id&&i.push({id:t.floor_id,name:t.name||t.floor_id,level:t.level??null});return i.sort((t,e)=>{const i=t.level??1e9,s=e.level??1e9;return i!==s?i-s:t.name.localeCompare(e.name)}),i}(this.hass);t.length?this._importDialog={floors:t.map(t=>({...t,checked:!0}))}:this._openSpaceDialog("create")}}_adoptStructuralResponses(t,e,i){const s=t?.config,n=s&&Array.isArray(s.spaces)?s:null,o=nh(n),r=o!==(this._cfgContentFingerprint||nh(this._serverCfg));if(r&&(this._geometryHistory.clear(),this._serverCfg&&this._clearGeometryGesture(),this._serverCfg=n,this._cfgContentFingerprint=o),this._cfgRev=t?.rev??this._cfgRev,t&&("virtual_lights"in t||"config"in t)){const e=mn(this._virtualLights,t.virtual_lights,this._cfgRev,"virtual_lights"in t);vn(e)!==vn(this._virtualLights)&&(this._virtualLights=e,this._capturedSnapshotVirtual="")}let a=!1;if(void 0!==e||void 0!==i){const t=i??e?.layout??{},s=nh(t);a=s!==(this._layoutContentFingerprint||nh(this._layout)),a&&(this._layout=t,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev}return this._canOptimizeUndo=!(!t?.can_optimize_undo&&!e?.can_optimize_undo),this._undoKind=t?.undo_kind||e?.undo_kind||null,"boolean"==typeof t?.can_write&&(this._serverCanWrite=t.can_write),r&&this._continuity.note("config-candidate",{configRev:this._cfgRev}),a&&this._continuity.note("layout-candidate",{layoutRev:this._layoutRev}),{configChanged:r,layoutChanged:a}}_resumePendingNavMode(){if(!this._pendingNavMode||!this._canEdit||this._config?.kiosk)return!1;const t=this._pendingNavMode;return this._pendingNavMode=null,this._setMode(t,!1),!0}async _loadFromServer(){this._loading=!0,this._loadTries++;const t=this._space,e=!!this._view;try{const[i,s]=await Promise.all([this.hass.callWS({type:"houseplan/config/get"}),this.hass.callWS({type:"houseplan/layout/get"})]),n=i?.config&&Array.isArray(i.config.spaces)?i.config:null,o=nh(n)!==(this._cfgContentFingerprint||nh(this._serverCfg))||nh(s?.layout??{})!==(this._layoutContentFingerprint||nh(this._layout));if(o){if(!await this._signer.prepareImage(this.hass,this._candidateBackdrop(n)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0)}o&&this._continuity.hasCompleteFrame&&"steady"===this._continuity.state&&this._beginContinuityCandidate("structural-response",!0),this._connectionWasLost=!1,this._serverStorage=!0,"boolean"==typeof i?.can_write&&(this._serverCanWrite=i.can_write),this._canOptimizeUndo=!(!i?.can_optimize_undo&&!s?.can_optimize_undo),this._adoptStructuralResponses(i,s),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._warmVpArmed&&this._space===this._warmVp?.space?this._warmVpArmed=!1:e&&this._space===t||this._restoreZoom(),this._loadOk=!0,this.hass.callWS({type:"houseplan/trail/get"}).then(t=>{this._vacSrvTrails=t?.trails||{},this.requestUpdate()}).catch(()=>{}),this._ensureLiveSyncSubscriptions()}catch(t){if(this._serverCfg)this._scheduleLoadRetry(!0);else if(this._loadTries>=8){this._serverStorage=!1;try{this._layout=JSON.parse(localStorage.getItem(M_)||"{}")||{}}catch{this._layout={}}}}finally{this._loading=!1,this._continuityDataReady=!0,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}}_ensureLiveSyncSubscriptions(){const t=this.hass?.connection;if(!t)return;if(t!==this._liveSyncConnection&&(this._unsubCfg?.(),this._unsubCfg=null,this._unsubLayout?.(),this._unsubLayout=null,this._unsubTrail?.(),this._unsubTrail=void 0,this._unsubVirtual?.(),this._unsubVirtual=null,this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=t),this._liveSyncAttempt)return;const e=this._liveSyncGeneration,i=[],s=(s,n,o,r)=>{s()||i.push(async()=>{const i=await t.subscribeEvents(r,o);e===this._liveSyncGeneration&&this.isConnected&&this.hass?.connection===t&&!s()?n(i):i?.()})};if(s(()=>this._unsubCfg,t=>{this._unsubCfg=t},"houseplan_config_updated",t=>{const e=Number(t?.data?.rev??-1);e!==this._cfgRev&&this._reloadConfigOnly(!1,e)}),s(()=>this._unsubTrail,t=>{this._unsubTrail=t},"houseplan_trail_updated",async()=>{try{const t=await this.hass.callWS({type:"houseplan/trail/get"});this._vacSrvTrails=t?.trails||{},this.requestUpdate()}catch{}}),s(()=>this._unsubLayout,t=>{this._unsubLayout=t},"houseplan_layout_updated",t=>this._onLayoutEvent(Number(t?.data?.rev??-1))),s(()=>this._unsubVirtual,t=>{this._unsubVirtual=t},"houseplan_virtual_light_updated",t=>{const e=wn(this._virtualLights,t?.data);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}),!i.length)return;const n=function(t){return Promise.allSettled(t.map(t=>Promise.resolve().then(t)))}(i).then(()=>{});this._liveSyncAttempt=n,n.finally(()=>{this._liveSyncAttempt===n&&(this._liveSyncAttempt=null)})}async _reloadConfigOnly(t=!1,e){if(!t){if(void 0!==e&&e<=this._cfgRev)return;if(this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(()=>this._reloadConfigOnly(!1,e),400))}this._beginContinuityCandidate("config-reload",!1);try{const t=await this.hass.callWS({type:"houseplan/config/get"}),e=t?.config&&Array.isArray(t.config.spaces)?t.config:null;if(nh(e)!==(this._cfgContentFingerprint||nh(this._serverCfg))&&!await this._signer.prepareImage(this.hass,this._candidateBackdrop(e)))return this._continuity.note("asset-failed"),void this._scheduleLoadRetry(!0);const i=this._space;this._adoptStructuralResponses(t),this._adoptInitialSpace(this._model,!0),this._resumePendingNavMode(),this._cacheSnapshot(),this._space!==i&&this._restoreZoom(),this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate()}catch(t){this._showToast(this._t("toast.cfg_reload_failed",{err:this._errText(t)}))}finally{this._continuityDataReady=!0,this.requestUpdate()}}_scheduleLoadRetry(t=!1){if(void 0!==this._loadRetryTimer)return;const e=Math.min(8e3,500*2**Math.min(4,Math.max(1,this._loadTries-7)));this._loadRetryTimer=window.setTimeout(()=>{this._loadRetryTimer=void 0,!t&&this._loadOk||this._loading||!this.hass||this._loadFromServer()},e)}_ensureHaRegistryAuthority(){const t=this.hass?.connection||null;t&&t!==this._haRegistryConnection&&(this._haRegistryRelease?.(),this._haRegistryConnection=t,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._haRegistryRelease=An(this.hass,this._onHaRegistryUpdate),this._onHaRegistryUpdate())}get _haRegistry(){return In(this.hass)}get _planHass(){const t=this._haRegistry,e=En(this.hass,t),i=this._planHassMemo;if(i&&i.hass===this.hass&&i.sig===e)return i.active;const s=On(this.hass,t),n=Hn(this.hass,t);return this._planHassMemo={hass:this.hass,sig:e,active:s,full:n},s}_captureRenderDeviceSnapshot(){if(!this.hass)return;const t=Date.now(),e=[...this._activityRt.entries()].map(([e,i])=>`${e}:${i.gen}:${i.flashTs}:`+(i.flashKind&&(i.expiresAt||i.flashTs+zu)>t?1:0)).join("|"),i=vn(this._virtualLights);if(this._capturedSnapshotSequence===this._hassSequence&&this._capturedSnapshotDevices===this._devices&&this._capturedSnapshotLayout===this._layout&&this._capturedSnapshotConfigEpoch===this._cfgEpoch&&this._capturedSnapshotVirtual===i&&this._capturedSnapshotActivity===e)return;const s=this._planHass,n=new Map,o=new Map,r=new Set(["sun.sun"]);this._vacFit?.source&&r.add(this._vacFit.source);const a=new Set,l=new Set,c=t=>{if(!t)return;const e=t.indexOf(":");if(e<0)return void r.add(t);const i=t.slice(0,e),s=t.slice(e+1);"device"===i?a.add(s):"entity"===i&&r.add(s)};for(const t of this._model)for(const e of t.rooms)e.area&&l.add(e.area),c(e.settings?.temp_source),c(e.settings?.hum_source);for(const t of this._serverCfg?.spaces||[])for(const e of t.openings||[])for(const t of mi(e))r.add(t);for(const t of this._serverCfg?.spaces||[])for(const e of t.decor||[])if("text"===e.kind){for(const t of String(e.text||"").matchAll(/\{([^{}\r\n]+)\}/g)){const e=Yi(t[1]);e?.entity&&r.add(e.entity)}e.entity&&r.add(e.entity),o.set(`decor:${t.id}:${e.id}`,ts(e.text,e,s,t=>!!s.entities?.[t]&&!!s.states?.[t]&&!bo(s,t,yo(this._markers))))}const h=lo(s,this._devices,null,this._virtualLights);for(const t of this._devices){for(const e of[!1,!0])n.set(yu(t.id,e),gu(s,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._devices,lightSources:h,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}));if(this._isVacDev(t)){const e=this._vacSource(t,s),i=e?wh(s?.states?.[e]?.attributes):null,n=this._vacRt.get(t.id);o.set(`vacuum:${t.id}`,{source:e,telemetry:i,mapId:i?this._vacMapId(t,i,s):null,runtime:n?{trail:n.trail,lastTs:n.lastTs,moving:n.moving,jump:n.jump}:null,server:this._vacSrvTrails[t.id]||null})}}const d=vu({sourceSequence:this._hassSequence,hass:s,devices:this._devices,presentations:n,positions:(u=this._model.length>0,p=this._devices,_=t=>this._livePos(t),u?new Map(p.map(t=>[t.id,_(t)])):new Map),facts:o,entityIds:r,deviceIds:a,areaIds:l});var u,p,_;this._capturedSnapshotSequence=this._hassSequence,this._capturedSnapshotDevices=this._devices,this._capturedSnapshotLayout=this._layout,this._capturedSnapshotActivity=e,this._capturedSnapshotConfigEpoch=this._cfgEpoch,this._capturedSnapshotVirtual=i,this._visibleDeviceSnapshot&&"steady"!==this._continuity.state?this._candidateDeviceSnapshot=d:(this._visibleDeviceSnapshot=d,this._candidateDeviceSnapshot=null)}get _renderDeviceSnapshot(){return this._stagedDeviceSnapshotToken===this._continuity.token?this._candidateDeviceSnapshot||this._visibleDeviceSnapshot:this._visibleDeviceSnapshot||this._candidateDeviceSnapshot}get _renderPlanHass(){return this._renderDeviceSnapshot?.hass||this._planHass}get _renderDevices(){return this._renderDeviceSnapshot?.devices||this._devices}get _fullRegistryHass(){return this._planHass,this._planHassMemo?.full||this.hass}_bindingStatus(t){return Bn(this.hass,t,this._haRegistry)}houseplanDiagnostics(){const t=function(t){const e=In(t);return{access:e.access,authoritative:e.authoritative,revision:e.revision,lastSuccess:e.lastSuccess,error:e.error}}(this.hass),e={active:0,ha_disabled:0,orphaned:0,unverified:0};for(const t of this._markers)t.removed||"virtual"===t.binding||e[this._bindingStatus(t.binding).kind]++;return{registry:{...t,lastSuccessAgeMs:t.lastSuccess?Math.max(0,Date.now()-t.lastSuccess):null},bindings:e}}_openBindingInHa(t){const[e,i]=t.split(":");if(i)if("device"!==e){if("entity"===e){const t=this._fullRegistryHass.entities?.[i];t?.device_id&&N_("/config/devices/device/"+encodeURIComponent(t.device_id))}}else N_("/config/devices/device/"+encodeURIComponent(i))}_bindingHasHaPage(t){const[e,i]=t.split(":");return!!i&&("device"===e||"entity"===e&&!!this._fullRegistryHass.entities?.[i]?.device_id)}_toggleMarkerDialogVisibility(){const t=this._markerDialog;if(!t)return;const e="ha"===t.bindingMode?this._bindingStatus(t.binding):null,i=t.hideFromPlan||"ha_disabled"===e?.kind;i&&"ha_disabled"===e?.kind?this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device")):i&&"unverified"===e?.kind?this._showToast(this._t("toast.ha_binding_unverified")):this._markerDialog={...t,hideFromPlan:!i}}_hookConnection(){const t=this.hass?.connection;t&&t!==this._connHooked&&(this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),t.addEventListener?.("ready",this._onConnReady),t.addEventListener?.("disconnected",this._onConnLost),t.addEventListener?.("reconnect-error",this._onConnLost),this._connHooked=t)}_display(t){return this._signer.display(this.hass,t)}_resign(){this._signer.resign(this.hass,As(this._serverCfg))}_onLayoutEvent(t){t<=this._layoutRev||(clearTimeout(this._layoutSyncTimer),this._layoutSyncTimer=window.setTimeout(()=>{t<=this._layoutRev||this._reloadLayoutOnly()},200))}_noteLayoutRev(t){const e=t?.rev;"number"==typeof e&&e>this._layoutRev&&(this._layoutRev=e)}async _reloadLayoutOnly(){if(!this._serverStorage||!this.hass?.callWS)return;this._beginContinuityCandidate("layout-reload",!1);const t=new Map;for(const e of this._dirtyPos)this._layout[e]&&t.set(e,this._layout[e]);this._persistLayout.pending()&&this._persistLayout.flush();for(const[e,i]of this._sentPos)t.set(e,i);try{const e=await this.hass.callWS({type:"houseplan/layout/get"}),i={...e?.layout||{}};for(const[e,s]of t)i[e]=s;const s=nh(i);s!==(this._layoutContentFingerprint||nh(this._layout))&&(this._layout=i,this._layoutContentFingerprint=s),this._layoutRev=e?.rev??this._layoutRev,this._canOptimizeUndo=!!e?.can_optimize_undo,this._undoKind=e?.undo_kind||null,this._cacheSnapshot(),this.requestUpdate()}catch{}finally{this._continuityDataReady=!0,this.requestUpdate()}}_maybeRebuildDevices(){const t=this.hass;if(!t?.devices||!t?.entities||!t?.areas)return;const e=this._haRegistry,i=En(t,e)+":"+Object.keys(t.areas).length+":"+(this._norm?"n":"l")+":"+or(t,this._config?.language);if(i===this._regSignature&&this._devices.length)return;this._regSignature=i;const s=new Map(this._devices.map(t=>[t.id,t.bindingStatus?.kind||"active"]));this._devices=xo({hass:t,registry:e,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),markers:this._markers,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||"",loc:t=>this._t(t),iconRules:this._iconRules});const n=this._markers.filter(t=>!t.removed&&"virtual"!==t.binding).map(t=>t.binding).sort(),o=e.revision+":"+n.join("|");if(e.authoritative&&o!==this._haBindingCacheKey){const i=new Map;for(const s of n)i.set(s,Bn(t,s,e));!function(t){if("undefined"==typeof localStorage||!t.size)return;const e=Ln(),i=Date.now();for(const[s,n]of t)"active"===n.kind?e[s]={kind:"active",ts:i}:"ha_disabled"===n.kind&&(e[s]={kind:"ha_disabled",reason:n.reason,ts:i});const s=Object.fromEntries(Object.entries(e).sort((t,e)=>e[1].ts-t[1].ts).slice(0,1500));Mn=s;try{localStorage.setItem(Sn,JSON.stringify(s))}catch{}}(i),this._haBindingCacheKey=o}this._defPos=this._defaultPositions(),this._syncNewDevices(),this._seedHiddenDevices(),this._syncActivityRuntime();const r=new Set(this._devices.filter(t=>!t.hidden).map(t=>t.id));for(const t of this._vacRt.keys())r.has(t)||this._vacRt.delete(t);if(this._infoCard){const t=this._devices.find(t=>t.id===this._infoCard.id);this._infoCard=t&&"ha_disabled"!==t.bindingStatus?.kind?t:null}const a=this._devices.some(t=>"ha_disabled"===t.bindingStatus?.kind&&"ha_disabled"!==s.get(t.id));a&&("ha_disabled"!==this._infoCard?.bindingStatus?.kind&&"ha_disabled"!==this._devices.find(t=>t.id===this._infoCard?.id)?.bindingStatus?.kind||this._closeInfoCard(),this._drag&&"ha_disabled"===this._devices.find(t=>t.id===this._drag.id)?.bindingStatus?.kind&&(this._drag=null),clearTimeout(this._holdTimer),this._holdFired=!1,this._tip=null,this._tapConfirm=null),this._nativeMoreInfoEntity&&!this._planEntityAvailable(this._nativeMoreInfoEntity)&&(H_(this,"hass-more-info",{entityId:null}),this._nativeMoreInfoEntity=null)}_syncNewDevices(){if(!this._norm||!this._loadOk||!this._serverCfg)return;const t=this._devices.filter(t=>!t.marker&&!t.virtual).map(t=>t.id).sort(),e=t.join(",");if(e===this._newSyncKey)return;this._newSyncKey=e;const i=this._settings,{fresh:s,known:n}=function(t,e){if(!Array.isArray(e))return{fresh:[],known:[...t]};const i=new Set(e),s=t.filter(t=>!i.has(t));return{fresh:s,known:s.length?[...e,...s]:e}}(t,i.known_devices);if(!Array.isArray(i.known_devices)||s.length){const t=[...new Set([...i.new_device_ids||[],...s])];this._serverCfg={...this._serverCfg,settings:{...i,known_devices:n,new_device_ids:t}},this._saveConfig()}}get _newIds(){const t=this._settings.new_device_ids;return new Set(Array.isArray(t)?t:[])}_ackNewDevice(t){if(!this._newIds.has(t)||!this._serverCfg)return;const e=this._settings;this._serverCfg={...this._serverCfg,settings:{...e,new_device_ids:(e.new_device_ids||[]).filter(e=>e!==t)}},this._saveConfig(),this.requestUpdate()}get _markers(){return this._serverCfg?.markers||[]}_roomLqi(t){if(!t)return null;const e=[];for(const i of this._renderDevices){if(i.area!==t||i.virtual)continue;const s=uo(this._renderPlanHass,i.entities);null!=s&&e.push(s)}return zi(e)}_roomBounds(t){if(t.poly&&t.poly.length){const e=t.poly.map(t=>t[0]),i=t.poly.map(t=>t[1]),s=Math.min(...e),n=Math.min(...i);return{x:s,y:n,w:Math.max(...e)-s,h:Math.max(...i)-n}}return{x:t.x??0,y:t.y??0,w:t.w??0,h:t.h??0}}_defaultPositions(){const t={},e=this._config?.icon_size??2.5;for(const i of this._model){const s=e/100*mc(i)*1.3;for(const e of i.rooms){if(!e.area)continue;const n=this._devices.filter(t=>t.area===e.area&&t.space===i.id);if(!n.length)continue;const o=this._roomBounds(e),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(n.length*a/Math.max(l,1)))),h=Math.ceil(n.length/c),d=a/c,u=l/Math.max(h,1),p=n.map((t,e)=>({x:o.x+r+d*(e%c+.5),y:o.y+r+u*(Math.floor(e/c)+.5)}));Hi(p,o,s,.5*r),n.forEach((e,i)=>t[e.id]=ic(p[i]))}}return t}_pos(t){const e=this._renderDeviceSnapshot?.positions.get(t.id);return e?{x:e.x,y:e.y}:this._livePos(t)}_livePos(t){const e=this._spaceModelById(t.space),i=this._layout[t.id];if(i)if(this._norm){if(i.s===t.space)return{x:i.x*I_,y:i.y*I_}}else if(void 0===i.s)return{x:i.x,y:i.y};return this._defPos[t.id]?this._defPos[t.id]:e?ic(gc(e)):{x:500,y:500}}_savePos(t,e,i){if(this._spaceModelById(t.space)){if(this._norm){const s=this._gridPitch,n=Math.round(e/s)*s,o=Math.round(i/s)*s,r=this._layout[t.id]?.k;this._layout={...this._layout,[t.id]:{s:t.space,x:nc(n/I_),y:nc(o/I_),...r?{k:r}:{}}}}else this._layout={...this._layout,[t.id]:{x:Math.round(e),y:Math.round(i)}};this._dirtyPos.add(t.id),this._persistLayout()}}_visualSamples(t){return hu(this._renderPlanHass,t,this._renderDevices,void 0,this._fullRegistryHass).samples}_devicePresentation(t,e=!1!==this._config?.show_signal,i=!1){const s=i?null:this._renderDeviceSnapshot?.presentations.get(yu(t.id,e));return s||gu(this._renderPlanHass,t,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:e,designPreview:i,activityRuntime:this._activityRt.get(t.id),sourceDetails:!1,lightDevices:this._renderDevices,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion})}_deviceVisual(t){return this._devicePresentation(t).visual}_stateClass(t,e=this._deviceVisual(t)){const i=this._devicePresentation(t);return i.effectiveHidden?"":("icon_ripple"!==i.display||!1===this._config?.live_states||"alarm"===e.status||e.activity,_u({...i,visual:e}).join(" "))}_liveTemp(t){if(!this._config?.show_temperature)return null;if(!0===t.marker?.use_climate_temp){const e=_o(this._renderPlanHass,t.entities);if(null!=e)return e}return"mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon?null:po(this._renderPlanHass,t.entities)}_bindingEntities(t){if("virtual"===t||!t)return[];const e=this._bindingStatus(t);return"active"===e.kind?e.enabledEntityIds:e.allEntityIds}_bindingHasClimate(t){return this._bindingEntities(t).some(t=>t.startsWith("climate."))}_bindingHasAlarm(t){return this._bindingEntities(t).some(t=>{const e=this._planHass?.states?.[t]||this.hass?.states?.[t],i=this._fullRegistryHass.entities[t]||this.hass?.entities?.[t];return Bs(t.split(".")[0],e?.attributes?.device_class||i?.device_class||i?.original_device_class)})}_liveHum(t){return this._config?.show_temperature&&t.primary&&go(this.hass,t.primary)?mo(this.hass,t.entities):null}_deviceBindingActive(t,e=!0){if(t.virtual||"virtual"===t.bindingKind)return!0;if(!t.bindingKind||!t.bindingRef)return!1;const i=this._bindingStatus(`${t.bindingKind}:${t.bindingRef}`);return"active"===i.kind||(e&&this._showToast(this._t("ha_disabled"===i.kind?"toast.ha_disabled_action":"toast.ha_binding_unverified")),!1)}_openMoreInfo(t){t?this._planEntityAvailable(t)?(this._nativeMoreInfoEntity=t,H_(this,"hass-more-info",{entityId:t})):this._showToast(this._t("toast.ha_disabled_action")):this._showToast(this._t("toast.no_entity"))}_interruptViewGesture(t,e){if(clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),void 0!==t)for(const i of[e,this._stageEl])try{i?.hasPointerCapture?.(t)&&i.releasePointerCapture(t)}catch{}this._pointers.clear(),this._panStart=null,this._panLock=null,this._pinchStart=null,this._swipeStart=null}_closeInfoCard(){this._interruptViewGesture(),this._holdFired=!1,this._infoCard=null}_ctxDevice(t,e){"view"===this._mode&&(t.preventDefault(),t.stopPropagation(),this._deviceBindingActive(e)&&(e.primary?this._openMoreInfo(e.primary):this._infoCard=e))}_clickDevice(t,e){if(t.stopPropagation(),this._drag?.moved||this._suppressClick||this._holdFired)return;if("plan"===this._mode)return;if("devices"===this._mode)return void this._openMarkerDialog(e);const i=this._devices.find(t=>t.id===e.id);if(!i)return;const s=Xh(i.tapAction,i.primary?.split(".")[0]),n=(t,e)=>{i.marker?.tap_confirm?this._tapConfirm={kind:"run",text:t,exec:e}:e()};if("toggle"===s){const t=this._toggleIntent(i);if(!t||!id(t))return;const e=t=>{const e=id(t);if(!e)return;if("virtual-light"===e.kind)return this._startDevicePressFeedback(i.id),void this.hass.callWS({type:"houseplan/virtual_light/toggle",marker_id:e.markerId}).then(t=>{const e=wn(this._virtualLights,t);e!==this._virtualLights&&(this._virtualLights=e,this._capturedSnapshotVirtual="",this._cacheSnapshot(),this.requestUpdate())}).catch(t=>this._showToast(this._t("toast.virtual_light_toggle_failed",{err:this._errText(t)})));const{command:s}=e;this._startDevicePressFeedback(i.id),this.hass.callService(s.domain,s.service,s.data).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))},s=((o=t).targets.length?o.targets:o.skippedTargets).map(t=>t.name||t.entityId||t.ref).join(", ")||i.name;if(i.marker?.tap_confirm){const n=this._toggleConfirmationLines(t);if(!n.length)return;this._tapConfirm={kind:"toggle",text:this._t("confirm.tap_toggle",{name:s}),lines:n,initialIntent:t,deviceId:i.id,exec:()=>{const s=this._devices.find(t=>t.id===i.id),n=s?this._toggleIntent(s):null;n&&sd(t,n)?e(n):this._showToast(this._t("toast.tap_target_changed"))}}}else e(t);return}var o;if("info"===s)return this._interruptViewGesture(),void(this._infoCard=i);if(this._deviceBindingActive(i)){if("run"===s){const t=i.marker?.tap_target||"",e=function(t){const e=String(t||"").split(".")[0];return"automation"===e?{domain:"automation",service:"trigger"}:"script"===e?{domain:"script",service:"turn_on"}:"scene"===e?{domain:"scene",service:"turn_on"}:null}(t),s=this.hass.states[t];if(!e||!s)return void this._showToast(this._t("toast.run_target_missing"));const o=s.attributes?.friendly_name||t;return void n(this._t("confirm.tap_run",{name:o}),()=>{this._deviceBindingActive(i)&&this._planEntityAvailable(t)&&(this._startDevicePressFeedback(i.id),this.hass.callService(e.domain,e.service,{entity_id:t}).then(()=>{this._stampActivity(i.id,"event",this._activitySourceKey(i)),this.requestUpdate(),this._showToast(this._t("toast.run_started",{name:o}))}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)}))))})}"more-info"===s&&i.primary?this._openMoreInfo(i.primary):this._infoCard=i}}_keyDevice(t,e){"Enter"!==t.key&&" "!==t.key||"view"!==this._mode&&"devices"!==this._mode||(t.preventDefault(),this._clickDevice(t,e))}_startDevicePressFeedback(t){const e=[...this.renderRoot.querySelectorAll(".dev[data-id]")].find(e=>e.dataset.id===t),i=e?.querySelector(".device-shell");if(!i||"function"!=typeof i.animate)return;const s=Number.parseFloat(this.ownerDocument.defaultView?.getComputedStyle(i).scale||""),n=Number.isFinite(s)?Math.max(.95,Math.min(1,s)):1;this._devicePressAnimations.get(t)?.cancel();const o=this._reducedMotion?[{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"},{outlineColor:"var(--hp-accent, #3ea6ff)",outlineStyle:"solid",outlineWidth:"2px",outlineOffset:"2px",offset:.5},{outlineColor:"transparent",outlineStyle:"solid",outlineWidth:"0px"}]:[{scale:String(n)},{scale:"0.95",offset:.5},{scale:"1"}],r=i.animate(o,{duration:200,easing:"cubic-bezier(.22,.61,.36,1)"});this._devicePressAnimations.set(t,r);const a=()=>{this._devicePressAnimations.get(t)===r&&this._devicePressAnimations.delete(t)};r.addEventListener("finish",a,{once:!0}),r.addEventListener("cancel",a,{once:!0})}_cancelDevicePressFeedback(){for(const t of this._devicePressAnimations.values())t.cancel();this._devicePressAnimations.clear()}_pruneDevicePressFeedback(){if(!this._devicePressAnimations.size)return;const t=new Set([...this.renderRoot.querySelectorAll(".dev[data-id]")].map(t=>t.dataset.id||""));for(const[e,i]of this._devicePressAnimations)t.has(e)||(i.cancel(),this._devicePressAnimations.delete(e))}_t(t,e){return rr(or(this.hass,this._config?.language),t,e)}get _colorPickerLabels(){return{title:this._t("color_picker.title"),hue:this._t("color_picker.hue"),saturation:this._t("color_picker.saturation"),value:this._t("color_picker.value"),hex:this._t("color_picker.hex"),invalidHex:this._t("color_picker.invalid_hex")}}_help(t){const e=`${t}.aria`,i=or(this.hass,this._config?.language);return ar(i,t)&&ar(i,e)?j``:G}get _stageEl(){return this.renderRoot.querySelector(".stage")}_contentItems(t){const e=[];for(const i of this._devices){if(i.space!==t.id||i.hidden)continue;const s=this._pos(i);e.push({minX:s.x,minY:s.y,maxX:s.x,maxY:s.y})}if(t.id===this._space){for(const t of this._openingsR){const i=Number(t.angle)*Math.PI/180,s=Math.cos(i)*t.rlen/2,n=Math.sin(i)*t.rlen/2,o=ac([[t.rx-s,t.ry-n],[t.rx+s,t.ry+n]]);o&&e.push(o)}const i=this._decorH;for(const t of this._decorList){const s=ac("line"===t.kind?[[t.x1*I_,t.y1*i],[t.x2*I_,t.y2*i]]:"text"===t.kind?[[t.x*I_,t.y*i]]:da({x:t.x*I_,y:t.y*i,w:t.w*I_,h:t.h*i,angle:t.angle}));s&&e.push(s)}for(const i of this._physicalBodiesR(t)){const t=ac(i);t&&e.push(t)}}return cc(t,e)}_frameOf(){const t=this._spaceModel();if(!t){this._frame=null;const t={x:0,y:0,w:I_,h:I_};return{rect:t,all:t,outliers:0}}const e=this._frame,i="view"!==this._mode;if(e&&e.id===t.id&&this._bdDrag)return e;if(e&&e.id===t.id&&e.model===t&&e.layout===this._layout&&e.devs===this._devices&&e.far===this._showFar&&e.grow===i)return e;const s=pc(this._contentItems(t));let n=s.all||_c(t),o=this._showFar?n:s.core||_c(t);return e&&e.id===t.id&&i&&e.grow&&(o=E_(e.rect,o),n=E_(e.all,n)),this._frame={id:t.id,model:t,layout:this._layout,devs:this._devices,far:this._showFar,grow:i,rect:o,all:n,outliers:s.outliers},this._frame}_isoSource(){const t=this._spaceModel();if(!t)return null;const e=this._spaceWalls,i=this._openPairs().flatMap(t=>t.segs),s=this._openingsR.map((t,e)=>({id:String(t.id||e),sourceIndex:e,type:t.type,x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen>0?t.rlen:900,flipH:!!t.flip_h,flipV:!!t.flip_v}));return{key:`${t.id}|${function(t){let e=2166136261;const i=t=>{if("number"!=typeof t)if("string"!=typeof t)if("boolean"!=typeof t)if(Array.isArray(t)){e=t_(e,t.length);for(const e of t)i(e)}else{if(t&&"object"==typeof t){const e=t;for(const t of Object.keys(e).sort())i(t),i(e[t]);return}e=t_(e,-1)}else e=t_(e,t?1:0);else for(const i of t)e=t_(e,i.codePointAt(0)||0);else e=t_(e,t)};return i(t),e.toString(36)}({rooms:t.rooms,walls:e,openCuts:i,openings:s,partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:this._cellCm,gridPitch:this._gridPitch,wallKeyPitch:this._wallKeyPitch,camera:Bp,wallHeight:qp,floorEdgeHeight:10,algorithm:3})}`,build:()=>{const n=Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t)).all,o=this._roomWallOpeningInputs(this._openingsR,t),r=e.length||n.length?pl(t.rooms,e,i,o,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,n):null;if((e.length||n.length)&&!r)throw new Error("wall boolean geometry failed");const a=r?.paperGeom??function(t,e,i,s,n,o,r=1){try{const a=dl(t,e,i,s,n,o,r);return a?a.shell?.length?si(a.centre,a.shell):a.centre:[]}catch{return null}}(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);if(!a)throw new Error("floor boolean geometry failed");const l=r?.openingIndex||fl(t.rooms,e,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_),c=s.map(t=>{const i=this._openingsR[t.sourceIndex],s="gate"===t.type?!t.flipV:t.flipV,n=i?.partitionHost?dd(i.partitionHost,s):e.length||"gate"===t.type?wl(l,{x:t.x,y:t.y,angle:t.angle,length:t.length,flip_v:s}):{ox:0,oy:0,cm:0,side:-1};return function(t,e=64){if(!(e_([t.x,t.y,t.angle,t.length,t.face.ox,t.face.oy,e])&&t.length>0&&e>0))throw new Error("invalid isometric opening input");const i=t.length/2;let s;if("passage"===t.type)s=[];else if("gate"===t.type){const n=t.flipV?-1:1,o=t.face.side*n*10;s=[s_(t,0,[-i,0],[i,0],o,0,.88*e),s_(t,1,[i,0],[-i,0],-o,0,.88*e)]}else s="window"===t.type?[s_(t,0,[-i,0],[i,0],-90,.27*e,.78*e),s_(t,1,[i,0],[-i,0],90,.27*e,.78*e)]:[s_(t,0,[-i,0],[t.length,0],-90,0,.92*e)];return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaves:Object.freeze(s.map(t=>Object.freeze(t)))}}({...t,face:n})});return{walls:r?.geom||[],floor:a,openings:Object.freeze(c)}}}}_isoSceneKey(){if(!this._labsIso||"view"!==this._mode)return null;try{return this._isoSource()?.key??null}catch{return`${this._space}|invalid`}}_isoScene(){const t=this._isoSource();if(!t)return null;const e=this._isoGeometryCache.get(t.key);if(e)return{key:t.key,...e};const i=this._frameOf().rect,s=t.build(),n=function(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of t)for(const t of o.leaves){const o=Math.hypot(t.closedVector[0],t.closedVector[1]);e=Math.min(e,t.hinge[0]-o),i=Math.min(i,t.hinge[1]-o),s=Math.max(s,t.hinge[0]+o),n=Math.max(n,t.hinge[1]+o)}return e_([e,i,s,n])?{x:e,y:i,w:s-e,h:n-i}:null}(s.openings),o=Vp({rect:n?E_(i,n):i,wallHeight:qp,openingHeight:qp,floorDepth:10}),r=function(t,e=Bp,i=64){if(!Number.isFinite(i)||i<0)throw new Error("invalid wall height");const s=[],n=[],o=[];let r=0;for(let a=0;a<(t||[]).length;a++){const l=t[a];for(let t=0;t<(l||[]).length;t++){const c=Xp(l[t],t>0);if(!(c.length<3||Math.abs(Yp(c))<1e-9)){s.push(Jp(c,e,i)),r+=c.length;for(let s=0;st.depth-e.depth||t.polygon-e.polygon||t.ring-e.ring||t.edge-e.edge),{topPath:s.join(" "),sides:n,contactPath:o.join(" "),edgeCount:r}}(s.walls),a={geometry:r,floor:Qp(s.floor,10),openings:s.openings,frame:o};return w_(this._isoGeometryCache,t.key,a,8),{key:t.key,...a}}_effectiveProjection(){if("iso"!==this._desiredProjection||!this._model.length)return"flat";const t=this._isoSceneKey()||`${this._space}|invalid`;if(this._isoFallback.has(t))return"flat";try{const t=this._isoScene();return t?(e="iso",i=t.key,s=this._isoFallback,"iso"===e&&i&&!s.has(i)?"iso":"flat"):"flat"}catch(e){if(!this._isoFallback.has(t)){this._isoFallback.add(t);const i=t.split("|");console.warn(`HOUSEPLAN ISO FALLBACK: #89, space ${this._space}, fingerprint ${i[i.length-1]}, ${e instanceof Error?e.message:"renderer error"}`)}return"flat"}var e,i,s}_scenePoint(t){return"iso"===this._renderProjection?Wp(t,0):t}_floorView(t){if("iso"!==this._renderProjection)return t;const e=Up([t.x,t.y]),i=Up([t.x+t.w,t.y+t.h]);return{x:e[0],y:e[1],w:i[0]-e[0],h:i[1]-e[1]}}_baseVb(){if("iso"===this._effectiveProjection()){if(!this._spaceDisplayForRender().showBorders){const t=Vp({rect:this._frameOf().rect,wallHeight:qp});return[t.x,t.y,t.w,t.h]}const t=this._isoScene()?.frame??this._frameOf().rect;return[t.x,t.y,t.w,t.h]}const t=this._frameOf().rect;return[t.x,t.y,t.w,t.h]}get _outliers(){return this._showFar?0:this._frameOf().outliers}_fitFar(){this._showFar=!0,this._frame=null,this._resetZoom()}_fitAll(){this._showFar=!0,this._frame=null,this._resetZoom()}_renderFarHint(){return this._kiosk||"view"!==this._mode||this._booting||!this._outliers?G:j`
${this._t("canvas.far_objects",{n:this._outliers})} @@ -4763,7 +4849,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 style="left:${a.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:zi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=zi(s,this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},m_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Jc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=zi(this._baseVb(),this._stageAspect()),o=Math.min(L_.ZOOM_MAX,Math.max(L_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=zi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(M_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=zi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&O_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},N_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ic(this._drag.ox+r),c=ic(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(P_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(P_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(P_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Zl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return ai(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,R_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return di(t?.rooms||[]).map(t=>[t[0]*R_,t[1]*e,t[2]*R_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(C_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(C_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?qp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=fa(_a,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?fa(_a,this._imperial):this._drawWallField}get _drawWallCm(){const t=f_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:fa(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Sd(this._path,this._draftSegmentCms,_a),i=e.length;if((t.partitions||[]).length+i>E_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=E_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ic(ri(t[0],e)),ic(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Xl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=yl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=bd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(pd(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>pd(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(wd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!kd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Hs([e[0],e[1]],t);if(r>i.tolerance)continue;const l=xd(o,e,i.gridStep);!wd(l,n,s)&&kd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return mi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Yl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Sl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Ml(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=zc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Pa(t.walls,t.rooms||[],Ql,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&bi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=ci(e);return!!i&&Ci(t,i)})}_pointInRoom(t,e){return e.poly?fi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!yr(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>E_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Ti(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/R_,t[1]/R_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/R_,t[1]/R_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:$d,s=Gd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Pd(t.a,i),s=Pd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Pd(t.a,i),Pd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Rd(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Dd(g);if(!(m>i*i))continue;const f=Ad(Id(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=ci(t);if(!t.id||!e)continue;const i=Ii(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Ti(s)>=Ti(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Ti(a))-Math.abs(e.area-Ti(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Sl(i),angle:0},o=(s.wall_columns||[]).find(t=>Bl(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/R_,e[1]/R_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:fa(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Ml(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:fa(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),N_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Nl(n,Pl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Nl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Yl*R_-Math.min(...n),Math.min(Yl*R_-Math.max(...n),i[0])),Math.max(-Yl*R_-Math.min(...o),Math.min(Yl*R_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/R_,n.a[1]/R_],t.b=[n.b[0]/R_,n.b[1]/R_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=rd(t,[n],R_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,ud(t,i,R_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/R_,(n.center[1]+e.delta[1])/R_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),N_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Ml(e.angle),angle:Ml(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Ml(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Bl(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?ci(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/R_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/R_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*R_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:_r(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),N_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Sr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=kr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Cr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Cr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Mr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=vr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Pa(n.walls,n.rooms||[],Ql,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&ol(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||n,r=xi(o),a=u.length?Ol(zl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Tr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&ol([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||t,l=xi(a),c=this._physicalBodiesR(),h=c.length?Ol(zl(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Dr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Tr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_roomLabelReferenceViewWidth(t){if(!this._markup)return t.w;const e=this._stageEl,i=this.renderRoot.querySelector(".editorchrome");if(!e||e.clientWidth<=0||e.clientHeight<=0)return t.w;const s=e.clientHeight+(i?.getBoundingClientRect().height||0);return s<=0?t.w:this._viewForModeTarget(this._zoom,void 0,void 0,e.clientWidth,s).w}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,r=i+s-e+n;return Math.max(Math.min(o,r),Math.min(Math.max(o,r),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,t)),r=n.w/o,a=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-r/2,y:h-a/2,w:r,h:a},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},v_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Zc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(q_.ZOOM_MAX,Math.max(q_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const r=s.clientWidth,a=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/r*c,y:l[1]-e/a*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(D_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return!this._hasFixedFloor&&this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&this._slideTo(n,i<0?"left":"right")&&(this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&N_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},B_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),r=(t.clientX-this._drag.sx)/n.width*o.w,a=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=sc(this._drag.ox+r),c=sc(this._drag.oy+a);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}_syncPointerHoverTargets(){const t=this._pointerModality.hoverEnabled;for(const e of this.renderRoot.querySelectorAll(A_))e.toggleAttribute("data-pointer-hover",t)}_syncPointerHoverSubtree(t){if(t.nodeType!==Node.ELEMENT_NODE)return;const e=t,i=this._pointerModality.hoverEnabled;e.matches(A_)&&e.toggleAttribute("data-pointer-hover",i);for(const t of e.querySelectorAll(A_))t.toggleAttribute("data-pointer-hover",i)}_clearTransientHover(t=!1){t&&this._pointerModality.suspend(),this._tip&&(this._tip=null),this._hoverRoom&&(this._hoverRoom=null)}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse";const e=this._pointerModality.modality,i=this._pointerModality.note(t);"touch"!==i&&"pen"!==i||e===i&&!this._tip&&!this._hoverRoom||this._clearTransientHover()}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if(this._notePointer(e),"touch"===e.pointerType)if("pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type||"lostpointercapture"===t.type){if(this._clearTransientHover(),this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._clearTransientHover(),this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._notePointer(t),this._pointerModality.hoverEnabled&&(this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o}))}get _gridPitch(){return Ql}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,I_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*I_,t[1]*e,t[2]*I_,t[3]*e])}_savedNav(){if(this._hasFixedFloor)return null;try{return JSON.parse(localStorage.getItem(T_)||"null")}catch{return null}}_saveNav(){if(!this._hasFixedFloor)try{localStorage.setItem(T_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._clearTransientHover(!0),this._cancelDevicePressFeedback();const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),r=this._modeTransitionBusy,a=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=r&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(r?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:r?this._modeTransitionTargetCenterX:a?.viewport.centerX,u=c?c.centerY:r?this._modeTransitionTargetCenterY:a?.viewport.centerY;if("view"===s&&"view"!==t&&!r){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||r||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:a?.viewport.centerX,centerY:a?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Wp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?a?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=a,this._prepareModeTransition(p,a,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(a,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=va(ga,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?va(ga,this._imperial):this._drawWallField}get _drawWallCm(){const t=y_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?Sl:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?Sl:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:va(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=Md(this._path,this._draftSegmentCms,ga),i=e.length;if((t.partitions||[]).length+i>O_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=O_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[sc(ai(t[0],e)),sc(ai(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const r=Math.PI/4;let a=Math.atan2(o,n);a<0&&(a+=2*Math.PI);const l=Math.floor(a/r+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Jl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=bl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,r=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-r,e.x+o,e.y+r])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=wd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(_d(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const r=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>_d(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of r){if(kd(t.point,n,s))continue;const r=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);r>i.tolerance||!xd(r,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:r})}if(o)return o;let a=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],r=Ns([e[0],e[1]],t);if(r>i.tolerance)continue;const l=$d(o,e,i.gridStep);!kd(l,n,s)&&xd(r,o.key,a)&&(a={kind:"line",point:l,key:o.key,distance:r,segment:o})}return a}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Xl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:Ml(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Cl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Oc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Ra(t.walls,t.rooms||[],tc,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){if(!this._canCommitSpace(t.spaceId))return!1;const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._commitSpace(t.spaceId),this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!br(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>O_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const r=this._draftEndAt(n,this._activeDraftId||void 0);if(r)return void this._mergeDraftEndpoint(r);if(!this._canAppendRoomDraftPoint())return;const a=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(a)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,r=n.find(e=>e.id===t.draft.id);if(!r)return;const a=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(r.segments||[]).map(t=>({...t})):[...r.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,a[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?a.slice(1):a],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(r.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||r,id:b,points:m.map(t=>[t[0]/I_,t[1]/I_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/I_,t[1]/I_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:Sd,s=Vd(t,i),n=new Map,o=new Map,r=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Rd(t.a,i),s=Rd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const a=new Map;for(const[t,e]of o){const i=n.get(t);a.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Rd(t.a,i),Rd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Ad(u,p));const s=a.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=Td(g);if(!(m>i*i))continue;const f=Id(Fd(e,n,i)),v=new Set;for(const t of d)for(const e of r.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let r;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);r=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!r.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Fi(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,a=o===s?n:s,l=[...r].sort((t,e)=>Math.abs(t.area-Pi(a))-Math.abs(e.area-Pi(a))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:a.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:a},consumeAllActive:!0}])}const a=r.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));a.length&&this._beginWallFaceBatch(a)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange(Sl);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:Ml(i),angle:0},o=(s.wall_columns||[]).find(t=>ql(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const r=this._geometrySnapshot(),a=this._curSpaceCfg;a.wall_columns||=[],a.wall_columns.push({...n,center:[e[0]/I_,e[1]/I_]}),this._recordGeometry(this._t("history.column_add"),r),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:va(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Cl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:va(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),B_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Ll(n,Rl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Ll(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const r=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),a=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===r&&a-l.at>380&&a-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:r,index:c,x:t.clientX,y:t.clientY,at:a},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Xl*I_-Math.min(...n),Math.min(Xl*I_-Math.max(...n),i[0])),Math.max(-Xl*I_-Math.min(...o),Math.min(Xl*I_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/I_,n.a[1]/I_],t.b=[n.b[0]/I_,n.b[1]/I_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ad(t,[n],I_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,pd(t,i,I_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/I_,(n.center[1]+e.delta[1])/I_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),B_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Cl(e.angle),angle:Cl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Cl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&ql(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const r=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/I_,t[1]/r]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/I_,e.y=i[1]/r)}const a=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*I_,t[1]*r]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:gr(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),B_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const r=Math.sign(s);let a=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&a>1e-9;s++,a-=l){const s=r*a;if(Mr(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const r=xr(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(r.polys),this._rszApplyPreview(r.polys,r.openings),this._rszLive=this._rszEdgeLabels(r,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Dr(t,e,i,s,n,o))return n;let r=1,a=n;for(let n=0;n<28;n++){const n=(r+a)/2;Dr(t,e,i,s,n,o)?r=n:a=n}return r}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),r=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),a=Cr(o,e.openings,r,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:a.poly},a.openings),this._rszLive=this._rszScaleLabels(a.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=yr(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Ra(n.walls,n.rooms||[],tc,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,r=e.edge,a=(r+1)%o;for(const[t,e]of[[n[(r-1+o)%o],n[r]],[n[r],n[a]],[n[a],n[(a+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&rl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||n,r=$i(o),a=u.length?Hl(Ol(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(o,this._gridPitch,this._cellCm);s.push({x:r[0],y:r[1],text:Pr(a,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),r=this._spaceWalls,a=r.length&&this._rszSel&&rl([{id:this._rszSel,poly:t}],this._rszSel,r,[],this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||t,l=$i(a),c=this._physicalBodiesR(),h=c.length?Hl(Ol(a,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Tr(a,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Pr(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],r=this._rszRooms();for(const t of r)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4773,7 +4859,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @pointercancel=${t=>this._rszPointerCancel(t)} - @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*R_,ry:t.y*e,rlen:t.length*R_};if(!t.host)return[s];const n=rd(t,i.partitions,R_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=rd(n,t.partitions,R_,this._cellCm,this._gridPitch);i.resolved&&s.push(cd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=tl(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&dd(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?hd(t.partitionHost,i):bl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return R_}_decorResolvedStyle(t){return function(t,e,i,s=ia){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:sa(o?.opacity,s.opacity),widthCm:la(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?sa(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,ia)}_decorWidthUnits(t){return((t,e,i,s=ia.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return ra(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:ra(s,e,i)})(t,this._cellCm,this._gridPitch,ia.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:aa(ts*es(t),this._cellCm,this._gridPitch)}return aa(ts,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return ts;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?ra(e,this._cellCm,this._gridPitch):ts*es(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(__,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Yl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH,angle:na(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*R_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(da(t))}for(const t of e.rooms){const e=ci(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},N_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:sc(e[0]/R_),y:sc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:aa(ts,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-na(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=R_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=sc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ca(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ca(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},N_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*R_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/R_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Yl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(na(i?zs([i.x1*R_,i.y1*this._decorH],[i.x2*R_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:aa(Math.hypot((i.x2-i.x1)*R_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:aa(s.w,this._cellCm,this._gridPitch),sizeHCm:aa(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Ki(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Yi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:sa(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Yi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:sa(t.opacity),size_cm:Number(Math.max(.1,Math.min(__,t.sizeCm)).toFixed(4)),...na(t.angle)?{angle:na(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:sa(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:sa(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ca(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*R_,s=(e.y1+e.y2)/2*this._decorH,o=ra(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=na(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:sc(c[0]/R_),y1:sc(c[1]/this._decorH),x2:sc(h[0]/R_),y2:sc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*R_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ri(ra(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ri(ra(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*R_+i/2,l=e.y*this._decorH+s/2,c=na(t.angle),h=oa({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:sc(h[0]/R_),y:sc(h[1]/this._decorH),w:o/R_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*R_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*R_,(t.y+t.h/2)*this._decorH]:[t.x*R_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(__,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},N_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=sc(s[0]/R_),o=sc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=ua(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(__,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*R_,s=t.y1*this._decorH,n=t.x2*R_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*R_,y:t.y*this._decorH,w:t.w*R_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=xc(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=R_,o=this._decorH,r=Dc(Sc(i.w,this._cellCm,this._gridPitch,n)),a=Dc(Sc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ac(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:sc(h/n-r/2),y:sc(d/o-a/2),w:r,h:a,...ca(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=R_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ac(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=sc(c),h=sc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=R_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=oa(e,i.angle,t=>this._snap(t));return{...i,x:sc(o[0]/s),y:sc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Yl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Yl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=R_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}> + @lostpointercapture=${t=>this._rszPointerCancel(t)}>`),o.push(W``)}return W`${o}`}get _openingsR(){const t=this._curSpaceCfg,e=this._spaceH,i=this._spaceModel();return i?(t?.openings||[]).flatMap(t=>{const s={...t,rx:t.x*I_,ry:t.y*e,rlen:t.length*I_};if(!t.host)return[s];const n=ad(t,i.partitions,I_,this._cellCm,this._gridPitch);if(!n.resolved)return"plan"===this._mode?[{...s,orphanReason:n.reason||"invalid-host"}]:[];let[o,r]=n.resolved.center;const a=this._physicalDrag;return a?.moved&&"partition"===a.kind&&a.id===t.host.id&&(o+=a.delta[0],r+=a.delta[1]),[{...t,rx:o,ry:r,rlen:n.resolved.length,angle:n.resolved.angle,partitionHost:n.resolved}]}):[]}_partitionOpeningCuts(t=this._spaceModel(),e=()=>!0){if(!t)return[];const i=this._curSpaceCfg?.id===t.id&&this._curSpaceCfg?.openings||[],s=[];for(const n of i){if(!n.host||!e(n))continue;const i=ad(n,t.partitions,I_,this._cellCm,this._gridPitch);i.resolved&&s.push(hd(i.resolved))}return s}_roomWallOpeningInputs(t=this._openingsR,e=this._spaceModel()){if(!e)return[];const i=this._openPairs().flatMap(t=>t.segs),s=el(e.rooms,this._spaceWalls,i,this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return t.flatMap(t=>{const e={x:t.rx,y:t.ry,angle:Number(t.angle)||0,length:t.rlen};return t.host?t.partitionHost&&ud(t.partitionHost,s,2e-4*this._gridPitch)?[e]:[]:[e]})}_openingFace(t,e,i){return t.partitionHost?dd(t.partitionHost,i):wl(e,{x:t.rx,y:t.ry,angle:t.angle,length:t.rlen,flip_v:i})}_cmToUnits(t){return t/this._cellCm*this._gridPitch}get _decorList(){const t=this._curSpaceCfg;return Array.isArray(t?.decor)?t.decor:[]}get _decorH(){return I_}_decorResolvedStyle(t){return function(t,e,i,s=sa){const n="rect"===t?.kind||"ellipse"===t?.kind,o=t,r=Rt(o?.color,s.color);return{color:r,opacity:na(o?.opacity,s.opacity),widthCm:ca(t,e,i,s.widthCm),fill:!!n&&!0===o?.fill,fillColor:Rt(o?.fill_color,o?.fill?r:s.fillColor),fillOpacity:n&&o?.fill?na(o?.fill_opacity,.25):s.fillOpacity}}(t,this._cellCm,this._gridPitch,sa)}_decorWidthUnits(t){return((t,e,i,s=sa.widthCm)=>{const n=Number(t?.width_cm);if(Number.isFinite(n)&&n>0)return aa(n,e,i);const o=Number(t?.width);return Number.isFinite(o)&&o>0?o:aa(s,e,i)})(t,this._cellCm,this._gridPitch,sa.widthCm)}_decorTextSizeCm(t){if("text"===t?.kind){const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?e:la(es*is(t),this._cellCm,this._gridPitch)}return la(es,this._cellCm,this._gridPitch)}_decorTextUnits(t){if("text"!==t.kind)return es;const e=Number(t.size_cm);return Number.isFinite(e)&&e>0?aa(e,this._cellCm,this._gridPitch):es*is(t)}_decorSmallField(t){return Math.round(100*(this._imperial?t/2.54:t))/100}_decorSmallCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(100,e)):.1}_decorTextCm(t){const e=this._imperial?2.54*t:t;return Number.isFinite(e)?Math.max(.1,Math.min(m_,e)):.1}_decorLargeField(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_decorLargeCm(t){const e=this._imperial?30.48*t:100*t;return Number.isFinite(e)?Math.max(.1,Math.min(Xl*this._cellCm,e)):.1}_angleField(t){const e=Number(t);return Number.isFinite(e)?String(Number(e.toFixed(3))):"0"}_decorBoxOf(t){return"rect"!==t.kind&&"ellipse"!==t.kind&&"furniture"!==t.kind?null:{x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH,angle:oa(t.angle)||void 0}}_decorSnapGeometry(t){const e=this._spaceModel();if(!e)return{points:[],segments:[]};const i=t||"",s=this._decorSnapCache;if(s&&s.epoch===this._cfgEpoch&&s.space===this._space&&s.height===this._decorH&&s.exclude===i)return s.geometry;const n=[];for(const e of this._decorList)if(e.id!==t)if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];n.push({points:[t,i,[(t[0]+i[0])/2,(t[1]+i[1])/2]],segments:[{a:t,b:i}]})}else if("text"===e.kind)n.push({points:[[e.x*I_,e.y*this._decorH]],segments:[]});else{const t=this._decorBoxOf(e);t&&n.push(ua(t))}for(const t of e.rooms){const e=hi(t);e?.length&&n.push({points:e.flatMap((t,i)=>{const s=e[(i+1)%e.length];return[t,[(t[0]+s[0])/2,(t[1]+s[1])/2]]}),segments:e.map((t,i)=>({a:t,b:e[(i+1)%e.length]}))})}const o=function(t){return{points:t.flatMap(t=>t.points),segments:t.flatMap(t=>t.segments)}}(n);return this._decorSnapCache={epoch:this._cfgEpoch,space:this._space,height:this._decorH,exclude:i,geometry:o},o}_decorSnap(t,e="mouse",i){const s=this._stageEl,n=this._viewOr(this._baseVb()),o="touch"===e||"pen"===e?14:8,r=s?n.w/Math.max(1,s.clientWidth)*o:this._gridPitch;return function(t,e,i,s){const n=s(t);let o=null;for(const n of e.points){const e=s(n),r=Math.hypot(e[0]-t[0],e[1]-t[1]);r<=i&&(!o||rthis._snap(t)).point}_replaceDecor(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>i.id===t?{...i,...e}:i),this.requestUpdate())}_cancelDecorGesture(){const t=this._decorMove?.before||this._dtDrag?.before||this._bdDrag?.before,e=t&&this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(t&&e){const i=t=>JSON.parse(JSON.stringify(t));void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];Object.assign(e,i(t.plan_transform||{})),this._cfgEpoch++}this._decorMove=null,this._dtDrag=null,this._bdDrag=null,this.requestUpdate()}_decorPointerDown(t){const e=this._decorTool;if("select"===e||"erase"===e?t.target.closest?.(".dshape"):null)return!0;if("line"===e||"rect"===e||"ellipse"===e){t.preventDefault();const i=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorDraft={kind:e,a:i,b:i,pid:t.pointerId},B_(t),!0}if("text"===e){const e=this._decorSnap(this._svgPoint(t),t.pointerType);return this._decorTextDialog={x:nc(e[0]/I_),y:nc(e[1]/this._decorH),text:"",color:this._decorStyle.color,opacity:this._decorStyle.opacity,angle:"0",sizeCm:la(es,this._cellCm,this._gridPitch)},this._decorTextSelection={start:0,end:0},!0}if("furniture"===e)return!!this._furnPalette&&(t.preventDefault(),this._furnPlace(this._svgPoint(t),t.shiftKey),!0);if("select"===e&&(this._decorSel=null),this._bdMovable){const e=this._bdRect,i=this._svgPoint(t),s=e.x+e.w/2,n=e.y+e.h/2,o=-oa(e.angle)*Math.PI/180,r=i[0]-s,a=i[1]-n,l=[s+r*Math.cos(o)-a*Math.sin(o),n+r*Math.sin(o)+a*Math.cos(o)];if(l[0]>=e.x&&l[0]<=e.x+e.w&&l[1]>=e.y&&l[1]<=e.y+e.h)return t.preventDefault(),this._bdStart(t)}return!1}_decorCommitDraft(){const t=this._decorDraft;if(this._decorDraft=null,!t)return;const e=.5*this._gridPitch;if(!function(t,e,i,s){const n=Math.abs(i[0]-e[0]),o=Math.abs(i[1]-e[1]);return"line"===t?Math.hypot(n,o)>=s:n>=s&&o>=s}(t.kind,t.a,t.b,e))return;const i=I_,s=this._decorH,n=this._decorStyle,o=this._geometrySnapshot(),r="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),a=nc;let l;if("line"===t.kind)l={id:r,kind:"line",x1:a(t.a[0]/i),y1:a(t.a[1]/s),x2:a(t.b[0]/i),y2:a(t.b[1]/s),...ha(n,!1)};else{const e=a(Math.min(t.a[0],t.b[0])/i),o=a(Math.min(t.a[1],t.b[1])/s),c=Math.abs(t.b[0]-t.a[0])/i,h=Math.abs(t.b[1]-t.a[1])/s;l={id:r,kind:t.kind,x:e,y:o,w:c,h:h,...ha(n,!0)}}this._curSpaceCfg.decor=[...this._decorList,l],this._decorSel=r,this._recordGeometry(this._t("history.decor_add"),o),this._saveConfig(),this.requestUpdate()}_decorShapeDown(t,e){if("decor"!==this._mode)return;const i=this._decorTool;if("text"===i){if("text"!==e.kind)return;return t.stopPropagation(),t.preventDefault(),void this._decorOpenText(e)}"select"!==i&&"erase"!==i||(t.stopPropagation(),t.preventDefault(),"erase"!==i?(this._decorSel=e.id,this._decorMove={id:e.id,start:this._svgPoint(t),orig:JSON.parse(JSON.stringify(e)),pid:t.pointerId,moved:!1,before:this._geometrySnapshot()},B_(t)):this._decorEraseConfirm={id:e.id,kind:e.kind})}_decorMoveUpdate(t){const e=this._decorMove;if("furniture"===e.orig?.kind)return void this._furnMoveUpdate(t);const i=this._svgPoint(t),s=e.orig,n=("line"===s.kind?s.x1:s.x)*I_,o=("line"===s.kind?s.y1:s.y)*this._decorH,r=this._decorSnap([n+(i[0]-e.start[0]),o+(i[1]-e.start[1])],t.pointerType,e.id);let a=(r[0]-n)/I_,l=(r[1]-o)/this._decorH;const c=e.orig,h="line"===c.kind?Math.min(c.x1,c.x2):c.x,d="line"===c.kind?Math.min(c.y1,c.y2):c.y,u="line"===c.kind?Math.abs(c.x2-c.x1):c.w||0,p="line"===c.kind?Math.abs(c.y2-c.y1):c.h||0,_=Xl;a=Math.max(-_-h,Math.min(_-h-u,a)),l=Math.max(-_-d,Math.min(_-d-p,l)),(a||l)&&(e.moved=!0);this._curSpaceCfg.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i=e.orig;return"line"===t.kind?{...t,x1:i.x1+a,y1:i.y1+l,x2:i.x2+a,y2:i.y2+l}:{...t,x:i.x+a,y:i.y+l}}),this.requestUpdate()}_decorShapeDbl(t,e){"decor"===this._mode&&"select"===this._decorTool&&(t.preventDefault(),t.stopPropagation(),this._decorMove=null,this._decorSel=e.id,this._openDecorProperties(e))}_openDecorProperties(t){if("decor"!==this._mode||"select"!==this._decorTool)return;if("text"===t.kind)return void this._decorOpenText(t);if(!["line","rect","ellipse","furniture"].includes(t.kind))return;const e=this._decorResolvedStyle(t),i="line"===t.kind?t:null,s=this._decorBoxOf(t);this._decorShapeDialog={id:t.id,kind:t.kind,color:e.color,opacity:e.opacity,widthCm:e.widthCm,angle:this._angleField(oa(i?Os([i.x1*I_,i.y1*this._decorH],[i.x2*I_,i.y2*this._decorH]):t.angle)),...i?{lengthCm:la(Math.hypot((i.x2-i.x1)*I_,(i.y2-i.y1)*this._decorH),this._cellCm,this._gridPitch),lineStyle:"dashed"===i.line_style?"dashed":"solid"}:{},...s?{sizeWCm:la(s.w,this._cellCm,this._gridPitch),sizeHCm:la(s.h,this._cellCm,this._gridPitch)}:{},..."furniture"===t.kind?{symbol:t.symbol}:{},..."rect"===t.kind||"ellipse"===t.kind?{fill:e.fill,fillColor:e.fillColor,fillOpacity:e.fillOpacity}:{}}}_decorOpenText(t){if("text"!==t.kind)return;let e=String(t.text??"");const i=[...e.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1])),s=String(t.unit??"").trim(),n="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,o=i||s?"":Xi(t.entity,n),r=!(!String(t.entity??"").trim()||i||o&&!s);if(o&&!r){const t=e.indexOf("{}");e=t>=0?e.slice(0,t)+o+e.slice(t+2):`${e}${e?" ":""}${o}`}this._decorTextDialog={id:t.id,x:t.x,y:t.y,text:e,color:Rt(t.color,this._decorStyle.color),opacity:na(t.opacity,this._decorStyle.opacity),angle:this._angleField(t.angle),sizeCm:this._decorTextSizeCm(t),pickerEntity:t.entity||"",preserveLegacy:r||void 0},this._decorTextSelection={start:e.length,end:e.length}}_decorRememberTextSelection(t){this._decorTextSelection={start:t.selectionStart??t.value.length,end:t.selectionEnd??t.value.length}}_decorInsertLiveVariable(t){const e=this._decorTextDialog;if(!e)return;const i=Xi(e.pickerEntity,t);if(!i)return;const s=e.text,n=Math.max(0,Math.min(s.length,this._decorTextSelection.start)),o=Math.max(n,Math.min(s.length,this._decorTextSelection.end));if(s.length-(o-n)+i.length>200)return;const r=s.slice(0,n)+i+s.slice(o),a=n+i.length;this._decorTextSelection={start:a,end:a},this._decorTextDialog={...e,text:r,preserveLegacy:void 0},this.updateComplete.then(()=>{const t=this.renderRoot.querySelector("textarea.dtarea");t&&(t.focus(),t.setSelectionRange(a,a))})}_decorSaveText(){const t=this._decorTextDialog,e=String(t?.text??"").replace(/\r\n?/g,"\n").trim();if(!t||!e)return void(this._decorTextDialog=null);const i=this._geometrySnapshot(),s=this._curSpaceCfg,n={color:t.color,opacity:na(t.opacity),size_cm:Number(Math.max(.1,Math.min(m_,t.sizeCm)).toFixed(4)),...oa(t.angle)?{angle:oa(t.angle)}:{}};if(t.id)s.decor=this._decorList.map(i=>{if(i.id!==t.id)return i;if("text"!==i.kind)return i;if(t.preserveLegacy){const{angle:t,size:s,scale:o,...r}=i;return{...r,text:e,...n}}const{entity:s,attr:o,unit:r,...a}=i,{angle:l,size:c,scale:h,...d}=a;return{...d,text:e,...n}});else{const i="dc"+Date.now().toString(36)+Math.random().toString(36).slice(2,5);s.decor=[...this._decorList,{id:i,kind:"text",x:t.x,y:t.y,text:e,...n}],this._decorSel=i}this._decorTextDialog=null,this._recordGeometry(this._t(t.id?"history.decor_edit":"history.decor_add"),i),this._saveConfig(),this.requestUpdate()}_decorSaveShape(){const t=this._decorShapeDialog;if(!t)return;const e=this._geometrySnapshot(),i={color:t.color,opacity:na(t.opacity),widthCm:Math.max(.1,Math.min(100,Number(t.widthCm)||.1)),fill:!!t.fill,fillColor:t.fillColor||t.color,fillOpacity:na(t.fillOpacity,.25)};this._curSpaceCfg.decor=this._decorList.map(e=>{if(e.id!==t.id)return e;const s="rect"===t.kind||"ellipse"===t.kind,n=ha(i,s);if("line"===e.kind){const i=(e.x1+e.x2)/2*I_,s=(e.y1+e.y2)/2*this._decorH,o=aa(Math.max(.1,Number(t.lengthCm)||.1),this._cellCm,this._gridPitch),r=oa(t.angle)*Math.PI/180,a=Math.cos(r)*o/2,l=Math.sin(r)*o/2,c=this._snap([i-a,s-l]),h=this._snap([i+a,s+l]),{width:d,line_style:u,...p}=e;return{...p,...n,x1:nc(c[0]/I_),y1:nc(c[1]/this._decorH),x2:nc(h[0]/I_),y2:nc(h[1]/this._decorH),..."dashed"===t.lineStyle?{line_style:"dashed"}:{}}}if("rect"===e.kind||"ellipse"===e.kind||"furniture"===e.kind){const i=e.w*I_,s=e.h*this._decorH,o=Math.max(this._gridPitch,ai(aa(Number(t.sizeWCm),this._cellCm,this._gridPitch),this._gridPitch)),r=Math.max(this._gridPitch,ai(aa(Number(t.sizeHCm),this._cellCm,this._gridPitch),this._gridPitch)),a=e.x*I_+i/2,l=e.y*this._decorH+s/2,c=oa(t.angle),h=ra({x:a-o/2,y:l-r/2},c,t=>this._snap(t)),{width:d,angle:u,...p}=e;return{...p,...n,x:nc(h[0]/I_),y:nc(h[1]/this._decorH),w:o/I_,h:r/this._decorH,..."furniture"===e.kind&&t.symbol?{symbol:t.symbol}:{},...c?{angle:c}:{}}}return e}),this._decorStyle={...i,fill:"rect"===t.kind||"ellipse"===t.kind?i.fill:this._decorStyle.fill,fillColor:"rect"===t.kind||"ellipse"===t.kind?i.fillColor:this._decorStyle.fillColor,fillOpacity:"rect"===t.kind||"ellipse"===t.kind?i.fillOpacity:this._decorStyle.fillOpacity},this._decorShapeDialog=null,this._recordGeometry(this._t("history.decor_edit"),e),this._saveConfig(),this.requestUpdate()}get _dtSel(){return"decor"===this._mode&&"select"===this._decorTool&&this._decorSel&&this._decorList.find(t=>t.id===this._decorSel)||null}_dtPivot(t){return"line"===t.kind?[(t.x1+t.x2)/2*I_,(t.y1+t.y2)/2*this._decorH]:"furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind?[(t.x+t.w/2)*I_,(t.y+t.h/2)*this._decorH]:[t.x*I_,t.y*this._decorH]}_dtApply(t,e){const i=this._curSpaceCfg;i&&(i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const s={...i};"text"===i.kind&&void 0!==e.textSizeCm&&(delete s.size,delete s.scale);const n={...s};return void 0!==e.textSizeCm&&(n.size_cm=Number(Math.max(.1,Math.min(m_,e.textSizeCm)).toFixed(4))),void 0!==e.angle&&(e.angle?n.angle=Number(e.angle.toFixed(2)):delete n.angle),n}),this._cfgEpoch++,this.requestUpdate())}_dtStart(t,e,i,s){const n=this._dtSel;if(!n)return;t.stopPropagation(),t.preventDefault();const[o,r]=this._dtPivot(n),a=this._svgPoint(t),l=this._decorBoxOf(n);this._dtDrag={id:n.id,kind:e,pid:t.pointerId,ax:o,ay:r,r0:Math.hypot(a[0]-o,a[1]-r),a0:180*Math.atan2(a[1]-r,a[0]-o)/Math.PI,textSizeCm0:"text"===n.kind?this._decorTextSizeCm(n):1,angle0:"line"===n.kind?0:Number(n.angle)||0,sgx:i?.[0],sgy:i?.[1],orig:l||void 0,origShape:JSON.parse(JSON.stringify(n)),before:this._geometrySnapshot(),lineEnd:s,moved:!1},B_(t)}_dtMove(t){const e=this._dtDrag;if(!e)return;const i=this._svgPoint(t);if(void 0!==e.lineEnd&&"line"===e.origShape.kind){const s=this._decorSnap(i,t.pointerType,e.id),n=nc(s[0]/I_),o=nc(s[1]/this._decorH),r=e.origShape,a=0===e.lineEnd?r.x1:r.x2,l=0===e.lineEnd?r.y1:r.y2;return(Math.abs(n-a)>1e-9||Math.abs(o-l)>1e-9)&&(e.moved=!0),void this._replaceDecor(e.id,0===e.lineEnd?{x1:n,y1:o}:{x2:n,y2:o})}if("scale"===e.kind&&e.orig){const s=pa(e.orig,e.sgx??1,e.sgy??1,i[0],i[1],!t.shiftKey,this._gridPitch,this._gridPitch),n=Math.abs(s.x-e.orig.x)>1e-6||Math.abs(s.y-e.orig.y)>1e-6||Math.abs(s.w-e.orig.w)>1e-6||Math.abs(s.h-e.orig.h)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._decorApplyBox(e.id,s)}if("scale"===e.kind){const t=Math.hypot(i[0]-e.ax,i[1]-e.ay);if(e.r0<1e-6)return;const s=Math.max(.1,Math.min(m_,e.textSizeCm0*(t/e.r0))),n=Math.abs(s-e.textSizeCm0)>1e-6;if(!n&&!e.moved)return;return e.moved||=n,void this._dtApply(e.id,{textSizeCm:s})}const s=180*Math.atan2(i[1]-e.ay,i[0]-e.ax)/Math.PI;let n=e.angle0+(s-e.a0);t.shiftKey||(n=5*Math.round(n/5)),n=(n%360+360)%360,n>180&&(n-=360);const o=Math.abs(n-e.angle0)>1e-6;(o||e.moved)&&(e.moved||=o,this._dtApply(e.id,{angle:n}))}_dtUp(){const t=this._dtDrag;this._dtDrag=null,t?.moved&&(this._recordGeometry(this._t("history.decor_transform"),t.before),this._saveConfig()),this.requestUpdate()}_dtMeasure(){const t=this._dtSel;if(!t)return void(this._dtBox&&(this._dtBox=null,this.requestUpdate()));let e;if("line"===t.kind){const i=t.x1*I_,s=t.y1*this._decorH,n=t.x2*I_,o=t.y2*this._decorH;e={id:t.id,x:Math.min(i,n),y:Math.min(s,o),w:Math.abs(n-i),h:Math.abs(o-s)}}else if("furniture"===t.kind||"rect"===t.kind||"ellipse"===t.kind)e={id:t.id,x:t.x*I_,y:t.y*this._decorH,w:t.w*I_,h:t.h*this._decorH};else{const i=this.renderRoot.querySelector(`text.dtext[data-id="${t.id}"]`);if(!i||"function"!=typeof i.getBBox)return;let s;try{s=i.getBBox()}catch{return}if(!s||!s.width&&!s.height)return;e={id:t.id,x:s.x,y:s.y,w:s.width,h:s.height}}const i=this._dtBox;i&&i.id===e.id&&Math.abs(i.x-e.x)<.01&&Math.abs(i.y-e.y)<.01&&Math.abs(i.w-e.w)<.01&&Math.abs(i.h-e.h)<.01||(this._dtBox=e,this.requestUpdate())}_deleteDecor(t){if(!this._decorList.some(e=>e.id===t))return;const e=this._geometrySnapshot();this._curSpaceCfg.decor=this._decorList.filter(e=>e.id!==t),this._decorSel===t&&(this._decorSel=null),this._recordGeometry(this._t("history.decor_delete"),e),this._saveConfig(),this.requestUpdate()}_decorDeleteSel(){this._decorSel&&this._deleteDecor(this._decorSel)}_confirmDecorErase(){const t=this._decorEraseConfirm;this._decorEraseConfirm=null,t&&this._deleteDecor(t.id)}get _furnWalls(){const t=this._rawPhysicalBodiesR().flatMap(t=>t.map((e,i)=>{const s=t[(i+1)%t.length];return[e[0],e[1],s[0],s[1]]}));return[...this._segments,...t]}get _furnWallReach(){return 6*this._gridPitch}_furnFieldValue(t){return Math.round(100*(this._imperial?t/30.48:t/100))/100}_furnFieldToCm(t){return e=this._imperial?30.48*t:100*t,Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1;var e}_furnPick(t){const e=function(t){const e=$c(t);return e?{w:e.w,h:e.h}:{w:60,h:60}}(t);this._furnPalette={symbol:t,w:e.w,h:e.h}}_furnPlace(t,e=!1){const i=this._furnPalette,s=this._curSpaceCfg;if(!i||!s)return;const n=I_,o=this._decorH,r=Tc(Mc(i.w,this._cellCm,this._gridPitch,n)),a=Tc(Mc(i.h,this._cellCm,this._gridPitch,n)),l=this._geometrySnapshot(),c=this._decorSnap(t);let h=c[0],d=c[1],u=0;const p=e?null:Ic(h,d,a*o,this._furnWalls,this._furnWallReach,this._gridPitch);p&&(h=p.cx,d=p.cy,u=p.angle);const _="df"+Date.now().toString(36)+Math.random().toString(36).slice(2,5),g={id:_,kind:"furniture",symbol:i.symbol,x:nc(h/n-r/2),y:nc(d/o-a/2),w:r,h:a,...ha(this._decorStyle,!1)};u&&(g.angle=Number(u.toFixed(2))),s.decor=[...this._decorList,g],this._decorSel=_,this._decorTool="select",this._furnPalette=null,this._recordGeometry(this._t("history.decor_add"),l),this._saveConfig(),this.requestUpdate()}_furnMoveUpdate(t){const e=this._decorMove;if("furniture"!==e.orig.kind)return;const i=e.orig,s=this._curSpaceCfg;if(!s)return;const n=I_,o=this._decorH,r=this._svgPoint(t),a=(i.x+i.w/2)*n+(r[0]-e.start[0]),l=(i.y+i.h/2)*o+(r[1]-e.start[1]);let c,h,d=Number(i.angle)||0;const u=t.shiftKey?null:Ic(a,l,i.h*o,this._furnWalls,this._furnWallReach,this._gridPitch);if(u)c=u.cx/n-i.w/2,h=u.cy/o-i.h/2,d=u.angle;else{const s=this._decorSnap([a-i.w/2*n,l-i.h/2*o],t.pointerType,e.id);c=s[0]/n,h=s[1]/o}c=nc(c),h=nc(h),(Math.abs(c-i.x)>1e-9||Math.abs(h-i.y)>1e-9||Math.abs(d-(Number(i.angle)||0))>1e-9)&&(e.moved=!0),s.decor=this._decorList.map(t=>{if(t.id!==e.id)return t;const i={...t,x:c,y:h};return d?i.angle=Number(d.toFixed(2)):delete i.angle,i}),this.requestUpdate()}_decorApplyBox(t,e){const i=this._curSpaceCfg;if(!i)return;const s=I_,n=this._decorH;i.decor=this._decorList.map(i=>{if(i.id!==t)return i;const o=ra(e,i.angle,t=>this._snap(t));return{...i,x:nc(o[0]/s),y:nc(o[1]/n),w:Math.max(this._gridPitch/s,Math.min(2*Xl,e.w/s)),h:Math.max(this._gridPitch/n,Math.min(2*Xl,e.h/n))}}),this._cfgEpoch++,this.requestUpdate()}get _furnLive(){const t=this._dtDrag;if(!t||"scale"!==t.kind||!t.orig)return null;const e=this._decorList.find(e=>e.id===t.id);if(!e||"furniture"!==e.kind)return null;const i=I_,s=this._decorH,n=e.w*i,o=e.h*s,r=function(t,e,i,s,n){const o=t+i/2,r=e+s/2,a=(Number(n)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(t,e)=>{const i=t-o,s=e-r;return[o+i*l-s*c,r+i*c+s*l]};return[h(t,e),h(t+i,e),h(t+i,e+s),h(t,e+s)]}(e.x*i,e.y*s,n,o,Number(e.angle)||0),a=(t,e)=>[(t[0]+e[0])/2,(t[1]+e[1])/2],l=a(r[0],r[1]),c=a(r[0],r[3]);return[{x:l[0],y:l[1],text:this._fmtLen([0,0],[n,0])},{x:c[0],y:c[1],text:this._fmtLen([0,0],[0,o])}]}_renderFurnPalette(){const t=this._furnPalette,e=this._t(this._imperial?"gs.unit_ft":"gs.unit_m");return j`
t.stopPropagation()}>
${this._t("furn.title")} @@ -4783,16 +4869,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- ${bc.map(e=>j` + ${wc.map(e=>j`
${this._t(`furn.group_${e}`)}
- ${$c(e).map(e=>j``)}
`)} @@ -4808,7 +4894,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._furnPalette={...t,h:this._furnFieldToCm(Number(e.target.value))}} /> ${this._t("furn.place_hint")}
`:j`
${this._t("furn.pick_hint")}
`} -
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...jl(t.plan_aspect,R_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Gl(t,R_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:na(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:aa(e.w,this._cellCm,this._gridPitch),heightCm:aa(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=na(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Ul,Math.max(e.w*Wl,ri(ra(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Ul,Math.max(e.h*Wl,ri(ra(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=oa({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/R_,(a[1]-e.y)/R_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(sc(t).toFixed(6)),o.plan_y=Number(sc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Ul,Math.max(Wl,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Ul,Math.max(Wl,s)).toFixed(6));const r=na(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},N_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/R_,(o[1]-s.y)/R_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=na(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=ua(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Wl),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=oa(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/R_,(l[1]-s.y)/R_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=na(e.angle),a=2.2*i;return W` +
`}get _bdBase(){const t=this._curSpaceCfg;return t?.plan_url?{...Wl(t.plan_aspect,I_)}:null}get _bdRect(){const t=this._curSpaceCfg;return t?.plan_url?Vl(t,I_):null}get _bdParams(){const t=this._curSpaceCfg,e=Number(t?.plan_x),i=Number(t?.plan_y),s=Number(t?.plan_scale),n=Number(t?.plan_scale_x),o=Number(t?.plan_scale_y),r=Number.isFinite(s)&&s>0?s:1;return{dx:Number.isFinite(e)?e:0,dy:Number.isFinite(i)?i:0,sx:Number.isFinite(n)&&n>0?n:r,sy:Number.isFinite(o)&&o>0?o:r,angle:oa(t?.plan_angle)}}_openBackdropDialog(t){if(!this._bdMovable||!this._bdRect)return;t?.preventDefault(),t?.stopPropagation(),this._bdDrag=null;const e=this._bdRect;this._backdropDialog={widthCm:la(e.w,this._cellCm,this._gridPitch),heightCm:la(e.h,this._cellCm,this._gridPitch),angle:this._angleField(e.angle)}}_saveBackdropDialog(){const t=this._backdropDialog,e=this._bdBase,i=this._bdRect;if(!t||!e||!i)return;const s=oa(t.angle),n=this._geometrySnapshot(),o=Math.min(e.w*Gl,Math.max(e.w*Ul,ai(aa(t.widthCm,this._cellCm,this._gridPitch),this._gridPitch))),r=Math.min(e.h*Gl,Math.max(e.h*Ul,ai(aa(t.heightCm,this._cellCm,this._gridPitch),this._gridPitch))),a=ra({x:i.x+i.w/2-o/2,y:i.y+i.h/2-r/2},s,t=>this._snap(t));this._bdApply((a[0]-e.x)/I_,(a[1]-e.y)/I_,o/e.w,r/e.h,s),this._backdropDialog=null,this._recordGeometry(this._t("history.backdrop_transform"),n),this._saveConfig()}get _bdActive(){return"decor"===this._mode&&!!this._bdRect&&"backdrop"===this._decorTool}get _bdMovable(){return"decor"===this._mode&&"backdrop"===this._decorTool&&!!this._bdRect}_bdApply(t,e,i,s,n){const o=this._curSpaceCfg;if(!o)return;o.plan_x=Number(nc(t).toFixed(6)),o.plan_y=Number(nc(e).toFixed(6)),delete o.plan_scale,o.plan_scale_x=Number(Math.min(Gl,Math.max(Ul,i)).toFixed(6)),o.plan_scale_y=Number(Math.min(Gl,Math.max(Ul,s)).toFixed(6));const r=oa(n);r?o.plan_angle=Number(r.toFixed(2)):delete o.plan_angle,this._cfgEpoch++,this.requestUpdate()}_bdStart(t,e,i=!1){const s=this._bdBase,n=this._bdRect;if(!s||!n)return!1;const o=this._svgPoint(t),r=e?e[0]:0,a=e?e[1]:0,l=r>0?n.x:n.x+n.w,c=a>0?n.y:n.y+n.h;return this._bdDrag={kind:i?"rotate":e?"scale":"move",pid:t.pointerId,sx:o[0],sy:o[1],base:s,p0:this._bdParams,fx:l,fy:c,sgx:r,sgy:a,rect0:{x:n.x,y:n.y,w:n.w,h:n.h,angle:n.angle},before:this._geometrySnapshot(),moved:!1},B_(t),!0}_bdMove(t){const e=this._bdDrag;if(!e)return;const i=this._svgPoint(t),s=e.base;if("move"===e.kind){const t=e.rect0.x,n=e.rect0.y,o=this._snap([t+(i[0]-e.sx),n+(i[1]-e.sy)]),r=Math.abs(o[0]-t)>1e-9||Math.abs(o[1]-n)>1e-9;if(!r&&!e.moved)return;return e.moved||=r,void this._bdApply((o[0]-s.x)/I_,(o[1]-s.y)/I_,e.p0.sx,e.p0.sy,e.p0.angle)}if("rotate"===e.kind){const s=e.rect0.x+e.rect0.w/2,n=e.rect0.y+e.rect0.h/2,o=180*Math.atan2(e.sy-n,e.sx-s)/Math.PI;let r=e.p0.angle+(180*Math.atan2(i[1]-n,i[0]-s)/Math.PI-o);t.shiftKey||(r=5*Math.round(r/5)),r=oa(r);const a=Math.abs(r-e.p0.angle)>1e-9;if(!a&&!e.moved)return;return e.moved||=a,void this._bdApply(e.p0.dx,e.p0.dy,e.p0.sx,e.p0.sy,r)}const n=pa(e.rect0,e.sgx,e.sgy,i[0],i[1],!t.shiftKey,this._gridPitch,Math.min(s.w,s.h)*Ul),o=n.w/Math.max(1e-9,s.w),r=n.h/Math.max(1e-9,s.h),a=Math.abs(o-e.p0.sx)>1e-9||Math.abs(r-e.p0.sy)>1e-9||Math.abs(n.x-e.rect0.x)>1e-9||Math.abs(n.y-e.rect0.y)>1e-9;if(!a&&!e.moved)return;e.moved||=a;const l=ra(n,e.p0.angle,t=>this._snap(t));this._bdApply((l[0]-s.x)/I_,(l[1]-s.y)/I_,o,r,e.p0.angle)}get _bdMoved(){if("decor"!==this._mode||!this._bdRect)return!1;const t=this._bdParams;return 0!==t.dx||0!==t.dy||1!==t.sx||1!==t.sy||0!==t.angle}_bdReset(){const t=this._curSpaceCfg;if(!t)return;const e=this._geometrySnapshot();delete t.plan_x,delete t.plan_y,delete t.plan_scale,delete t.plan_scale_x,delete t.plan_scale_y,delete t.plan_angle,this._bdDrag=null,this._recordGeometry(this._t("history.backdrop_transform"),e),this._saveConfig(),this._showToast(this._t("decor.backdrop_reset_done")),this.requestUpdate()}_bdUp(){const t=this._bdDrag;this._bdDrag=null,t?.moved&&(this._recordGeometry(this._t("history.backdrop_transform"),t.before),this._saveConfig()),this.requestUpdate()}get _bdLive(){if(!this._bdDrag)return null;const t=this._bdRect;return t?{x:t.x+t.w/2,y:t.y+t.h/2,text:`${this._fmtLen([0,0],[t.w,0])} × ${this._fmtLen([0,0],[0,t.h])}`}:null}_renderBackdropFrame(t){const e=this._bdRect;if(!this._bdActive||!e)return G;const i=.02*Math.max(t.w,t.h),s=i/4,n=e.x+e.w/2,o=e.y+e.h/2,r=oa(e.angle),a=2.2*i;return W` {e.stopPropagation(),e.preventDefault(),this._bdStart(e,[t,n])}}>`})} - `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*R_,e.y1*this._decorH],i=[e.x2*R_,e.y2*this._decorH];return W` + `}_renderTextFrame(t){const e=this._dtSel,i=this._dtBox;if(!e||!i||i.id!==e.id)return G;const s=.018*Math.max(t.w,t.h),n=s/4;if("line"===e.kind){const t=[e.x1*I_,e.y1*this._decorH],i=[e.x2*I_,e.y2*this._decorH];return W` ${[t,i].map((t,e)=>W`this._dtStart(t,"scale",void 0,e)}> @@ -4833,7 +4919,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 cx="${t<0?i.x:i.x+i.w}" cy="${e<0?i.y:i.y+i.h}" r="${s.toFixed(1)}" @pointerdown=${i=>this._dtStart(i,"scale",[t,e])}>`)} - `}_renderDecorLayer(){const t=R_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``}_renderDecorLayer(){const t=I_,e=this._decorH,i="decor"===this._mode,s=i&&"erase"===this._decorTool,n=this._decorList.map(n=>{const o="dshape"+(i&&this._decorSel===n.id?" dsel":""),r=this._decorResolvedStyle(n),a=this._decorWidthUnits(n),l=t=>this._decorShapeDown(t,n),c=t=>this._decorShapeDbl(t,n);if("line"===n.kind)return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`;if("rect"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=na(n.angle);return W``:G}`}if("ellipse"===n.kind){const i=(n.x+n.w/2)*t,h=(n.y+n.h/2)*e,d=oa(n.angle);return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Pc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W``:G}`}if("furniture"===n.kind){const i=n.w*t,h=n.h*e,d=Rc(n.symbol,i,h);if(!d)return G;const u=Number(n.angle)||0,p=n.x*t+i/2,_=n.y*e+h/2,g=`${u?`rotate(${u} ${p} ${_}) `:""}translate(${n.x*t} ${n.y*e})`;return W` ${s?W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:Qi(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W``:G}`}if("text"===n.kind){const i=this._decorTextUnits(n),s=this._renderDeviceSnapshot?.facts.get(`decor:${this._space}:${n.id}`),a=function(t){return String(t??"").replace(/\r\n?/g,"\n").split("\n")}("string"==typeof s?s:ts(n.text,n,this._renderPlanHass,t=>this._renderEntityAvailable(t))),h=n.x*t,d=n.y*e,u=Number(n.angle)||0,p=d-(a.length-1)*i*1.2/2;return W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=ra(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W`${a.map((t,e)=>W`${t}`)}`}return G});let o=G;const r=this._decorDraft;if(r){const t=this._decorStyle,e=aa(t.widthCm,this._cellCm,this._gridPitch);if("line"===r.kind)o=W``;else{const i=Math.min(r.a[0],r.b[0]),s=Math.min(r.a[1],r.b[1]),n=Math.abs(r.b[0]-r.a[0]),a=Math.abs(r.b[1]-r.a[1]);o="rect"===r.kind?W``:W``}}return W`${n}${o}`}get _editorToolbarGroups(){return"plan"!==this._mode?[]:[{id:"opening",label:this._t("markup.opening"),icon:"mdi:door",activeItemId:"opening"===this._tool?this._openingPreset?.type:void 0,items:[{id:"window",label:this._t("opening.window"),icon:"mdi:window-closed-variant",role:"tool",invoke:()=>this._activateOpeningPlacement("window")},{id:"door",label:this._t("opening.door"),icon:"mdi:door-open",role:"tool",invoke:()=>this._activateOpeningPlacement("door")},{id:"passage",label:this._t("opening.passage"),icon:"mdi:arch",role:"tool",invoke:()=>this._activateOpeningPlacement("passage")},{id:"gate",label:this._t("opening.gate"),icon:"mdi:gate",role:"tool",invoke:()=>this._activateOpeningPlacement("gate")}]}]}_renderEditorGroupLauncher(t){return this._editorSecondary.renderGroupLauncher(t,this._editorToolbarGroups,this._editorSecondaryCopy)}get _editorSecondaryContextId(){const t=`editor:${this._mode}:${this._space}:${this._cfgEpoch}`,e=this._editorSecondary.activeGroup(this._editorToolbarGroups);if(e)return`${t}:group:${e.id}:${this._editorSecondary.groupGeneration}`;if("plan"===this._mode){const e=this._physicalSel;return e?`${t}:selection:${e.kind}:${e.id}:${e.segment??""}`:`${t}:tool:${this._tool}:${this._path.length}:${this._openWallAnchor?1:0}`}return"decor"===this._mode?"furniture"===this._decorTool?`${t}:palette:furniture:${this._furnPalette?.symbol||"none"}`:"select"===this._decorTool&&this._decorSel?`${t}:selection:decor:${this._decorSel}`:`${t}:tool:${this._decorTool}:${this._bdMoved?1:0}:${this._bdDrag?1:0}`:`${t}:none`}_runEditorContext(t,e){this._editorSecondary.runContext(t,this._editorSecondaryContextId,e)}_renderEditorGroupModel(t){return this._editorSecondary.renderGroupModel(t,this._editorSecondaryContextId,this._editorSecondaryCopy)}_renderDrawWallControl(){return j``}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j`
@@ -5013,8 +5099,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``}_setFillColor(t,e){const i=this._settingsDialog;this._settingsDialog={...i,colors:{...i.colors,[t]:{...i.colors[t],...e}}}}async _saveSettingsDialog(){const t=this._settingsDialog;if(t&&!t.busy){this._settingsDialog={...t,busy:!0};try{const e=this._serverCfg,i=JSON.stringify(t.colors)===JSON.stringify(ds),s={...e.settings};i?delete s.fill_colors:s.fill_colors=t.colors;const n=this._imperial?30.48*t.glowRadius:100*t.glowRadius;Number.isFinite(n)&&n>0&&300!==Math.round(n)?s.glow_radius_cm=Math.round(n):delete s.glow_radius_cm,t.bgColor?s.bg_color=t.bgColor:delete s.bg_color,null!==t.northDeg&&Number.isInteger(t.northDeg)&&t.northDeg>=0&&t.northDeg<=359?s.north_deg=t.northDeg:delete s.north_deg,s.bg_mode=t.bgMode,t.sunRays?s.sun_rays=!0:delete s.sun_rays,delete s.weather_entity,this._serverCfg={...e,settings:s},await this._saveConfigNow(),this._settingsDialog=null,this.requestUpdate(),this._showToast(this._t("gs.saved"))}catch(t){this._settingsDialog&&(this._settingsDialog={...this._settingsDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}}_boolInput(t,e,i=!1){const s=t=>e(!!t.target.checked);return customElements.get("ha-switch")?j``:j``}_rangeInput(t,e,i,s,n,o=!1,r){const a=t=>{const e=Number(t.target.value);Number.isFinite(e)&&n(e)};return customElements.get("ha-slider")?j``:j``}_renderColorRow(t,e){const i=this._settingsDialog.colors[t];return j`
{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Al(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?ul(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,R_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Yd(t));else for(const t of h)f.push(...Yd(t));for(const{poly:t}of e)for(const e of s.length?Ds(t,s,m):Yd(t))f.push(e);const y={occluders:Kd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:ci(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Fs(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=ao(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=lo(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=xs(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Ll([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:$s(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=v_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Zd([f.x,f.y],m,r,96);b={lit:t.length>=3?El([t],a):[]},y_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&ol(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||i,o=this._cleanFloor(e,s,t).path,r=Di(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` +
`}get _glowRadiusCm(){const t=Number(this._settings.glow_radius_cm);return Number.isFinite(t)&&t>0?t:300}get _imperial(){return"mi"===this.hass?.config?.unit_system?.length}get _glowRadiusPlaceholder(){const t=this._glowRadiusCm;return this._imperial?String(Math.round(t/30.48*10)/10):String(t/100)}_glowTransition(t,e){let i=this._glowRenderedSources.get(t);if(e){const e=this._glowFadeTimers.get(t);if(null!=e&&(clearTimeout(e),this._glowFadeTimers.delete(t)),null==i){this._suspendGlowFeatherForTransition(),i=++this._glowSourceSeq,this._glowRenderedSources.set(t,i),this._glowEnteringSources.add(t);const e=requestAnimationFrame(()=>{this._glowEnterRafs.get(t)===e&&(this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),this.isConnected&&this.requestUpdate())});this._glowEnterRafs.set(t,e)}return{domId:i,entering:this._glowEnteringSources.has(t),leaving:!1}}if(null==i)return null;const s=this._glowEnterRafs.get(t);if(null!=s&&cancelAnimationFrame(s),this._glowEnterRafs.delete(t),this._glowEnteringSources.delete(t),!this._glowFadeTimers.has(t)){this._suspendGlowFeatherForTransition();const e=window.setTimeout(()=>{this._glowFadeTimers.get(t)===e&&(this._glowFadeTimers.delete(t),this._glowRenderedSources.delete(t),this._glowLastAppearance.delete(t),this.isConnected&&this.requestUpdate())},534);this._glowFadeTimers.set(t,e)}return{domId:i,entering:!1,leaving:!0}}_suspendGlowFeatherForTransition(){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;this._glowFeatherSuspendUntil=Math.max(this._glowFeatherSuspendUntil,Date.now()+500),clearTimeout(this._glowFeatherResumeTimer);const t=Math.max(0,this._glowFeatherSuspendUntil-Date.now())+17,e=()=>{this._glowFeatherResumeTimer=0,Date.now()t.segs),s=[...i],n=Math.max(this._cmToUnits(10),.5*this._gridPitch),o=t=>e.some(e=>this._pointInRoom(t,e.r)),r=this._openingsR.filter(t=>{if("door"!==(e=String(t.type))&&"gate"!==e&&"passage"!==e)return!1;var e;const i=t.angle*Math.PI/180,s=-Math.sin(i),r=Math.cos(i);return o([t.rx+s*n,t.ry+r*n])&&o([t.rx-s*n,t.ry-r*n])}),a=this._roomWallOpeningInputs(r,t);for(const t of a){const e=t.angle*Math.PI/180,i=Math.cos(e)*t.length/2,n=Math.sin(e)*t.length/2;s.push([t.x-i,t.y-n,t.x+i,t.y+n])}const l=new Set(r.filter(t=>t.partitionHost).map(t=>t.id)),c=[t.id,this._cfgEpoch,this._cellCm,this._gridPitch,[...l].sort().join(",")].join("|");this._lightPhysicalBodiesCache?.key!==c&&(this._lightPhysicalBodiesCache={key:c,all:Il(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t,t=>l.has(t.id))).all});const h=this._lightPhysicalBodiesCache.all;let d=2166136261;const u=t=>{d^=Math.round(64*(Number.isFinite(t)?t:0)),d=Math.imul(d,16777619)>>>0},p=this._spaceWalls;u(this._cellCm),u(this._gridPitch),u(this._wallKeyPitch);for(const{poly:t}of e){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of s)for(const e of t)u(e);for(const t of h){u(t.length);for(const e of t)u(e[0]),u(e[1])}for(const t of p)u(t.cm),u(t.a?.[0]??0),u(t.a?.[1]??0),u(t.b?.[0]??0),u(t.b?.[1]??0);const _=d.toString(36),g=`${t.id}|${_}`;if(this._lightBarrierCache?.key===g)return this._lightBarrierCache.value;const m=.02*this._gridPitch,f=[],v=p.length||h.length?pl(t.rooms,p,i,a,this._wallKeyPitch,this._cellCm,this._gridPitch,I_,h):null;if(v)for(const t of function(t){const e=[];for(const i of t||[])for(const t of i||[])t?.length>=4&&e.push(t.slice(0,-1).map(t=>[t[0],t[1]]));return e}(v.geom))f.push(...Xd(t));else for(const t of h)f.push(...Xd(t));for(const{poly:t}of e)for(const e of s.length?Ts(t,s,m):Xd(t))f.push(e);const y={occluders:Yd(f),floor:e.map(t=>t.poly),fingerprint:_,masonryGeometry:v?.geom||[],opaqueBodies:h};return this._lightBarrierCache={key:g,value:y},y}_renderGlowLayer(t,e){const i=this._fillColors,s=this._glowRadiusCm/this._cellCm*this._gridPitch,n=t.rooms.map(t=>({r:t,poly:hi(t)})).filter(t=>!!t.poly),o=n.filter(({r:t})=>Es(e.glow,t));if(!o.length)return this._forgetGlowSpace(t.id),W``;const{occluders:r,floor:a,fingerprint:l,masonryGeometry:c,opaqueBodies:h}=this._lightBarriers(t,n),d=lo(this._renderPlanHass,this._renderDevices,null,this._virtualLights).filter(e=>e.device.space===t.id),u=new Map;for(const t of d){if(!t.device.id)continue;const e=u.get(t.device.id)||[];e.push(t),u.set(t.device.id,e)}const p=[],_=new Set;for(const e of this._renderDevices){if(e.space!==t.id)continue;const n=co(u.get(e.id)||[]);if(!n)continue;const o=`${t.id}|${e.id}`;_.add(o);const d=$s(n.passive?{state:n.on?"on":"off",attributes:{}}:this._renderPlanHass.states[n.eid],e.marker?.glow_color,i.glow_light.c),g=Number(e.marker?.glow_radius_cm),m=Number.isFinite(g)&&g>0?g/this._cellCm*this._gridPitch:s,f=this._pos(e);if(Bl([f.x,f.y],c,h)){this._forgetGlowSource(o);continue}const v=this._glowTransition(o,!!d);if(!v)continue;d&&this._glowLastAppearance.set(o,{c:d.c,alpha:Ss(d.bri,i.glow_light.a)});const y=this._glowLastAppearance.get(o);if(!y)continue;let b=null;const w=`${t.id}|${l}|${f.x.toFixed(4)},${f.y.toFixed(4)}|${m.toFixed(4)}`,k=b_(this._glowClipCache,w);if(k.hit)b=k.value;else{const t=Qd([f.x,f.y],m,r,96);b={lit:t.length>=3?zl([t],a):[]},w_(this._glowClipCache,w,b,256)}p.push({key:o,sourceEid:n.eid,domId:v.domId,entering:v.entering,leaving:v.leaving,pos:f,c:y.c,alpha:y.alpha,geometry:b,r:m})}const g=`${t.id}|`;for(const t of this._glowRenderedSources.keys())t.startsWith(g)&&!_.has(t)&&this._forgetGlowSource(t);if(!p.length)return W``;const m=this._spaceWalls,f=o.length===n.length?[]:this._openPairs().flatMap(t=>t.segs),v=o.length===n.length?null:o.map(({r:e,poly:i})=>{const s=m.length&&e.id&&rl(t.rooms,e.id,m,f,this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||i,o=this._cleanFloor(e,s,t).path,r=Ti(s,n.filter(t=>t.r!==e).map(t=>t.poly)),a=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z";return[o||a(s),...r.map(a)].join(" ")}),y=this._viewOr(this._baseVb()),b=this._stageEl?.clientWidth&&y.w?this._stageEl.clientWidth/y.w:1,w=1/(b>0?b:1),k=!this._pinchStart&&!this._panStart&&Date.now()>=this._glowFeatherSuspendUntil;(null==this._glowFeatherUnits||k)&&(this._glowFeatherUnits=w);const x=this._glowFeatherUnits??w,$=4*x,S=p.reduce((t,e)=>({x:Math.min(t.x,e.pos.x-e.r-$),y:Math.min(t.y,e.pos.y-e.r-$),maxX:Math.max(t.maxX,e.pos.x+e.r+$),maxY:Math.max(t.maxY,e.pos.y+e.r+$),w:0,h:0}),{x:1/0,y:1/0,maxX:-1/0,maxY:-1/0,w:0,h:0});return S.w=S.maxX-S.x,S.h=S.maxY-S.y,W` ${Mt(p,t=>t.key,t=>{const e=t.domId,i=t.geometry;return W` ${""} - ${A_.map(([e,i])=>W` + ${F_.map(([e,i])=>W` `)} @@ -5435,7 +5521,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("gs.glow_radius")} {const e=f_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> + @input=${t=>{const e=y_(t.target.value);null!=e&&e>0&&(this._settingsDialog={...this._settingsDialog,glowRadius:e})}} /> ${this._imperial?this._t("gs.unit_ft"):this._t("gs.unit_m")}
@@ -5458,7 +5544,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._settingsDialog.bgColor?j``:j`${this._t("gs.bg_theme")}`}
`:j`
${this._t("gs.bg_daynight_hint")}
`} - ${Zr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`} + ${Qr(this.hass)?G:j`
${this._t("gs.sun_missing")}
`}
${this._renderCompass()}
@@ -5510,14 +5596,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
`:G} -
${this._t("gs.about_version",{v:d_})}
+
${this._t("gs.about_version",{v:p_})}
${this._t("gs.about_github")} ${this._t("gs.about_telegram")}
- @@ -5567,7 +5653,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.busy?"…":this._t("btn.save")}
- `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(D_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j` + `}_saveKioskScale(t){this._kioskScale={...this._kioskScale,...t};try{localStorage.setItem(P_,JSON.stringify(this._kioskScale))}catch{}this.requestUpdate()}_renderKioskDialog(){const t=this._kioskScale,e=(e,i)=>j`
${this._rangeInput(50,300,5,Math.round(100*t[e]),t=>this._saveKioskScale({[e]:t/100}))} ${Math.round(100*t[e])}% @@ -5624,13 +5710,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._spaceDialog?this._renderSpaceDialog():G} ${this._importDialog?this._renderImportDialog():G} ${this._toast?j``:G} - `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Ap||Hp(t);const e=Rp,i=e.active.join(",");if(!i||i===Fp)return;Fp=i;const s=new Map(kp.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(d_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=this._viewOr(this._baseVb()),b=this._floorView(y),w=this._editing?"":this._stageBg(d),k=this._opMeasureView,x=this._decorMeasure,$=this._bdLive,S=this._furnLive,M="view"===this._mode?this._editorChromeMode:this._mode,C=this._roomHoverPaths(s),D=s.bg?this._display(s.bg.href):"",T=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,P=this._modeTransitionVisual,R=this._dayCycleState(),A=P?.viewWeight??("view"===this._mode?1:0),I=this._modeTransition.state?.from.presentedMode,F=!this._markup||!!P&&("view"===P.presentedMode||"devices"===P.presentedMode||"view"===I||"devices"===I),E=P?.stageColor||w,z=P?.sceneBrightness??1;return j` + `;const s=this._spaceModel();if(!s)return G;const n="valid"===i.kind?[s]:t,o=s.vb,r=this._effectiveProjection();this._renderProjection=r,this._labs.active.length&&function(t){Fp||Lp(t);const e=Ip,i=e.active.join(",");if(!i||i===zp)return;zp=i;const s=new Map($p.map(t=>[t.id,t])),n=e.active.map(t=>{const e=s.get(t);return`${t} (#${e.issue}, expires ${e.expires})`}).join(", ");console.info(`HOUSEPLAN LABS: ${n}`)}(p_);const a="iso"===r,l="devices"===this._mode&&this._showAll,c=this._renderDevices.filter(t=>t.space===s.id&&(!t.hidden||l)),h=this._renderDeviceSnapshot,d=this._spaceDisplayForRender(),u=a?this._isoDecorationLayers(d):null,p=u?this._isoOpeningPanels(u):[],_=this._resolvedRoomFills(s,d),g=this._resolvedGlowBase(s,d,_),m=d.showLqi??this._config.show_signal??!0,f=this._config.icon_size??2.5,v=f>8?2.5:f,y=bu(v),b=this._viewOr(this._baseVb()),w=this._floorView(b),k=this._editing?"":this._stageBg(d),x=this._opMeasureView,$=this._decorMeasure,S=this._bdLive,M=this._furnLive,C="view"===this._mode?this._editorChromeMode:this._mode,D=this._roomHoverPaths(s),T=s.bg?this._display(s.bg.href):"",P=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,R=this._modeTransitionVisual,A=this._dayCycleState(),I=R?.viewWeight??("view"===this._mode?1:0),F=this._modeTransition.state?.from.presentedMode,E=!this._markup||!!R&&("view"===R.presentedMode||"devices"===R.presentedMode||"view"===F||"devices"===F),z=R?.stageColor||k,O=R?.sceneBrightness??1;return j`
- ${"plan"===M?this._renderMarkupBar():"devices"===M?this._renderDevicesBar():this._renderDecorBar()} + style=${R?`opacity:${R.toolbarContentOpacity}`:G}> + ${"plan"===C?this._renderMarkupBar():"devices"===C?this._renderDevicesBar():this._renderDecorBar()}
`:G}
-
this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -5715,35 +5801,35 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerleave=${t=>this._stagePointerLeave(t)} @pointerup=${t=>this._stagePointerUp(t)} @pointercancel=${t=>this._stagePointerCancel(t)}> - ${ea(R,A)} + ${ia(A,I)} ${this._renderEditorSecondary()}
+ style="${1!==O?`filter:brightness(${O.toFixed(3)})`:""}"> ${a&&u?.structural?W``:G} + transform=${u?.structural?Gp():G}> ${""} ${this._wallHatchDefs(d.color)}${W`${this._paperShapes(s.rooms).map(t=>"path"in t?W``:"poly"in t?W``:W``)}`} ${this._editing?this._renderMarkupDefs(o):G} ${""} - ${this._editing&&!this._markup&&this._gridLevels()?W``:G} - ${s.bg&&D?W`this._onBackdropLoaded(s.bg.href,D)} + ${this._editing&&!this._markup&&this._gridLevels()?W``:G} + ${s.bg&&T?W`this._onBackdropLoaded(s.bg.href,T)} transform=${s.bg.angle?`rotate(${s.bg.angle} ${s.bg.x+s.bg.w/2} ${s.bg.y+s.bg.h/2})`:G} @dblclick=${t=>this._openBackdropDialog(t)} preserveAspectRatio="none" />`:G} ${""} ${d.hideDecor&&"decor"!==this._mode?G:this._renderDecorLayer()} - ${(()=>{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,ci(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Is(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&ol(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||g,y=v?Di(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{const t=this._openPairs(),e=new Map,i=t=>(e.has(t)||e.set(t,hi(t)),e.get(t));return s.rooms.filter(t=>t.area||"view"===this._mode||this._markup||d.showBorders).map(e=>{let n="room "+(s.bg?"overlay":"yard")+(this._markup?" outlined":"");!this._markup||e.id!==this._mergeSel&&e.id!==this._splitSel?.roomId||(n+=" picked");let o="";const r=Fs(d.fill,e);if(!this._markup&&(d.showBorders||"none"!==r)){n+=" styled";const t=[];t.push(`--room-stroke:${d.color}`,`--room-stroke-op:${d.showBorders?d.opacity:0}`);const i=_.byRoom.get(e)||null;i?(n+=" filled",t.push(`--room-fill:${i.color}`,`--room-fill-op:${i.opacity}`)):t.push("--room-fill:transparent","--room-fill-op:0"),o=t.join(";")}let a;const l=t=>{"view"===this._mode&&(void 0===a&&(a=this._roomArea(e)),this._showTip(t,e.name||this._t("room.unnamed"),a?this._t("tip.area",{value:a}):"",m?this._roomLqi(e.area):null,this._roomTemp(e),this._roomHum(e)))},c=this._markup&&(e.id===this._mergeSel||e.id===this._splitSel?.roomId),h=e.id&&!c?t.filter(t=>t.a.id===e.id||t.b.id===e.id).flatMap(t=>t.segs):[],u=c?[]:this._thickWallCuts(),p=h.concat(u);p.length&&(n+=" noedge");const g=i(e),f=this._spaceWalls,v=f.length&&e.id&&g&&rl(s.rooms,e.id,f,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,I_)||g,y=v?Ti(v,(b=e,s.rooms.filter(t=>t!==b).map(i).filter(Boolean))):[];var b;const w=t=>"M "+t.map(t=>t[0]+" "+t[1]).join(" L ")+" Z",k=v?this._cleanFloor(e,v,s).path:"",x=e.id||G,$=e.area||G,S=k&&v?W`{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @@ -5766,74 +5852,74 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 x="${e.x}" y="${e.y}" width="${e.w}" height="${e.h}" rx="${.03*Math.min(e.w,e.h)}" @pointerenter=${t=>{this._notePointer(t),this._pointerModality.hoverEnabled&&(this._hoverRoom={space:s.id,room:e})}} @pointermove=${l} - @pointerleave=${()=>this._clearTransientHover()}>`,M=p.length&&g?Ds(g,p,.02*this._gridPitch):null,C=M?W`this._clearTransientHover()}>`,M=p.length&&g?Ts(g,p,.02*this._gridPitch):null,C=M?W``:G;return W`${S}${C}`})})()} - ${this._renderRoomHoverFill(C)} + ${this._renderRoomHoverFill(D)} ${this._renderOpeningTunnelFills(s,_)} ${this._renderGlowBaseRooms(s,g)} ${this._renderOpeningTunnelFills(s,g,"glow-base")} - ${F?this._renderGlowLayer(s,d):G} + ${E?this._renderGlowLayer(s,d):G} ${this._renderSunRays(s)} ${this._editing?W`${this._renderAlignGuides()}`:G} + opacity="${R?.editorWeight??1}">${this._renderAlignGuides()}`:G} ${this._markup?W`${this._renderMarkupLayer(o)}`:G} + opacity="${R?.editorWeight??1}">${this._renderMarkupLayer(o)}`:G} ${""} ${""} ${this._editing?G:this._renderOpenWalls(d)} ${this._renderWallBodies(d)} ${this._markup?W`${this._renderPlanSnapOverlay()}`:G} + opacity="${R?.editorWeight??1}">${this._renderPlanSnapOverlay()}`:G} ${this._markup?W`${this._renderOpeningPlacementPreview()}`:G} - ${k?.guide?this._renderOpeningCenterTick(k.guide):G} - ${this._renderRoomHoverOutline(C)} + opacity="${R?.editorWeight??1}">${this._renderOpeningPlacementPreview()}`:G} + ${x?.guide?this._renderOpeningCenterTick(x.guide):G} + ${this._renderRoomHoverOutline(D)} ${""} ${this._editing?this._renderOpenWalls(d):G} ${d.hideOpenings&&!this._markup||u&&!u.floorSymbols?G:this._renderOpenings(d)} ${this._renderWallThickUi()} - ${this._markup&&"resize"===this._tool?this._renderResizeLayer(y):G} + ${this._markup&&"resize"===this._tool?this._renderResizeLayer(b):G} ${""} - ${this._renderBackdropFrame(y)} - ${this._renderTextFrame(y)} + ${this._renderBackdropFrame(b)} + ${this._renderTextFrame(b)} ${a&&u?.structural?W` - `:G} ${""} -
- ${c.map(t=>this._renderDevice(t,y,m))} - ${this._renderVacuums(c,y)} - ${this._renderVacFit(y)} - ${this._renderOpeningLocks(y)} - ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,y,d)):G} - ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,y)):G} +
+ ${c.map(t=>this._renderDevice(t,b,m))} + ${this._renderVacuums(c,b)} + ${this._renderVacFit(b)} + ${this._renderOpeningLocks(b)} + ${d.showNames||this._markup?s.rooms.map(t=>this._renderRoomLabel(t,s,b,d)):G} + ${this._markup?s.rooms.map(t=>this._renderRoomGear(t,s,b)):G}
- ${this._measureAnchor?j`
${this._renderMeasureLabel(y)}
`:G} + ${this._measureAnchor?j`
${this._renderMeasureLabel(b)}
`:G} ${this._rszLive?j`
${this._rszLive.map(t=>j`
${t.text}
`)}
`:G} - ${k?j`
${k.labels.map(t=>j`
${t.text}
`)}
`:G} + ${x?j`
${x.labels.map(t=>j`
${t.text}
`)}
`:G} + style="left:${((t.x-b.x)/b.w*100).toFixed(2)}%;top:${((t.y-b.y)/b.h*100).toFixed(2)}%">${t.text}
`)}
`:G} ${this._wallDialog?j`
${this._renderWallThickDialog()}
`:G} - ${x?j`
${x.text}
`:G} - ${S?j`
${S.map(t=>j`
${t.text}
`)}
`:G} ${$?j`
${$.text}
`:G} + ${M?j`
${M.map(t=>j`
${t.text}
`)}
`:G} + ${S?j`
${$.text}
`:G} + style="left:${((S.x-b.x)/b.w*100).toFixed(2)}%;top:${((S.y-b.y)/b.h*100).toFixed(2)}%">${S.text}
`:G}
${this._zoom>1?j`
${Math.round(100*this._zoom)}%
`:G} ${this._renderFarHint()} @@ -5883,7 +5969,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${null!=this._tip.temp?j`${this._t("tip.temp_avg")} ${this._tip.temp}°`:G} ${null!=this._tip.hum?j`${this._t("tip.hum_avg")} ${this._tip.hum}%`:G} ${null!=this._tip.lqi?j`${this._t("tip.lqi")} - ${this._tip.lqi}`:G} + ${this._tip.lqi}`:G}
`:G} ${this._kiosk&&!this._hasFixedFloor&&this._kioskDots&&this._model.length>1?j`
${this._model.map(t=>j``)} @@ -5914,7 +6000,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G} ${this._toast?j``:G} - `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=wh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=wh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=ao(this._planHass,this._devices,null,this._virtualLights)){const i=cu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:uu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Eu(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Ou(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=ao(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Li(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&zu(a,r,o,window.clearTimeout.bind(window)):(a=Eu(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Li(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Hu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Li(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Sh(this.hass.states[i||""]?.state),n=bh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Ph(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=$h(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?bh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(kh).filter(Boolean)),s=new Set;for(const e of t){const t=kh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j` + `}_vacCandidateStatus(t,e,i=this._planHass){const s=this._bindingStatus("entity:"+t);if("ha_disabled"===s.kind)return"disabled";if("orphaned"===s.kind)return"missing";if("unverified"===s.kind)return"unverified";const n=i?.states?.[t];return"unavailable"===n?.state?"unavailable":e?.hasPosition?"ok":"unsupported"}_vacOpenAllCameras(t){const e=this._haRegistry.entities||{},i=[];for(const[t,s]of Object.entries(this.hass?.states||{})){if(!t.startsWith("camera."))continue;const n=kh(t,s,e[t]);n&&i.push(n)}this._vacAllCameraCache={devId:t.id,candidates:i},this._vacAllCamerasFor=t.id}_vacSourceResolution(t,e=!1,i=this._planHass){const s=t.marker?.vacuum,n="string"==typeof s?.source&&!!s.source,o=new Set(t.entities||[]),r=new Set(o);n&&r.add(s.source);const a=i?.entities||{},l=[];for(const t of r){const e=i?.states?.[t],o=kh(t,e,a[t]);o?l.push(o):n&&t===s.source&&l.push({entityId:t,name:String(e?.attributes?.friendly_name||t),platform:a[t]?.platform?String(a[t].platform):null,category:t.startsWith("camera.")?"camera":"partial",hasPosition:!1,hasRooms:!1,hasPath:!1,hasMapId:!1,score:0})}if(e&&this._vacAllCameraCache?.devId===t.id){const t=new Set(l.map(t=>t.entityId));for(const e of this._vacAllCameraCache.candidates)t.has(e.entityId)||l.push(e)}const c={};for(const t of l)c[t.entityId]=this._vacCandidateStatus(t.entityId,t,i);return function(t,e,i,s){const n="string"==typeof t&&t.length>0,o=new Set(e),r=Array.from(i).sort((e,i)=>n&&e.entityId===t?-1:n&&i.entityId===t?1:i.score-e.score||e.entityId.localeCompare(i.entityId));if(n){const e=r.find(e=>e.entityId===t);return{entityId:t,status:s[t]||(e?.hasPosition?"ok":"unverified"),pinned:!0,candidates:r}}const a=r.find(t=>o.has(t.entityId)&&t.hasPosition&&"ok"===s[t.entityId]);return a?{entityId:a.entityId,status:"ok",pinned:!1,candidates:r}:{entityId:null,status:"none",pinned:!1,candidates:r}}(s?.source,o,l,c)}_vacSource(t,e=this._planHass){if(!1===t.marker?.vacuum?.live)return null;const i=this._vacSourceResolution(t,!1,e);return"ok"===i.status||"unsupported"===i.status?i.entityId:null}_vacEntity(t){return t.primary?.startsWith("vacuum.")?t.primary:(t.entities||[]).find(t=>t.startsWith("vacuum."))||null}_isVacDev(t){return!!this._vacEntity(t)}_activitySourceKey(t){return this._activitySnapshot(t).sourceKey}_activitySnapshot(t,e=lo(this._planHass,this._devices,null,this._virtualLights)){const i=hu(this._planHass,t,this._devices,e,this._fullRegistryHass);return{samples:i.samples,sourceKey:pu(this._planHass,t,i)}}_stampActivity(t,e,i){let s=this._activityRt.get(t);s||(s=Ou(i||"",[]),this._activityRt.set(t,s)),null!=i&&(s.sources=i),Nu(s,e,Date.now(),window.clearTimeout.bind(window),t=>window.setTimeout(()=>this.requestUpdate(),t))}_syncActivityRuntime(){const t=new Map;if(!this.hass)return t;if(!1===this._config?.live_states){for(const t of this._activityRt.values())clearTimeout(t.timer);return this._activityRt.clear(),t}const e=new Set,i=lo(this._planHass,this._devices,null,this._virtualLights);for(const s of this._devices){if(s.hidden)continue;if("icon_ripple"!==Bi(s.marker?.display))continue;e.add(s.id);const n=this._activitySnapshot(s,i);t.set(s.id,n);const{samples:o,sourceKey:r}=n;let a=this._activityRt.get(s.id);a?a.sources!==r&&Hu(a,r,o,window.clearTimeout.bind(window)):(a=Ou(r,o),this._activityRt.set(s.id,a))}for(const[t,i]of this._activityRt)e.has(t)||(clearTimeout(i.timer),this._activityRt.delete(t));return t}_activityTick(){if(!this.hass)return;const t=this._syncActivityRuntime();for(const e of this._devices){if(e.hidden)continue;if("icon_ripple"!==Bi(e.marker?.display))continue;const i=t.get(e.id)||this._activitySnapshot(e),{samples:s,sourceKey:n}=i,o=this._activityRt.get(e.id);if(!o||o.sources!==n)continue;const r=Lu(o,s,window.clearTimeout.bind(window));r&&this._stampActivity(e.id,r,n)}}_vacTick(){if(this.hass)for(const t of this._devices){if(t.hidden||!this._isVacDev(t))continue;if("static_icon"===Bi(t.marker?.display)){this._vacRt.delete(t.id);continue}const e=this._vacSource(t);if(!e)continue;const i=this._vacEntity(t),s=Mh(this.hass.states[i||""]?.state),n=wh(this.hass.states[e]?.attributes);let o=this._vacRt.get(t.id);o||(o={trail:[],lastKey:"",lastTs:0,moving:!1,jump:!1,endedTs:0,lastPos:null},this._vacRt.set(t.id,o)),s&&!o.moving&&(o.trail=[],o.lastPos=null);const r="never"!==Rh(t.marker?.vacuum)&&!n?.path.length;!s&&o.moving&&(o.endedTs=Date.now(),r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=null),o.moving=s;const a=n?.pos;if(s&&a){const t=a.x+":"+a.y;if(t!==o.lastKey){const e=Date.now();o.jump=o.lastTs>0&&e-o.lastTs>1e4,o.lastKey=t,o.lastTs=e,r&&o.lastPos&&(o.trail=Sh(o.trail,o.lastPos,40)),o.lastPos=[a.x,a.y]}}}}_vacEnsureMarker(t){const e=this._serverCfg;if(!e)return null;e.markers=e.markers||[];const i=e.markers.find(e=>e.id===t.id);if(i)return i;if("device"!==t.bindingKind&&"entity"!==t.bindingKind||!t.bindingRef)return null;const s={id:t.id,binding:t.bindingKind+":"+t.bindingRef,space:t.space||null,area:t.area||null,hidden:!!t.hidden};return e.markers.push(s),s}_renderVacSection(t){const e=this._devices.find(e=>e.id===t.devId);if(!e||!this._isVacDev(e))return G;const i=e.marker?.vacuum||{},s=this._vacAllCamerasFor===e.id,n=this._vacSourceResolution(e,s),o=n.entityId,r=n.candidates.find(t=>t.entityId===o)||null,a=o?wh(this.hass?.states[o]?.attributes):null,l=!1!==i.live&&("ok"===n.status||"unsupported"===n.status),c=this._vacPlanRoomAnchors(e.space),h=a?function(t,e){const i=new Set(e.map(xh).filter(Boolean)),s=new Set;for(const e of t){const t=xh(e.name||"");t&&i.has(t)&&s.add(t)}return s.size}(a.rooms,c.map(t=>t.name)):0,d=!!(l&&a&&h>=3),u=Object.keys(i.calibration||{}),p=t=>{const i=this._vacEnsureMarker(e);i&&(i.vacuum={...i.vacuum||{},...t},this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate())},_=new Set(e.entities||[]),g=n.candidates.filter(t=>_.has(t.entityId)||t.entityId===i.source),m=s?n.candidates.filter(t=>t.entityId.startsWith("camera.")&&!g.some(e=>e.entityId===t.entityId)):[],f=t=>[t.hasPosition?this._t("vac.cap_position"):"",t.hasRooms?this._t("vac.cap_rooms_short"):"",t.hasPath?this._t("vac.cap_path"):"",t.hasMapId?this._t("vac.cap_map"):""].filter(Boolean).join(" · ")||this._t("vac.cap_none"),v=t=>j`
@@ -5974,28 +6060,28 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${u.length?j`
${is(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} + ${u.length?j`
${ss(this._t("vac.cal_maps"),{maps:u.join(", ")})}
`:G} `:G} - `}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:ci(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=gh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=xh(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:ai(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Dh(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(is(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?bh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Dh(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Ch(c),[d,u]=dh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Ch(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=bh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Th(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=bh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Ch(s.p0),[a,l]=dh(r,e[0],e[1]),[c,h]=dh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Th(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=bh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Ch(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>dh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=dh(s,t.cx,t.cy);n.push(W` - ${t.name}`)}let a=G;if(i.pos){const[e,n]=dh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W``}_vacMapId(t,e,i=this._planHass){const s=this._vacEntity(t),n=s?i?.states?.[s]?.attributes?.selected_map:null;return o=e.mapId,r=n,"default"!==o?o:null!=r?String(r):"default";var o,r}_vacSaveMatrix(t,e,i,s){const n=this._devices.find(e=>e.id===t),o=n?this._vacEnsureMarker(n):this._serverCfg?.markers?.find(e=>e.id===t);if(!o)return!1;const r={...o.vacuum||{}};return r.source=e,r.calibration={...r.calibration||{},[i]:s.map(t=>Number(t.toFixed(6)))},o.vacuum=r,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_vacPlanRoomAnchors(t){return(this._spaceModelById(t)?.rooms||[]).map(t=>({room:t,poly:hi(t)})).filter(({room:t,poly:e})=>t.name&&e).map(({room:t,poly:e})=>{const i=mh(e);return i?{name:String(t.name),cx:i[0],cy:i[1]}:null}).filter(Boolean)}_vacAutoCalibrate(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i||i.rooms.length<3)return void this._showToast(this._t("vac.autocal_no_rooms"));const s=this._vacPlanRoomAnchors(t.space),n=$h(i.rooms,s);if(!n)return void this._showToast(this._t("vac.autocal_no_match"));const o=this._serverCfg?.spaces?.find(e=>e.id===t.space),r=Number(o?.cell_cm),a=Number.isFinite(r)&&r>0?r:5,l=function(t,e,i){return![t,e,i].every(Number.isFinite)||t<0||e<=0||i<=0?Number.POSITIVE_INFINITY:t/e*i}(n.residual,this._gridPitch,a),c=this._vacMapId(t,i);l>40?this._vacCalConfirm={markerId:t.id,source:e,mapId:c,matrix:n.matrix,rooms:n.matched.length,error:li(l,"mi"===this.hass?.config?.unit_system?.length)}:this._vacSaveMatrix(t.id,e,c,n.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(n.matched.length)}))}_vacApplyCalibrationProposal(t){const e=this._vacCalConfirm;if(e){if(this._vacCalConfirm=null,t){const t=this._devices.find(t=>t.id===e.markerId),i=Th(e.matrix);if(!t||!i)return;if(this._markerDialog=null,t.space!==this._space&&!this._commitSpace(t.space))return;return void(this._vacFit={markerId:e.markerId,source:e.source,mapId:e.mapId,p:i,drag:null})}this._vacSaveMatrix(e.markerId,e.source,e.mapId,e.matrix)&&this._showToast(ss(this._t("vac.autocal_done"),{rooms:String(e.rooms)}))}}_vacStartFit(t){const e=this._vacSource(t),i=e?wh(this.hass?.states[e]?.attributes):null;if(!e||!i)return void this._showToast(this._t("vac.cal_need_pos"));const s=this._vacMapId(t,i),n=t.marker?.vacuum?.calibration?.[s],o=this._spaceModelById(t.space);if(!o)return;const r=o.vb,a=n&&6===n.length&&Th(n)||function(t,e){const i=[],s=[];for(const e of t)null!=e.x0?(i.push(e.x0,e.x1),s.push(e.y0,e.y1)):(i.push(e.cx),s.push(e.cy));if(!i.length)return{ox:e[0]+e[2]/2,oy:e[1]+e[3]/2,s:e[2]/1e4,rot:0,mir:!0};const n=Math.min(...i),o=Math.max(...i),r=Math.min(...s),a=Math.max(...s),l=Math.max(o-n,a-r)||1,c={ox:0,oy:0,s:.6*Math.min(e[2],e[3])/l,rot:0,mir:!0},h=Dh(c),[d,u]=uh(h,(n+o)/2,(r+a)/2);return c.ox=e[0]+e[2]/2-d,c.oy=e[1]+e[3]/2-u,c}(i.rooms,r);this._markerDialog=null,(t.space===this._space||this._commitSpace(t.space))&&(this._vacFit={markerId:t.id,source:e,mapId:s,p:a,drag:null})}_vacFitSave(){const t=this._vacFit;if(!t)return;const e=this._vacSaveMatrix(t.markerId,t.source,t.mapId,Dh(t.p));this._vacFit=null,e&&this._showToast(this._t("vac.cal_done"))}_vacFitTurn(t){const e=this._vacFit;if(!e)return;const i=wh(this.hass?.states[e.source]?.attributes),s=this._vacGhostCentre(i?.rooms||[]),n={...e.p,...t};this._vacFit={...e,p:Ph(n,e.p,s[0],s[1])}}_vacGhostCentre(t){const e=[],i=[];for(const s of t)e.push(s.x0??s.cx,s.x1??s.cx),i.push(s.y0??s.cy,s.y1??s.cy);return e.length?[(Math.min(...e)+Math.max(...e))/2,(Math.min(...i)+Math.max(...i))/2]:[0,0]}_vacDelta(t,e,i){const s=this._stageEl,n=s?.clientWidth||1,o=s?.clientHeight||1;return[e/n*t.w,i/o*t.h]}_vacFitPointer(t,e){const i=this._vacFit;if(!i)return;if(t.stopPropagation(),"pointerdown"===t.type){const e=t.target,s=e.getAttribute?.("data-corner");try{t.currentTarget.setPointerCapture?.(t.pointerId)}catch{}return void(this._vacFit={...i,drag:s?{kind:"scale",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:Number(s.split(",")[0]),fy:Number(s.split(",")[1])}:{kind:"move",sx:t.clientX,sy:t.clientY,p0:{...i.p},fx:0,fy:0}})}const s=i.drag;if(s){if("pointermove"===t.type){const[n,o]=this._vacDelta(e,t.clientX-s.sx,t.clientY-s.sy);if("move"===s.kind)this._vacFit={...i,p:{...s.p0,ox:s.p0.ox+n,oy:s.p0.oy+o}};else{const t=wh(this.hass?.states[i.source]?.attributes),e=this._vacGhostCentre(t?.rooms||[]),r=Dh(s.p0),[a,l]=uh(r,e[0],e[1]),[c,h]=uh(r,s.fx,s.fy),d=Math.hypot(a-c,l-h)||1,[u,p]=[2*a-c,2*l-h],_=Math.hypot(u+2*n-c,p+2*o-h)/2,g=Math.max(.05,_/d),m={...s.p0,s:s.p0.s*g};this._vacFit={...i,p:Ph(m,s.p0,s.fx,s.fy)}}return}"pointerup"!==t.type&&"pointercancel"!==t.type||(this._vacFit={...i,drag:null})}}_renderVacFit(t){const e=this._vacFit;if(!e)return G;const i=wh(this._renderPlanHass?.states?.[e.source]?.attributes);if(!i)return G;const s=Dh(e.p),n=[],o=[],r=[];for(const t of i.rooms){if(null==t.x0)continue;const e=[[t.x0,t.y0],[t.x1,t.y0],[t.x1,t.y1],[t.x0,t.y1]].map(([t,e])=>uh(s,t,e));e.forEach(([t,e])=>{o.push(t),r.push(e)});const[i,a]=uh(s,t.cx,t.cy);n.push(W` + ${t.name}`)}let a=G;if(i.pos){const[e,n]=uh(s,i.pos.x,i.pos.y);a=W``}const l=[];if(o.length){const e=(()=>{const t=s[0]*s[4]-s[1]*s[3];return(e,i)=>[(s[4]*(e-s[2])-s[1]*(i-s[5]))/t,(-s[3]*(e-s[2])+s[0]*(i-s[5]))/t]})(),i=Math.min(...o),n=Math.max(...o),a=Math.min(...r),c=Math.max(...r),h=.022*t.w,d=h/4;for(const[t,s,o,r]of[[i,a,n,c],[n,a,i,c],[n,c,i,a],[i,c,n,a]]){const i=e(o,r);l.push(W` `)}}return j`this._vacFitPointer(e,t)} @pointermove=${e=>this._vacFitPointer(e,t)} @pointerup=${e=>this._vacFitPointer(e,t)} - @pointercancel=${e=>this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Li(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??bh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Ph(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=dh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=vh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:yh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=dh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=dh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=dh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
this._vacFitPointer(e,t)}>${n}${a}${l}`}_vacRafLoop(){this._vacRaf=requestAnimationFrame(()=>{const t=this.renderRoot,e=this._stageEl,i=this._vacLastView,s=t?.querySelectorAll?.(".vacpuck")||[];if(!e||!i||!s.length)return void(this._vacRaf=0);const n=e.getBoundingClientRect();for(const e of s){const s=e.getAttribute("data-mid"),o=e.getBoundingClientRect(),r=i.x+(o.left+o.width/2-n.left)/n.width*i.w,a=i.y+(o.top+o.height/2-n.top)/n.height*i.h;for(const e of t.querySelectorAll(`line.tip[data-mid="${s}"]`))e.setAttribute("x2",r.toFixed(1)),e.setAttribute("y2",a.toFixed(1))}this._vacRafLoop()})}_renderVacuums(t,e){if(this._markup||"decor"===this._mode)return G;const i=this._space+"|"+e.x+"|"+e.y+"|"+e.w+"|"+e.h,s=this._vacJumpOnce||i!==this._vacViewKey;this._vacViewKey=i,this._vacJumpOnce=!1;const n=[],o=[];for(const i of t){if(i.hidden||!this._isVacDev(i))continue;if("static_icon"===Bi(i.marker?.display))continue;const t=this._renderDeviceSnapshot?.facts.get(`vacuum:${i.id}`),r=t?.source??this._vacSource(i,this._renderPlanHass);if(!r)continue;const a=t?.telemetry??wh(this._renderPlanHass?.states[r]?.attributes);if(!a)continue;const l=String(t?.mapId??this._vacMapId(i,a,this._renderPlanHass)),c=i.marker?.vacuum?.calibration?.[l];if(!c||6!==c.length)continue;const h=t?.runtime??this._vacRt.get(i.id),d=h?.moving??!1,u=Rh(i.marker?.vacuum),p="always"===u||"cleaning"===u&&d,_=t?.server??this._vacSrvTrails[i.id],g=_?.current?.map_id===l&&Array.isArray(_.current.points)?_.current:null,m=_?.previous?.map_id===l&&Array.isArray(_.previous.points)?_.previous:null;if("always"===u&&m&&m.points.length>1){const t=m.points.map(([t,e])=>{const[i,s]=uh(c,t,e),n=this._scenePoint([i,s]);return n[0].toFixed(1)+","+n[1].toFixed(1)}).join(" ");o.push(W``)}if(p){const t=yh(a,g,h?.trail||[]),e=!d||"integration"!==t.source&&"server"!==t.source?t.path:bh(t.path);if(e.length){const t=e.map(t=>t.map(([t,e],i)=>{const[s,n]=uh(c,t,e),o=this._scenePoint([s,n]);return`${i?"L":"M"} ${o[0].toFixed(1)} ${o[1].toFixed(1)}`}).join(" ")).join(" ");o.push(W``);const s=e[e.length-1];if(d&&s?.length>=2){const t=s[s.length-1],[e,n]=uh(c,t[0],t[1]),r=this._scenePoint([e,n]),a=r[0].toFixed(1),l=r[1].toFixed(1);o.push(W``)}}}if(!d||!a.pos)continue;const[f,v]=uh(c,a.pos.x,a.pos.y),y=this._scenePoint([f,v]),b=(y[0]-e.x)/e.w*100,w=(y[1]-e.y)/e.h*100,k=h&&h.lastTs>0&&Date.now()-h.lastTs>6e4,x=i.marker?.icon||i.icon||"mdi:robot-vacuum";n.push(j`
{t.stopPropagation();const e=this._vacEntity(i);e&&this._openMoreInfo(e)}}>
`)}return this._vacLastView=e,n.length&&!this._vacRaf&&this._vacRafLoop(),n.length||o.length?j` ${o.length?W`${o}`:G} - ${n}`:G}_renderDevice(t,e,i=!0){const s=this._pos(t),n=this._scenePoint([s.x,s.y]),o=(n[0]-e.x)/e.w*100,r=(n[1]-e.y)/e.h*100,a=this._devicePresentation(t,i),l=[`left:${o}%`,`top:${r}%`,...jo(a)],c=a.disabledReason,h=a.haDisabled?this._t(`marker.ha_disabled_${c}`):t.userHidden?this._t("marker.hidden_ghost"):t.name,d=nu(a),u="view"===this._mode||"devices"===this._mode,p=[h,a.haDisabled?"":this._t(`marker.state_a11y_${d}`),"none"!==a.pulse.kind?this._t(`marker.pulse_a11y_${a.pulse.reason}`):"",a.valueFullText||a.valueText||"",Do(a.valueBadge),null!=a.lqiText&&a.lqiBand?this._t(`marker.lqi_a11y_${a.lqiBand}`,{value:a.lqiText}):""].filter(Boolean).join(", "),_=[t.model,a.valueBadge?.fullText||"",null!=a.lqiText?"LQI "+a.lqiText:""].filter(Boolean).join(" · ");return j`
this._clickDevice(e,t)} @keydown=${e=>this._keyDevice(e,t)} @@ -6020,16 +6106,16 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointerup=${e=>this._pointerUp(e,t)} @pointercancel=${e=>this._pointerUp(e,t)} > - ${Uo(a,{newDevice:this._newIds.has(t.id),newDeviceTitle:this._t("device.new"),disabledTitle:a.haDisabled?h:""})} -
`}_roomArea(t){const e=ci(t);if(!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._spaceWalls,n=s.length&&t.id&&ol(i.rooms,t.id,s,this._openPairs().flatMap(t=>t.segs),this._wallKeyPitch,this._cellCm,this._gridPitch,R_)||e,o=this._cleanFloor(t,n),r=this._cellCm/this._gridPitch;return Tr(o.area*r*r/1e4,"mi"===this._renderPlanHass?.config?.unit_system?.length)}_roomTemp(t){const e=t.settings?.temp_source;return e?xo(this._renderPlanHass,e,"temp",this._markers):t.area?this._climate().get(t.area)?.temp??null:null}_roomHum(t){const e=t.settings?.hum_source;return e?xo(this._renderPlanHass,e,"hum",this._markers):t.area?this._climate().get(t.area)?.hum??null:null}_climate(){const t=this._serverCfg?.markers,e=this._renderPlanHass,i=this._climateCache;if(i&&i.h===e&&i.r===this._iconRules&&i.mk===t)return i.m;const s=function(t,e,i){const s=new Map;if(!t?.entities)return s;const n=vo(i),o=new Set;for(const t of i||[]){if(t?.removed||!0!==t?.use_climate_temp)continue;const e=(t.binding||"").indexOf(":");e>0&&o.add(t.binding.slice(e+1))}const r=new Map;for(const[e,i]of Object.entries(t.entities)){if(i.device_id&&n.devices.has(i.device_id)||!i.device_id&&n.entities.has(e))continue;const s=i.device_id?t.devices?.[i.device_id]:null,a=i.area_id||s?.area_id||null;if(!a)continue;if(i.entity_category)continue;if(!(o.size>0&&e.startsWith("climate.")&&(o.has(e)||i.device_id&&o.has(i.device_id)))){if(Yt.has(i.platform))continue;if($o.test(e))continue}let l=r.get(a);l||(l=new Map,r.set(a,l));const c=i.device_id||e;let h=l.get(c);if(!h){const n=t.states?.[e];h={name:(s?s.name_by_user||s.name:i.name||n?.attributes?.friendly_name||e)||e,model:s?.model,ents:[]},l.set(c,h)}h.ents.push(e)}for(const[i,n]of r){const r=[],a=[];for(const[i,s]of n){const n=fo(t,s.name,s.model,s.ents,e),l="mdi:thermometer"===n||"mdi:air-filter"===n;if(l){const e=uo(t,s.ents);null!=e&&r.push(e)}if(o.size>0&&(o.has(i)||s.ents.some(t=>o.has(t)))){const e=po(t,s.ents);null!=e&&r.push(e)}if(l||"mdi:water-percent"===n){const e=go(t,s.ents);null!=e&&a.push(e)}}(r.length||a.length)&&s.set(i,{temp:r.length?Math.round(r.reduce((t,e)=>t+e,0)/r.length*10)/10:null,hum:a.length?Math.round(a.reduce((t,e)=>t+e,0)/a.length):null})}return s}(e,this._iconRules,t);return this._climateCache={h:e,r:this._iconRules,mk:t,m:s},s}_resetRoomDialogFields(){this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1}_openRoomEdit(t){if(!t.id)return;this._roomEditId=t.id,this._nameSel=t.name||"",this._areaSel=t.area||"",this._roomFill="glow"===t.settings?.fill_mode?"":t.settings?.fill_mode||"";const e=t.settings?.custom_fill;this._roomCustomFill=e&&"object"==typeof e?rs(e,ls(this._curSpaceCfg).customFill):null,this._roomTempSrc=t.settings?.temp_source||"",this._roomHumSrc=t.settings?.hum_source||"",this._roomNameScale=Es(t.settings?.name_scale),this._roomLabelScale=Es(t.settings?.label_scale),this._roomSrcOpen=null,this._roomSrcFilter="",this._roomDialog=!0}_roomSettingsFromDialog(){const t={};return this._roomFill&&(t.fill_mode=this._roomFill),this._roomCustomFill&&(t.custom_fill=this._roomCustomFill),this._roomTempSrc&&(t.temp_source=this._roomTempSrc),this._roomHumSrc&&(t.hum_source=this._roomHumSrc),1!==this._roomNameScale&&(t.name_scale=this._roomNameScale),1!==this._roomLabelScale&&(t.label_scale=this._roomLabelScale),Object.keys(t).length?t:null}_saveRoomEdit(){const t=this._curSpaceCfg,e=t?.rooms.find(t=>t.id===this._roomEditId);if(!e)return this._roomDialog=!1,void(this._roomEditId=null);e.name=this._nameSel.trim()||e.name,e.area=this._areaSel||null;const i=e.settings||{},s={...i};this._roomFill?s.fill_mode=this._roomFill:delete s.fill_mode,this._roomCustomFill?s.custom_fill=this._roomCustomFill:delete s.custom_fill,"glow"===i.fill_mode&&"boolean"!=typeof i.glow&&(s.glow=!0),this._roomTempSrc?s.temp_source=this._roomTempSrc:delete s.temp_source,this._roomHumSrc?s.hum_source=this._roomHumSrc:delete s.hum_source,1!==this._roomNameScale?s.name_scale=this._roomNameScale:delete s.name_scale,1!==this._roomLabelScale?s.label_scale=this._roomLabelScale:delete s.label_scale,Object.keys(s).length?e.settings=s:delete e.settings,this._saveConfig(),this._roomDialog=!1,this._roomEditId=null,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate(),this._showToast(this._t("toast.room_updated"))}_roomSrcCandidates(){const t=this._planHass,e=vo(this._markers),i=this._roomSrcFilter.trim().toLowerCase(),s=[];for(const n of Object.values(t.devices)){if("service"===n.entry_type)continue;if(e.devices.has(n.id))continue;const t=(n.name_by_user||n.name||n.id).trim();i&&!t.toLowerCase().includes(i)||s.push({value:"device:"+n.id,label:t,sub:n.model||this._t("marker.sub_device")})}for(const[n,o]of Object.entries(t.entities)){if(!n.startsWith("sensor.")||o.hidden)continue;if(yo(t,n,e))continue;const r=o.name||t.states[n]?.attributes?.friendly_name||n;i&&!(r+" "+n).toLowerCase().includes(i)||s.push({value:"entity:"+n,label:r,sub:n})}return s.sort((t,e)=>t.label.localeCompare(e.label)),s.slice(0,200)}_roomSrcLabel(t){const e=t.indexOf(":"),i=t.slice(0,e),s=t.slice(e+1);return"device"===i?this._fullRegistryHass.devices[s]?.name_by_user||this._fullRegistryHass.devices[s]?.name||s:this._fullRegistryHass.entities[s]?.name||this.hass.states[s]?.attributes?.friendly_name||s}_labelPos(t,e){const i=this._layout["rl_"+(t.id||"")];if(i&&i.s===e)return{x:i.x*R_,y:i.y*R_};const s=this._snap(this._roomCenter(t));return{x:s[0],y:s[1]}}_labelDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=this._labelPos(e,i);this._drag={id:"rl_"+(e.id||""),sx:t.clientX,sy:t.clientY,ox:s.x,oy:s.y,moved:!1},N_(t),this._tip=null}_labelMove(t,e,i){const s="rl_"+(e.id||"");if(!this._drag||this._drag.id!==s)return;const n=this._stageEl;if(!n)return;const o=this._spaceModelById(i);if(!o)return;const r=o.vb,a=n.getBoundingClientRect(),l=this._viewOr(r),c=(t.clientX-this._drag.sx)/a.width*l.w,h=(t.clientY-this._drag.sy)/a.height*l.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0);const d=ic(this._drag.ox+c),u=ic(this._drag.oy+h);this._savePos({id:s,space:i},d,u)}_labelUp(t){const e="rl_"+(t.id||"");if(!this._drag||this._drag.id!==e)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&window.setTimeout(()=>this._drag=null,0)}_labelScale(t){const e=this._layout["rl_"+(t.id||"")]?.k;return"number"==typeof e&&Number.isFinite(e)?Math.min(3,Math.max(.5,e)):1}_rlResizeDown(t,e,i){if("plan"!==this._mode)return;t.preventDefault(),t.stopPropagation();const s=t.target.closest(".roomlabel");if(!s)return;const n=s.getBoundingClientRect(),o=n.left+n.width/2,r=n.top+n.height/2,a=Math.max(8,Math.hypot(t.clientX-o,t.clientY-r));this._rlResize={id:"rl_"+(e.id||""),space:i,k0:this._labelScale(e),cx:o,cy:r,d0:a},N_(t)}_rlResizeMove(t){const e=this._rlResize;if(!e)return;t.stopPropagation();const i=Math.max(8,Math.hypot(t.clientX-e.cx,t.clientY-e.cy)),s=Math.min(3,Math.max(.5,e.k0*(i/e.d0))),n=this._layout[e.id];if(n)this._layout={...this._layout,[e.id]:{...n,k:s}};else{const t=e.id.slice(3),i=this._spaceModelById(e.space);if(!i)return;const n=i.rooms.find(e=>e.id===t);if(!n)return;const o=this._labelPos(n,e.space);this._layout={...this._layout,[e.id]:{s:e.space,x:o.x/R_,y:o.y/R_,k:s}}}this._dirtyPos.add(e.id)}_rlResizeUp(){this._rlResize&&(this._rlResize=null,this._persistLayout())}_renderRoomGear(t,e,i){if(!t.id)return G;let s=null;if(t.poly?(s=this._gearPtCache.get(t.poly)||null,s||(s=xi(t.poly),this._gearPtCache.set(t.poly,s))):null!=t.x&&null!=t.y&&(s=[t.x+(t.w||0)/2,t.y+(t.h||0)/2]),!s)return G;const n=(s[0]-i.x)/i.w*100,o=(s[1]-i.y)/i.h*100;return j``}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=ao(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
`}_renderRoomLabel(t,e,i,s){if(!t.name&&!this._markup)return G;const n=this._labelPos(t,e.id),o=this._scenePoint([n.x,n.y]),r=(o[0]-i.x)/i.w*100,a=(o[1]-i.y)/i.h*100,l=Math.min(1,s.opacity+.25),c=this._labelScale(t),h=[];if(t.area||t.settings?.temp_source||t.settings?.hum_source||s.labelLight){if(s.labelTemp){const e=this._roomTemp(t);null!=e&&h.push(j`${e}°`)}if(s.labelHum){const e=this._roomHum(t);null!=e&&h.push(j`${e}%`)}if(s.labelLqi&&t.area){const e=this._roomLqi(t.area);null!=e&&h.push(j`${e}`)}if(s.labelLight){const e=(d=lo(this._renderPlanHass,this._renderDevices,t,this._virtualLights)).length?{on:d.filter(t=>t.on).length,total:d.length}:null;if(e){const t=0===e.on?this._t("roomcard.light_off"):e.on===e.total?this._t("roomcard.light_on"):this._t("roomcard.light_partial",{on:e.on,total:e.total});h.push(j`${t}`)}}}var d;const u=!!t.area,p=!this._markup;return j`
this._labelDown(i,t,e.id)} @pointermove=${i=>this._labelMove(i,t,e.id)} @pointerup=${()=>this._labelUp(t)} @@ -6044,13 +6130,13 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=zs(e,i),r=Math.round(10*o)/10,a=Os(o);return j`
- ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=zs(t.a,t.b);return{x:o,y:r,on45:Os(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Tr(aa(Math.abs(s-e),this._cellCm,this._gridPitch)*aa(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=R_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=ci(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e +
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),r=Math.round(10*o)/10,a=Hs(o);return j`
+ ${this._fmtLen(e,i)} · ${r}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,r=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:r,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const a=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),a=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:r,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${a}`}}return{x:o,y:r,on45:!1,text:`${a} × ${l} · ${Pr(la(Math.abs(s-e),this._cellCm,this._gridPitch)*la(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=I_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,r,a]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} `}_renderOpeningCenterTick(t){const e=(t.angle+90)*Math.PI/180;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return _i(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!yo(this._fullRegistryHass,t,vo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!yo(this._renderPlanHass,t,vo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=An(t)){return!!e&&"active"===Ln(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:_i(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W``}_roomCenter(t){if(t.poly){const e=t.poly.length;return[t.poly.reduce((t,e)=>t+e[0],0)/e,t.poly.reduce((t,e)=>t+e[1],0)/e]}return[t.x+t.w/2,t.y+.1*Math.min(t.w,t.h)]}_openingAmt(t){const e=t.contact&&this._renderOpeningEntityAvailable(t.contact)?this._renderPlanHass.states[t.contact]?.state:null;return gi(t.type,e,!!t.invert)}_planEntityAvailable(t){return!!t&&(!bo(this._fullRegistryHass,t,yo(this._markers))&&"active"===this._bindingStatus("entity:"+t).kind)}_renderEntityAvailable(t){return!!t&&(!bo(this._renderPlanHass,t,yo(this._markers))&&(!!this._renderPlanHass.entities?.[t]&&!!this._renderPlanHass.states?.[t]))}_openingEntityAvailable(t){return function(t,e,i=In(t)){return!!e&&"active"===Bn(t,`entity:${e}`,i).kind}(this.hass,t,this._haRegistry)}_renderOpeningEntityAvailable(t){return e=this._renderPlanHass,!!(i=t)&&!!e?.states?.[i];var e,i}_renderOpeningPlacementPreview(){const t=this._openingPreview;if(!t)return W``;const e={type:t.type,length:t.renderedLength,angle:t.angle,amount:gi(t.type,null),flipH:t.flipH,flipV:t.flipV,base:"var(--hp-open)",tone:"var(--hp-open)",cellCm:this._cellCm,gridPitch:this._gridPitch,face:t.face},i="passage"===t.type?function(t,e){const i=Math.max(0,t.renderedLength)/2,s=Math.max(0,t.target.physicalHalfWidth),n=s+.18*Math.max(0,e),o=t=>({x1:t,y1:-n,x2:t,y2:n});return{rect:{x:-i,y:s?-s:0,width:2*i,height:2*s},boundaries:[o(-i),o(i)]}}(t,this._gridPitch):null;return W` `}_renderOpenings(t){const e=this._openingsR;if(!e.length)return W``;const i=this._spaceModel();if(!i)return W``;const s=t.color,n=this._spaceWalls,o=this._openPairs().flatMap(t=>t.segs),r=this._openingWallIndexFor(i,o).value;return W`${e.map(t=>{if(t.orphanReason)return W`! - `;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=tu(l);return W``;const e=this._openingAmt(t),i=e>0&&!!t.contact&&this._renderOpeningEntityAvailable(t.contact)?"var(--hp-open)":s,o="gate"===t.type?!t.flip_v:t.flip_v,a=t.partitionHost||n.length||"gate"===t.type?this._openingFace(t,r,!!o):{ox:0,oy:0,cm:0,side:-1},l={type:t.type,length:t.rlen,angle:t.angle,amount:e,flipH:!!t.flip_h,flipV:!!t.flip_v,base:s,tone:i,cellCm:this._cellCm,gridPitch:this._gridPitch,face:a},{half:c,outlineHalf:h,hitHalf:d}=eu(l);return W` - ${eu(l)} + ${iu(l)} this._opClick(e,t)} @@ -6081,10 +6167,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @pointermove=${e=>this._opPointerMove(e,t)} @pointerup=${e=>this._opPointerUp(e,t)} @pointercancel=${e=>this._opPointerUp(e,t)}> - `})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
`})}`}_renderOpeningLocks(t){const e=this._openingsR.filter(t=>!t.orphanReason&&("door"===t.type||"gate"===t.type)&&t.lock&&this._renderOpeningEntityAvailable(t.lock));if(!e.length)return j``;const i=this._spaceModel();if(!i)return j``;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return j`${e.map(e=>{const i=this._renderPlanHass.states[e.lock]?.state,s="locked"===i,o=s||["unlocked","open","opening","unlocking","locking"].includes(String(i)),r=(e.angle+90)*Math.PI/180,a="gate"===e.type?this._openingFace(e,n,!e.flip_v):null,l=a?-16*a.side:16*(e.flip_v?-1:1),c=e.rx+Math.cos(r)*l,h=e.ry+Math.sin(r)*l,d=this._scenePoint([c,h]),u=(d[0]-t.x)/t.w*100,p=(d[1]-t.y)/t.h*100;return j`
{t.stopPropagation(),"view"===this._mode&&(this._openingInfo=e)}}> - +
`})}`}_lockAction(t,e){if(this._openingEntityAvailable(t)){if("unlock"===e){const e=this.hass?.states?.[t]?.attributes?.friendly_name||t;if(!confirm(this._t("confirm.unlock",{name:e})))return}this.hass?.callService?.("lock",e,{entity_id:t})}}_renderOpeningInfoCard(){const t=this._openingInfo,e="passage"!==t.type&&t.contact&&this._openingEntityAvailable(t.contact)?t.contact:null,i=("door"===t.type||"gate"===t.type)&&t.lock&&this._openingEntityAvailable(t.lock)?t.lock:null,s=e?this.hass.states[e]?.state:null,n=this._openingAmt(t),o=i?this.hass.states[i]?.state:null,r="door"===t.type?"opening.door":"gate"===t.type?"opening.gate":"passage"===t.type?"opening.passage":"opening.window",a="door"===t.type?"mdi:door":"gate"===t.type?"mdi:gate":"passage"===t.type?"mdi:arch":"mdi:window-closed-variant",l="gate"===t.type?n>0?"mdi:gate-open":"mdi:gate":n>0?"mdi:door-open":"mdi:door-closed",c=(t,e,i,s="")=>j`
${e}${i}
`;return j`this._openingInfo=null}> @@ -6105,7 +6195,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_renderOpeningDialog(){const t=this._openingDialog,e=this._spaceModel()?.partitions||[],i=t.id?this._curSpaceCfg?.openings?.find(e=>e.id===t.id):null,s={id:t.id||"preview",type:t.type,x:t.x/R_,y:t.y/this._spaceH,angle:t.angle,length:i&&!t.lengthTouched?i.length:this._cmToUnits(Math.max(20,t.lengthCm))/R_,...t.host?{host:t.host}:{}},n=ld(i,s),o=t.host?n?ad(s,e,R_,this._cellCm,this._gridPitch):rd(s,e,R_,this._cellCm,this._gridPitch):null,r="does-not-fit-jamb"===o?.reason,a=t.host?e.find(e=>e.id===t.host.id):null,l=a?ai(a.cm/2,this._imperial):"",c=!!t.host&&!o?.resolved&&!r,h="gate"===t.type?"mdi:gate":"window"===t.type?"mdi:window-closed-variant":"passage"===t.type?"mdi:arch":"mdi:door",d=(t,e,i)=>j`i(t.target.value)}> ${t.map(t=>j``)} `;return j` {const i=f_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> + @input=${e=>{const i=y_(e.target.value);null!=i&&(this._openingDialog={...t,lengthCm:i,lengthTouched:!0})}} /> ${"passage"===t.type&&(t.contact||t.lock)?j`
@@ -6170,7 +6260,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
-
`}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=fc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=fc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` +
`}_gridLevels(){const t=this._stageEl,e=this._viewOr(this._baseVb()),i=t&&t.clientWidth&&e.w?t.clientWidth/e.w:1;return function(t,e,i=7){if(!(t>0&&e>0&&Number.isFinite(e)))return null;const s=vc.find(s=>t*s*e>=i);if(void 0===s)return null;const n=vc.find(t=>t>=5*s)??5*s;return{fine:s,coarse:n}}(this._gridPitch,i)}_renderMarkupDefs(t){const e=this._gridLevels();if(!e)return W``;const i=this._gridPitch*e.fine,s=this._gridPitch*e.coarse,n=this._gridPitch*e.fine*.14;return W` @@ -6184,34 +6274,34 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - `}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=va(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W``}_renderPhysicalEditorLayer(){const t=this._spaceModel();if(!t)return W``;const e=this._gridPitch,i=this._viewOr(this._baseVb()),s=this._stageEl,n=s?.clientWidth?i.w/s.clientWidth:e/8,o=Math.max(.22*e,8*n),r=Math.max(o,12*n),a=t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`,l=(t,e)=>this._physicalSel?.kind===t&&this._physicalSel.id===e||"column"===t&&this._duplicateColumnId===e,c=(t.room_drafts||[]).flatMap(t=>t.points.slice(0,-1).map((e,i)=>{const s=t.points[i+1],o=ya(t.segments[i]?.cm||15,this._cellCm,this._gridPitch);return W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Tl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`{this._physicalSel={kind:"draft",id:t.id,segment:i},this._registerPhysicalTap("draft",t.id,i)}}>`})),h=(t.partitions||[]).map(t=>{const e=Pl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);return e?W`this._physicalDown(e,"partition",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Pl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalUp(t)}>`:G}),d=(t.wall_columns||[]).map(t=>{const e=Rl(this._physicalRotate?.id===t.id?{...t,angle:this._physicalRotate.angle}:t,this._cellCm,this._gridPitch);return W`this._physicalDown(e,"column",t.id)} @pointermove=${t=>this._physicalMove(t)} - @pointerup=${t=>this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Tl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Pl(u.base,this._cellCm,this._gridPitch);return t?W`this._physicalUp(t)}>`}),u=this._physicalDrag,p=(()=>{if(!u?.moved)return G;const t="partition"===u.kind?Pl(u.base.a,u.base.b,u.base.cm,this._cellCm,this._gridPitch):Rl(u.base,this._cellCm,this._gridPitch);return t?W``:G})(),_=(()=>{const i=this._physicalSel;if(!i)return G;if("draft"===i.kind){const e=t.room_drafts.find(t=>t.id===i.id);return e?W` t.join(",")).join(" ")}> ${e.points.map(t=>W``)} - `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Tl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` + `:G}if("partition"===i.kind){const e=t.partitions.find(t=>t.id===i.id);if(!e)return G;const s=Pl(e.a,e.b,e.cm,this._cellCm,this._gridPitch);if(!s)return G;const n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2;return W` - `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Pl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` + `}const s=t.wall_columns.find(t=>t.id===i.id);if(!s)return G;const l=this._physicalRotate?.id===s.id?{...s,angle:this._physicalRotate.angle}:s,c=Rl(l,this._cellCm,this._gridPitch);if("square"!==l.shape)return W` - `;const h=va(l.cm,this._cellCm,this._gridPitch),d=Ml(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` + `;const h=ya(l.cm,this._cellCm,this._gridPitch),d=Cl(l.angle)*Math.PI/180,u=Math.sin(d),p=-Math.cos(d),_=[l.center[0]+u*h/2,l.center[1]+p*h/2],g=[_[0]+u*Math.max(e,24*n),_[1]+p*Math.max(e,24*n)];return W` @@ -6219,7 +6309,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}> - `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=va(5,this._cellCm,this._gridPitch),s=va(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=ya(5,this._cellCm,this._gridPitch),s=ya(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(va(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=sl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,R_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:va(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Hs(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return La([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Cs(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>va(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||_a:l||_a,this._cellCm,this._gridPitch)/2):[],d=c?Ba(c,va(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(ya(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=nl(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,I_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:ya(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Ba([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,r=this._gridPitch,a=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>ya(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||ga:l||ga,this._cellCm,this._gridPitch)/2):[],d=c?qa(c,ya(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} - ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Pl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} + ${"column"===this._tool&&this._cursorPt&&this._drawWallCm?W``M ${Rl({shape:"square",center:this._cursorPt,cm:this._drawWallCm},this._cellCm,this._gridPitch).map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`)()}>`:G} ${d?W` `:G} ${u?W` @@ -6263,7 +6353,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628

${this._t("confirm.delete_partition_openings_body",{count:t.openings.length})}

    - ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:ai(t.length*R_/this._gridPitch*this._cellCm,e)})}
  • `)} + ${t.openings.map(t=>j`
  • ${this._t("confirm.delete_partition_openings_item",{type:this._t(`opening.${t.type}`),length:li(t.length*I_/this._gridPitch*this._cellCm,e)})}
  • `)}
@@ -6287,8 +6377,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
this._physicalDialog={...t,cm:e.target.value}} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}
${e&&"square"===t.shape?j` @@ -6411,12 +6501,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
- `}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of ao(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Xi(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ss).filter(t=>this._planEntityAvailable(t));return j``}_cardEntities(t){const e=this._planHass,i=[],s=new Set,n=t=>{if(!t||s.has(t)||!e.states[t])return;const n=e.entities[t];if("config"===n?.entity_category||"diagnostic"===n?.entity_category)return;s.add(t);const o=t.split(".")[0];["light","switch","fan","humidifier","siren","input_boolean"].includes(o)?i.push({eid:t,kind:"toggle"}):["cover","valve","lock","climate","media_player","vacuum","water_heater"].includes(o)?i.push({eid:t,kind:"open"}):["sensor","binary_sensor","number","select"].includes(o)&&i.push({eid:t,kind:"value"})};for(const i of lo(e,this._devices,null,this._virtualLights))if(i.device.id===t.id)for(const t of[...i.serviceEids,...i.stateEids])n(t);t.primary&&n(t.primary);for(const e of t.entities)n(e);return i.slice(0,12)}_cardToggle(t){const e=t.split(".")[0];"lock"!==e&&"alarm_control_panel"!==e&&this._planEntityAvailable(t)&&this.hass.callService("homeassistant","toggle",{entity_id:t}).catch(t=>this._showToast(this._t("toast.error",{err:this._errText(t)})))}_renderInfoCard(){const t=this._infoCard,e=t.primary?this.hass.states[t.primary]:void 0,i=e?Ji(this.hass,t.primary)?.text??e.state:null,s=(t.controls??t.marker?.controls??[]).filter(Ms).filter(t=>this._planEntityAvailable(t));return j`
${(()=>{const e=this._cardEntities(t);return e.length?j`
- ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Xi(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
- + ${e.map(({eid:t,kind:e})=>{const i=this.hass.states[t],s=this.hass.entities[t]?.name||i?.attributes?.friendly_name||t,n=i?Ji(this.hass,t)?.text??i.state:"",o="on"===i?.state||["open","unlocked","playing","cleaning"].includes(i?.state);return j`
+ ${s} ${"toggle"===e?j``:"open"===e?j`
`:G} ${i&&!this._cardEntities(t).length?j`
${this._t("info.state")}${i}
`:G} - ${Hi(t.link)?j`
${this._t("info.link")} - ${t.link}
`:G} + ${Ni(t.link)?j`
${this._t("info.link")} + ${t.link}
`:G} ${t.description?j`
${t.description}
`:G} ${t.pdfs&&t.pdfs.length?j`
${this._t("info.manuals")} - ${t.pdfs.map(t=>j` + ${t.pdfs.map(t=>j` ${t.name}`)}
`:G} ${s.length?j`
${this._t("info.controls")} @@ -6448,7 +6538,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 `:G}
- `}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=Bs(t.room),i=Fi(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Yn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=f_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return ko({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return Qh({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!ed(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Yh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Lo(this._planHass,s,n),r=Bo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return lo(ao(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&oo(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Jn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Jn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Jn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ss(e)&&!s.has(e)&&Kn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=ks(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?ls(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?_u(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Lo(this._planHass,o,l):[],p=o?Bo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Po(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return Qn(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Jn(o):[],P=o&&Zn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Wh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j``}_markerValueBadgeFields(t){return(e={touched:t.valueBadgeTouched,originalHas:t.originalHasValueBadge,original:t.originalValueBadge,enabled:t.valueBadgeEnabled,source:t.valueBadgeSource,position:t.valueBadgePosition}).touched?{value_badge:{enabled:e.enabled,source:e.source,position:e.position}}:e.originalHas?{value_badge:e.original}:{};var e}_markerDraft(t){if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return null;const e=qs(t.room),i=Ei(t.binding,t.devId,()=>"__hp_device_preview__"),s=this._markers.find(e=>e.id===i||e.id===t.devId),n=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),o=this._effectiveStoredTapAction(t),r={id:i,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&1.5!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle||null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===o&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:n.length?n:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=y_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:t.hideFromPlan,vacuum:s?.vacuum||null};return("virtual"===t.binding||t.room)&&(r.space=e?.space||("virtual"===t.binding?this._space:null),r.area=e?.area||null,r.room_id=e?.roomId||null),r}_markerPreviewDevice(t){const e=this._markerDraft(t);if(!e)return null;const i=`${this._haRegistry.revision}\n${JSON.stringify(e)}`;if(this._markerPreviewMemo?.key===i)return this._markerPreviewMemo.device;const s=function(t){const{marker:e,...i}=t;return xo({...i,markers:[e]}).find(t=>t.id===e.id)||null}({hass:this.hass,registry:this._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this._areaToSpace).map(([t,e])=>[t,e.space])),marker:e,settings:this._settings,excluded:this._excluded,showAll:this._showAll,firstSpaceId:this._model[0]?.id||this._space,loc:t=>this._t(t),iconRules:this._iconRules});return this._markerPreviewMemo={key:i,device:s},s}_markerPreviewDevices(t){const e=this._markerPreviewDevicesMemo;if(e?.base===this._devices&&e.preview===t)return e.devices;const i=[...this._devices.filter(e=>e.id!==t.id),t];return this._markerPreviewDevicesMemo={base:this._devices,preview:t,devices:i},i}_toggleIntent(t,e=this._devices){return td({hass:this._planHass,registryHass:this._fullRegistryHass,devices:e,device:t,virtualLights:this._virtualLights})}_toggleIntentForDialog(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i=this._markerPreviewDevices(e);return this._toggleIntent(e,i)}_toggleStateText(t,e){const i=this._planHass?.states?.[t]||this.hass?.states?.[t];try{return i&&"function"==typeof this.hass?.formatEntityState?this.hass.formatEntityState(i):e}catch{return e}}_toggleConfirmationStateText(t){const e=String(t.state||"unknown"),i=t.entityId?this._toggleStateText(t.entityId,e):e;if(i.trim().toLocaleLowerCase()!==e.trim().toLocaleLowerCase())return i;const s={on:"confirm.state_on",off:"confirm.state_off",open:"confirm.state_open",closed:"confirm.state_closed",opening:"confirm.state_opening",closing:"confirm.state_closing",unknown:"confirm.state_unknown"}[e];return s?this._t(s):e.replaceAll("_"," ").replaceAll("-"," ")}_toggleConfirmationLines(t){const e={"turn-on":"confirm.state_on","turn-off":"confirm.state_off",open:"confirm.state_open",close:"confirm.state_closed",stop:"confirm.state_stopped"};return function(t,e){if(!id(t)||!t.nextEffect||!t.targets.length)return[];const i="group"===t.kind,s=i?t.targets.filter(t=>"on"===t.state).length:0,n=i?0===s?e.groupAllOff():e.groupCurrent(s,t.targets.length):e.state(t.targets[0]);let o;return o="toggle"===t.nextEffect?e.expectedByHa():i&&"turn-on"===t.nextEffect?e.groupAllOn():i&&"turn-off"===t.nextEffect?e.groupAllOff():e.effect(t.nextEffect),[e.current(n),e.expected(o),...t.skippedTargets.length?[e.unavailable(t.skippedTargets.length)]:[]]}(t,{state:t=>this._toggleConfirmationStateText(t),current:t=>this._t("confirm.current_state",{state:t}),expected:t=>this._t("confirm.expected_state",{state:t}),groupCurrent:(t,e)=>this._t("confirm.group_current",{on:t,total:e}),groupAllOn:()=>this._t("confirm.group_all_on"),groupAllOff:()=>this._t("confirm.group_all_off"),unavailable:t=>this._t("confirm.unavailable_targets",{count:t}),effect:t=>this._t(e[t]),expectedByHa:()=>this._t("confirm.expected_by_ha")})}_toggleHintLines(t){if(!t)return[];const e=t=>this._t(`marker.toggle_effect_${t.replace("-","_")}`),i=t=>this._t(`marker.toggle_skip_${t.replace("-","_")}`);return function(t,e){const i=t.targets[0]||t.skippedTargets[0],s=[];return"group"===t.kind?t.targets.length&&s.push(e.group(t.targets)):i&&s.push(e.single(i)),t.nextEffect&&t.targets.length&&s.push("group"===t.kind?e.groupCurrentNext(t.targets,t.nextEffect):e.currentNext(t.targets[0],t.nextEffect)),t.skippedTargets.length&&s.push(e.skipped(t.skippedTargets)),!t.command&&t.noneReason&&s.push(e.none(t.noneReason)),s}(t,{single:t=>{if("via"in t&&"virtual-light"===t.via)return this._t("marker.virtual_light_target",{name:t.name});const e=t.entityId||("ref"in t?t.ref:""),i=t.name||e;return this._t("marker.toggle_hint_single",{name:i,id:e})},group:t=>this._t("marker.toggle_hint_group",{count:t.length,names:t.map(t=>`${t.name} (${t.entityId})`).join(", ")}),currentNext:(t,i)=>"virtual-light"===t.via?this._t("marker.virtual_light_current",{state:this._t("on"===t.state?"marker.virtual_light_state_on":"marker.virtual_light_state_off"),effect:e(i)}):this._t("marker.toggle_hint_current",{state:this._toggleStateText(t.entityId,t.state),effect:e(i)}),groupCurrentNext:(t,i)=>this._t("marker.toggle_hint_group_current",{on:t.filter(t=>"on"===t.state).length,count:t.length,effect:e(i)}),skipped:t=>this._t("marker.toggle_hint_skipped",{count:t.length,targets:t.map(t=>{const e=t.entityId||t.ref;return`${t.name||e} (${e}: ${i(t.reason)})`}).join(", ")}),none:t=>this._t(`marker.toggle_none_${t.replaceAll("-","_")}`)})}_effectiveStoredTapAction(t,e){return t.tapActionTouched?t.tapAction:Xh(t.originalHasTapAction?t.originalTapAction:null,e)}_effectiveMarkerTapAction(t,e=this._markerPreviewDevice(t)){return this._effectiveStoredTapAction(t,e?.primary?.split(".")[0])}_announceToggleDraft(t){const e=this._markerPreviewDevice(t),i=t.tapActionTouched?t:{...t,tapAction:this._effectiveMarkerTapAction(t,e)},s="toggle"===i.tapAction?this._toggleHintLines(this._toggleIntentForDialog(i)).join(" "):"";return{...i,tapHintAnnouncement:s}}_valueBadgeForBinding(t,e){const i={...t,binding:e,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0},s=this._markerPreviewDevice(i);if(!s)return{valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgeTouched:!0};const n=[...this._devices.filter(t=>t.id!==s.id),s],o=Bo(this._planHass,s,n),r=qo(this._planHass,s,o);return{valueBadgeEnabled:t.valueBadgeEnabled&&!!r,valueBadgeSource:r,valueBadgeTouched:!0}}_markerSpatialSource(t){const e=this._markerPreviewDevice(t);if(!e)return null;const i={...e,hidden:!1};return co(lo(this._planHass,[...this._devices.filter(t=>t.id!==i.id),i],null,this._virtualLights).filter(t=>t.device.id===i.id))}_markerAutoHasSpatialSource(t){const e={...t,lightRole:"auto",lightRoleTouched:!0},i=this._markerPreviewDevice(e);return!!i&&ro(this._planHass,{...i})}_setMarkerLightRole(t){const e=this._markerDialog;e&&(this._markerDialog={...e,lightRole:t,lightRoleTouched:!0})}_controlRefInfo(t){if(!t.startsWith("marker:"))return{label:this.hass.states[t]?.attributes?.friendly_name||t,sub:t,icon:t.startsWith("light.")?"mdi:lightbulb":"mdi:toggle-switch",warning:!this._planEntityAvailable(t)};const e=t.slice(7),i=this._markers.find(t=>t.id===e),s=this._devices.find(t=>t.id===e);if(!i||i.removed||!0!==i.is_light)return{label:this._t("marker.control_missing_label"),sub:`${this._t("marker.control_broken")} (${t})`,icon:"mdi:alert-outline",warning:!0};const n=this._serverCfg?.spaces.find(t=>t.id===(s?.space||i.space)),o=!!s&&Zn(s).length>0;return{label:i.name||s?.name||e,sub:[n?.title||s?.space||i.space,i.room_id||s?.area,o?"":this._t("marker.control_passive")].filter(Boolean).join(" · "),icon:i.icon||s?.icon||"mdi:lightbulb-outline",warning:!0===i.hidden||!0===s?.hidden}}_valueBadgeCandidateLabel(t){const e=t.source;if("derived_lqi"===e.kind)return this._t("marker.value_badge_lqi");if("derived_marker_state"===e.kind)return this._t("marker.value_badge_marker_state",{name:t.label});if("entity_state"===e.kind)return this._t("marker.value_badge_state",{name:t.label});const i=this.hass.states[e.entity_id]?.attributes?.friendly_name||this._fullRegistryHass.entities[e.entity_id]?.name||e.entity_id;return this._t(`marker.value_badge_attr_${e.attribute}`,{name:i})}_controlCandidates(t){const e=this._markerDraft(t)?.id||t.devId||"",i=[],s=new Set;for(const t of this._markers){if(t.id===e||t.removed||t.hidden||!0!==t.is_light)continue;if("virtual"!==t.binding&&"active"!==this._bindingStatus(t.binding).kind)continue;const n=this._devices.find(e=>e.id===t.id);if(!n||n.hidden)continue;const o=this._controlRefInfo(`marker:${t.id}`);for(const t of Zn(n))s.add(t);i.push({value:`marker:${t.id}`,label:o.label,sub:o.sub,icon:o.icon,search:`${o.label} ${o.sub} ${t.id} ${Zn(n).join(" ")}`.toLowerCase()})}const n=Object.keys(this.hass.states||{}).filter(e=>Ms(e)&&!s.has(e)&&Yn(t.binding,[e],this._bindingEntities(t.binding)).length>0&&this._planEntityAvailable(e)).map(t=>{const e=this._controlRefInfo(t);return{value:t,label:e.label,sub:t,icon:e.icon,search:`${e.label} ${t}`.toLowerCase()}}),o=t.controlsFilter.trim().toLowerCase();return[...i,...n].filter(e=>!t.controls.includes(e.value)&&(!o||e.search.includes(o))).slice(0,12).map(({search:t,...e})=>e)}_addControlRef(t,e){if(e.startsWith("marker:")){const i=this._markerDraft(t)?.id||t.devId||"";if(!i)return void this._showToast(this._t("toast.marker_binding_required"));const s=e.slice(7),n=this._markerDraft(t);if(function(t,e,i){if(!e||e===i)return!0;const s=new Map;for(const e of t)s.set(e.id,(e.controls||[]).filter(t=>"string"==typeof t&&t.startsWith("marker:")).map(t=>t.slice(7)));const n=new Set,o=[i];for(;o.length;){const t=o.pop();if(t===e)return!0;n.has(t)||(n.add(t),o.push(...s.get(t)||[]))}return!1}(n?[...this._markers.filter(t=>t.id!==i),n]:this._markers,i,s))return void this._showToast(this._t("toast.marker_control_cycle"))}this._markerDialog=this._announceToggleDraft({...t,controls:[...t.controls,e],controlsFilter:""})}_setMarkerGlowMode(t){const e=this._markerDialog;if(!e)return;if("auto"===t)return void(this._markerDialog={...e,glowMode:t,glowTouched:!0});const i=this._markerSpatialSource(e),s=xs(i?this._planHass.states[i.eid]:void 0,null,this._fillColors.glow_light.c),n=!e.glowColorDrafted,o="fixed"===t&&!e.glowBrightnessDrafted;this._markerDialog={...e,glowMode:t,glowColor:n?s.c:e.glowColor,glowBrightness:o?Math.max(1,Math.round(100*s.bri)):e.glowBrightness,glowColorDrafted:!0,glowBrightnessDrafted:e.glowBrightnessDrafted||"fixed"===t,glowTouched:!0}}_renderMarkerDialog(){const t=this._markerDialog,e="virtual"===t.bindingMode,i=this._bindingCandidates();this._bindingEntities(t.binding);const s=e?null:this._bindingStatus(t.binding),n=!e&&this._bindingHasHaPage(t.binding),o=this._markerPreviewDevice(t),r=this._effectiveMarkerTapAction(t,o),a=o?cs(this._serverCfg?.spaces.find(t=>t.id===o.space)):null,l=o?this._markerPreviewDevices(o):this._devices,c="toggle"===r&&o?this._toggleIntent(o,l):null,h=this._toggleHintLines(c),d=o?gu(this._planHass,o,{liveStates:!1!==this._config?.live_states,showTemperature:!1!==this._config?.show_temperature,showSignal:a?.showLqi??!1!==this._config?.show_signal,designPreview:!0,activityRuntime:this._activityRt.get(o.id),lightDevices:l,registryHass:this._fullRegistryHass,reducedMotion:this._reducedMotion}):null,u=o?Bo(this._planHass,o,l):[],p=o?qo(this._planHass,o,u):null,_=t.valueBadgeTouched?t.valueBadgeEnabled:!!d?.valueBadge,g=t.valueBadgeTouched?t.valueBadgeSource:d?.valueBadge?.source||t.valueBadgeSource,m=t.valueBadgeTouched?t.valueBadgePosition:d?.valueBadge?.position||t.valueBadgePosition,f=Ro(g),v=!!g&&!u.some(t=>t.key===f),y=u.find(t=>t.key===f),b=d?.valueSource?d.valueSource.attribute?`attr:${d.valueSource.eid}:${d.valueSource.attribute}`:`state:${d.valueSource.eid}`:"",w=this._markerAutoHasSpatialSource(t),k=!!o&&function(t,e){return to(t,e).some(t=>!!t.eid)}(this._planHass,{...o}),x=function(t,e,i,s){const n="always"===t||"auto"===t&&e,o=n&&!i;return{sourceExists:n,fromSourceEnabled:n&&i,manualEnabled:n,radiusEnabled:n,passive:o,effectiveMode:o&&"auto"===s?"fixed":s}}(t.lightRole,w,k,t.glowMode),$=!x.sourceExists,S=!x.fromSourceEnabled,M=x.passive,C=x.effectiveMode,D="never"===t.lightRole?this._t("marker.glow_disabled_never"):"auto"!==t.lightRole||w?M?this._t("marker.glow_passive_hint"):this._t("marker.glow_disabled_no_entity"):this._t("marker.glow_disabled_auto"),T=o?Zn(o):[],P=o&&Qn(o)||"",R=!!t.lightEntity&&!T.includes(t.lightEntity),A=o?Uh(o):[],I=!!t.toggleEntity&&!A.includes(t.toggleEntity),F="toggle"===r?this._toggleIntentForDialog({...t,toggleEntity:"",toggleEntityTouched:!0}):null,E=F?[...F.targets,...F.skippedTargets].map(t=>t.entityId||("ref"in t?t.ref:"")).filter(Boolean).join(", "):"",z=(()=>{if(e)return null;const s=i.find(e=>e.value===t.binding);if(s)return s.label;const[n,o]=t.binding.split(":");return"device"===n?this._fullRegistryHass.devices[o]?.name_by_user||this._fullRegistryHass.devices[o]?.name||o:this._fullRegistryHass.entities[o]?.name||this.hass.states[o]?.attributes?.friendly_name||o})();return j`this._markerDialog=null}>
@@ -6471,7 +6561,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628
@@ -6496,7 +6586,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @input=${e=>this._markerDialog={...t,bindingFilter:e.target.value}} />
${i.map(e=>j`
{const i={...t,binding:e.value,bindingOpen:!1,controls:Yn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> + @click=${()=>{const i={...t,binding:e.value,bindingOpen:!1,controls:Xn(e.value,t.controls,this._bindingEntities(e.value)),autoIcon:this._autoIconForBinding(e.value)};this._markerDialog=this._announceToggleDraft({...i,...this._valueBadgeForBinding(i,e.value)})}}> ${e.label}${e.sub}
`)} ${i.length?G:j`
${this._t("marker.nothing_found")}
`} @@ -6519,7 +6609,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 @@ -6692,12 +6782,12 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 -

${this._t(p_[t.display])}

+

${this._t(g_[t.display])}

${"static_icon"===t.display&&this._bindingHasAlarm(t.binding)?j`
${this._t("marker.static_alarm_warning")} @@ -6719,7 +6809,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._help("marker.value_badge_source.help")}
this._spaceDialog=ch(t,"file")} /> + @change=${()=>this._spaceDialog=hh(t,"file")} /> ${this._t("space.source_file")} ${"file"===t.source?j`
@@ -6866,25 +6956,25 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${t.pickSaved?this._renderServerPlans(t):G}`:G}
- {const i=f_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(g_,i)):t.cellCm}}} /> + @input=${e=>{const i=y_(e.target.value);this._spaceDialog={...t,cellCm:null!=i&&i>0?Math.max(.1,Math.min(f_,i)):t.cellCm}}} /> ${this._t("space.scale_unit")}
-
`:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=ls(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j``:G}`:G}`}_renderRoomDialog(){const t=!!this._roomEditId,e=t?null:this._wallFaceBatch,i=e&&e.candidates.length>1?this._t("room.queue_progress",{current:e.index+1,total:e.candidates.length}):"",s=!!this._areaSel||!!this._nameSel.trim(),n=cs(this._curSpaceCfg),o=this._roomFill||n.fill,r=this._roomCustomFill||n.customFill,a=[...this._freeAreas];if(t&&this._areaSel&&!a.some(t=>t.area_id===this._areaSel)){const t=this.hass.areas[this._areaSel];t&&a.unshift(t)}return j`
@@ -7073,7 +7163,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 - ${[["","fill.inherit"],...ji.map(t=>[t,"fill."+t])].map(([t,e])=>j`
- ${this._renderCardPreview(ls(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)} + ${this._renderCardPreview(cs(this._curSpaceCfg).cardFontScale,this._roomNameScale,this._roomLabelScale)}
@@ -7117,4 +7207,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d5eb5e11c38b54fee7310db684182bb1f628 ${this._t("btn.save")} `}
- `}}L_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},L_.ZOOM_MAX=8,L_.ZOOM_MIN=1/3,L_.styles=[Kt,ju],customElements.get("houseplan-card")||customElements.define("houseplan-card",L_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${d_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); + `}}q_.properties={_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_tapConfirm:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_hoverRoom:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeDraftId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_rszSel:{state:!0},_rszLive:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_openWallAnchor:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_alignDialog:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},q_.ZOOM_MAX=8,q_.ZOOM_MIN=1/3,q_.styles=[Kt,Uu],customElements.get("houseplan-card")||customElements.define("houseplan-card",q_),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${p_} `,"background:#3ea6ff;color:#04121f;font-weight:700",""); diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index e67a7b80..9d0e2762 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -220,8 +220,11 @@ mutable and warning-deduplicated. ## Sizes -`icon_size` in the config = **% of the visible plan area width** (default 2.5). Implementation: -`.stage { container-type: inline-size }` + sizes in `cqw`. Legacy px values (>8) are ignored. +`icon_size` in the config = **% of the visible plan area width** (default 2.5). +The surface boundary resolves this legacy public unit to the current effective +device base (`2.25` for the default) before the shared face sees it; the face +does not apply a late visual factor. Implementation: `.stage { +container-type: inline-size }` + sizes in `cqw`. Legacy px values (>8) are ignored. ## Sticky header @@ -238,8 +241,11 @@ projection (sources, value, icon, classes, metrics and explanation), `src/device-face.ts` renders one package-derived shell/core DOM on the full plan, device preview and static space card. The saved coordinate remains the icon-core centre; Text is shell-centred, while a Double shell extends around the anchored -core. The 101.5/80 shell/core ratio, Light/Dark context, full-text fitting and -44×44 interactive hit area are renderer facts rather than surface-specific DOM. +core. The 101.5/80 shell/core ratio, shared shell/core centre, Light/Dark +context, full-text fitting and 44×44 core-centred interaction floor are +renderer facts rather than surface-specific DOM. A positioned shell frame owns +the complete visible capsule hit area; its event bubbles to the marker's one +action path. `badge` shows the icon/morph and semantic core; `icon_ripple` additionally shows three finite event waves or one continuous wave for presence, mechanical transition and actual work; `value` replaces the icon @@ -256,9 +262,9 @@ suppresses legacy output. Bottom badges stack above system LQI, and a derived LQI badge de-duplicates that system row. `hp-device-preview` fits and centres the complete face bounding box rather than allowing satellites to clip. `normalizeDeviceDisplay()` is the mandatory compatibility gate for every consumer and maps -legacy `ripple` to `icon_ripple`. `markerLqiBand()` / `markerLqiColor()` are -deliberately marker-only (`<=40` red, `41…179` amber, `>=180` green); room fill -keeps the continuous `logic.ts::lqiColor()` gradient. The marker dialog builds +legacy `ripple` to `icon_ripple`. `markerLqiBand()` remains marker-only semantic +metadata for accessibility, while `markerLqiColor()` delegates to the shared +continuous `logic.ts::lqiColor()` red-to-green scale. The marker dialog builds its unsaved draft through `buildDevices`, then `hp-device-preview` shows the actual projection, integration provenance from registry/config-entry metadata and isolated short/continuous activity demonstrations. @@ -548,8 +554,9 @@ are two casement leaves. A gate has the same data/light/contact/lock semantics a uses two half-width leaves opening only 10° toward the exterior face and no large swing arc. Its default width in the editor is 300 cm. `openingAmount` (pure) maps the contact state to 0..1: no sensor → door/gate drawn open / window closed (static-plan convention); -`unavailable`/`unknown` freeze that default. The lock renders as an HTML padlock badge -(`.oplock`) in the device layer; a lock is +`unavailable`/`unknown` freeze that default. The lock renders as a compact +package-derived shell/core HTML padlock badge (`.oplock`) in the device layer, +with theme-aware locked/unlocked/unknown states; a lock is **never** toggled from the plan (`resolveToggleIntent` returns a secure no-op). View-mode UX: hover outline, drag along walls (continuous re-snap, saved on release), click → status card (250 ms timer), double click → properties dialog. In markup mode the "Opening" tool handles clicks instead. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d5f745bb..5475f83a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +- Device marker cores now stay concentric with their outer shell at fractional + sizes and common DPRs. Their current footprint is preserved without a late + `0.9` visual factor, while the MDI glyph is 10% larger. A value capsule owns + hover and the configured action across its complete visible area; opening + lock badges follow the compact light/dark Lock/Unlock artwork; and marker + LQI colours again move continuously from red to green + ([#213](https://github.com/Matysh/houseplan-card/issues/213)). + ## v1.65.0-beta.8 — 2026-08-20 - Device markers are now 10% more compact without moving their saved centres or diff --git a/docs/CHANGELOG.ru.md b/docs/CHANGELOG.ru.md index 43ba1370..3561747f 100755 --- a/docs/CHANGELOG.ru.md +++ b/docs/CHANGELOG.ru.md @@ -8,6 +8,14 @@ ## Не выпущено +- Core маркера устройства теперь остаётся соосным внешнему shell при дробных + размерах и распространённых DPR. Текущий размер сохранён без позднего + коэффициента `0.9`, а MDI-глиф увеличен на 10%. Вся видимая капсула со + значением получает единые hover и выбранное действие; компактные значки + замков проёмов соответствуют светлым/тёмным Lock/Unlock макетам; цвет LQI + маркера снова плавно меняется от красного к зелёному + ([#213](https://github.com/Matysh/houseplan-card/issues/213)). + ## v1.65.0-beta.8 — 2026-08-20 - Маркеры устройств стали на 10% компактнее без сдвига сохранённого центра и diff --git a/docs/TESTING.md b/docs/TESTING.md index 5020abdc..3a3f208e 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -375,6 +375,22 @@ owner's amber Dark Unlock override are recorded in that directory's README. covered by `smoke_device_preview_parity`, `smoke_static_icon` and `smoke_disabled_device` after a fresh production build. +## Device marker geometry and input polish (#213) + +- [ ] `node demo/smoke_device_icon_pixel_alignment.mjs` covers core bases + 24…112 CSS px in quarter-pixel steps at DPR 1/1.25/1.5/2. DOM centres, + isolated painted centroids/support and a deliberate 1 CSS px mutant must + distinguish browser raster parity from a persistent offset. +- [ ] `node demo/smoke_device_icon_design.mjs` keeps the effective 32/56/96 + geometry, uses the direct 0.55 MDI/core ratio and proves hover plus the + configured action from the far value-capsule end at right/bottom/left/top. +- [ ] Opening binding/registry-less/lock-action smokes preserve the secure + no-toggle-on-plan invariant while checking compact Light/Dark + locked/unlocked/unknown shell/core presentation. +- [ ] Unit presentation coverage compares marker LQI colour with the shared + continuous `lqiColor()` across former 40/41 and 179/180 boundaries; bands + remain semantic metadata only. + ## Touch support and release gates The product contract is defined in `docs/TOUCH-SUPPORT.md`: @@ -1593,7 +1609,8 @@ require hands on real hardware — they remain for the human pass. - [ ] Bind a contact sensor: open → leaf swings and the arc draws on in the accent colour; closed → leaf lies along the wall, arc hidden; invert flips this - [ ] Sensor unavailable → the opening freezes at its static default (door open / window closed) -- [ ] A door with a lock shows the padlock badge: green locked / orange unlocked / grey unknown +- [ ] A door with a lock shows the package padlock badge: black/dark locked, + amber unlocked and neutral unknown in both themes - [ ] A gate defaults to 300 cm, has two equal leaves, no swing arc and opens 10° outwards; contact, inversion, lock, drag and resize anchoring match a door - [ ] Clicking an opening (or the padlock) in view mode opens the info card with both states; diff --git a/docs/USER-GUIDE.md b/docs/USER-GUIDE.md index f8146b38..afbb48e5 100644 --- a/docs/USER-GUIDE.md +++ b/docs/USER-GUIDE.md @@ -310,8 +310,9 @@ near-end openings remain visible and are not moved until their geometry is edited. An opening may bind a contact; doors and gates may also bind a lock. View paints -the moving leaf and state. A lock badge is green when locked and orange when -unlocked. A plan tap never toggles a lock. The opening card provides a labelled +the moving leaf and state. A lock badge uses the package's black/dark locked +state and amber unlocked state. A plan tap never toggles a lock. The opening +card provides a labelled lock/unlock control, with confirmation before unlocking. Openings may slide along joined wall corners. A double click in Plan opens @@ -435,14 +436,17 @@ state; and always-static icon. A separate value badge can show an entity state, useful attribute, average LQI or linked light state on any side of the marker. Text and adjacent values are sections of the same shell. They shrink to a readable floor and then expand the shell; they are never ellipsized. +The complete visible value capsule is one hover and action target: clicking or +tapping its value section runs exactly the same configured action and safety +checks as the icon core. Virtual devices use the ordinary neutral/hover background with a dashed outer circle. An HA-less virtual device does not invent unavailable or activity; a linked virtual light may still follow its real controller. Unavailable keeps the ordinary presentation with the standard icon opacity reduction, no visual hover and no motion; its existing click/tap still opens information or settings. Marker LQI -is red at 0–40, amber at 41–179 and green at 180+, without changing the room -fill gradient. +uses the same continuous red-to-green scale as before the package update; the +room fill gradient and the displayed number are unchanged. Interactive View/kiosk and Device-editor markers have at least a 44×44 CSS px target. Enter and Space reuse the exact current click and confirmation path; diff --git a/docs/USER-GUIDE.ru.md b/docs/USER-GUIDE.ru.md index cd5e7124..6dd9d7d0 100644 --- a/docs/USER-GUIDE.ru.md +++ b/docs/USER-GUIDE.ru.md @@ -523,8 +523,8 @@ YAML-сущность без `unique_id` и строки в Entity Registry: п ### Замок -- `locked` показывается как закрытый замок; -- `unlocked`/`open` — как открытый, с оранжевым состоянием; +- `locked` показывается как закрытый чёрный/тёмный замок из дизайн-пакета; +- `unlocked`/`open` — как открытый, с жёлтой подложкой дизайн-пакета; - неизвестное состояние получает нейтральное/неизвестное оформление; - клик по значку открывает карточку проёма; - закрытие выполняется без дополнительного подтверждения; @@ -558,9 +558,9 @@ House Plan читает реестры устройств, сущностей и После первичного заполнения новые устройства отмечаются красной точкой. Точка исчезает после первого открытия маркера в редакторе устройств. -Визуальная часть маркера рисуется на 10% компактнее выбранного базового и -индивидуального размера; сохранённая точка остаётся его центром, а область -нажатия не уменьшается. У режима **Значение** внутренняя подложка числа имеет +Текущий компактный размер маркера сохраняется напрямую в его базовой геометрии, +без дополнительного уменьшения уже рассчитанного результата; сохранённая точка +остаётся центром, а область нажатия не уменьшается. У режима **Значение** внутренняя подложка числа имеет ровные полукруглые торцы и одинаковый отступ внутри внешнего shell. ### Виды привязки @@ -833,6 +833,10 @@ Hover включается только после события от наст другим молча — отображается `—`, а редактор позволяет сохранить связь или выбрать новую. +Вся видимая внешняя капсула является одной областью наведения и действия: +клик или тап по секции значения выполняет то же выбранное действие с теми же +подтверждениями и ограничениями безопасности, что и нажатие по core иконки. + Для старых маркеров без этой настройки прежние автоматические °/% сохраняются как дополнительная секция того же shell. Явно выключенный бейдж подавляет эту legacy-эвристику. Явный бейдж не зависит @@ -850,9 +854,9 @@ Glow и заливка «Свет» продолжают работать по настройкам устройства. Для привязок, способных сообщать о тревоге, редактор показывает неблокирующее предупреждение перед сохранением этого режима. -Число Zigbee LQI под маркером имеет три фиксированных диапазона: **0–40 — -красный, 41–179 — жёлтый, 180 и выше — зелёный**. Это не меняет плавный -градиент LQI-заливки комнаты. +Цвет числа Zigbee LQI под маркером плавно меняется от красного при слабом +сигнале к зелёному при сильном. Числовое значение и градиент LQI-заливки +комнаты не меняются. В Просмотре/киоске и редакторе устройств интерактивный маркер получает клавиатурный фокус и область действия не меньше 44×44 CSS px. Enter и Space diff --git a/docs/images/01-view-desktop.png b/docs/images/01-view-desktop.png index 3b3cb13dbe377e4f0926634cc0d012b4f2fcfcca..03120b696431c8a43b23ce5f5cbf597aa90bd026 100644 GIT binary patch delta 146153 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∾I(% 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

|Rcs7H{e$*zn9$Y3}-x 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

LNa0MeQ9uoxg1O!&=AJ1-9Sx0^p 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


)y_~V6TX=`<;S&g3WPprGNg12Sy~`-<@8^ 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

3|@M163KrR@1{wB!WkV}D$9_9 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 diff --git a/docs/images/06-device-editor.png b/docs/images/06-device-editor.png index c3688169f51a52c7b91d00c735f988addfcff660..b214f27ca702272e7e8db16647447996cccb9bac 100644 GIT binary patch delta 243257 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%0A3V)Ig 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 z zU;Ru4z+zA|pq&hyb-2I(2h;+e*bab08;M~fRP1H5EnrAuv+jmpz|&XITAwb$>OcF; ze=K2%>|ktuTEUwYDkmHgC(Y`cbmmm=4V>b*wMLq$jBJ3JN^Jo-1GV`Whn;KQx8OFc z;w$@bdaN|eRM*+7qaij!8jIm$GWHwsQ*RYnzw|_*?~1S#8b-4h_q;W7v(?Z`kmG|% zpW8wL7GYuQlI8HsK$N{Sgj5LRS;eIW*0>BE)UH7Mxkj_Lp>&lLt3=_M?` z?_1ZfCEvkhq{Bh$RbekF)tSyCa6$9WcKkEu9=r^Xi86?yxoqDe8E{`b+++J-S)(;N ziPJLGYwJjs0Zd3NM2O5<`2iS95`V#k^c-$m)kU&Rnt6?1( z3n^J=pX&vCGKs)mkX%PCEigPmE0N9P&9{#EIu{97hyr%NVC7b$Laz75xn92`A@Z0b zG%VqBy6wp}qQ4>`BZL?m7o^!Xw3yaekVvfqCJ6~m$*;m+fABzeL*Qjkir2$xF6U=W z{BJ302~=iK?-6Mdm-~X?bW#(0SETICU#tJ^9i?WDI|VM@G^rw_bPMfS_>B)l$)Q#i zx+Gyb9KAfkk6&UG$gkZ1K<|lk)#8@g-i*95hYP|v zDCto-%p|?zYQWDts5LxrU*O2G?zNM^$=cFgN#OBEUg~ipXVObr@Sfm`)BW2xf9H{C zR$c1DmkN?r&jv==*K+eP{>SsAG7QO+%E?4HUyKwfDL^JXTn7LtAVOh{8mQ#uVsqYe z>-YB$66&5+QgL(??7x+~wI?mSIfe{W&XQA^81+jz1!@TrH!@xhmuBETQ(aI*ZOCmp zP&Q&QbdY=Dvq9krHTRuNb3tq5;fiqv6e1UDDu(p&oo2iVWh|zvgLXa@aE5`fCdG+) zYo1d4A}Kxg@;Yfj#=u3u_`nm*H39MPhh;})jrezRG8b6!dtO*WFSv|7QmsnRAxxGb zo7zd4H+&scM#!n1c*iwdjq@#RLhI(6SKccIjyk{!3{jN?L`vTfZE#3BCG@*v#?(*k z@Pk=|-}syOywvbSmR^>hDZqmb zhp{TQ$4;37!<3|g)E%OyMm;AR@K>NNCTx4y)`hsp4tVAbp{kS8l#GJ=2{@NAqeA&3) z6UfV1@jpfn&NY8qie@*~Cm{Xs(N@(1zJ@EYqo7VA|NHLpz}M&UM&*hbbb-gZ7UEKg zUl)6X82UE5_KjKPjxY9*R`7vIg-|evT3l|?v(F$mT?sh;kA^U6fI*U}bH&+MSX~Gw zn0~g|^LmKt^6_eYS{sHCGjpcDAsP4(R-k9n-^7Fa*jWk{;*dOYoA}>U(kgTKw%Q15 zPmLLw4sQNBNB90IrLdaKM^Y1Enz827_UnwY&Xx1-j#n_lC{rjf;?*TX-@&Nf7Q#;n zWMrL6z$=Bs4jgSuoh=08fp`yn%-v1EwVU9p;PYMxie~9`-Wm;D_^vRPg=f%A_x~!~ za2(W1F<8`OyO(8hEQY7W#D91bWwbE18~zcGxMVauRi)e|(6nqrwZ%6mnLx~E)4MPk zKJm`oD(``=yTUUKr$RM6$C{l4!K%3GIw-MrUK9SMu?a3#1a=xO<2f~!p$f567Wr)y z%5Bz^ixN9%>6p83StKt1HwO8b7p~)(De!!qxi5qPP#LzWatP&6r{B9)U=pLYY=HE{ z#}GF(LY({ofvM!jPaM(2qBR);xwC3i+``%3xoRP3`A(o%S=P?rXOKh&s{5pc7}E1~ zvd1U6goT#jgA>%EEm=UahXOPlrkoTZVb(&+dhJatf|+kE5mb>Sn0`#Ba)>Rd;p#(% zcQ3-ssaiodV7z61|DpWvZ*VO-BqeuH{1Pn!A?SqB(`>e)F^=8VQz9KZc8c+Le@n#F zozA%l2|%Rpu* z6|IHg9`*HplNU_7U{D&lp%;%Yo=$BF&U2$Gf^RHS7mHFvMIuk47HP$T_! zN5C~x44pjrGf5ko7Mgj=ACg)m2Ee6Cea+(c*jk?kW{aL>U9EN;%OuYhshBA>M3biq zCbXDXL(sx`^zj!fJD_`*8AU_03G>n6pLWqUbR$bg3h?zGT z%W{ct+>ad@#afyA`g+$DJaYe2mzF3guQ-Gb2<}^j`|e11)|lCBm$v9oR2NREpjR z(RD(Sh8bau;B+&WiQp*Nl|0FaXvIz>AXQDbm#OFXcdfy7aNF@PH*4z2EK+G;2vQ=i zaiE8wAcVxSbgOU7rE7zTjGW)rI6xvS(y=&Av^Le3;H) z`x3#719mJ?n8S+qwxx+T10e#%eG63|37e)OXzn0J+Pz%&YHjP{r0Ikxa}q`b6jSp_B%yF4$Il z{x$I=4eGWGi_eb-_P86QrVP5EN9>rlP8b8b9$z{b<}dSn0f6sVoxb(!C)fBf`WoYz z(1t_kJ#%ejw_i$){?QCKnVU=3D)u&nv4;C{wARDo|8A%wEVW>Y>Ct9 zU+#I;2kJwCr!03f{Yz#ha=s{GV1pCOL+09M~Zp49vJ~$FQtb zDnnRy5>TUe2aT7etfdP3pe!4h0Av7gp$vpbaKaF9&>m%CW>P_FvJS7B>&O(!l@r)! zw6+ZHLX?aUd0{31TqI)LHz#Zpis>R~jB_}qYXhk~MBFi6TW0jZq!`L6JL-`!*b*-T z?FeU)9wwh`hyiIr0O|2UQ;Hw@1mrw%6vyzQOzQsRMT^sHs1o1EuHAmx?HtE z`qxaR2=XOIff6z{{8?^iQ{JLNWg5&Cr&;E^*;xBJ%IG<8gfi8^<2F9`a$YEU_ zRoEwCp$ttpIM($e!_*`!vPxjeCMyKIH_F52$1aZ~d8`tC2;-T2Z)ikKtpJIGGRrtl zOEo(TZpSiv3>+Hs?_W^+zvh-xS0M5ke|F^P{p5@WiF zXEA5bv~kS0a76G!0^-^-7g)cW1o0-<@YWh!1>cP{h#AWhnyBgR`;`o=%&#t((ZuER zuS}oC<#Ts*wvIA-qb%;kg1xbLQ~&MjoZ(dDDB&|_ z*erN%B$-qdbW0dav0O6D9db9eztlZxFKt?r9ybU?w2-OiwOoyE7(_=di0cEgm3mk7 zD*3pxZJ@|{SFUZSczNJI4PrY~*hsFiJTbgjo2?5=j(Lv%jKgsNG5VdKHGt1nz!WVZ zEm3Q0t5TN=vZA_df+7B?5nT#`5f?(?4{1 z1z|wv0g?LCW7Uuu587x3r;Y+(8Jxcos8{tXhB$mJNUh&~-xAIsC`PfyL+6g@ODm1! zSTvywQ8b9N7G>yc{-N6#%-7C-d6;5$Fm@jU@BGitYvHRQv793RuY>G+tTE~7-)1=z z-W!-7w%xM_CaVY38iLM1+iEyA{Viygg`yn2_!}JMRa6DNj;K z_AyG1wSh^Dtn;kAG4s!UjGOKMW~^0;co10Enbpb8&2;#-@Ku4W6B_qQu9YRg1=v9)r_bwruGRia>bDx4M&oa^~%31m8@hn+cqjfT?quyYM2vUbv znY73sK8wo5F2IaorT{;pcUDQRe}>jxpTA!tX#m_8vi60NcFn!DEkO1Cfw z`qIAl*57G3*qz7aWJ=7~<|l9=2uU?5896{o&C ze^p)A&f27?3}CP58-{k>IB~*>}PF`+LX2bwkNe(qmsKSGL3vG(7x8nyCOK0Bj z0@U|~!7Ke(H6VBDtiDyTZv70~t;W1m!$;Mn;=N}nKhZ_gXNiEQv_p2>2TJ7#r~e22$=g?S_T zjEw#2D4;flGoWu|_Bbd}{a_xl(BxMz2heklK82*T$76wDteUBdze_eBlmJrkM4T;+ z18b9yTbVn)>gQA-uIy0NF}R17;Mf02l?!t*oDECnbCz%-1Y7_TT>-eU8qX?-S_7%7 z&JIT*wT>blh(aT0<<^C%?d(#j9qv>LwfKbx?!8dhFW+>6BOVX4VSa?Gn3i8G;ECKJ z4=(P=2%CU@XhrqAksxEhyvorN1f8SD1j-FK4_C_p6!j*-&Wy6S*pfS<0kw$yj;B2d zaENT@7l~~0QC3y$+3T<2M{vNoxW}N!gFdy9H^Sc9E*ZG!dg9PC2nVni4=t9<<0-KR zpa*~U^f94Dc@mbw?gd9x#-Xt{Yo~eW%=!V}>Op&y-6{+t`g}X%XZ6x7r)8X>7j4Eu zHiSYt-S&~6L57_Z0QDf3iHn&^@TgL`MDKKUgBejr~?)cBm-+%YxZmuZ{-$t<8! zORyX>XtgwbMMy9-Sf{qlRZ{>G<$$CeS!p%AZ)9GAX(7*%{aJZDZG(#3z$VczVG>W% zK4w5SViy7T=ch-Ov+m=iHZ~78ij7teMTPqJ`0t_QxFQoJa0YdOhP6=cC&G{yVkM1C zAd=O%se3qj^B_dXkfEdn2lvkIaUD>*s8a6UEp14C77N7vF0}?I)V$%06wk;oZ)ZWpMtxXD;5}wN7)C?fb!|*r={Lpb04-- zky#y<^hd4HS@N`OrK1NR;pnpBpt8a!9@-Vx(P?=e^z%4l_lc>}a+m(s>Tcx9RBGZQ zSPn!>FQU5S&Ld6xxs+lt%?450(*;PP3XCS^Loa>Be2N+r@M0qE$A4PO;H)^f%%#L+L_pY%0 z4h5Mmw39@+8kNpXov^i1Ad)r7P>mg`%Q2l$Gzr}-p9V_Fsr)fr5m|3Wh+L!BHP0(606(m<)>YlTS9gaTXLQe zqzxrcVqwDOE6v1r!=$#0K_E1gkgo2r^^(t`!m71KyADG#0oyE@(dbjVfG3h(QyB-U{g0lrs6&Y zgT=>EiCU$BYZjZt8UY6X<+yXIS%w1HFxO*DAe9HZe1dIK52;Ik2d!Y+Ac+L4#U(EL#o=_XVKX0uQodJsO5#5~aBJz`aVF+Md(OAV^sQaDs+ z(AOp7yccPe4~9pKRcvams?{6@c^?bY374&js|+6SIRnKW4)`adol>{A07cP7+hFl2 zSD@?VO)VlD&!B9}09+@L&0eb}7TDn6&mbC)t{G00=;ZNp zM}ga0@~N_Q2VW9CE(qze%#^3)nvJIp&2o#0jwKIwYxwMHN4m{PJ!Oi01gvMpDNMmx z8j#1t{#iEpLNGz^+^c3ht^q?4Lj)~`xUeVJlLmd*K$G8lAAXsIx4m}L19J3S-5Gyw z>+}=zHfVQg0f+SJ9cOWL?RRs$DTDMTy+TktV_}Ns6z%I3K}P-Sd^E1w{aR5D5ega0 zpNsU2jQ&3My+Qrq5fXY$>&`-_C11}L=&e*RzTp2IBhN%5L!g4`B6 za2TgB8Jvg5MxxSd)I-lz$^J^)iR~DJoCm!&RoKHu_YaA zAdqX1%6KR$f~HxDteX=kSw-u)s-_i(eq7-r@z`pWI2$LedK*-{D-;Uo5=#)nFJbf$ z%F9yEV|G!;8@7fqxxb4dFsIAu>V|IjJ~q>1qEPTnP~ z@*2b}SxnFZsVN0_aC;~%;wrd~Oe;A6{_h8e9lUf0piT^+HY}W7nv|1$bQ%{2r~Il# zosl~dq*-{R$m5C0U0}19n3KCJH5EK;3};pRHUXGry@`)p)cGX>g(9(PL=hd1dvJpc zcTo6bo`eW4yZoXJ1^TI_VFrk}m+4KuPQ@bRJ|QgWwGi|{kXyT*07l8LVUHqJyl=a> zPptWZt}@xL)_Hr|)=eeaTy6#4>Guz5JQv_Bgi|i$v)X zyg}SuB-K4{G+C`LaOB~dew|fBg~x@hW7xVl5%upL&uLDpssF^aVcT+Ya+2rs;`5G4 zVXP$d^=-ZceuEPaqp9y>d0UV0+ZGf^4Dq!s|6QKa6})^S>6m=-A)vUw*B^_ozLqWu zHEmJP&|pr8Os^4V_WDF$FF|a%D)Sj*hfUOihHi3m#mTk>P7H&1caSUxcuGAtiY}v! zx#DUFUuRwL-e91N)jt`YQaGmW8xf!7(Y&A77)G zpsOGOk9I-xJS|*&3KOHQ)5}`_z^aqOAjA>q&h5ci8ZEwDL&H8!^NKt)I1)IM1(*=6 zsI!|?l6QXPN`#@i4%h30ebrV5Ens`l!1f`24^s_%&D9PWV0&rTrq5y8xw6DfCppG+`vkD7B%DpU2u@+lZeD}9UE z{MY3Nl+keYbKw$;X4k=UCTrn)&p^BrrPaM&yYKv)hL>#*_omFOy*lVUF z-L?B|4*SP-^xrq^14>JZfPj~c)841!x-942l5|5+J;RSmEkmzuj`pGZLz><@aPVr= z(DQ7O@3wtA<>8Tam5?_<1;B;aY4tJlQQ z@g?onSHRKd&re)=`ieH}>in1D1Mhk)UOu;zt1w*Rdb!MMb^aHyp`%k7g`amc1fHe$ zy^?`WVo7mrcur0(I-dWXyVdoU>$dN_g^OJGO88<9+<|n1vI(-z|7Jru^RHDa8U-rS zVTXghW2X&U z5^)=vO@R;dE~o8L!-P)k7X zAC8U|GQa?P*)FGdTk&`aMYwqPkIEp@D{|Bzm z*&uWFlh~m`TS#3-hgDE41oVZG?{v-1C9DJ%`oLWo^7 zygie5k^>-Y<7ZVrKpz1Bt0JN!O98MX_p5 zQK>faL)WVOR-2lV`BCrLI2*Z)icAS@%RAs-a;P1-M;tzC0*i= z(0_b%137gcqwKc73YsI0huyI+(wlSFb=+$-C!V4I5%iFy%{CjpO$I&FRik_L{(hJe zd=?TC8@@u}+6_&io?@e92mQeXNvOlT+EA0VLu2q%!{~{-TC|!`5fBh)qutzfW;^=- z3B&FCom!XmBzGj8A}gCxy^2V@@Lbn@;+Fpx9%QaIOiThgpj#-@39nhMH}JY%IUA%9 zT@8IUYvJ%d@xBMRSXCo380qMY?g-Oow6ML$T-_{;n{^( z29Je-$g^9NhG*(P*9%2so<^bUy3LPci{b*V_IBtb>F?VQA%qf1Z;ctU>G!QE_8fDv zAf9eDa>r(NZZu2ZCmdT^=#~lZr=zO4rsaYK>9nQf_ZZ^tvX(``$rHmNgS6;Nu6D(rC3(pJ0Hu?Ve`y;4ez?ul;bQY! z_7H0)#h9YL*Gejy;7fB3E9}ORv3E(27*PpzFZD2ptSY_;IJy#iRSYo{^hu0!m9;vM(Bgvhr%a&>wc|e`50ik}jRLwJ$wsuW z8zVG-FF%#>ZpvFxj8FMh}V+zxOrZ3 zz$;(CZ|={?m}(cVzs9vQrthv^AA`!TWD~H+Ad9XqFA0W+S65f-728OYXzfwaCilLC zw|vxf3CZParKL}M;u5%uR!77kfbs&~fg|_!VkhAXJXh$L8$$vOAf10ft^*x-54ZCTgV0Ntx*GT{V5+YHMW z#FP9DkgI*a=rcVvM?Xk5CQtg8IWs#$sg62TCb-O&`O)-?S~7v%tZ=P60K*LmB!N+y;iyGdOPVsbO@Ez&wbo5q)-A^)sX?Z|?8^6?MJs(V?8<10 zO7=E->rD>a+em*}{zc67N$3yP@n9=k$0QZYLjYQY&lYr%?fT6$mN5j(SImfo`Lvu* zh!Ocdj*gz5U`|>H6=6ZS; z2cy+q9FWdTz7e8``iQ5OS0Nt^3pS|49vrHreCY=e{UL1;gA3z_u|a!C^ZLD~H-jo3 zDo;$RDwqz^B!eEvz*r<}{gk{==|W!!q&Q~Yq$`5UmYL=MdLl0-@MYz0*`@_8pgfTm z5n|`TpsvhZ@%sS6y1W#>=Wm#RfRl~W#BDMGH<|4_A_;Icy*!&~wv0GCmt@T`EvV&X2O`5~$JkzAUz~NWLwGd)`!1 zYs@BBa55YTV55`9mzv#}+N}^K%{AS^-yxZROE0-rf@hIB^ppVrI9!_%CsBfZ)d@<4 zdJtPMLv~%na2V%cF!PnYpIK3|%u2#_i?_qNCG1Pv(yRmkJU6U|hyEReZM~*8o^Hyu z0bx>mq#JmSPs0>3aVEP|K!qnIV5z`Slo+kj59cOcF)=YUDgazZ8W_lICn z-kTYtYB6$H=m^{_f+cJqKvy{_YtLC-iqPdY$Lj>$L=P1c)<$D;OFwb zFy;_3MbJI-t;~Y7?%&5wySmm>G4Q5)4dQ3b)ThMlk+d(j zzj-q#s%(Wi;Zimu@AKguuk%?!jS+myVSh2ZrmtFkIw`vqeg(6#wfg@K)9kEfq0zS ze^S3=4oQvQ)6yj9ONVA0x!%4FfFi}eO#tz!a17m^8Q6B;d8BO;eyZ3bewusjKAzFx zeMm2;2qi_)L5w8)Gk?l%HA{|L30v35NK~rG7{=N>#nKn!>FLID-abD<`70IWxqj*7 z#FC}^tRD;&{}cI{^NQq3lJg9p12U8P41kfJ*@ryH1J89%ewPOBlHZ>3IElgU%;UKD z0hJSEcIu^JsV8q7x#Nxt{V7%I!!@*LLN!_NnL)GYntl>T{R`ssr5A(hB|ikrRA-^6 z$9&YROG)DV%*glO1})mOTRL!zb}fkuE{0Ejx$jWH3$4RnV&e`rtn$SI^d5W9S0!Y>7V|4*ef4^O!n?xc zsX_gF^?9iY$<&ApI4q2pE#{fBO?a)t$MzPnf>_zQxMW?C-0Sx&yj ziLSyWkBWDERQ-Xh++9{lr(TuyBN0gSy{J9Ejl72gQ1`exDeAloqG8B71!wTwxEbyR z44}q*0$6DDXkJSWFz>M!#5V%aDP+6(Lyd ziliW{t8v4J+bEBT`*M%5`=!@3A<0mz;$9!v{QvQE77kH`Th|v!fuYNxyF(bdQ&K{t zySuxF?(S|0De3O+Zs{7jq!GXI-uHgzPnbF9dG=m=?e(+TipQ0;hE!R8?08aq+|h4y zD`rn4YI|)p&ow)$loZ4I$A5Aj8G0P+{0F+cNvoFGSJ7wiOvI#x^}_q^RIyq8HcYF` zZy06UG=qoYUF;Mho1rLk`pnTu6-nW>kcva9K5n!2D~j-w_0L>8Edu}39?eM}j`50x z)&h;J;PJthamjZBXwLP{)~Bax<#qHkJDi7}Y>ck_DwjEVS-RTbEjCwKcuU7*)gSQ{ zI`_^6DGN}IA;cb+f3plx!AWJ$!U~;ID3*Mwfm(g&=n!|ziTb$yjAK6fi}*U~@Fg*`QgX6HgC2I&zBM??i%*CsQcuh7R+*Z1irDY?OTCH+;NtW{B$DyQ%0SIa0Fh5!Dee7U>lQ&NKR%rrcwFN zjNgu3-7s4wmr^yo(fFKZ z2nFk&ff}1rShxZLQdJ~`uWSO}H3$%_B?yAa zm#PS8q)N9kWfm_3^UiTfxd;*)fNy?!ZB}h3IDv!1|I-RuE;G=CTYJ^o?<$J&@Xcoz zcdTo z$mB{+1|Kpg4eEw9x9_K7W>?olPjU`?Us+xmGSyJ*%vPWl>1H%Qe#?G<ysBKZ0?QDykZX}~Hvhg3!H9*2?PHs$D=0v-^v7iA>t~+?umRDS z7RU>l^0gcun|jnuwgvc*8sK;MH1`D2?p>9t*i@~0R?)M^>csT5snm`gMZeNJH}!+W^g~In0dH0}W9SZX#ijHIt{(~BR4@dr!7I1C!Oua6)nz|X z`nZ{X4(AH^K>jmm$~zBvFu~5inUcw7WDl78hK`K<(eV?j2r@vmyYV}j2Mw+$v43G7 z(@w-ZF;#Ec)7txEEHJa4mfuihOY2~GcV-(*ux32iM#>TsUg3CW5^6V6P61wEW zHI#u$3kX_81s`fL$g8sx0-slkxV_ft|6-i#I8Wy%kyw@g=%|c5MwS7M6oZ{MNPepP zsF1~LnWbix%P4y9HK9%DN?drSS`ucNz#Eh@Fx*Lr3k*2e{l=ov2A?cD#11^;-QbUw zc4v=7i7so?W{^2tV^*1Gys^tYI_xQdp#=0;I4BTFfeYz%IZz!KiHON<-b>luvN0BI zH?GRkAQXw-wHFitS-9>xF}ox@TeuVBr#Rs-xq3zJ=gFFh=|c9-Frv-W`9?UAQJ-=q znvoC^Nv*7L2o#Wlj^wH#Lg}+GSvfhMBoBc4WqzgKfT;}l_NMU*uA_#gT$&S} z+AaAP;7mEZ8>6Ogik}sdOgvL38zVC+RS?RmGE7)*E%GZ=GDwGRY}jiIROP-GE{IiN zWL*6Obl4H8EMFc)NZ*EATm8q7=K|=qx%J7`x$b#U^O|Tc650F`Qh6e;l~DjQaYa{( zI@uXt`N2mPL4KBZ=G!%}#<(N;B|vL^&X)sh7nU=jZ9;5azY86uv2%+Rz( z+8$xFmC0wX`9QZ?S9%)@Qoln@sT9vGW?aA!MKpXWSsJz1P}@gnqWgA3v+>y_gaQ7WQ1J z27FW&!N}H`IL*WqZH5|O^VvwC?stFD-8~ynaP$Y%$&>2&255}h-OGj=WA!)SKVAAO z_iNp`Yr9P(&E{Q`>5?g9%BAnOdnL=G*n_ z;OGDy(!mllg^nqL=4E@kLsy|Cgdedt_J23(Od! zsfkmz(6scZy`Y>P2%7~X9Aqw4CnF!4OqeT4UU*JGm^dr=cvZx+55EF~58W2PZbUAM zQh!Wc;VHH=HYU!CiyCMA&nH%>FqxXF9!YU&WAn3IGZBe}cIh*WbjQ~{pS;Db{I{x` zHUzc9n$IO7TA0mX%w1P6M7tDdpROGdwtQTy*vdjz`fj652clx4>!jsr(hksAvog;h zAc#0n@*>776^2&!$0M~+mgYr$T>}nc$E;h1q*OCAS4nX%bom2ITJ8QUDs zOZHrIGk;w3;q~Y#rYdE5`5a<|-}K>~6}N5*0rn6kT2ASWB;}QEy0)qZCE&u_MQA z;e^`(&I{8GVazLFIK$VQ#xWRCDf+!cW&66wny@@MF~!WpvU5u_Zp7#D&snN4^z4f| z?4mZEd+xHd+7cR(l=Tag?TGRTG1FT5 zLF*)gUG8Tsdz{&$I&$1dq46T^5Go&VnV$~Ue5k4XI`N)qp@W+@Prs&3?9^QAJHzK5 z(-27*Ct8fBRM}`bi9Trzd!n3Ee{0aSqd#bT;3hzx#eTJhRy!78TroI29N0UIN9wNT zMW7LR`=P(*^w>0wgeY;=RCDRr&611<{@SrSvZ00ZYVbAORsmj0B+bW$U~|uEX~7H( zB{OrV+v}#?{HrBDsdl@gMP~vAA;?{uj8|=W3P~Ai-@nicu@rZ9vXBc^n+z~EdzH(@ zRyWL5&Qhm+C(?D&+_6F6s48Asl2VjToi-CCfEqxWzJ(OHj(YCsglijRC4wL}mF`?a zq|X1wg<4PtGYbSW>={GrPJHLC`4QBkjolR${$8r7soEK;zBC@HTWc-9GyK|X}3 zoMYOIz;{(ylpwp242fi2_H$UmlPn;3c1Br~0~IfL=QEwxhQ47EBdR!(?M}tT4nYpf z$bJkj1*+#~6M-|?G3^$#+~v!zYi~+a@ea}*G3rVd1PfW1gz$njBLFn5de8kcLiQ5| zGQk9F5mLLVw#>?4a$=+{__r)lA|GmrVR5bw{4oQS;H{e~roU*l6v2i2S+Jq1ErAp* zUeT^kqju%PM|=Ep5WTC-{&>wI8m&5G1qSmgjm|km0oL$xAK`=>E>xZB41?U<>%a@$ z2r@OU^(#p7GwS{>w5|GDc_$gxpyETLrdh}oQp;yE?q(Q0)q{};M%`|c_VFQ<*qg%7 z`OgX3HsxsK4~htC)-G-+dXQ`5GO2(3&o~JUQsWN1v~*N=Fs!{j+zlC(a>VB|>AZ zPSOYWSSNQ+L=p~6CJx`rN56>-s}RB(d*uKCHuN>3_^=#mcOmq#z2Xn$BSX=t-^N^P zMYw(jz)(UXn#!x+vuC8u)*=vK1j7`UPrjC@c6WaF$Bp4mXs()phi3f%zqp9gBW=;o zI1nSZDU0Nbd4+sU`ewKU5Bt`%5cV#51|AioZ00txLIoKtMhw3r6b!>A=AMU+0QFUJ zH<;S2c)HYmh|Y*urjQ|ybdeEtpnWehw^^r3966IMk(RvgnAN|G{Md1OlDPL)9t<

hzUzB2g_RJPv=RUqQZ7Annxu4Jzw{Szs3PpkW=UT zHWdw>*U^v7J?||+9EZx6wl08$*8A*axV88a3O-ssap~y;-=R_z<6@}M$0DAIlyoQ@ zX?3Yjnh0vs0z|VUw9agI8j_a{g4beQ4s+A4GFZ)G808lp> z)cWu-q->#2o?U!ybJ4egrK}atJaH8-@47WO+Jjt&lOa5zVQ|%iCXK}(7(J+@ov&LC zMkN2Xavwl@;Bv^q-$ea?RP1vxln(n8acL)5e$P_SsVxt#dbPGcLY57NW)aq)ezcsdENB#boba7X&2n?I2<5qrLoZ%xrcH>p!T&7}JQ;~F z>WxXV))&_id=Lzupn7!rp0K7pePSN9{B0DoOg3E)5gb6``fHVOW>EzE z)Ye#Edi7`I*Q?Qz6}moNH{05|=Bub!OP3p$4A&uk8t>J}X=t73KmR5xF>h1L&z?es zRVZ>B{O?A(9gJ5BACTiMV8OnnBDiIvPU(7Yifl5ug;7(H`K!Ebg5*)F!82!%bFjCc z$g_1tG{dMo&?Pf%4E{odtu5R3w`6fOEA8@6W{}nb79Cd)Blc0@xe*jGUR7OnghOqJ-Ump}dyTj}cBM9{v{oiMjgHKaD^hqkMoQ;^nGWFXR)u_R5 z;%>h`$D@}!A_QsR;L9SM92t1WxjxKN9ryGdSu z#p9SJCa-kY2KyCGm7)! zBXmhi9q?&vmz(RA20V_x-9yrhcGDM_ zTkUvKEq%3|jZkmI>I~G%z18y9G)>Rv>~VB7GS1mG<>h;)W>L@YV8dYCA#U`3HokrP zC~ubS69CR7xU#A$m-l#%w`Rv~WGjAyndvekBTL;rEz!jB65d>qI8R%{$`n^`IXWJ# zwU(Qv=$Sbl(SS`Cxr9|{iU37{qW+_9rkV-i_5BtE<{b;iv@QGbJONs zsL!ii(6h&X&z>ffDjK0!bmLYA{AtMXz+z--zGbH2R~k%}6gV$KdZAR!#2fVAGYz0$ zxnl()ngMvE<^vBR-1&&cAvVoiPGogQA3woTGDzWi=@BG7@^Ao~l){cplWEb||M@TT_#dLYkQHE9{21j;v2M z^dHFhZ0GHBea(hi^?Z)aM;lz!Qx*{i^?!|b#C>Y}E{Om8Ks!4b-`YIZzOt$g6HvZ! zjQ!c1A4QJw#nO=0#@fwsYwegaiqZSJiN#ZwUTBK=8|Vw$Rs3m(oz3;NKLQ^V$a)I( zU+iF#ZY3k|IqMXx<^!U?gva5(+LUTs_G7VL^(Jeb9M4e?4CC|K@4$|${b50N0y~l; z$gvC#XUtI7M8@r%Cf2J+>9mch=+x~l+SM+>st`#>i>`4F%wj5QSHT&W8U)~OVuKk15)fqW${U=u+?<6YmMf^$#@GFKcXBjTPTk zaIugXVX$VAX{mNc4cJos`wga6gtGdx|IiXl^?Y=3Z{iK)bvB6pWDq!c9F7o8CE_n) zD5_P}Q1NrEIHo>H|DyVD&5yPh*RmhWe-1mL^u;?%&`Swe_nW>t_~Ep=hS7&}?d$Ma zIR@71T*=rc63drQ7+l&@0|@prbG9x^XgRD$1F;y!mLUul1`}Cv48UDFmG3Gz%K!ic z{S@~ohU7qzM{QndG=j>UQfVI+u)&yhsQsCJ90ZD(!vY*Mi*vhjYwpkkFs zyD`*TUgV>AQN>}YBA`Y?QhocNZK{;Kl11xQ!-XqDWgyX-5RsFf*JNjKCnhFs#vvG_ z;g=|(VJmbYEha;UlaoexSiLpEw#!Q}VX|n#YPZWe$;OEcewZ9CDsOr6xRE3r-`p2h zEkxT}K{4Di6v&8tNgTFx2)o|rC&sD!{CUh=?r*+iPH1T85W9qdQ0yx9$X6Gdrf9d* zUhlK3X`Y4LlDv*%=MiqwhhLpVU(Zl?JKH(ecs&7i+qHz=vCsDBgH?!>81{uj;m6<` z;8k%>&GE4cc5~A$CI@pNHbOm_x^vT}B)Jivm{L`ylbE!xe8=Ca)E_ z$>9`G+s}116AKsI6M5M2Qw(z!>j03$iK-M>V8-xPlW@6I)rEH*LD`(GC_!&l1bNxs zR8nSKB{MFI{%qFq8N=A(hvilGhw`aOk!fHaw8hc}Yo-_O`4g4U#MWqZPMNrW$^Qxj z1_W+5ga4imMG}Xh_Hrypl`%=uVaEt%#34fRAs(W?q;z)JSdcZl8r}6E&pF(YO(Q

  • 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 delta 243561 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 z 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
    + space-card, so the two renderers agree. The compatibility + base is resolved before `iconCqw`; only the per-device and + kiosk multipliers still feed --dev-size. */} +
    ${devs.map((d) => this._renderDevice(d, view, showLqi))} ${this._renderVacuums(devs, view)} ${this._renderVacFit(view)} @@ -17811,10 +17814,14 @@ class HouseplanCard extends LitElement { const point = this._scenePoint([px, py]); const left = ((point[0] - view.x) / view.w) * 100; const top = ((point[1] - view.y) / view.h) * 100; - return html`
    { e.stopPropagation(); if (this._mode === 'view') this._openingInfo = o; }}> - +
    `; })}`; } diff --git a/src/hp-device-preview.ts b/src/hp-device-preview.ts index dbd7fbf6..70d1b8dd 100644 --- a/src/hp-device-preview.ts +++ b/src/hp-device-preview.ts @@ -351,6 +351,7 @@ class HpDevicePreview extends LitElement { pointer-events: none; container-type: inline-size; --icon-size: 54px; + --device-base-size: 48.6px; } .previewfit { position: absolute; left: 50%; top: 50%; transform-origin: center; } .previewstage .dev { left: 0; top: 0; cursor: default; } diff --git a/src/space-render.ts b/src/space-render.ts index 08fa1a3e..1dd0cbf0 100644 --- a/src/space-render.ts +++ b/src/space-render.ts @@ -38,6 +38,7 @@ import { } from './device-presentation'; import { presentationSnapshotKey } from './render-device-snapshot'; import { deviceFaceStyle, deviceThemeClass, renderDeviceFace } from './device-face'; +import { effectiveDeviceBaseSize } from './device-marker-geometry'; import { valueBadgeTitle } from './device-value-badge'; import { contentFingerprint } from './visual-continuity'; import type { VirtualLightSnapshot } from './virtual-light-state'; @@ -174,6 +175,7 @@ export function renderSpaceStatic(o: StaticRenderOpts): TemplateResult | null { const colors = fillColorsOf(o.cfg.settings); const cfgSize = o.iconSize ?? 2.5; const iconPct = cfgSize > 8 ? 2.5 : cfgSize; + const deviceBasePct = effectiveDeviceBaseSize(iconPct); const planHass = o.registry ? activeRegistryHass(o.hass, o.registry) : o.hass; const registryHass = o.registry ? fullRegistryHass(o.hass, o.registry) : o.hass; @@ -545,10 +547,10 @@ export function renderSpaceStatic(o: StaticRenderOpts): TemplateResult | null { ${''/* docs/CANVAS.md §6: the same expression as the full card. The static card has no zoom, but its frame is the CONTENT now, so a bare `iconPct` would make markers shrink relative to the plan the - tighter the frame got. `iconCqw` keeps the marker's footprint at - iconPct% of the plan's base unit, which is what it was when the - frame was the stored view_box. */} -
    ${markers}${labels}
    + tighter the frame got. `iconCqw` keeps the resolved device base + proportional to the plan's base unit, as it was when the frame + was the stored view_box. */} +
    ${markers}${labels}
    `; } diff --git a/src/styles.ts b/src/styles.ts index de598e10..35bd8520 100644 --- a/src/styles.ts +++ b/src/styles.ts @@ -10,7 +10,6 @@ export const cardStyles = css` --hp-accent: var(--primary-color, #3ea6ff); --hp-on: #ffd45c; --hp-open: #ff9f43; - --device-visual-factor: 0.9; /* design tokens (UI chrome only). The icon/plan scale math stays on --icon-size/--dev-size cqw units and never uses these. */ /* spacing scale, fact-based; stray 3/5/7/9/13/14px values are unified @@ -762,31 +761,100 @@ export const cardStyles = css` cursor: default; } .oplock { + --oplock-size: calc(var(--icon-size, 2.5cqw) * 0.62); + --oplock-core-size: calc(var(--oplock-size) / 1.26875); + --oplock-stroke-ratio: 0.01875; + --oplock-stroke-width: max(1px, calc(var(--oplock-core-size) * var(--oplock-stroke-ratio))); + --oplock-core-bg: light-dark(#fff, #252525); + --oplock-core-fg: light-dark(#252525, #fff); + --oplock-shell-stroke: light-dark(#BCBCBC, rgb(37 37 37 / 75%)); + --oplock-shell-shadow: + 0 calc(var(--oplock-core-size) * .025) calc(var(--oplock-core-size) * .05) rgb(37 40 45 / 12%), + 0 calc(var(--oplock-core-size) * .1) calc(var(--oplock-core-size) * .175) + calc(var(--oplock-core-size) * -.025) rgb(37 40 45 / 18%); + --oplock-core-shadow: 0 0 0 0 transparent; pointer-events: none; /* inert while editing; clickable in View (rule below) */ position: absolute; transform: translate(-50%, -50%); - width: calc(var(--icon-size, 2.5cqw) * 0.62); - height: calc(var(--icon-size, 2.5cqw) * 0.62); - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - background: var(--hp-bg); - border: 1px solid var(--hp-line); + width: var(--oplock-size); + height: var(--oplock-size); + display: grid; + place-items: center; + border: 0; + background: transparent; z-index: 1; } + .oplock.theme-light { + --oplock-core-bg: #fff; + --oplock-core-fg: #252525; + --oplock-shell-stroke: #BCBCBC; + } + .oplock.theme-dark { + --oplock-core-bg: #252525; + --oplock-core-fg: #fff; + --oplock-shell-stroke: rgb(37 37 37 / 75%); + --oplock-core-shadow: + inset 0 calc(var(--oplock-core-size) * .0125) + calc(var(--oplock-core-size) * .0125) rgb(255 255 255 / 70%); + } .stage.mode-view .oplock { pointer-events: auto; cursor: pointer; } + .oplock-shell { + box-sizing: border-box; + width: 100%; + height: 100%; + border: var(--oplock-stroke-width) solid var(--oplock-shell-stroke); + border-radius: 50%; + background: transparent; + box-shadow: var(--oplock-shell-shadow); + display: grid; + place-items: center; + pointer-events: none; + backdrop-filter: none; + } + .oplock-core { + width: var(--oplock-core-size); + height: var(--oplock-core-size); + border-radius: 50%; + background: var(--oplock-core-bg); + color: var(--oplock-core-fg); + box-shadow: var(--oplock-core-shadow); + display: grid; + place-items: center; + pointer-events: none; + } .oplock ha-icon { - --mdc-icon-size: calc(var(--icon-size, 2.5cqw) * 0.4); + --mdc-icon-size: calc(var(--oplock-core-size) * 0.55); display: flex; line-height: 0; } - .oplock.locked { color: #66d17a; border-color: #66d17a; } - .oplock.unlocked { color: var(--hp-open); border-color: var(--hp-open); } - .oplock.unknown { color: var(--hp-muted); } + .oplock.locked { + --oplock-core-bg: light-dark(#000, #252525); + --oplock-core-fg: #fff; + --oplock-shell-stroke: light-dark(#000, #252525); + } + .oplock.theme-light.locked { + --oplock-core-bg: #000; + --oplock-shell-stroke: #000; + } + .oplock.theme-dark.locked { + --oplock-core-bg: #252525; + --oplock-shell-stroke: #252525; + --oplock-stroke-ratio: .025; + } + .oplock.unlocked { + --oplock-core-bg: #F0A00C; + --oplock-core-fg: light-dark(#fff, #252525); + --oplock-shell-stroke: #F0A00C; + } + .oplock.theme-light.unlocked { --oplock-core-fg: #fff; } + .oplock.theme-dark.unlocked { + --oplock-core-fg: #252525; + --oplock-stroke-ratio: .025; + } + .oplock.unknown { --oplock-core-fg: var(--hp-muted); } .btn.lockact { width: 100%; justify-content: center; @@ -1881,15 +1949,14 @@ export const cardStyles = css` } .dev { position: absolute; - /* per-device multiplier on top of the card-wide icon size */ - --dev-size: calc( - var(--icon-size, 2.5cqw) * var(--dev-scale, 1) * var(--device-visual-factor, 0.9) - ); + /* The surface resolves compatibility icon_size units once. The shared + face receives an effective base and only applies the per-device size. */ + --dev-size: calc(var(--device-base-size, 2.25cqw) * var(--dev-scale, 1)); /* 101.5/80 is the package shell/core ratio, including its stroke. */ --device-shell-size: calc(var(--dev-size) * 1.26875); + --device-shell-inset: calc(var(--dev-size) * 0.134375); --device-shell-stroke-ratio: 0.01875; --device-shell-border-width: max(1px, calc(var(--dev-size) * var(--device-shell-stroke-ratio))); - --device-shell-pad: max(0px, calc(var(--dev-size) * 0.134375 - var(--device-shell-border-width))); --device-core-bg: var(--card-background-color, #fff); --device-core-fg: var(--primary-text-color, #252525); --device-core-bg: light-dark(#fff, #252525); @@ -1953,6 +2020,7 @@ export const cardStyles = css` transform: translate(-50%, -50%); border-radius: 50%; pointer-events: auto; + z-index: 3; } .device-shell { position: absolute; @@ -1960,43 +2028,59 @@ export const cardStyles = css` display: flex; align-items: center; gap: calc(var(--dev-size) * 0.1); - padding: var(--device-shell-pad); - min-width: var(--device-shell-size); - min-height: var(--device-shell-size); + padding: 0; + min-width: var(--dev-size); + min-height: var(--dev-size); + border: 0; + background: transparent; + box-shadow: none; + transition: opacity .2s; + pointer-events: none; + } + .device-shell-frame { + position: absolute; + z-index: 0; + box-sizing: border-box; + inset: calc(var(--device-shell-inset) / -1); border: var(--device-shell-border-width) solid var(--device-shell-stroke); - border-radius: calc(var(--device-shell-size) / 2); + /* A saturating radius is resolved from the final border box. Using a + second fractional length here lets border-box and radius quantise on + different sides of a device pixel at some zoom/DPR combinations. */ + border-radius: 9999px; background: transparent; box-shadow: var(--device-shell-shadow); transition: border-color .15s, box-shadow .15s, opacity .2s; - pointer-events: none; + pointer-events: auto; /* Normative production fallback: never add a per-marker backdrop blur. */ backdrop-filter: none; } .device-shell:not(.with-values) { - left: 50%; - top: 50%; - transform: translate(-50%, -50%); + left: 0; + top: 0; + } + .device-shell:not(.with-values) .device-shell-frame { + border-radius: 50%; } .device-shell.with-values.pos-right { - left: calc(50% - var(--device-shell-size) / 2); + left: 0; top: 50%; transform: translateY(-50%); } .device-shell.with-values.pos-left { - right: calc(50% - var(--device-shell-size) / 2); + right: 0; top: 50%; transform: translateY(-50%); flex-direction: row-reverse; } .device-shell.with-values.pos-bottom { left: 50%; - top: calc(50% - var(--device-shell-size) / 2); + top: 0; transform: translateX(-50%); flex-direction: column; } .device-shell.with-values.pos-top { left: 50%; - bottom: calc(50% - var(--device-shell-size) / 2); + bottom: 0; transform: translateX(-50%); flex-direction: column-reverse; } @@ -2018,6 +2102,7 @@ export const cardStyles = css` 0 0 0 var(--device-ring-width) var(--device-ring-color); line-height: 0; transition: background .15s, color .15s, box-shadow .15s, opacity .2s; + pointer-events: none; } .device-sections { display: flex; @@ -2026,6 +2111,7 @@ export const cardStyles = css` justify-content: center; gap: calc(var(--dev-size) * .08); min-width: 0; + pointer-events: none; } .device-shell.pos-top .device-sections, .device-shell.pos-bottom .device-sections { @@ -2036,7 +2122,7 @@ export const cardStyles = css` scale the GLYPH with its badge. Pinned to the base size, "make this icon bigger" grew an empty box around a default-size glyph (user report via the owner, 2026-07-29). */ - --mdc-icon-size: calc(var(--dev-size, var(--icon-size, 2.5cqw)) * 0.5); + --mdc-icon-size: calc(var(--dev-size, var(--device-base-size, 2.25cqw)) * 0.55); display: flex; align-items: center; justify-content: center; @@ -2150,7 +2236,7 @@ export const cardStyles = css` .drawwall.invalid .rangehint { color: var(--error-color, #db4437); opacity: 1; } .stage.markup.tool-partition, .stage.markup.tool-column { cursor: crosshair; } - .dev.virtual .device-shell { + .dev.virtual .device-shell-frame { border-style: dashed; } /* "hide from plan" flag, shown only in the device editor with the @@ -2162,7 +2248,7 @@ export const cardStyles = css` opacity: 0.6; color: var(--hp-accent); } - .dev.ghost .device-shell { + .dev.ghost .device-shell-frame { border-style: dashed; border-color: var(--hp-accent); box-shadow: none; @@ -2178,7 +2264,7 @@ export const cardStyles = css` opacity: 0.62; color: var(--secondary-text-color, #9aa0aa); } - .dev.ghost.ha-disabled .device-shell { + .dev.ghost.ha-disabled .device-shell-frame { border-color: var(--secondary-text-color, #9aa0aa); } .dev.ghost.ha-disabled .device-core { @@ -2565,9 +2651,7 @@ export const cardStyles = css` position: absolute; /* the base badge, but round and 20% smaller — the owner's wording: «иконка похожа на иконку базы, только круглая и чуть меньше» */ - --puck-size: calc( - var(--icon-size, 2.5cqw) * var(--device-visual-factor, 0.9) * 0.8 - ); + --puck-size: calc(var(--device-base-size, 2.25cqw) * 0.8); width: var(--puck-size); height: var(--puck-size); border-radius: 50%; diff --git a/test/device-face.test.mjs b/test/device-face.test.mjs index a2c8a578..469922bf 100644 --- a/test/device-face.test.mjs +++ b/test/device-face.test.mjs @@ -102,6 +102,7 @@ test('Text and Double use one shared shell and deterministic full-text fitting', : Array.isArray(value) ? value.map(flatten).join('') : String(value ?? ''); const markup = flatten(root); assert.match(markup, /device-shell/); + assert.match(markup, /device-shell-frame/); assert.match(markup, /device-core/); assert.match(markup, /device-sections/); assert.match(markup, /band-/); diff --git a/test/device-marker-geometry.test.mjs b/test/device-marker-geometry.test.mjs new file mode 100644 index 00000000..d4604ed7 --- /dev/null +++ b/test/device-marker-geometry.test.mjs @@ -0,0 +1,16 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + DEFAULT_DEVICE_BASE_SIZE, + DEVICE_PREVIEW_BASE_PX, + effectiveDeviceBaseSize, +} from '../test-build/device-marker-geometry.js'; + +test('issue 213 resolves compatibility size units once at the surface boundary', () => { + assert.equal(DEFAULT_DEVICE_BASE_SIZE, 2.25); + assert.equal(DEVICE_PREVIEW_BASE_PX, 48.6); + assert.equal(effectiveDeviceBaseSize(2.5), 2.25); + assert.equal(effectiveDeviceBaseSize(4), 3.6); + assert.equal(effectiveDeviceBaseSize(5) / effectiveDeviceBaseSize(2.5), 2); + assert.equal(effectiveDeviceBaseSize(Number.NaN), 2.25); +}); diff --git a/test/device-marker-polish-contract.test.mjs b/test/device-marker-polish-contract.test.mjs index f453616b..a87adb88 100644 --- a/test/device-marker-polish-contract.test.mjs +++ b/test/device-marker-polish-contract.test.mjs @@ -4,18 +4,40 @@ import { readFileSync } from 'node:fs'; const source = (name) => readFileSync(new URL(`../src/${name}`, import.meta.url), 'utf8'); -test('issue 212 applies one visual 0.9 factor without shrinking the hit target', () => { +test('issue 213 resolves the effective base before the face without a late visual factor', () => { const styles = source('styles.ts'); - assert.match(styles, /--device-visual-factor:\s*0\.9\s*;/); + assert.doesNotMatch(styles, /--device-visual-factor/); assert.match( styles, - /--dev-size:\s*calc\([^;]*var\(--device-visual-factor,\s*0\.9\)[^;]*\);/, + /--dev-size:\s*calc\(\s*var\(--device-base-size,\s*2\.25cqw\)\s*\*\s*var\(--dev-scale,\s*1\)\s*\)/, ); assert.match(styles, /width:\s*max\(44px,\s*var\(--device-shell-size\)\)/); assert.match( styles, - /--puck-size:\s*calc\([^;]*var\(--device-visual-factor,\s*0\.9\)[^;]*\);/, + /--puck-size:\s*calc\(\s*var\(--device-base-size,\s*2\.25cqw\)\s*\*\s*0\.8\s*\)/, ); + assert.match(styles, /--mdc-icon-size:\s*calc\([^;]*var\(--dev-size[^;]*\*\s*0\.55\)/); +}); + +test('issue 213 gives the visual shell a shared-centre frame that owns capsule input', () => { + const styles = source('styles.ts'); + const face = source('device-face.ts'); + assert.match(face, /class="device-shell-frame"/); + assert.match(styles, /\.device-shell-frame\s*\{[\s\S]*inset:\s*calc\(var\(--device-shell-inset\)\s*\/\s*-1\)/); + assert.match(styles, /\.device-shell-frame\s*\{[\s\S]*pointer-events:\s*auto/); + assert.match(styles, /\.device-shell\s*\{[\s\S]*padding:\s*0/); +}); + +test('issue 213 projects opening locks through the compact package layers', () => { + const styles = source('styles.ts'); + const card = source('houseplan-card.ts'); + assert.match(styles, /--oplock-size:\s*calc\(var\(--icon-size,\s*2\.5cqw\)\s*\*\s*0\.62\)/); + assert.match(styles, /--oplock-core-size:\s*calc\(var\(--oplock-size\)\s*\/\s*1\.26875\)/); + assert.match(styles, /\.oplock ha-icon\s*\{[\s\S]*--mdc-icon-size:[^;]*\*\s*0\.55/); + assert.match(styles, /\.oplock\.unlocked\s*\{[\s\S]*--oplock-core-bg:\s*#F0A00C/); + assert.doesNotMatch(styles, /\.oplock\.locked\s*\{[^}]*#66d17a/i); + assert.match(card, /class="oplock \$\{deviceThemeClass\(this\._renderPlanHass\)\}/); + assert.match(card, /class="oplock-shell"[\s\S]*class="oplock-core"/); }); test('issue 212 Text value uses a stadium radius based on height', () => { diff --git a/test/device-presentation.test.mjs b/test/device-presentation.test.mjs index 91d5a912..e9548f66 100644 --- a/test/device-presentation.test.mjs +++ b/test/device-presentation.test.mjs @@ -51,13 +51,14 @@ const options = { showSignal: true, }; -test('marker LQI is categorical without changing the room-fill gradient', () => { +test('marker LQI keeps semantic bands while its colour uses the continuous gradient', () => { assert.deepEqual([0, 40, 41, 179, 180].map(markerLqiBand), [ 'low', 'low', 'mid', 'mid', 'high', ]); - assert.deepEqual([40, 41, 179, 180].map(markerLqiColor), [ - '#F0410C', '#F0A00C', '#F0A00C', '#1DC21D', - ]); + for (const lqi of [0, 40, 41, 110, 179, 180, 255]) { + assert.equal(markerLqiColor(lqi), lqiColor(lqi)); + } + assert.notEqual(markerLqiColor(41), markerLqiColor(42)); assert.equal(lqiColor(110), 'hsl(60, 85%, 55%)'); }); diff --git a/tsconfig.test.json b/tsconfig.test.json index 86535870..e88fe64d 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -8,7 +8,7 @@ "resolveJsonModule": true }, "include": [ - "src/color.ts", "src/logic.ts", "src/glow-blend.ts", "src/device-visual.ts", "src/device-pulse.ts", "src/device-presentation.ts", + "src/color.ts", "src/logic.ts", "src/glow-blend.ts", "src/device-visual.ts", "src/device-pulse.ts", "src/device-presentation.ts", "src/device-marker-geometry.ts", "src/device-face.ts", "src/device-toggle.ts", "src/marker-toggle-entity.ts", "src/activity-runtime.ts", "src/ha-binding-status.ts", "src/integration-provider.ts", "src/vacuum.ts",

    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�nXUvq3adZ2`a#OdqX5s2PO)LyJTe~G=zyfK|e#k4E zmei@Vq|CT_q{HkViSLu>84-uvE~JDRDUo@ZvTlv@gSPlZ%_-c|LEPAumX;=|Lj!$~V}x{=y=pGts=sB5ImCY+y?isI=`=YF^z$C@8yup6V1@=RKX+W->XT&reE$z zxM_nGZ)BK6g$Po?TD<3n6|EyU6}sYs_a1Fe=0nI|BC# zqHqYb9ia@kOue3J9K63j_>uO-wRSy}(vy%H4=N_~lsjFff4 zjwx$u`j$$^>2n0t{(b{;+E-)!xg9HYj-s{a?(pn^4PsE3&SCs0FnRrxx{`E4Ra}}1 zpQV4dU6VR)1sR;NJu7fyuV>(U{CvELlrKt95-dAG>M$kF3C%H?Hx4?HsXx11f0u4t zPmLT+F~iq0^?f;tC;FOW8G~v#oOrpOI)V3>JBqJA;kn>TPT3TQwt$DobFZ8HSiH69 z973~-Ux%t3)vUto@_%#+r~hThP=QuhU%%}-@~q$1Q0#wxLs##=)&{;G95bkxZRz-+ zKok?@Kpdzf9<@xfel9bn_mI4j=w+{X2doGJOcm z?7fF&3$ktO+c*Jj-Z*!NdHm~Z8_8X0;NiY4+OXY-_{{8@Mmi*P{aG2otP5s8nLfHh z09&q4VcXF7UEu)oG`8 z7C|dpy|$SXyzQKA$NEM2#s#h-PHIBF<<%g%>9sVIAdVr#MR8y4{9;3{L*JP^o`Nc| zGHlBD!lbYXb1+Iek`4u~M4SiP#rSw*=WRu3;OXMOFwLg4k=wy_QAt$(*&|VALlFn^ z;4fUKF7P7k246DOF+6C z`Hs)?yz65v{$VZF%$zglzW3hOb^Y$wH%Fp3hj!MI9w&%62W-$+g2_wh7f4TT9WL2o^Io~ZiO)zj2TYMOK(kXs7o9%?z;BW)^kVaZfh?hj~%btnmHKm5|r=AH#Z&h;%3*g5yk_= z?}PHa;UawPm^oTSf&co{;Np0$k#x^JDm2|4ih7J(%M`)CbY9oZ8%PIJCYUDZAeZkM z*TW$~NxX!sIZ{(p7DCQZTnAML+^T~I6_9uzgojm%<)SQy24A;DpM zQj|z;Bm(amnW^6lvB40G`w(RPP|HcsPlZp{>aM%FF2t^TA&t8iy;~Z{5o&k7Luc!{ z56h~v|1;qL2NcmE(m+4_-pP!;ko^6)=`-r3?LRYy13L_Lq@Vjiw8E|1iI&hR6Fcdv zD`^s3we}8>lF`T)9Ds9NEU16~-$X#!b>h7bs=r)c{uVx8=v`AV?Bt$2; zl1Wh!xRzlD&FMG&^3(RhscRi+__Vg-<2iC$=`FqiP<{VEN8EMHnnqnmwW%wQC;o5o zMf|fwef1ISre#s%MGYr{ttc%~Ff-YcqJaE@hG_VaQRrD9(NJPY3DjeXS57wcOo9C3 ztf>dcj5cVMq@6PDf((78QYLXjfWHk9a~IO3X2upwL1G=}{#jk4<1pRnajntO!$9HZClU zP!_TaFbg6UBf1lgvo)&1ZTp}>a(HYp)RaEfkw#EtmG{;D8(7IkmPOZ~w84Ey^X1D^ zeG8_cNV5B%s}iQDoRwI!#rc$8tmYyyg&aY&CKe? zj2riQHi^y5)?t+WRwW_i*-cw5B-SdQh_?24FV0NEJk6BJK@fqQvT@5<0(cb!`kwqH ztfB%LZ($<#RZFqLKYtd(`#@P-@Hw1OE54{xfoUR3u?pj}Y(T0TSFcC^bXHAR(N@y} zEn=>8C=v6D;KW6Sv!=R+0=ZTi@yMqZmzlV<*qb6cg`%$kE>pOmA5Y5?rHLjZUfnUgLAyR7>b-E-I9?6Mz(5i9X}v2BxJ`XvK;(IOn4ZeXi1->x@_%wa zZbt0I*T|;&h^Kgp1Y*(@kPwzCIWHR2gnEc5boe||S^tZG0M<`?KKvtHl$=^iZ-)r#7Vb^eEouUtzNEVplEeS=9aF6`hk}R-I3}hj~ zA*#IHLfu{#OzKk!8FD0_%U8Y}j<6^}RffeG1sdVvk2;c~{oe&kjb;L_AJUS3M82?- zGjYoUJ*5QJQ&DhSiJM?yt%4PKfoT{_0&$BYQ=mxA^)aJ&qgg*FpDuu>Y?60+k0Y-e zB9*s;&xMB>a6hb;g58&=;VN#AL_oCg{bWHzi;VSi$&Uxx01OVR8?V6Iz}kB2BAgStt<3n&5PT^Gu)s!a2{H% zlyvcrS+@siks;Y10oYYeB^&VN(i2M=qW11GLJ0gg*TiKaH3#E;~|(-yAgRG z#-AF#aR|C8wl$C5GkFPAe8BeKar)?zawT3-vq;;T6$}M-0nhajfGsCZE-&RRST)2xhAkd2%ENXaH^@nK1EY&_Yi&C1L90JpDB`+uaJXQJXfB(ZH zblQv@U%&OuGM8nR&80t1cB)c`&kXB($fxZkmtatIvMd7|q&}YlIl2p`fr>@-8JZ3U zMN~~$OFA=*@~I}hv2}w`uNpNyL4NV7O^Y>K<(UQMsQ$GW|MFoWGpjhxxI51;9e%EDQ}49MgE{CZB16DuTE~m0yh$@ZWQ+r% zZzCeDtZ4UZz81nwo2FCOUn3Gh>rZ~nZU=v!`tY|`f56H6Qg`}LrTR4A?1!Qtp1`XU zLHjO{oclH_mTu=mdaN`r<7jQ$%5S)588IJ?g;}4~EuHRnEQYty$OT=a1F7((k2n7{ z=7PiQdjH_Wx7CrBpBl&@JzG27e8;{jis9S@ETga^YivtgG_3j*{}paRZ^X{FGxIOO2C%{b++ z7eykbrJ2nR0iPI42Y*;Kky+B#e`sNwPy!^bh^k>tH${3$nL|jjM053>0k0@NRggt;o(Rs zi!ghqzZ%FXmO~}^?1iXz&1exlWnA%e@GfE3LbEp=;^#J+%9`Rb zYB$po?a&d3O3G=TfSvA|=9HfM(6zn=$;F$uJoUuA^cPM$L<$L2Ya2?K$ZwJGLLb#! zM`aEJfFH~z z?+^jq2qsWuXt9>w2~JGXfAnMqj~cbbt@-Lw;*a!hK>la)6}AIT*>&aN*8%8~&* zBv75JzX|~Y7|t7YpCJri{=4=#dB0!)Wfgzg*F_R`#tMZJw5|_QN3?x|OkQJ*&;1h( z*7w2_f#tRT>cH0TlXV5>rMfFQB(TcnKfb^SJm75M;)5`HI_Ayx8hR4qI!s+wPT8rq z8I`BbOXTG8z3CRVa^-ur6jqiM^p=v1QIm6(|M_OrL@|if(&Jju`2?LlZyaqvpG0|5 z-a@ISSz109oDG_^*4X=6VqzDm$O2i18Qjmn$$zfJo&UlutikdNn~98N0WWP%f_E-H zZpL|T5D1uxP|Gv9@D(eYKQd@>_VGb3mbE{eNd@9Q_06|LjaD#>LbEE_q*O|Nszp?- zHhJtqG6n3iGBYFbDZfp;HO`R<TVby53b94gHTmPjA@AF8SAu8+FwcI! zQFZ04XJA0QX(pzwWy2}8K@2p<&OH#H8MJHU(8Zco=c9a?%F2PrDBaf-Em+o=9rMpD z|HCM&#lJN<-%8q{Hm+>SDX)n&xIzZi^1E>1oLeM6=Vx>F9*xwHSD03?qpAqxe49S& z3#b2VbmFPW9EeQN0q*y8<5zw|&E0AY?fFX$ZX^AF+-l<3ZkpYbi5GZDtWraSBGksk z+KXLg1`o`uzKSP+vY4i13{p~uhol&O-{DU?Cae)4OVUs={t449^a1I5Nj9G^I!cC) z4#|Vj$yfa8c(9};d+Bz!d>6WL9jzERtqQVIMyHZ7yz>_qkWI)la_K3_@ zgQv-xWHA`8Kc#%(6gt|toQSo*b|g`Ecnj|{U&d`a61?DW&JRa|S7E>tLECXnnoYuM zh47FRiYm5l-=W>l<3r4!ZR53IRH$#M@(@Zl=?2nmRLC)2!j4}Si0evc#@YZ$4ogf@ z;BddC1qY~n29@V)3XRu4w81RLowy~f>#u7=W!8%*-G%_AmXCk2;VtbkT|z>MtB8g_%%Si^czbsy7q!zlLOv%MHBIc)%lFxpY%v=;uM8eNJ zje&Tlp9h9bWB#cI_V~F!!F=1WbuClk3BMt%0IqlS#dUFc@&tT1P6Pye@eJk-TeGG( z@!R!An>oTX5gH*wm}5xxJGQNg4EXsPJIFwKOYJNU9%^9yFT?^SmFoPezd1CJYu&8| zrC-{h-ENE~efcz)n~EB~q{93fA0023+5vA8&el5;`gfu?6Yo3c?-Mb;tEqr|wgo^R zRNz)44`i!sH=|p+L`E1^A=4fnR_qy+WT>8M&XD@5=4UDMzP^Wy6`Ve(^JjDb@iJQ) zg`~j_I|>%i&J}eVr>dsL4q2XvSQ(XpGGw7!yopR8@y_G(uqC)L3j1A32y)~k@2)ld zxk~)i|6sp1xReo;X3EPqqZGKNmGoNp%A=mY5-uq$l0wXz&JK_Gonlz5#2e)eI(!AiN}Tx; zXO;F9&qPqWf9@r`)G_LPl4Kb_^aWQ?)lB}sF2{uErL^dbX!yP)FStxI@>~K>G8L09 ziGNl#L)<7W_-+2)k;UT)WrRW#jubvoIVK!$QNV`$4FqVg@A;ynW-6k(@5xT{EcYgd zF^%rtmZ4Vql1EEj?6YyHvO!ybVT6J3TQbhUhV>7rVj<-aq!IQ>0i+?^O}h9pX{4FF zoh|yV+(eia@kcZ);_eanUfh3oKc|czGj3;}g1F3Nn^{q&(1iBDJ{Bu;%?SV3Zd18w zPuk#EW0F}B>NOq+>K&E9oyv@te)8S3wv2H7vX__->VrCCm7;Hm&?UVEfyo)Z{MY(V z&W54I+roQRa(I;55PR%jxd)O8c8#cd;C7qUYS737HUJ|X4FgGmcRXLO`cb*_H&T;_ z+_;{bpWCjw%a_JNz*djxz)>H6MW4+~jF8QGmsan}f6M)L$-Up+><+ZemFMi-EY`o9 zF?fV7TL98um4W}Bn}a98qyKsM%KM>a5?#-`nDXE|jJh$kpWH8q&U=pspqEd=alra4 zMb5rNc&rvy7bLp3?QZ|&hxs0ELx9~tM+wl1m`|uGa{0{`!TR&!RHjzyF5so5L!T>Q zAdteRL4Da^qHL@EU-|_!Y~q(|}VblW?(_;I1YUZJF0qtxCN`h*sgd~7#9v>QLh;^haoxf-WIg!6Y!kEDz^!8C*( z<9E9rLPymr?g!x}1Knmw=@91mwOiI(TtXp!5r4pP)olL+vVA;m>_D65feulkx7!ZP z&39ayO|qotW(J9hw>qEy2=Jgreutt%`)+m!!{Bk63;G8`26z;EQ0m`1=RFrcT2ZZQ5^N0a`KlZuPcf%r~i^y~8z zq2ud|2{Kz6DzcIT0gz%QRPVSEyOLhFHZFvq6xqHpdvMYSq>G02{Z;D`6L6%V89M`3 zi##>?IWDv5+TS3cP|>!q5160|U35W+&X?_EM}*T=U@ZuX8ymp0 zZlD@Wgyp~Owv5vlz?**IU0DVBFbV0{R?`|U*vf)gW%0xaNLztOvB2zY_oD*?U%x)D zEUi7aKR=-C>bgO<#!l{vQ&-Oamg_&2pFZr|`2MY6^WXQ${ri-;dbh?#V54I8Rs_4< zT2Z9tVZdVr?a8gSqtrwi2YO*+fS~-!8vXC9srrX0Y0=A$n;b#^#~p!oGG4UnU`pED zcEv-yor|*hHtYm3aNNh=a_J7iIQ4x<3!dAP@Kil0qAxad7@d&H)aMGLs{JT3H*_Uu zu?}UM*w*(c(;;9DdL}CRD&n|kUJoZi!8r+)oQakM-iWKlR3dVVc?a5eyTvROI~O01 zQ;d6UY$6Re?+*P66n|YAfp`z9_-V1NycbU9!kJ;s0e6CUh0bZup6t^0($tP&R~TNU zVWX*8o*<~P7xK>56yvFBb{3^Ue!ffADupKgHE+s-3fueoME=c5nIhtaoN6H_U1e5D z?HIvXWi7)<-a}rf*ITUg758E;tPmvkB)DdaVu3s(NcSC9`k%VQuJEN|@t5R`1X#@z zZ`BUTGWiSD05>s0&54|&%Jj_M!99md#WAyPArM#HMcqW z@fmZDLrV<7%}I{kw9@ER>zw3O%+g-MXOf`h&$fw<7F2sIGH&@+>_4cd(Eqqnu^ed4 zq&Yw(_Je%#Cip2?Y^v~zr{JKLC_1&sV5!t;RF9v^M+4yD5P>XQ{d_R+ME;{UJko9AJUpEbxUb3R8EZ*`3se} zMS4e^gl`m5;3I{P&Q|AeWqhU|VST9DqvfxXq~<7^phEtJ3*Nh?B?VE*V*Hf$Xc@4Y)vJ`5< z<5Z0_)_Xeqo@q5LDMWd2LTe)K8>qCNaqr3x$)Bs@EO^|$=V=@t!V9*&IzjzFKm5}M zCMmUxd@Uy-lQk?;$mPWtGHfrkOYSi_d5`MF^j~3Vzn8vK~e1o;t(}; z(ZB3GjvpC7ug0o7@1h-cf*8f^)mc|Jf~XNC%VhMc=bOi~a#rJ_s&quDX2lBhgR&Ii zf1m)`pdk1rIOfBu@3Vc7Xd&b?+CwZo`|vRCd$u=whQ#zNsI|^D0$kW&1EKtv!$TvHuvklz)=VtnC+nZ`q z{k4QSi(v9u=b;~850cF|X|O&EQBz?Vh0WxBo%k!;g_tkS<;lmt|10R@R9F4c1sNum zjAZRBGQ$hZTUxO$*&3C}A6}NdF{wN}+*ExT@vwY$3Vo4uYnW`vB(wndX5g_MO{s&n zvA0BeMCt=nr^PDRRdrKl_b8_@Wxd>-4zn3bKAWA^|oxGDYl^d;oeTA zjtK=0^#V@2`@ikBfac?2`^iV}Jud|VBN=z#ZwKp|LEq)P33(AC+0(BCaIFNHF8weG z#L=*}R929fjLf_C{Gf&_V8MHTHrqi;7cw6g&+}^cWyVWAu;xLqHP4v}->71bgr3Qr z6`>|FmOhlibREQ~EJ>4XXJ{#m9fv%=M}L$}C`1$25y*qoPEb%NF8#u^2+qQ0W2pt& z79cWWHMs;y&;{LlGxQ`+uMd9bMX$pPrGXFzZbq4w7#HvjOnG)$zN0OlRO8`ABjzo1 zIki0-A>5a@Pw%c3gZ(l`CO5;dOMg+bJC(*R#SHC22BknIl`%a4^|hkv-PU6>!$Zi_ z;^;=b4(E4_hSZY2&5_nl0e0Oje`NxQ2hp=w~esxSs?Z zg)QSMBo)D$CYfb>6=>f(qAGs-v~`W-eSyN-yO(cZ^1Hu2+KW~kggDt2Y|5mO&_~m);Qmy^g^OD^$`ho4Sb{CYnc56O}B6LF=dYW>& z@ulg5`}Q~LP+$y*Cq1n3BAi+KXNuVuY7G2e#H%qTKD>plq&S2?E^{l{X^^~}$Zu!L z$}($M(95}@IzKZzw|ed&c4S729{T@13RyK*6@b@QvChKHd8PVsqWUjTGkc7y3v}#7 zpP>De`_rH!`uIq50zDOWxc@Q#_rB5KmsXbK2*Tc#_msTBnIiPr16}emKh?nFNM1kV zJ4B1_1&`N7<|^h(2eWAae4!;Yz2=N)`>?gLldC)URm#vop*a;_6cHclkkAIcGc012 zn`!(iGin~~nY*=w=cZ^)QVdk-PW5sqex~GZf7pcDw8}rU*i6*;tA2e8Qt9Fb_{HaA z6z$Jr9WM5C~=kp-Ih^OgF-JiMRY; zFu{?9uYPpQ75VpxHesMKsjW0j4DoAx6xu z`W0X}?Ap~_=MsNRU>{G=_VFXxW=^6O$V>^3zT;W{Ywdk7BbhUKPrU6DkL$&mp6H!` zV1t0)dil-r^{$I_&Z@`rkxip+(?%AX{_VX7^r#x@aMQjfIf4$i5O7`g+bn>>6p;4Z zRDmiX*bxtkKTh`ga6m@HMW!U1!&BdTL>2?xm@X;JMm&u!=cBqah0sq?mWAUp)WXcQ zjCD>3bx%p*$h`FHrD)7q-!_urV{ZS9Y0{>y+uuI ztnU(R*Af`I;t*vGA@Va}`aj{XY{OombqE6hHf-t7D{#G%NY;^K| zdVDknXd0p4sao#MrXse}pA2mMNm6fBj6cJnCd$^#KE<4k=LN2G>w zzs7POBqp|yVT4x+_4tDl;6{_{pRSW4jyDF}Ta^-w#Jb;uXiX!)!6A&HqpIO-a{3gf zM|BrdKY&I_-V7B?jYWvlY)u}#+C`ge#W+}}gHjaVRNJlwYhp*jqK-(O8^LuFCyL;P zdd-JC&~*)E+<={g5$3B|5|f##dZ62Y-vle+s{6%%AEa$e%O@l8Vsaj99Kvy%iP- zDnqC1-cJAh*ni^*SpPY~NMoY!mZW3bz{hVvmJH0LD!8j3(iYyeQ7zI>@{0H@r87{w zg{wLo_JzF<`eK(DE~lcyxGFR z=W(b#!8vKrsWz_7ULE?zyAw${DvZ~NmkC?NNEV-Qy)-W%hzpN+5+dP79b)hys*pr_ z+b;1vgxxsI^mtW*65TRP)#x{eq%*+}8E-5@#!eHHYp_z5)Qfb05LR%45H1jfIB?Mu zps7#q(&QGo(*EZ|HfeqU-NHyBBcCbpZqDpLxEit)z9_XVH#wBFFS17@`geDj#6Kn! zte=IB@^w$chz<^H{Y?n208MOXE0ziw%#j!};gU6Qi(QzCPDjs%F`#mm1cG!#R_}V+ zQw;!S@%}DWp^8fq1(Sem%qzEe{@SGaK+A8;7U$&LD%_(Vd$?@Afq40nX1-7pEwr8d z5Vsups_aT)0Cm(KfPeLCC>0ucXDMUD;3MfoE&&d5%ZWU|l^x#1{3OdV@Rnwrn;Ja& zN8h;7&iEacP>NWV+{QhXDGMeUpt&`3HAf&{gN?~I<1CCKkTSIUxCgo4_$L5*c}g$u zsl*V=QsE0dJ;9y(=-2X6eeQN6+|f;3cWS?mgxJ;Dp{DDl_{V}JrUR`ebcsW}r3>tY zMMf&*=IO~qBa@e;ElMR;%w(Ho($oVGGu=PuF^guC?*HQmf!CwxmbnD77=qQwUO^m9kzVn~HUAl|A;p;wuqnjU#$=3vB!uVc8#bkeNM<d`~!l0FPEB zK%Qa}oA?haO0Zo_ifJa$OgSY-@#n{BHsGkH=8~B|s2Gya1ZOwP-=QTlu$d#*#nTZt zz3#u#uGYAZ(opu926UvJ@1_@F&NFd(<>->q+h`Y4VnO4Mzh}gThhG;Mhbf4Xvt;MH zm_WVzJp%7?s~nCv8b=bps=!_uTop|!1(Ql$q(zJUpB4wd^W=7l3j4{h@q^{e@U=eJ zXiF2iBTr4b29Hz5zs5)~Bju;T$rsF^>)*(FHCVV8fwbh*B6}XxxMa@hv*_zv0@^bZ zUv@8;`UBcX)ML>Op*LoW(_y}C&kQRh7+z{F4{0l_?SEre*Hb$%~x%9Yz zp?uMo@^#8DEh|t0Y<)xmg6r(^P{~GSUL+1>en+SB%~AG{J4Ox+`*7g| z^8T;vSA&knLxbZW?R%-6uO0rVSt`Yg7ERiAl!%J7vo%Dim(u&O?ZJ$LNFxbqDMI-k zmq$t}fv%2yAk0QayfvMnJfA>l_bU(01o=L1JFDAMidIVTnOLm4KMlFPKl!`&lV+v& zlY>Tm$GH2m%Vlm$V=6_TIXcqB~VrgZMK!R>}G82U_k|G`Lv3 zAL@UD((XLZ%`_%b-+N_H*)wp~vf}`cd)1GK4{9laQuKsLAqg1<`;Dswbm+~8Qq~c= zSle_Hsmr{txL)Nh`>ZD%?UoWzU2Y*Mck6cA%t~cN0h&|~=ADNyr?x4Sf71lXHgf}Y z8v+^Q{7~%vhS=GQwFGaUn|gDvw$?fv*T`&c5d_lD5eO~`hvZ2rTkbIL%7Y(!#it5B!-#jz_a9bQjG=cmFnMe!J<{(vPh z^~UlN=MBLdz%7aw1udEjsqskRozh0fs=zdIGD=XhCKp7+5;3cqDQn!1EZV=_Uc?eq zPCI1!V)VJeN}V;?yKavmN1xdAPXLdia)vis1VO}jImKlKSp6qAs9_q ztEas-NnlYB?=j^6VjknL^X30&D5)NDfHa9xviE+%fYC`zBY4~Vr@6koSs{1YxI$2? z3{IMqDCG1KG>d6s<|UtlJ6po>gW{s}ilQf#-nFYf!|is>Z9V!um7CSKU#_R%RnC-% zqFOtWpjx>i)<*!TdB3S^W}9%$O`#9>v+4zJ{1f{5Ca93LEy$)5!6}X^2|U_i&|EJ1 z3}!<20R_3aM0r!_s9po?v|neTng&qv2GBM!!Oqruwc2n`!r{~Z!53MBPvg7Sq$B$D_Zm^A zmm*|$1X{aE(l<)jX-7Cvy-o%Tdc;wFN$I$8dR_*Etc_uDjhL23@8xV$-8@zvON@Tn}i|jrF^Z4qMIRHlkbV(G+#n(Ci-Yv7b&8_p+&Zt zxYkQYL4>Oq(p!rE+7Jz-6c9Z~7}_>=zPmR0-&+k(Il}Y>Rv2PWN;O!6R9wl~XpAH^ zsVN#OUamnG%I0k_>V}dXg1@W~n=5{4DOdPNG(z+@B2S4uXhA0}lPp&^h@0jirPwJ& zW$J^+?Vcn_76wfmAmImsr<@F%`}Hc}cw(XpK$QOwiI2VFO?`0VaxYixAQm^+@Zv!Si;V~R)H1w8v^Vr+ac?bXBM-h;<03ISkz6y4Z%B-{vn zstKi*_(v)&cu8iOs`FeMSC|K7k}cUA&iWc~6j)Cv>9M_lCbVQNMmr4Y*G`DaK_&+! z!Y649=WNry_U%pu(B^({`o1)@oF9hZ{Drf%)Q#e?P@XK%3pA7nY!O@G z-R0!3AzxxsEPxNihSG&7_{g|3($z{IB)IuZ+}wahh4g-KbihhzJ~4Kvw$Og3x9(d{ zIFeqQ1(WP(5DEMC4jnW)-{*QV{s{#ed?7RpZuKw5x^jvK@)_<Mn;BOWch`N* ziSnARl-ce!M#tN|vqB05N@b%Hlt8c;W`&%1FdO<&Cm>iWrHItci=}Mu7O&Fu!l`$e z;bKMx8Ws%hDfj;b64dlb4Mp+vqZj&N)5&owx8#tF@RCu z!XsNS#zk-PBROx6Jvu3DwG9P*Z%<>WgxAZwtxsm&)CoNY9))642jk4Qok|)Z)!RS0 zP99vf2((#2FMd`|CZjBQJuj@jzHa+{bi$%p_U-q2z|()m?jCE0Lx~1|r%4Pk4skj+ z_-vP3jw%du9h)c1iAU&$IF>C?y+lrisU}~0o!_F}`W@_wq6pjmYPs@Qdq&tR^4$)| z7P|t(A}?d-^ErV|Y98@Hz70QbN5NAv_bp6=%X8>KRp*)d=|=CF$;MWoe`j7R4u8k~ z+v);s+;g1Vzl4t?Xaf6hZwXisKCocO;WW_x!$D*1`&pyDB68qCiF7gQO#RZgaI%mX zc6yCfr=}nnc;S&=RfxAGCY)wS052@tLjRP<5k8>wjg&UnQjUEljt7uwd~y~&Hjs8d zJU|a!l*u97G#-1QMrpB`+F(QhniJNs0kniPR|^3e534ZYD6W+9)r90DjRIu@i6BT_ zhZajRdLMeRGHdKxih5@^%7@6W!8qFHBAl%vH{pa-az-MY6)efow_;-hs@{3!mU*7F zKkS9w2?nJLVl$hkjdb_#k5ZXLIBV`a4WZKryp@%Gs<#PlvI@+8wje!-`VPYjw_9=k{>i)vU9X?Adov;$xR0&#?gUNI?six z%*jSfKdl)|0JM}2(* zVe}wMVr%z1M8Q5)>q*k8n2My4NokMgryGm{VUJ_qA^9qf`4O@Z)VhhML^R9BHf6&KGa)Ggs$GKE_K}Axy{VbI^--o38IP) zat{&&6Kvm+JYPUg5uw8<*J!DkqvAlvy=%9I?c=|bn46ZCh1yV^xq1ry`>5FQQ0ZXb zd8x8z)pmrDo12^YuxQr^n|m|ZE!B>V^mH^Jij28IO4pdG@A0AVrSZ2OVD24Rq3g-z zd6O-Adx7(Ov$**Zx8oty11us&(M!F3Q3jl6JucjVp`$=43dL3yWGMvn#0^B0S`2xQ zI329QL4E?Fq~Z!vpb=r?Y`3iVJg%YJ5n5j>pGHp)ytrG#`}1kkG5TGtIPf&$9t22=83Ok0ucU%j<9{dbhM6m=pvQj zxNmvsH*8sV;F$hxqaXj=@ z$p^*|)**P_#39m#&4&|G8PkKX23*4!Ih{%nFnt~FVTb9XxQ+)sdH14D!P6*N| zX3#4on`I7@y?tT*vtg^aUbpn`dG#~%IS#^X1$96vyrzYYSoQCLBKt3c`+JQ`xq6a> z!UQZ)<@QVU_vk_M`@{99b*w@o!4&4;+3<`hdCbaJ7iUCZ#NXFYOBk_fu^y`;ojVab z=V;zWUIVvgh1#8?Nvo3O_?%pawAV94LE`2O5!EI>IAIrEfX09hq;$+C7n(xpZM_x{ zJ##P{aSZgw-E5eu^9~rl9=ig!ki7n`gcF2*n0F9oT^{hwD#j1?4RvD2F)QqXl!Y$i z^5`m~tVm-FQ^UpX?z|RIu6p{%EV4W{LUea&p??NXxn=h3T6aRYGICb6baY>wA-20u z>Rc5FccS=!Ply!n*^bdy@4} z-Kk|)OcO^86+v~=n=ofoN7q=J$lDg_^a90q5HOcs1WoCZOwd8cwBYXmF^&L=;TdFAtHDV~yz)e>|99j%g%X_*#RqL=F zJu-Mgr(`#MDQk%FZQ7;?7(r*{(>~hSeABW(1;P>ThWim}rx~y#bI6LXcNd1f5({Bf z$Nj#u_UXF+erYi_mC$$S^IwY`FR8S)IcrDdP)iHF(j}{)5(rsMqX7-odM|X8a!(Z? z$5#b|B;BQMEuXAl@DQdFlh6FmVi53tNUfJj&>*P%WwyJUU{-=uKph>fGQ{&`_DUloE2y__FP2(>s!PeCH*wSnGr z5JnvDoe{KNzkl~mL2h z`t)=@k9%}5EN#Fj>~D*?9_7pDzy*D%ZJl>A3b?s7WZpoXO`ab2H-*A*iROg=c^fRU zy=K@W4*e$ZE0p1~c>boZ_=P7GO*EMQY(P=Q50;AQ3rr~PQ)_b`8QQpA+}v)pXfH)>p4F(c3f3H z9JeaQPjV8@SKMeYBL-+zb3}crIO}+CZD&EM2{rKYs{7^58IlhiUa1GLX~s7SPGef0 zG3>FTlaVnsA7a=5e2oIEJ7S#s)Ff8aX=UWTny^Xe^ep@G=3hehoI3X~1~1!E05e&5 zSu+_hZdSGWx0wLY3t@vBUe{&p`e=#9_q0oz#!syYF<0~K z`P|O#?rUb|vblZWNbLJ3nn%aA4l`0?jL-I-RIZ};f2lUi-u>g%rXW?x=e`+w&8eEOnNeT?{6;3+BG-?YJZWZTrhCKawPMbD*FD_tvZh0HP|K`e zvz`&03bMMXjUIPMVrd9pzU>4og%j{uI0(D=8#&czkeFk`0iw@)n}ZaE#-%i6q?YQ{C_cL*s zu07dfQL9~nYI(oL*g-A$V~ej@H3Ww|N)MN$s%$9pY^OYj=AXRsET5^?V6tYHIWGxN6uMeGBvlwAZsQb{;JbIa)xhsdl$Gr)mJ?XDf++c zD-1EBsdkiK1*y+mooayyOEHP(D*%`otj@a1oD3wQwq9}ZBV1I zJ#sBVnch{C%h$T(CxW1Jo(`chK_dKll{j?yVSInp+pDlX3vG=v7I%cmNCMv8RUN3Pat7*b1gA{jW9!y_ zysAKnY+jQ)qQL3Gugg!@j5}NUq8zgN6jDDVaJ#?W)}C3C4zXaQYhABU2uXod+w>iL zpHV~sNEh(K5O8QT{M4HGa?pmJ*2-S%)^m#vzE$lI&KyPN4`)n=Z}`dZg6?)KgOXD^ zU;UF=P6w-?D_e7N-z(nhZ@_q8Q8}qt>;`;Jxq;L1)bVQwVu6LYcEDu=P{p2Fk6YxMg3zdZJ0{-xogDvR^nS_FBYdref7tqc=EKTh(Wg%R zV9!*C%lv`w@>poqSRwMQ@#A>ZBdSKS+O_gYgMLF$BGAX?`o{DgL_K2T;{|gKa=02m zO>rIUJ%ljy(3M-=nlY(5vAN@6Es|Nvs1$uOmIec~@PJ!1hUomDN4ub3VM~REebTO< z^#?i9U}WtzOUya!8?1%3TcvGrL2~ZXM$2jJ1T5vInH#HoqjtUW=Hbc7-||pi<+M+X4+?;OeEFQj=+$;Sngi)COUN)+NgNV z6d69Y;g?vJyF~%2YV-f2i32?l#9OlQ>Ct6ipo~YkxP}+OueJ($a5erbgub3kCORYp zY0`WkmPWvm*?#Tm$e8E$qhz)bJ@9Cv0V5}DkthZq)Db?l;Pd3ShW|elP|VDzIPo#U zeg<|`=}uvlh5lunuXsuFqa9J?Z}JTF!^iviPLcPI&KEml4R!{uQCQsx;#J1Y?7zWw8^hO;cV5|g z)lAWb=0g||var|8zvQI;?tY_y$TuOdDX8D6ZD#EJciYJ=quT$foJF|IM77Ie{s7lLNqbJhMvk{H6a?flJO=Ag+OpMR{YQ^$tWi(EONiWDS+PIdlnq z&D=jVJ-L^k&TK7YIVxo%H>i(H)5L;>@hMr!h$(vH=l|Ygpic0wnxc$!x@`GW-pG@Q zLs*H6^Lg{fzEC(1LW4s?a zi&W~Bwf6oWQ|BEH=h{a5hy=mtbr42L^g4Psx)3cwl;}ou(TRyR>gc^i7tuxUy^|Rv zx@bZ45)mYEUVDH0obxZPxh~Ay&-31Et>3E0b&RuqA@XDFJ~U5k!6BRl`ZnOp0?C3X z%&DHfpHLVNxxn91EDV!mf2uxsmXfHPfa&Id=jm5{rG?is@ctTrrfyzU7LXcUK2pYh zaqu(Iz6c+o^!&(UUhM>KZX(B(JorUO@|IeQU>1 zl?1pD-iOCVr#HE@vp?L8*p2dk)%TQ}^7WHPf88!i)@t=n>k?@P6*%lY)IyOg1sGBc zlRdnd8O)3{`yLZnA;J#&O2!0tIxDB1FSfN3nCp^|iNrzGj+F7EYzu9v)rS$dYl3^$ zYY_6Acm^FOpXbSR)gaLq2s+kGP6N7=x}|Zb52p$M4l|>xN>?Uv$C2+VrY?$A|bYpn2bz%OffW5n@0zHfQM>i$qO=3IVPl&`8RVchI&i6SZgB~eWR*Fa@eF2`!P-@vtrtYIu`#Te;E&HPn|gd z{;JKMI+kK902PyS9*#ik;pLP#+B{VM)v?x(HWV)Kwu*+@|?2eBd3s-H57`FyiUBTR$XVN)UE z?IVQ7H#HuLeAjx~_px|VwQpDxMqw$G{Qhe;;_Y{M&6h+c9S!Vqld_4)Wc8KNRI4P1 zw&h7V9E$}nEO&zG^mpaY9+mVShz0f(?l)Mdy~0*lTj<8<+iT&QxkpT<^roACZjj$` z&fvQ<6|TJR$|M)@A@aS9-aGI$)OK43Uch-Ca0mI-Q{on4Z$Sc{wRB|Xy+T4swKujp3><3-c-D+J&Bd84TplZ zGY2)mHIM>_s-Nvc-#W8UAUcfd@&t_I+!x;iAG zRtRAx@^=YyvBin_l-M^v9(*Ng3jLbZA(Ai>$EU~-A^?$hkN}}PhGi615|t393%JOf zsGLp;*z)FARSc=%B9a8CsIbP^LIJd=DM^N7J_RZ28;J+Sf7Tv$14kA-)M_N`>rt%r zTiJGAhH3)BGcA1u*R zh21RQmr7}L$Aa)PrtlZr_t10ox&ul7v+I=7Si)wkHN&A%M4L-}aR&m&_;3mPqC0zA z#a($>Rh|5HnM~VGjSNqpRAM_diivI@JcPt7EH`@H8_R2#hJ`Nfw}-UevBPdOP`SP$@Y z4BnHFt2N|xW*6O!J|7S-U3|9vAeh8mwd&*DsH#SO6-ow$l{@PsAYkW?fCL+Oj1lqd z-d+))26Vu_y=){BG`*MWxYQGTL7_(<+;3gx@y;Ga(4tmZ1XmS2kgWjXB&6hDv?SB{^ z$1>iGKfcLy@m;1{fi`$K9dE<=|Bbj^q9?DnZSDSl9oG7Ps%y{q=7}vu_=gJi98Hv-J-s|5=*h6UM&^O z?Rl89HEsWV=utk2LL0Wc#7|zOK+Lx))DP%-evf$XyIrWeSWFVo{cx#(kGOFb1|^Uk z>pf@<2DHlb58?J`ws2Nx4g3MseNeI%#xvXb)}87>54cl%Vv?ys@f&rZEZ?xgl!p$) zidfZwd^T+KKFb=vRwhH!eTWX{R?s08cOiU0ufZ>WSX>W{rw~dr29PZ9b-e%jZkzZY zoOvHCoDZ`Q^Ko;>#3AAURn@dsmsJ)*1n)KG`PDR+z_(&TY>ZTSE%_l~>gSi2?56eh=c%FhIH^E6GG) zdynqt3xE|YO0l&4&NT7X)bLUgXmvGBhfLv!pgd;1s#`y7IN`Q&(HCVswprc_qD&u1 z(~9zj(ySn}4TdE7v%D45+7N% zJ@d~N`I}@_FmVlCXw{n$jhnUUcOQ6oy36=K`5Bqf*Ol#BXtsfS_eUN#yYyTz zFrBny33n5Mb>Nf6SH(g`g52sMY26@}&;2FzQA8jLLk5;n_+;L%Y*jAb2T+{Y@nVaT zZ|NxhcQz^v5`-zgrmhPUml;;Y?w@%n^4PwJ%B~|MfITnfL*HLVGKRKJLIYp@ zKkgeMTEYxQ!1 z;)ao1BV^#~IvNEfeXa8nteRTNT@bNcmJ-0A@A!vk<^Oh*8uk_jxz7G_PO~b61-BRao#pBHbDZxt)s4& zG|Mfow>8Y%oyzo|WGqfz1FIMLk71(0Z(DvA^R)r7&YS3)OUSRYbC*t=BXWPaPk=ka z{LApQ)=rv>pBKd58Gbg z8uAIyiUXd~GWo6iJgC{WlevtH9Emi)Zv76r+5U8MZ*(E>dvW(>BVRyZp!15ivkwiW z#erITzW=~JJ#E4c$C=*y^7i0Zp#!1KomRfF>}+S@Y#aDf%%js&l4sNF$$E`LZnJaK zqSJKb>+^wu7V?QO+D)%9tBv@0Gb5avcYm>uws^KOkOc<^GL&K0vp8CBhF8jx!)lU| zfHz!dx?3Yp9u`US5DMahk<%jI<_80mnl+mU8z|ujgaF3Q&Q*4C^(;9a2az~!PWxhA zKO)U03T|kI7Y!@n51o{`ZG`k5D5f_0OOzgK(+yxl-_W8`c35YR|E30&sy_lzf`ryI zWQ=-AzgJh%{Z6*nr8r=e>WJ~rg;%Hrvdav zpx91aT!@bMJ>E+>jdA%yjaZF5Zl`2{PzsxGh54!j_T1q>Uq{vZ#b&oYmN=<`xqO3i zpetgYT{sXRD)7z)Vr~QW$Ag}GrHH+Yz;_7e8HWgjJtz9PMGtoK-@)f638;wk)gbn} z6F7<728#T5$OPOXlJWFS2!~=Bl>XcS@83GmZe`&FS!N2u`#S2?ET*yI=0v+QjT?_^ z|DPayMR$((1X%w*iwPT804#q-gF0zo7UkjC>}cM<#HQtmQKAy6N!n`${Gg<-kdnt|bXD9y-%uA?Df2agM3 zk$TJrur#2ja<^>#hkABP_;Tx-Pn~L~s2swdxqRrPob4Wt7YI5xG0P5ynX&fg#h&&J8b6%H^Lu zT4M=rJliTCAn~Bt%GKqk<@=TT?pM!h;FP7|N-J-i zNNepjvM+jo$`eTqgG@nFO$=nfaJ0=gqA)~)F2+~Oj~V+YKkS|!PRn^Le+u(V6E_kH zWH?sSZm`9VaTkS(#jW;?J~1r4v;E}W^5eD3uZypjlit>nOF*6T&5tldkoT({3fzmw zci2Xrb726YDGkMc3B*AlfygM1lr@gv!|6#ytP=dboL={hK|QltY5rRUq_8=Cxt@eK z{xX-*ud^wc&Wa14wfpWM^RVLluJHoVE2`O-&3_VKH3XBXmhE`S{5C8!ll48dPG8fe zA7twsDHM_Tq-DjvwSiqE563kP_v-viM?Kj}UFQJDNjanm=j!+yCEkvVN7Nh}-RtOA z3a?xTnm*3JHFUo8Z9@qsx`<$6>PKE$sp>Xk1-;HR4VcmbiUt9)*`v=-u?MnNTkJ^^ zzhW~yreb&ywvJrA997_uLJK5H#Awjsqb5NcnGDYz7x*V`blF>n9wOFT(@g0o6d49h zb@|;eQBtyg5Q2{>+$@kSApIc18vz4&3R+?@qLM`i%{Gx3-$h6_LSC+LOo17x`6^B; zsxby~xzGFJ;?v3%R_Jg0R=k1Sygqb5-$9uJG}C+ee1k#KYk#Rlh_++*LwTUf6-iY*q0(xJ~PSUQ{(ZJCW(!9Pczrk5c6xyG~^jVr1k-Im>o= z0_t5bLE3r1bri$3R5bTanZaId8i?qMZ}kgXR+w;wrBJu76X2Qp^+-5BLLB zjSbi!8OQ?;np&o@Y_>sRyFpr9WBiz5fgkx*OUCqmn-Bf>YhP4~$jZtJ2z@pArGmF7;p#2%8D8PHT0t7ajF5KK;N{W?{7z}wwk&>>?ew%x<=Nr-6!U8a zPWu||FS8v`jGVnWed11m{s$=`r2clO@RuD4tni9Ma)z^SfxI1$=uZulIY^oaP{N__ zr$Usg*S@sEQG0TIXivkoVV4rnkI}(IYq9>9REe13arsU#g9WKOKp zqDtJu>r%d@1;^aeLf(J+VjmGAj0kWvvf?~uGKv<*;#(F^;vocTnN)KxiwL51X?r6C z``86JS~VKqy)%K)eCV~ToV3<>izMuoCFEDMhTKP)5KaIlx{pFoph7I|{vS#l-i1MI zx^de=@s3r6CSC?BNAr((9k1ai`9_K5Qqw21<%8CAJ@*LDI4{;Lj+xnqouqMp4%L~y7w#&)PUa2N#gE7ti(wbvt5JnbIO-?5%-0hf}r%fCYNsHo^=2K^oy z52`Z!K=ZYxl>z^Blt_VB#=Lp_dur^^4}AuKcOkKNDynfns3&u6HyK>l9IgIdG8D#R z_+!F{uRy3fedqt={LpA^EA1rW`U1(EppX$UM8fm){+G45KXR3T4j+dO+MgpLe=yq(t3CRue@tREP zmzcPo;13QrSGAo|GEnD_nW4Bsaln&GN@?!=gk#X}-Z(J5X~8ESkIz4xwPs$QIXX4= z4UFb~c-A%aW#pdaxT`@XlKcniPsN{T|)P__0O{;Vk*ffRr z8G!Jt%ZjDjiTFZ?uMkWlO5AVwkj(g$zm%-DPYh)V^v%M0^`i(|(mtIoS-y^vAXjWL zYt;qP`BuX<+(Pd%N{_L|d74dZ-J;1Mo4%L_b-L_WF5><=)2`Usw>EYWb)i6*6<}j^lPnP{O=_4Qm==hv_mXffirLC&Nu9a%a*u74 zEtp=xP?O|Pg?t|Xc790ZR7f)suMM6_%l_VPLo=1GGQ-0??zB=@X=eOSxCPwTzd5t8 zP4rOpnh7LtBa?fKz5OCGD~=!uNK-6C$ctqne*w!Y)s_~7;_pVvu<@Y>S|tUHpj2X)TkRgnXGA10>Ux zvD|R*QJ?QTn)yPz;F~%ExLH}t7=<2{XlU-z??MQ6cmCTInA#a5HM2Y(Wo3l>Lvb8r zst^_IyJb$cB8+La%@k*D;-H30A3rbzb{v}F$qRm8jS{2ex_jdclwOHO+d=z1*##LN z@ADMdVio})neC7D zQM_R9E^~ zSg*L_n2o7P;4W^>b9bE0?*vIQSYbL_n|Y|nAO+2PtuUV*z^dD zv520I?&y)m7yWsMLYE1Gq#xp%%}?D2ytp}|-@hL7z~t#aiz7!^t((#TmlSayTHAvB z_RY`RVViA4ZpU0Ufr=BX-#kkUJfs+pf=^aHCAfaczC%2a`^JpDRTkfdjWDcGEQ5|J z2LJoP+X2e;ZREfv8&vsic0twrdu%I2<=*Z5M&8r*m>78R@v~e@9+Z)KN6|$nbqmRs z`t6iNWb+^y07(zE&>GfO0mi$F{rtjyPZk@{kc9~;a~+99%EVAwi1L$cbnJaTS$g|` z+IZAJ$mnsNX_uSx>=EQ21~slaw!o|lHz$`YXe)@f{%5MV8%s-rsQNY{D3_!hKoJ3O z;v$UDy{ES6U$K`Jna@u2J2z?Jp@L6BnRlvp49Pw%7;j!p5carXdhfzqU&%NpJLPgF zmb%Djg)2q@87Ct)u0U%Npbs{fqeKS;5Qw)nti~-&;6{NTGJ)DUVW0br-(#H4&V-h= zN*C?hFyVlW9^foKLeR|B;46(aK6*SW$7t%T6du1Bv|b5f4?I^*-rA_Um>;<)TZ<1> z;^Rt`cy=7vlolE)N)Qi}FCw<)`&8lvC9YUUz11Lpe+`9<9VeGy{jpWl3W=~!+LSKg(=H_ zSf+&L2&3@O<7~zLBy($uxnLBFK*rek^hVbxz?s;RbP{Kvx~awX+|u_TKla?OGV!^q>qulRMJUnqw zB;$FnjC;&xYa^(QL9nRRSvxA$_y;p)>4E3_YL_~DyjND%RbN%@ze)+VIRUvcD7tQG z35sLa^hO=Mvr(2a>ufw7fxPD+2?|4I=I=~q#|&ij2)E7nGw)PhB2K$q-i&tfS3)FB@1Au5rb zl8d18<8kr}q_fcS|1k7xtDFtLevjt`E4iOq*@5}OTB(Tij+z-PK(fM zQS7dvCQJFow9bTJmg0q?Wh4$`Cziq^xi?2)Bl^5TjGr>2!hv>+hs=@jEEY8A_=jmi zssLpe8VU)=xPF{%k4Ms}7vn|RH~YdpRJ1}i^VVz&u@)syNn~H%1sA*9q1z`t#Wt91on0HfILo1M5CwwgmO(`HIaGh)a++zkRMCv{X~4|1o7(rpEmXP!2cb?>Dg8@NR`sjMP9W zLAi`^P}Y;#o)uy> zGaVeFf|2+bWj?h6F~_`bCfiSlyKdjXJlLxLz?^F zvSVli-oEFDWn79W+oHQ8KcFA~lmS(n13B;GJchyi1)kUOv|FVKpU(Z!P)9W*gt9Z2 zR~I+8tTiBw(J+A`_b$lnX=v@!@xkiIOE|j}TC;_+Eh7QPAk^=0j&^jtY&j^rcXsfBY8$+(xuG;*>F^Ur2!RHiiGw+cSCLHS1x_wItxY&Z#jgl0KI;~eC>{%& zET6gvE)kALy7KVgu+c`^a&yFVcM@AFC%AX1uD#!>9~6WV1GR`0lk$y?X{#27t~Ha) z{B?&*{wq=&K>ClU-#8)JuE%l}48QYN;i*USb^`ijmC&og@ zA&>*ozu%~$_k}~gZ}=hD#wc@e3YIx&Pe!It0*pZXaSJJ5_f^DEa3uadZw?`)Q(;7Z znR=sqyy3fR=dIqlnBe&|94%YJ`gm@|u~9?Qkl_D>e!`tXK>_N`-)ECAc1PLA1a9PS zr`9=e@fD+}d+d$3ji0ZBp~3oJZNMMH!J%=Ip4d@nt<$20j>pH>XR#aqP9mV+2vIOi zL-s>~;~&SAI``shBYpk{f%hdXu(zLkJl2|&s@r=oJ@XWHJGj{7xmv%49sYBdHw=55 z`xwoUUfEKD=IW#K7*0DLbY!Ds+3u5W(QopQ?qCI08~%(w*4LNY52d{bLF56#uN6zT zSYBUdN^nKs7{i`T<4wQiLsT?WK7@M{;2X{RWKw14@IbYq|gaE%fWY#G%IJj_WjkQcQS4_KN2OS^MAh z4Sr5J7GMx_3m0u&Vv8&mH7pdb*uzWAic8YQBT%>pk7BtajcMiOPy&nb{SqY}Dg0 zs{O|Kpku`(Vyey>%1w1@mA8{?DmS$I5H(@tqen?OZpOK*u@dG|8P;&we0#zJjAW0C zN5da~#%eNc+(oCTMSIm=nRjfoUkNeglp9&GIMo^VE;hsIZBaX!;F5XA*0AeuHXOxd@F zxrARP-T=j%q2-gOinYc;%Hi~mZ9eANbz-#UyEkCxY~^N=Rvo^rhoI-rzO33e+uI|W zPwVc2b%h*AK|`f$QB|NL%Os3;vlSPBY^d;m*X(QWfuqvL)-!=>uBxy20bS~Zl67th zfVEB+;?Ych;2twX8?{Gw)zM6A`aitEO0$j)A*>AH<09D`Am~>QtFsKrSVO-2x|s*g}^wT3=TL zZ7V`)U{bU0Z2|z6s|OC1IJA^h3%LU-ni#r$_JraPW&hrnbx8d?-Xm@WQ}j}zW~@!j zYKB5aQaIf@bxRW2AbsMG+xfiF;=C#g`$jerhuJf!u8Nn5TdKlE8eE7-OtL~U0*8iz zwu0NHru#jyOX4fNd)Gf1_se&3=dL|U7g1<)7^o(uC_=fpKvfWwYQX9teX7H$n$DL% z(O8ikDxf40U;OS-w zCEBNN=NX6;_w*n@oGDXFse`P^Vic{ojfN%hX;Z6q0{+e!fbCdVe`+==5p9$N5vCD4 z+X&l6=&^;XTZn_QLvWN$oi%b2kgX!O)K26QLOjocc3mG?SJ8tue>m|FwevYW5y#AZ z*g9|?Fe`+z^?BQi;y%SLv(J-9<8g24O}(YNPaz)wMj{}p!eB7cu2d_uA>YgXlREZ= z0><0*0a%OyRKXiB5KM+owN7F&FCatOnDvz4RI);1%SaaUtCOpU)cbj;m$C9|#XHp8Xasdr!`XkvP5? z_?z5z&oEF-N8+=&$?OAabsedrD`bRqxIBl%=5zfoBxJ%hcl7xU-)ng0_-GQb_!|`# z3Cxis8^5rChH@px#3Cala8h}a>$staLN=UXDw#QSTe5Z^JHw0{KLh2zY4fMgW|GSMmi$Kg>&(ORtU}5k3 zmA`MLmRhr8BLQZuvv?cjOp}L#kn>1FLG`C_wDOstFcv1NNCyo?mnmW&7Qdl1EfagY z!49)qrg`DjJ(f4Y^%hC;uR#u;9kt`hAmjgQIKgV@c|`%hMMN7`#&<{)a!K?VVpTuY z!rlqfz5Vz=5zNO$Q}{kGdZzSmT7C%sE{0j@fX(-}@i&0!a1YRu2!4FjyuFrh%*a1| z<+q{2pwRdZQT4wcz_O>v>7p+--z*XAPj%M`Rb-LRm}Tk77}E{gr1jG(hl}Siy4=20 zIY}?=>m^|#x|8#X;6MIluB=A% z<;!mLxC0~6&ujIgzg*y%%toesAN;JaZs?wEo{xU>XQ`c>_i7 zgm0Jl=!jr)^R2P`2H zFH0n+@>Gbd6I=qGXe8Ql40N4H{(>rWDMJF( zf(d^K#CI~GiuTP9z&vSo>4a|Jh5t1b)-Yv=5Z6VlS%>SnC<1zAha{s}mvbfN=Dr6# zw$v$`t&*VA^Qy>J_nLxXYXzb$AmzZtqWZIDx7l^8FE*zAA(Q*`Fn}_!?2RaBN9Y8q zx!xQArMbRp5jVtY_tbW73>N|}_>MYk_SxrzRq;}b1{J+##56s*aeo|Z+}?wp;lae3 z?y!Wc7Cjfc`6&8=^<=XU+db554Js6@l!zw;M2-FM`>6D^iAoQo`3n1FI|8P_*6W-^9IfPHTUFN15w1|=xVhhVsH+#a z4sC94h+Qfl&Jh=dbKXck%}**|15GB3gcmU$s)VGklbphtk0%xe4HxYcsLOXAn!&P zK7MZ=n$tPc{#-n{TKl1n5HA6!(ZDCAQym}81n$xr3We6GJOU^+_OY!pODGd%)m()1 z?^OBK|7^mLgPGp>t2Un}e@Att1ae?&dg0&rB$RY1AX;x_jlX9-`)oY_B`1envo1Y=H90B@{Zv(dt!77l0%vgl8yWIx@mm zRp5BB8jX>TZXa}exFHs*7BW=@kS3MqQ#BKb9o+xSHPkf2fUa9#$;33BNY6F^v1gPH zc>mcE0z!Sp3)YPx>M5`uBOv>|n{d)J@ZA>i%;Wx|R+Pj)Pv%fDk4?k!&jwtrK&(>a zg=Ud}H5zvX$jAbbtWtq&Uh&^ckiWjmSDHXuy>KweXF^cf3SE4`SdM0#VKSrbSW|yI z3WmDoo#eI|IV$waZVdUN+&_6Vm?3xLE4>a|>ODSv8m&TWWleK}aOKmnPi3 zm`CeHzxapG8AD^2(^6br(6&AmP0T2X1d7l*uKu;Nt2o+!vo6hOrbBTzWW|OCrs6SQ z32`48L=>=$Hn6`A)viM0=LZ3QzG=Bkf4B5jPoDJQu_XkAO-Hqp1U7BdJGXHt9GkQa>2xAy}S znHoo%k>wkYAN@tft%F2FSE%S(!=N9Zt98za*4@EV6*0u7L_l4jQQA6A(!LQN92Om^ z{SgLZGmeh}I*;BvS}exYY}zz1G$kM7Ur3_|0DB}ij21LioKkEk?-+rW_WXCc_c-*= z5y0kDS&246X~W2m;^1V8i877DE_f2_7un+hQr{^Li^;;{UE(HL=Dxn0b}hRRQ+xQG z1<{sE;|L&7nJa6$ACYZ1KKszVwP6GcDV4uM$Im-)(QK8hal#ZQ`Gr7_g+MCuu!o~6 zeIr`f9JHe`lL<>{^!LB4%-eggL6nRH3ts~~I#Ujq%H|a+J`wrSK=2tOI5D1!L*tvq z!?_5%e0g0o6YB|l2jE47iUWizkK|m0#w(yFZtctB3HRF33obmR(|rkRQUy(BLY{iO zqE{YEa|u0F1Wp&$Av1-LUWMrPicnlXRtlS)8p1c=6SU=Gjy?Ky%4Qq;AfW)OQY?$rI8g>#!w(DA_8Qw={YEvChz}74*;tGcPRr--^s+s;uJeNg zTPEv&omr71>(TL9PAr&>HnU{S=$KFt^nA1!3-gVm`7ecWZ*YArktTW&Ciqz5Zz^$g zA|B6JNO1qglYnYh1h=2zDVAg+38Np!+YuJbV3ZBmq2v*O$E1He^(OLlMjRiTqBbM- z_aGZFS70SjM>x?A#iPoS$x_{Cu2cnXH#DzKH41~+Y-o-4wAEmSREgoP_~5%A1yl0{ z1i@tCZl9d#G-&JU`n?u)!GcIUv3B%k@@yT><+7hn7lCw zY5Pz>5xd_K#LQ`US0;+2=Mu*@*()VPz#Sm|h)pbu^VG5rokV(jCp%>+zO8t3Yq_m>3yk?^-(Mky z-nMLxiwkWm1s0>Y?uYwM#tF9%n963>0MZTizvV3Lmhx-)W_Xf>G8Dgy!hs=;o(eckPlmubU zP0`AC>jVc|Ux8JpfFDn?a@n1vfte9N$Qr02D*=5qlfMIa~A#m!qCH{FV>(Wr!ll? zvto4L>bhk>_C=QLQ^aPR34yLETG(T6M#5|u0)8IHj`8Yn-HM_0w(f%2#*5xGpRDn; zDmxg`cmv2lSZz2UzyyS~h!N&^pmCoz)d?{6CD~8{A=*|;b?#@;zIoKZ9>2XJ)=s9A z&?|Jls$c`3_{8PZ1S;RL=&8`vp6a`XG14B*DLQ!S@6b@Fmi7(oIZ)B zhqpBG#q%10REpd(u@{RY_Yj31hXe=T&tj%%B#Ku>s3j39?_TX+pZxazd)HGE{(z~< zCqUYwHzNH3Ncop+1Z$e*qZtzVwqaG7-8a}Lo55V68F78edIc9d8rsZomKp=@HxCDM zBY8E#(is%kb&fXjC>U6tGQ^Xb7D#C6Fsx7F8Ky=tEsp1^D~IH$-|wS`GHDo_QKg1I z2}vgdt5R4ZN;buT7}jQ5fxP9xBtOa;UIhKEF9=S}s4e(iCy3F0o*bk6T&>S$*5axz zUa+V@ekX^ARzX!A_RJt2Kk3&5kG{e0=J;eB9rRlY?$8=0*xaEuxHikUsKS~veA!9~ z8V}Tbn$E1{`ykDR`%lt5I_hG4kny_}LQOym;Wi?t10>_4h9~shxdqU?xJb%F`+obr zUx5JJ&lEzgnJHVM4d;*1k0KmW#$D;!_x$oX6om+I4i^W+F1S-E|q&@B2PkS2hz2hAB?+qNi%4fNud8cQHq=q|> zb3h{rzyBUg1>mq;048yU0 z8%}$m)VGy6`&+cI)$1f25$-N8@}sYNeF#J?X1K1RGPH{~p)bH#&N7_DfcKRxBZ4}V z%_iS0=6Lzi`oY(U>?0LF%?5+EKZv=$+e^$^yU6-h_rwronfAk37l#K`Ujfdl2C|Qz z@sowEv@TE$Ra$#GF_Z#D%K;JCtqr_LK?=a3ZA{&?s1>*k)YxY2YBRS1-?$5|BdLZR z^2dhR0JI^O*?qI9B-)<>jMUR|B^-fsfTaJcF{WkDTYjJ4*$46jh5%&2PXXD=R^hg% z@oWN&d|-YY#9!vXp?7LE@t~twn6*S;N7cVS>&6~OF+~utzB9h$uOItPr(I3W90CLJFzyW zS6^MX;zS<)1&_uSAtravF=`J*1T*@Q%$3-$8b7)q@ibIQT%UbcYf;6&DfWE2pKsp3 z!_xNCalYLR;AtAp1ZtA&`n)QY>{WG2oJ5}bkJC|K11G;U;s0KFKhf|fUI@D8l7 z2x#1?BhO9D%jv3+t~a1qbokcuIEj*csw~Q&~>dwi}mE7{y26+tJ=7&K*dzh z+{P3YlT?BbAORBoVnF+CxCcBhpJoP-20_!YVr$EWq=N3n;5YEliyFMsh}PPZ$d-Ad z`luRyZ+FKh3-s-7WC&lc22`v5YPry4SC&ccm=27Eaq#6&#*wL1N~2oW#fg)&KacC7 z@x@y1V}|OS=Jvb^ObM*aJzd9{p3^1Y**GQAvJq6(2e)S~67VW%S*Z@Q?Ba(N>{WdD zsaLv35yfW2lNu=V-?HFGMS+{6rwH|c*pkvV1#qT|rD#hWg(=qt8?cP)HU#`_fHN7+ zzjSaBc#G!tm_bOJiI9(U-*-@pI_&P*ju09Ar|=$JUtnwo7-+omfjBq@!Ku)+Tt_e! z?c#vNX!0z45f^uHbG!hM8cNCVvl7bkE|H2wov6k7=QXoD>{?))f!NeTl?`$~}Pz(j=0|mYh0}oz@#iN_Mpx761wl zVepZ6-ULD`?pkF#u{r7Ufjup%t|p<^2e$a)GZY#DXsOV;qEXGh0~HqX%K)f0FE~n{ z^*LS+J`{%zOa=0`K^sCE+(yHP^8_~mbay(cxedMF*m_cqh`RFjwt>vRCC^aKZF__1 z+GlQ5yJ90GMef^7DeU)($2H*f`cM;gjr6E#xv`=|Wb@C9IYUoO6Ie>Krp5Bzv*JFn zm%dw>8YS&L=5doVou2Vp@=Grr9)5VIwIK$qV^fKbpSYoZ`AhabR5i4enY`(XEbcFR z&drSEdZ8PK_=Q|mMfYvh#7C|>#GVk^4>t)CwXUefLrOGuF1{G|aZ~Qqg=l}hNcc{< z{4LFFQ|!cOT0?;GG4s$XpI_cakn{|^(kCfM3E;K zHuZN7VOcGJ*z^QOqrm*mp{bg@X{R|=A;h|9&E4A(!JNMqj`IY&9F8|JWJ(KKx1kaG zc$i`{48wnUS|llwAQ8g_6uh!hMDciiJ;SFiIwkDUe4@7o=d@SV?BnB7gRM~>rrrN) zlpKV^H3m(DTuGt|Sn^r(kXu>fU2Us_CS8&wuUuccd)M9DZuS0%+aof|j3UbPSXRRx z##7Kk+y>CNE!LY4fwm$~G+6c7U=Z!ye6zK@o#xACNy_3L+EeYsL8*`2?_9$m3aCj_ z+;{H4s;YgHjW6)X|LgT$*WW!{BB`_XZRw*?u4<{*dtWrOM6*gxHW+U?__!ztZlmt5nRD!{i8X zzBeR{gvftSOG!aB#2$nK!1e7m{nbtj=8lF@Wrcf^++3;;?~W35VjQI#uSaA6M)8Y| zhnkP84SSZrHF>75Mk)HpJTJa>on>Hu3i!Q&I4|$I za;VyCzp@M50{+e`kx7q5ofnRe{w{;MemZnrp<%>-)))g*N`JTxaArUf1=;2$vR?fKK^sluwH7p*|PB#b#EVmAug-hZn1JeObmC*CYOx zpT44yF*4IQb(|8@B;zH0z7s=;XAr%VD8feWus3J;`4)uHIH}VSVdl|17Vu4B#v_LT z-Xe?hLJR963kAFO2qfe}?vqO2j!NG!e89QrSnl~3oL(dNdm29*h=8x2BFuRTrSNmd zFkM|Cum9!PicZWhL z5`w#H3$(?dc=6)y92|in}{`+8SjWvuSFl~6uJr|w!`!tqM@5d=K7|44+1RVkY!>ts8d<^p(q~tB@l^<$^Ax% zl~6GJP5mJj(MzI;Gs4q2M~p) z=iBQJ_IkRl2yo%lp7Of4z8>=`UH!^w{!J%)OZW!-vgtZtyw8$El{Q2q%zSmH>r*L$ z`tl&;xL3xVyAEIj{NO0>J%J7(0nlUcfIA-=_Tf~h+z1hikPXg^?UWe%?-e@+1J}K` z&enf%&3FwCuD@?oT#sAs{Yli|YVEu7`AMW`)0+{_`_=WAs$dNA*N*k44j1Tx3#EuR zn&axOLRyyh;{o*P;G3Sq7?)=j=F0`;!eN8Rz5gBKCE#{)r0cPuBl1t=41hk}uVjMP zZX26=&eosD)*lCDgxR?of^0m`Jk}hB=#rkND81ekE4@EgG~NqzT`ilb_}uoLKJ-Jq z|NT9m$b3K;%AAug^Jt&@EBskq_aU#Wse<*dK&PX~b2s8WN4qIIO6|$n9od?Y7NQiQ zz;jkoCIGE^V=?Yg0++V}&d}SdM$t3M>B;Xuk5aTY?`m)d0u}GqdU#Mf_0H$Y=6+3j z4K#gIPA}|PK(Ovb)IL<$k6We0-ovLuu*Kg0uI*Qz zOr)aNeScWH&?b*(5K9q@dv1BrzAY#77aEjbQvacgvAGARqaf3k@1ww<*n&~eq-Ng+ z{xsj@Js&FcTJdY_lDl4(yUNG4*|169r0n%zKZ3D;z# zWD#>A$~-E!{PPR0jOnt@y)WkZo>7mAq=8}dbEwl?sqynF#ZvcM0B9N5JLE}!gC_f9 z&nsOz!d$8pzI~Gz(5@!0Cp!xf@LmCqyw~k^63#vLU@^PT{u7#c)?Bx13tD7~Rf+t?KpVpx3 zub~kT&wXl}YQ+*2?-8vvw2BT`#7wc4ZqoQ*O!6(D7txGd*L5@S&2Bo~Vcd6IsIz1B z^xQgF8Py_m{xP@1qjCrkdA{4rLKhKq%$-6uN&};i`g=C2g=r0ZS$7-Tk(Hq3!Vq@A z^8Qw(#TqVd%6pwld%N?V;qq_28;9eLZ!~J-c@@itJw7UKA6)L-&FzP@$t>+C;Wyhp zQ{b7Mp*4$-(Cgp8{*gzWaUY`YrEh%K-FwD8(bbHxwZz#rM{PPl27F+xgDf=cF2oa& zbHJ|Z52HT<-iTexcMhjCc>^C%B`s4g~ep9mt-o%Od?i3E+*iNOlcm z;x7&b;VvfnCQc!$%!EwYw(s0?p}P-kaKqB))o4p{MyQG!%KnGSQ>QTNd{9m3TJj6s zqTGOz(^nd`feiR!Si9c=(V-@qPj8KS*%^4fwSn%kLJtkQp7emb{V78|X#axT&NS0ah-@f1ALA#%)|`JlT0qguq3` zjDh)T)l#OpnvRDxxgyqCrI625tKxI)kzPu113<91I2wbmBWQ=_Vmx z?<+=k<<~>ywc-)X)r`_8jCV`NB6?B|NG3hx+UM7##ck-SOI`yBYox4~&aN8_@GT0 z*rE}~;94pz+D=$KJ`P>93(FZc@fc&am#;F7GzN}8$fZqfmRlvI2Y=eP(z# zoIVm^Qw#y^4?g`4sQW~D1`Z_n|Dw{5rl@8=+Y!&MRfn!LSP&LBaB$l^%oYhdz3oh; z3bofAz1JP`uIG^(_m`^I!>TvFr^iqqK&a#V_v&>WdWV^1K>q&0cHQevtcr@0*rxS> zUKlUV2Kcurb1(fzP5xoNsncl~y-U!v{d##~*&ce)cSfF?X5|9B<@|)Ki`{`Mrd8{& z5n0~4;AbTwbj&W#bIFQ%C*YtLU2xgMW(_+nwkU`CkIPxJ;YeadPXNz;hQA14Knrzv zd2~8|O5j-=Op=T7#ccoQ4+eHJy58&cldGTjRIv=c$?W0;Y*{s}a@TGq0p6^wPMD9Y zgxOFpi6F%!vL=xTlhhbZTOQ7*Unu{F6=cW(4h;z3l5UJ2H}OqxGdZ(YFh=u|EOWXZ zmKdu!+Si_3j&pn}+0ajYR-6iQIyq&-gO>9)o2R$mQigcW6=u%oC8Xy+ zh9!?lMzye105ZCasK0v18)IumRxdF%=#5{1g_9)pI4$~_WYY#ECLTXe%zlbWjKLZE zlC+967uy>v+Liu|?(zXfibvTcl55g)#wqs(HPozelguVNuy7eYP*h=V$+|*;K%jVy z9+f3JutVjfl4It>0Euhm6y2NmwP^7sg$2=7#GuqLVCHI!Y}R~gIfEIPiE*xLS#vUP z%t>aNI3-%?9~(8jX{aIOb$FKBW;75KK-BVcJ(a5R$0EDG%U;0X?#0xzJ&V@}Ab;Eu_FBE& znCMyu9C*P5!I;_e&Yhc#f27qrFP7VOmpYCZh~W$FPWE=aPgf3rr<9S63B9(fA=Wip zHa*O%;NZP_y%uSb=dq8_x9E+y{&MPa6*JoKUf7+|Z`?PFk4J)1#|L^|HCuX$sVfP* zJC}d-KlAXi&fd}WqIh}OtgBy$L>26&9oY9viMrqZCbncnUgXbh@U7cRrai^gKloQS z>X0A;hX;z2$?pLjn_)6!LfPKst(0pVRw5_gfX2oMTw-n8Oh>?`y9Wm-0tZch4TPY6Fhbw*jViY(WHEN?` zd&NY$543+^LvRvNk(X7C+l+iSGd(7Nj-tO_>pW#?4r8xSj$oO3VyoA&XVbdd@tOr) zi*YhyY&~g7=}1;ucHzTkC*uba2xu=<0loBZt=atdW%H}5R!Of%nmgncXs9tm{JVF= z&5Qf0RL0?a$P(&!P7v%Se)y7B{Wl|0y~nO;Q{bf`a9Z$Y^h(d`;^27?>Hq)_tkA%& zd%{fbNAsJb|72*7M^%`mJ$f$|z{y&NhpkZgcJAx#)g1JE#_gsJ`VBakGvyAd$?w?< zHifPNmlT2@8Yk)Q=9d$e9iT@pgbJ6zQAfm$!Mz0J1uf!-z{}kG9LAb>rs?l56>40e zebMlu9^XYg6+N_w`6`HmfiKM~mFV_a>RSgSEbbPmw-E8`B)!9PMfc^KPXUR%gMBV0 zzGh$^1|746<98FkQo|`dZW?&DI%4*W9J_$Km#p^d-i7D5tDTP-hO36hsiE*v6-+JD zm`Y#1i=Yq{{{_KDpSlFE8roWaE@ipROlH`0`$@dqE_!E4x%$_~OZU^fXq0(B{U$|K-whKbjCE9n*+~r%V zynp+Y-D<*S87Iw!fbwAjI0>3^2_oEkrSkW4VC&CBw3yNyB}dS!W&EEPJL}N2ce^jWUx**#?q_*oh0*>;RE%{9ZdlowJ zX2no<*x}F587xkfhYhAUIYFEH-?5SMExn}&_RtXU<65)JwYi*{sc5H0R*;z@L;v)l zE2SA|M|NLx1@zddaPfrCwccM2EWk-4E4LGX>EUDlR>4msZ9*{oA=lzP-RD>08jZ}O z>x|^!=IbEfoFC#NwY$%ZFqAhOkD7cCL9@`0mAM{NA=bkx)`(zhIOg#}y*7eYW>?re zmHkhIn21;Yq`4OyB%UPbXoa@XVzo#{Frd6>M6{i#K|-{{`*OR@e#|bbV~L4@@hSry zhTfZsynK4zI2L&@Ih%lrK=Isp@UD_)pq(Sy0FB76bRQ~_I?{(X?48c;+U|t;GhLcgdV~0 z)BAtzkmDcl-)wpkNW0M74}ad43wN>9DSpxU7Up1cXz%R)_z}4LXe)#k7R$=Gw_0WX z#D4;4xKH&Hwh?;Lt!mjUET_g@d1rW7DI81Mw~x+krVkL*JP@y1Lat##Q9j%yY5yD` zFm_aR;$r3T_|Hvvzq{=j$Qn0twCQ>ht0q>pAv73?P8j;D$wk(SIoM2lDYes{l{G!H zu&Fv^{I`zw{u#~v=!Cj<$c3^Sb1u5-)C=H^%5b@!K2V43%X)i7o=jw-?tbvlJR;Vy z>A0C+HePZSOdZBX6@1IIhU2zpFiHl*{k zU+VgPaAHuq9reob=-UbZA$J?|waa#{u@^h~Ql@x2e?E?`L@4h+m+szX zn$_|8>%4~|X332`#;6fh?c@g+S~HDS&@B1!+1c@00A=*W&iUJ&KzqEeSl8MSP}f*T z?teo4UnsGEpPV4-KSA%;wNIA1j|`uQR-jR@7|hmq|F+1!i4=%h1S0O&&O*uPLm)MyS0s2QXn|VCQ3L5c8%f3z(mh!PND<3$e|Z&Y=CNKG{%&-j=#NU~4?D=TycB0lE(zwH zd#!PP^YZp6YVgCRF2AEgd!u70Z-h0_{T?2=n7X*Q!1P(Tpi3ts%S$+aVOkZHjdzzzu0UqyB_ZFjdIvpG7J{aiZ6p_1Hk z7n94`7^#>^zILYioo+}eHYkO(g2+uh>hRo2orYztPQcw9=qwN0=itz1*4W3%s5oNM z`|`S2=m$U7QS*eCYWK{(^dU|!ate8dt2i;}1IX{XG{$JxEcVZ_PKRGUQI6XYQ4r$g zgJi@w8%*BkDpYDZugugI$=sFgQ+CS-R+O)inAoWwv)oU6)>en=Gc(x)ym@;+F@HHV zGS)mfUi-(_3dGH9yD7a)QFpPMzq(AQK{wW}(>{6INk55%?Ax_r3FHZ?ZFRZUZSb|~ zO{fxg+&Gh;^oTq(9d=YvJTO7|*Z;Yyva{`RT!f2W6zgBRyq-a4^46cb^fht$or>Wg z4aC1b8io21s)Qa=yQW8#+mnlb7H1HwR2J6YHZS3~1_G2i6XrRN3OqsmAVt}! z&Sxi0I=}fgiR;W{?ZG1vw}SWT9mOO}SU?o462yTGg3CJug#|b+{{;UVDLAc7bl5QnfW(tneUT4oW(ZIL zA;6jfI<=!pRhaAbfp zdPO1ElRJBT!lURkgKY6kP3#_IBv|=NDRb2=Ggpwbi=*etY=hn+<4$8j0@IrUGD$y9 zB}G41KnEh6jZ#WitLw^eCl3C!G(5O(&DAq>1swv~=3G}7*<_}F1_~zmjI^JN zWRvLFkNwzOtST1OL?IZMw-14sP`wUKhIz8_h&v0ra-s&^;rb?$6fxlX{o&N9uKq2E^SfozfI`~E*7bh5 zX-(^_Y5DX&Ax0o;46^Uu#>+(Su}+XC63z1MzoFlKo4SMVUiURQ&D8-w7w{ISq7z9D z**h6c*#PsOSwdadtJc`Kgv_kIO5e!M^t*Y8{X>)7;`8H+1P59|>1@G&Y3q;FC z^gmHj%SHrgn>wS@Yosz!+(ozYg-+q;;Hvfx*)Cf}VxvKGnwSa-y#vyCioeg;#J;Zk z=HCHI54itb3ZOObF6}~I&ink#1JSCI_`lyH6}~aKSY6)w=;9#vpd}i#3*~~geCfTO z{=zO;DfHLS5f7Ue1v8%`%WeEEMVXI_!Ym#6PE+tuSr!ZLSjQ;0`ClO|`PBaT=*)W%SRU#UbVu2T(%HVpY*0&+PwtKhxAUzm#%D*11K ze)3)1Kj0ZTTc@eTb<#f|FY(G+&5)Z#QNUwn7Vm8;{=aHIDWm7jTt-ovhwOu}>qiYG z>o(mlU2VE*OKqCptsX8pp0Rs1dT+iv`UI0m)935;OC=>A=Gb~&%<;S>(tCQIPVVlz zyUzUhG)|^D+U6T5Z0TS3H<;so(MTTB$8b|-xv}Gy&?_)P%;N%jx-#eA_nViN#|ehV zeHLdrn=W@f--K56i~z2m|7!g=WuepHBAQA9a?KU5eN#;wAAiqSYl-J0t6F|Y7?|1G z{&O8(uEYrsDv(?AF?MuD_{P>0Q2yp&@yYHdk_6?1Fq?Ys{)c045NCcSGBqbG@+-rk%vyQ5Jhg#to&qQTx2iB(R-Xx9`!{Bw&AhXu z1=(fN8=g9Qppok=!M(@CuOGPUSxz#X7@mma$4221)%x~9lV->h)0(>zdX3dP(^I{X z35oWZ@kuQnUyFY6vADL=QXYPls*b)AVqhNs?@aXR=Cqof>_iE7oSygLl0#xY9e>Bu8W z35N)daYXW`I&Nw?aM4qEtiR^HWkX%Jl##m6S4EUiXwKX2ep{r$Gt#WkneBm0RscE! zg->0jF35TOcFx0Ds&Kj_e?!}<QiMo3z-$`jlt z2q&n=rH)ynq)YCieOmrSylTI-EiQTgUTMn72j-{HnK=K#>ek@SumRCRslMZ!Cx!H1 z7}_&Nfw{f94d2kYp5zh}Zww-=C&02aaA}0mE*M0Y9`Q*X5$&UDYwoZod16@4JL=_6 z*L-!Q>kR!6c>Q;3$^I~O;)>3_vYwKwJHv8`uu)BK8)1G|dP+Aw`gVFdT7H${|RLMgm2i3Xwo)cNwwiej@kIg?x~ErKcjR}^GraKW@~sPns2@t!qhLK4|^P)T@H7U zZ^BxeWaNdp4{qAzDBA!$f|H7sn@KR8$IDGk*B%+g06S}J##yRRQeqpC!Qnp2%)zkfVzCtjlZ-a5~qXZZV1!HldWbMC$1`Lf@cBm2zYs3|v*!bDtbuk(wd1^2lE&i2?~&tZ3>N*#bG z>34N7o2jNyxb=~~BR`KM+esea=VL*~8S3#7~A zDGIt;q5j%?D+irj%7WUgyFQxwXMD{5-`+bi81p|nv{|?Abn`fW1w@KFAGj#IZPfhg zJ#yh@9DNSsct)Z}wTbEPSKmwT=Di=yjJ{MFXjwZWvH5W~^nNf9!-2hZz4L`acj{Nl z|3Yi{TX>A;MKA0eD-a2*eOP!!5Xxo^t8Z>F*&Z0w&@c6C&JRk54@T%?y-o8@v`GwS_f zn94UHlvSsJTtPOj*1gXlMKQ`|fTjJf9DWkRovHV}=`bGMJho zEY|JgbWL|mjALQ++cr?Bo@MDC_?Yvg)6=3w z;xavlwWEU+ob?x*I@bDivKaJffB8>(L{3}a3zu}t`+#l-E`Eq3qkP_Ai)h0T4k+TK zR7Y3J07zy&?)Ykbg8t8i*{vr~Sf&ldNh{`7Q`!^}&do4)1sFMXF+T%?k6C>xZRloB zRyU_x{_UqOeI$C!lh+`s`6e#6OdBeaw5x(}S9L2@3P^`JT7V zZutCOE}M~xUM!6iwUEX~Ej%>PMn-#Af!6pV00=X=hxMruS4VtHJU~gC66l5?!Vk?~ zWEd^3IQYj;EE#Fe4FVz4VfHk4aQ`5B;$1;ov3yl%^y|@b4LfuQ?Du=h07(lJ2gYp#J<56j|uU z3ZVZHF4k30C>*;`nbqHjT`A|w2t}7JWB)2OANaK`8ZTC4n%KQ9FV+$tWbqwbg36IT ztOCL7eXHJMDj5@oTUC+^NY$)w9}o8QE+3jQJ%4^zwWFdDX^oFp@IKFd&y8c>y|vf4 zoc%!2@2Tf^QN3DkLpW&zL(|vu+=Rm}1F#4DrXiV6wnf1Phxf{Mlwit|%cjmVBqk88 zj+UX-$4lDu%P>HbE>impeo3&Ex|V6E?Cbn8fJjN;z${0r5Eh>au&VTNOAr$ia(mA% z7_BLWNM9)Bh=;V6_9zsEWK+s7%YlbSF@hZ#HM=n0^RR=A6iqzb&9+@RKc{Y#0gPr2 zv@_q43G;PIKf&Oz2_>V24HhUX{yh7Gk#tJ*De3USoRA^#s2tT{okdPM)zMfv#^i=C z;N5}BVeH)aM5dmzJIzD8qsO~al}m4i<9FFQvzho{{&=LFH@!udfIoWi!VAj&{_TeT zFXeO1F_B&+C)^jHMXH8AVh`k74nVj*yfWr4_Jn(uej4`cX1J1M=LprAE5X~A=AK{3 z@_e4U6M0^QfY#T27jsj4!!jX(ZVUQTDz&+#QaVW(dCbM5Mo6F3S$077;M%v$sNp!` z7{$Frp+TIelv#s7x_1uUpZALgLWM;OZ)WDJHP-%nG+haA;FxHvgJqey(kok_)Hq3& zfkP>h*}EHE%GP>MdXgIfqqd#Ptd$gty{EEl$mX?GnEGYzEDrfNdT=sOj|bh<^@GlG z-t8y3+H#45r4aqur2+#L04BU{*Y*7}?bn_6mIfiihsl%8V24D#Tr09!Y%_gs&U61q zDfB*E2_^DRp_?UIoDuq>$1Gsm-(Y+xX01UELG?UsZQp!ttLByH>yUFM*}0Hn8MaDh zw7${zgtA2JpQq`vLf{$gOFokmWO?4gL(gYfdiG;E(1Wz2F>064fsJb8_g3Ae;{5C% z1vI~K`|T^giRm{Rav?f|azknPV7zSoFetoEVMUz-qCWlti=K@C%9$FmSIVK0HiP^m z^y~ZrJWkESmyS8JiKQ_2{&7;&%GumUbyvTkk{B;*9N0FA|B_17_s6;i3ACdOrcxwD z31V42C0VCIxQ?Mp25^l=SvkVNsc~DiOXbR-{1v(;;(pNVHazIxB@|sriu_%>);nr3 zfvLRf%rG$9>T2Pa)_1v;|ET3#8IEOtGuP~BG`3}T7>%r4r{ovjpvPH2=V1MX(Z#x2 z&IOF$3$}PM*cXf^@sKO6$!&5erBS;{fn|#YQ=5SCqg-N*6>_v${TBfV8ya*K{7;a7C)g)gMq&WFoX@Y_M z?2aVdE4zq47C^pFO;OQjj3 zdFSg8w4;?q@9ifq3V9v<4kgyvm0n*4vcEd>sZejR0T&(yN3o80>dD|5hTgBL`&YrI#JPx${2O@+H-Hl14v`t1$CEJYxgVMTx0#?!pdz#{~r0L#Sg&SaEQg z$d6y;fG;7jklOd)-B{HI-ww2R18$J9($b@y;Za6cAU2FO8o7qp44o~yS(6FcP#@jLX?3Q zva@Ut?@MpEH7}WbA$18vvvi$rfi5fxmpQMb<0nydc;W30A*CKh|8UWsX zKwl;Bhe9-{OalwSv9%Uu+l?qXcuG~R41W!tb~Rq=$C5|kJuf{4`Bg}i3`hox%pN4G z0T}eQ^FqkPSBH(2lE|#rTU_qeUaX~E?q1h6r)q{2ioI>n3hG?~#eld<@e*&Dt?j<~ zVq$e(iU8DMUaEC6t~``^nv08Ge9Ajm)f})e-pJ8UqG?qIbt+-qL`I2=j|i-P21d&8 zCc))e@7#no9)BbuL(IN7SXAXOA0ueui2_sDXF;M~5vHJ-Hjv{Xu4nA&g#?l} zh%-wfcwxv^WOagS0mjrL$<8TpZbt_NK^s$@M_itA{*HtGvgYgEE|{!p5^kVX#f5cA zQL;$X@m=z%f$LAL+$#Z~6^sRuvwrA02svf?<>6;y9W;f_+rg<$8cH?n2O%x#U{;mf z64v&cDnLkRJS1?!C*t1W(`k<1zp^)WVzOi1JRCe{H`tIsg~dZ_cPHwj>+QB~IibWw z)0sciCRChvX*zpu(R;2>n|e81=yE%rl37^^kZsb%_7@Z5&`toFc-NgG$}CHBzT)f7 z%C^Rqn6!q5Tjcw{7+L9*7u@>v`z*jXeisPQ4O{i6bZbCkemGx8oh)^C!98000X;P>2ztj9_!erUxyw0J~ zJi|u5+=o{DrC$z5ERBCq$(B>n_x$Cim-u*sr*hspJaPVa2r0dL=DWqPMYw-28Az(q zN#m4Knxa03I!JBj+{df3wO$cbF2P@MjnKt6{7}a<9RF~xvF$(AMgdy5nh+L>n|isv zQ9oNUJXb@bG8wGWM%FlH|*$#WJ~ z8aV3S|1Xs0ZQ008F=6BwC2~8swkCY-+_O7AYcP03m2RReb}RpjP^4X`3c7Y5Y~@)K zxcGrX!JzB$ak=9K7GIYvD`Y3Bn46;3W`owme_VvZ&>T7~vd_W5)nWYp&A+=zW^e-6 zFH1QhIYfaPmdeSm!;-Z75R0{Qi6I35J|}B;6mW2b^;%k|;A`mCf+@qpY-#uYG5cS< z8EGev9a)yq?LMN&S!dv?i|7$T4y<4xniPNbk@WW+iGQ?_%&c%Y4^RO)g$IYAJdVER z8OP0$_S?O4r{EX5Ez1%QTkbqL`Q#!Skc|NHv?)0SCG_>=&O>_PKh>x65TIt%=;lbA zasOJ}6xQ_J)3bli_A=VMV_)c(5lk95%0+A+kQ`xUQ#kB={xLe$aXEcO=7+Quyp%qM zH6*EhGGd2x5R9@oc*$e`)BWX}r2pifCvv+k{{2(stWJx(Q5eX#@#?sD`p;z|Vw+j< zni~hbW_zT|utO@z6A&Se&%oVvhFHj?CRa*8$*&vx!(p6d3p6iob%_g*StrIuZtV*; ziFB7??m#dq`xIX&x2oi=e9$|r3X>pB*)8J6^WXXiPM6=_*;JzY*EyJg5~e2-L#F=z z4Dr63Z)5Gc_ni3O+pY9}gI&Lr_rgWUje?Q#{wOAGh+UTN`&I&tw1SzOs)~}+YvRz& zauY%fadOcdD7b`FSodMs*s&!)`_Dmuj$)9~`G(`t`KAGtFi1JW{0*T&qVYFp=|%(% z&5A4C?JTUXtb3dfhfO%RD&o;4pNB0q%MbDtvuLp4S#p#`8a1obBmb*9+-Z2_glGO+ zXEUqHfoEP?m3=;gn%iEfJzlEp zx4sR8u`K9T3y5LjD?lJC&Tx>Hiy+rsH1kE=cHmGoE?+eyxb z?fTS|5^O81?dYn*+2nhHN)(=V*bGWP8g5PRH6%2-7X^~S+K)22%JEyLU2e+8;Cf;g_U57ihat0hcTrdF}If^K!KJS=_=4z|3@ zwsVhP=K8eX@sEw)CBjte8;)#kxw($W)pf;NYt&5#N80h$9)vZl*sCf{kr0}w6f>SM zH|kdt%?n%__xfmFj+F)0)Q4UtKr}EmheuM8x9x`yb=3Dmt?2V;OCHAzZi^X%RAU@3 zE_mOIq;Sp@5~GLucF`56yqFMHpbt+|8u8%=Kc;UkRTuZFbc=aZmSZfGeCHtCpe@Zc z7(_p+l=UQ|-gUyF7@>6b#M+TAQAWvq)K?1sQUkEWQVaZB0T58_5_0niRvjbs-L^IYU&$Obe;`@(b0|IqEf zyZ}>Wc0Cb&)|Uo?5lV?G_W1ZjIm*-x-*5bDtIzIO*0)r)G=A?UOR$i_|4t`2Q5?{t zss0c#iTdJ7thBUh{l?+>K@J+og=*wvM8 z@6u3M9%x)@MY+NYO!Mo@m(hmScp~dvw330;Slin_Vyo@_@={`d8c6;kUOVwE}JccoFFqRxtT(a?-)EDzvwW*lX@$nIciN*yybaq0pwa}1F+Mv$IP z2!`<;GjV(u7j*kA!252u`tK*fv3Dkt9v{WK(sXt-28lEXuZq3sgmrlYEOY_J0~+TO z?wi{m2hK2&%Y2YLqu3R54V|&3CAu2tkn0{4y*ZM(s(W=9PP~ z)_@JS6i)d_KM3Bjp{;AF5!-$m+L`V79w*_; zLEH+@r+)0?IE`IjVyW`cP?gd%n)E|)AOa>!;Q3}#>QXCj?Ibggg@h&GA(srRzk@V4 zRXFLlA>}b-6?52%a@YEO#FJ}-n;0SCSY66v<<|f_$geSRvQ0aV`j2udl8MLMU;)XJ zwmO`@rKVzOe?>n7e!e!w>*CB#Z@XMpHM{xc~HC_!rn+%;x$s(mTj zvz{E@qNNofjnj5hIK~_x)246jB*94S6c~7QC7<^-s|_J}RPPj9OX~!KVc(V7Um=T0 zdO31O=nC8#CH#2u(F-=$6}3&HDThpeK?4cnob&Lu)ABc#H5)Y z{6R@aR3ZAo!#lts9Gqki0dY+$p4-gt{&4!Nzy37A2o{t-frkScqL!8w!+y&xRF!{9 z`jD1%YB98A$*-(etZL;7e;PG!NtRY?G@2kV)*2d{wb+&yv^Nm+YXAAw%}~-`sTo0a zvuYpWM18_S$dg#2(vM#btG)M`BgP;;G@y)m8r)pY2urJ%DBo9^TU~-zQs?;+#@f|6 z5Pq6K_=imA09PESpW)#ym*84fb1kFWi6mj5-$D{1p+YY5lqp_M#cjpTeT*@cDM8OI z4_1kt&S%#lP^`m4PMl1UQBh0nAY(&WMrBv&4#?fF4@2WI6yth`ME6ff;g@i8QX-y_ z{~(GA88?3~N=nVRrn(=wtGflY_)K^gmRhUQVwO z6ZL6tZ4(n2^MvuhbeNZY~n7>4|*$yS?kZ3)4+Phhy23+!eBBrKqGG3N(S$@3A*E+U#29?Ru)k|( zmp{}E`TFZUk1|^81gql?y8Ql^uhJlaTYp8{s%SF8CCB1><3$(LSu}!4SQh1I=ayZ` zgLopBxj_9k9}Z9$mi2%}2#={%KC`FhihGFpBb5{AvF>MR}2loTMNx)5n3Vsv#)Ft zeq0Uf7Tx>pBhJ>^X;m3{d72$KyC#mo!2=?02Z5Nvk8sZxqjU$(2^p0ij!#uExzMx; zq{p4i!5d563?OU-5L44?%w{fVP|qF_4UknV=Ns|c(J!y;0O9tJ*6Q044HGO87kqzQ zE%}9A`K8pmNL$>~Gurl|%EI4|5#LE-gM?J)Jq!sIWW*vlx|4`Rs8j z<#{X>)egfi>2qY@(u@6XG74di5!Q<<*3MQB0NS9gi&q93k<^Ib&Yy;w_50b^CKYYM zVxi&IjxqgTEuPf02}=vJo3y+M3r0$^P*>b_s@F`y-GY?_(z2#rjw943=y99z+UR-u zZi4MnkUWSS66YYiT}Qzvh7{5Z_oz(Z36DgVO(jtChqo1#Kxpx3G!A8{erJy;5hf1n z)*@x+MCkRq@B@11{bgF)9cBCL;Rr2MfPVoaG7{?~RUl~N*L2&dRMue%*utFf}f5kzD4CdzT9pV0A*KF8F5L zQU2FWWU(ge^uB&_X(cA_;uR3&4_X5)s+>I4m^>9*1O8vv=83BVVG4ePX^isiT}G!Z zra7_m@d|pr%q2;u@bNdEovpm=E}vO_$a~N*kPZ3Ai2)PFJ*8~?sZ)#_@tlT5BA0B- z2;h~KIZE+iN4lB*fOS=QA9A7}|Ig_*7R(?XoWM)#AzO}e()=Cm3bNARM@SI-u_)Oj zo;yv4zk+f=V(s~{sJUgdVl~r0gSc`QRFNIL80&=rc}+}rz2eJgObN$eiBdkpZQa{v z=7acP(eLi32P9|YU8(Cd!Uy_G(p&9*1+?O)@I_*a6#q+=XoQ-RRIDd z5!p?s+{^FiSNw?)sRYx($HLUl`FRbWVG&Jj1p^IWmT8G}V?-b7eGw7*=aHoM{Mj<* z-6KI0`)knixFTzzhrgy-sh`>S&S;u4RG(x@qgu#^5g*krf94G3ScGh6r5=zpqBmmE zc@UD`kekR@YM#ZP)5R^@&ASM`y?yWDX}#s#H_t6YxA|L9r`Yz9lp_J~O3+1^iHMynAyj{V`^c{v3h1Gg|+k-fkwpYNM! z+z-^>;c*CA8o@EJ-$Py$(!|PP2QA;kqUZff<;??mKAPS{>%i(cL?d3OMt-D5qfbQX z&!_iZSuYR!$fE=v7C!}2h#}vRZgPKkV|H{3>yk!bvf*HV2ZeHH>lIc{Rq!P zPgx0&9?nO23Qd1fFi1{(lo^b_=xIEiD^K&jV{r-jl?J&VO|zAkjQBAzMiDC#q9J)Y zu{3x>0FPFO9>$mqacA(l4B*3bgzc{nYagjiRXdZ`(* zJh10{E|^XqKV;(tRXWfGK@d~&)rrP67E|CvbOb7Vrv9KNFHL5lwW10tT4cBJ&i2hm zmJ$${&=6`7A){@q6#q)8{9M3KoYIM%Hj4q-$dk5yT=GlO%I{x*Z`q6XC4#NLX5RdT zb6i6`R@lwyxVa7_A0BQU(I6VU=NlDWM9;gnD^-EdH)xJ;>VP_mICe(Do{xX`7uzI{ zBau8**1p&hGi$=1B#>)u7XO?WC&c`uW5`Op{J=BqB5 zRj4Ryt=fn~B-hM|HoZ(!EZu@bw8EeaYsg>}N9bE4D1O$$gZoBW|IhO4t^4M6K2>zv ztVWb2OAK5v;=m=% z4-JzT0rxuAbI2ZEf@(!`d%*vckBmnp<@9wmqwUP=d?>A|qqeQX>u!xgMul4t7p)Y% z?g7}#^;LT(+84=nN78fT__@)~g73G#nK8}>wC`xXzjEpa@b^K}I9BvJKZlAQhn1z~ zKHR){xJXZQN3jOh^Du<&*hGBL%jZdTPvISR{X500WtZ#UX&33~wmMz#J)tb}1U8g9~YiX7pW69Gwra}hTQ z?UI@}QeIBCvAz0?U18(YDIsj?Qyi{zTZ6$!C?5xLq6P!IL}BD4Cy5!G1ZzU9muc|X zuk#S&<5?!f5AbBRx=I( z_*K;aeC_RR(-RvblFKfDmEcs$BaJoEbNx7tt`ik%r?zI zZ97DVo5G6hVy0T{lb{wCDaRtLYgBvBGLK*Md*^aR&gNZe%$|(rGRzIF5 zkcuGFhX|qOdtY@>RoVKZ@}g zrU{tc_mN4PI1d}ihC3IN_HaJl(wsM*5uOh};uBA#f?RGBhabiOOPp6;r*Q`?c0^_T zV^%+LjzPo`cgL>#i8&6<)>Gnn5vuFb)Rkd5FzBC5r_#uf#os;yug?snro)7nd0fO2 z%4gGO&+n*_S8W?AzALQ07(1s#9Ov$a7yRIZUlO!{loMuoZA>j zpMu=OjYOQU*c7*@?0E|Si35)p#_L$0gx`ram}Mw2JPped4zvIr370BKU>}x$s)88} zV)jhKaO2=e$vGrh#W=ht@kQS|H+;8Wc8Ubd{*7HdLZ=+r;>j-D=G}q>TTr^b#ccc^5SElQ-dcxVWZ=+ ztG*IaA^uKCC~6)Kj?Si{{U8e;09*!Sj9V5-CM(;G&+cCPyq$Xvv2lWbNGokuS~7F~ zhO)CjsLdYbSmi^v;CzsTnObgA5)Gq9G8^%loBOK#wPh&;@T(@JkB^%F`U5E4Q9a9jb_me&!%9n3apA0QHdkl zRCqqs|FtD154KYD*CS3;?T1$^n8yjt0JX0@56^!KDopKPP!5l53%2|t+2&l11Nxg)Ft}mG% zH7Jl^`Y`}$4{Rp1z^X|^bFekuq{M<}(~9#ltoc%t;bnk)sIWx26nHmZDRZv-rNF#{0J(SRRWQ zBsR5U?kZT92InWk2x3;63xvk~B3i(D!sfbvnVFGl%o7f(lX&?MTG$-HBf1$zlNE6E zpTqS(uAHnTYIaG%l+A%g<4ZSN^h;FhqKd@EDp>d)5Tfbf>D9p#8Z02fJM!R)wthw- zsfll0pT4L;=)vN_gf^DCs?AnfO=hSaz%YSS>W<$6QktL+9BIJWXJU*jYS|shM;Gp9 zT=T_NojHE(^HjJL$$)~%8m_%AL}7JcYC2%`!clRf*;BBRe!WPwDA63|H(#i`G@3XrGQO@s~cQKJ0=>XtyY`t4p|9svTC;SI#S#0WxEQb=OEN>!TK>;I1;_ z{}xxOG~174F7s{Dzceqf!{NtET|!J?=Z!1VJ1Yq=?zC)bF}i$l-xDhghp5s6yrSDi zs^j>4V?453=@F*4mDpwMoCrS3WRfng8H|wLZ=HLRhrhnJ%zgh;R1pt;M66bZd#jK~ zb4Au-ku1IYoAN#2xdQ3~HK$ZV7(HCx4Iw~=5el@R7vo0oTS*giiy%fWV(C{O^{n7P z8E(S;a)xH%&KgG!INStgNDGQ%#A)rqk#HREdCHgUycRz?G5Z5(^zqJx>L?=go3$+e znEaw2U>f@TEdqCSQb-v5sUD=m;&2_tN~r9HvD;1#MMoL6-i_Q5e0gLEv?K{j#J(NF z?^_5Ja{mQhh9rB|VE@OL0_*{kxN>4~#s(0p*p!adBjhX5$y97z28~3X!g%MNHi86M zTIFv%frW5}xEL~SY5%TXHm(Ptx`$pTg;Y>#KgV!tdg?eY30$r%5TF#^|B zmS@PpNS8*B7|o?abRANRt*v5Mt4$`d?cn(*dcLY<8t`g12OQ`}n_fXR6FDHQcBVfs zwh?F6$zP{{0i1$u`*_sW?)P}H*MnHPD5*j&*(CwE&v_ZQQoHdolxHJ-4NW=BnD+Rs z&KMxF^e{=%Z;#cM=1X`>W^(2%&QfqAKX~&w$?$g7!ka?wX{z;?fGRw(gXN!&!nfRl zNLbOhwdDc#_{h4s`Td8pi|1azG%{3EvU91|&qmcj1Ung-pc2PFdO^<({i>bQn%XA4 zp%Zh$VpmkHWY=w9QD<+3b@Tm=>+7y5FOVCPoF0;07P#w^(mfeBzLfowtFM$-L(<06 z#fhLutxPs!zR9&6o{<+k_=)~^A6zttGYAZW>v(XV9||9fxK6>88a z<=26kL)>SJ?aZpydp&~bTi)IqMvTNzSH711Yvz{k&6iaPA4NlYuT@B#58iOL2pWH% zQ1QtVA6;<^$E0p-u)g&8LvPbxh#B~ONx*3zOmZv#pY&qnM&5!`WHeo?2;=UupTtV# zea4lz(xRm6VxM8gT@(PF$H9-oPN;Ham9h)`_EzpNTYkSWbUwaVnYOi7!{*k^@O5)p z_!C@(n#dofcB|;0Av<3MVjY}(a(qYEmIAZP&=bQbvU{RfP@gIKgnX5G_Io+OFQ^08 z49^~>@H%!@ZSC@)Sm1gJ2(?%^1md+gaN#xyAKD(BQ}s|N@D{Za;4`Od;`{w${dg?X zfBrGXgc~^C$$^4e3RVQ!Kl!%j;Wz!BBKZKL88@w2W&n}oNu<~A$Ir+siv6njZO(f& zH}0xPT^xLQNG$&Ej`e@-A-63iUfxO`FQDSvqJaEkRalK z{mzsVh4CcgB;b(wHnX4NL&*C75K!H3QZli3rs zLc%xl!P@?4a!F}W8*I=m_{a&uAi4dYapQ5IksgqT1q7al1R`uFJ08{^nj5E^%-ty$ z7BzOTl$^EhC+!hRdHrAsUp2$oR5!f!a689Ust7XrSak~0#1^1J&wRJLO@Qqujs zm_=Adq+i9(Vo{=2?-bVbZr>r}wC5&~8V=8^$Y52jcr{0Z|0^>r0WBMaPz&PGwrm|_ zNU`X2ZqMIH7AZN8yMNZXlPm!kT0IL2kB9<%nmn$~hnc|>0+SsFfWumBg4;TlFh)S4UUOu7HpLE0&l zn;p6?20P`B|Ju`Z%8ykQNq zRT+4DD}8E6iE?{uamq5y7g>e@zl;Q;g||{=0uyF%s1tM?*!})$f;Zf|*|uNvir!9PxsfOC9$xr9)kmEoN^)ZgijqnHybBvJwi)Wrl}7`WmK?q;~!` zNjMuO4r(~e*O@W}XNbH~bPh&qZ;Mp9#_OCWE#fB@kU+8bnX^q&MPLe<(uLV|3O#*A z1sH(?Gp=P!+o0GdOaNjH$XgU3kh*XLtMdx+rv&rW1PQd2VVH#FZmlNV<@d&3z5m-)GuwEHP^D zNV-na`5P$(_a80?D$6mPlCxH+R*9o&_x{(oD%vFsK+i(g9B{W~lim4pdr{KiORhtvZ0j2}j$${I0X7d7x#1mtI34 z*R6*pyasVxlM^c74mLToz?c|w0NUrth^rL-)P?j+V|jbu&xF@;AOz5j{>W~y&0hJ< znZTY0!$N`ri4C3BYmA&ECGg94TuKP6{(QQg+Oale(CcXpBgM5X=;z&IJ&Rg)bxjr^qJZ>E#d6hD{$Mk0qa)6 zKyK=UaBlBa)V@y>8V=of;alpFLa)6K&cu9ZJ$REWnw?{faJ=YR(eJlQ1lOa9me1U+ z%%YX&%uQ?y>jqQ!#Rt){Gy0rlQ*N?;4?fL(_2CdeSqhg-=*i#TJ|Bv=(OxPBEpRgg z3VO0YN|s4s1rzf>+esY5K7b=mpX5i%#Lulkks~8N-y464KcCQk2YYN%EOncqwXEtb zOrMF~*`h1(01#dpa;cnR(klqlS@xxdqgZHFgK`zny??tc!&R1J*}U4AwbF*wvz)OL zqwYQ3`pe;>If^InJgnMqlmJ2D7jQK#{vs*x9O^VV+6(NE-%a%%0bqZl>O=YLXvyU)wl_M}%IkJ=*Jmu!7wYz8BPE8Lx z&iQ+`Cq&c%@v4U;Qk|>(fji}!ia!~?3KmF(L&1;dbroV;<0M~;GIS#EENV_alW|Bn z#zIyo*(EzlX{>|%lNfz%Q3kh<_8z; zaI&YGOjKS$L97-aNdtqX?euWej}5A1*G#rVNcz-qC7M$TQVwAfYiE}cu(1PQu>g5H zcD9)!6e7Auin0@Z`6`@Yfiv#-md`hZ97aSXrnWX*2Np1(CGai=pnW44kJ2`&{eh@5 zFhm5yk*D~i519lYq4v#dz#X3yRJ#+ zxjV0+rJuc?6&wORg$!a(Wp@ul6mWjNpVRq~+zSN0 zv-=tFzE%c_{|A4Iw8vrG?1Y*ghF}P;vIOOi3xA*X&b6RN?2FZoAZBb86_2CgZ2dw3 zKp>$$QifWakhcne+n81i{W|^mP3LIlpfQ)oC$=M#A-|@6$k)CB%{5GTUAUr`6iFny zDyb;tK8XsioQS#Ivk=%sQBNy|q5$YFQvCG~j~33%&)w-Z{r~;~8c>Ete8J($)hVpf zCU=&;o6gHptRk7Y+O_c=28jnQf}_7oXgQoj%8e7lp#%2oAc{GF7*!8#SdL=Ye+z|u zS}>~pb7#yJr>vl+YaOEidY=Y0U6)pcxd_up=x-w0{lX8}=5rWX$C#Bm{QyFn+?Xue zpoGW@aS5N`&1F$J_XN^Vfc4i(Gc8r=yYV=#Gb z<4>LEB%!NQrJiQ*4iWj&a>V%@FjIya#645o1vr<3$ybu@60i}9+Nca4Fr+OJ24uB} zbw4jMj0)-J99&3**0dRYGCN`C88ElW%vI;&i(Ku=ebQWe1FMsp9%nJQ+E@6^X3R$H z@CTc9yNU&+Yq}?R#q9aJ$`ykLnZ7^z?-w;1&kCh4a4DGj>g}PPwE@jYqxw!~=Nli* zSs5q{H&8`|o|!O!@M-~2ZL~6dZf1hZ?c`?0)89>Du%E!*-Qw<&Ez|X+eapx>JPxau zM2E;jl7*@TtjqCj*QWnO;Q>BELxce6Uau`0=Y+CfXuJX=$1#W)ITs)CZI=8vBe7)2 zhqOpV;U@#Z$V9FaCO4UdoB{d(0DHm%DZ!d2owsPv$v zzU6Nzh(kUSF@Cw%>l36%-ltnOeZSti!#~)!^U!q&HrmeO&Y+?Fbk)%C=bFi?@pUG; z7tZvUfb#VuH?*K?YRasf$e1?kZx=tiBvo|Mxb9M3C0ZGpD!I)F`#vTM9j#}6Uj661 zamAsstT*5Ttjg(1voXelxG?@?NCJ3z88@5N^OKM&f`RNucYnl)!^dTZd);(b{JZ(6 zW#(L3a0HiR!+v|C*Y?;B1}%}^50tf;g|Q!bTZ~cHa9$g5#aB2l3H?J!!t@9=$vKCd zltFiEYirgzakc+TntElAoczE>;~1z_nctD$?n#+@y9&1(BFnP{*_Y+=I?cv{Ma07S zzh(TZu%|GpdzSaY$idUf_Qt|RDNnZ1Is$(R!AOGQN(U99l+qT$D{!XB75L1zuy}ID zpMq#g73BXoi25VYYjlaC^K4=aY@%$UEw5xMlFqDD6cVbq^;<;HR0o%7_pyZ#e7Ig*8dIMst>oG{%JV@#mBy^WLv9=EI5(oS$O_wzy}72!5@d ze4JOI`u%J@$f=x8VI+^iRC>m>ucI>sm=52(Z0wz^3DjVgvlPQq5o0i zkfoKfQqZnIzQ2+5Yl;yUw=+v_OY)HHnBa$-+w$~QB+?t@X2RS?e}r1P)C&u3b7%C5 z;(D!vdf&z0cGM0k_@{DlNyuJ+PnV+>-OP_Hx@&TGQ^~f{s}Cjum{5x>=g-eqc^dP2 zbN`D>OF^%*s)2R$jhkIdZgIEaqw0Ysy|B7n1O%4W79=A7^vc6kSssSRev zo#(+O4{EE$aArnZB^L%UUCH}ic|@7ac35IuIiSF#QM*iAlgp-IzqX5c=eu`}v2Er4 zmLc&ko+@LD(FM0dqWEJ52GJBmLv@R(ocfhpoZZW$-c~zmzR}f5qx19FL~dh2#tbk# zZ5`{kKBMnf`+f!Hy!uD=_L2oub(4!uER*&Zb}=!f$UOr|Ekwu>B31rc z=A$qtJWE+P)g}-iN;w3y-A(p;hgW3ksyG$oip5zdKmt`v`fQo?8o=VQN#Skad9qwS zZ|U05s{KE4CLln2Q`{fa#y*)!S~c%#;~+&UEpjgd@BK1MVu&{Wptl8R=tIj%yh%VD8VxB=2=ldlqrzr6tC7nDB^9!lY-cZ|F zZmh1cZa0}!_HK+@hH`|)OvoIYM&v_W15s!JWgvR*R|DV~qQ%!#$NHE;UW_Dxi$dU{ zR^7Co_6KN&l`4`PH(?X?Nccd$2u1@i8!(I!M((|e2n_%k=Dj@oI=9~C1>!Ci7sLhk z3CS-?I&9S#@~x0^~0$$H2km<0-Yg7(V3R=*NWx(}5`{ z;Z|gc z&dM>7Q4Esf2-E)V>nY*Ms`f8lt-EQi^Q5r0?c2-}?T%W+yTda!;&F=|j*tU54{uKB zY6Y%EQM=`Y&bd)m;W&wB{Cn=DpuZtrV{L+VR^c5mil_t7ke9W7`$+&9X`w-~X#MA$ zcSYDqI_&ON!r8;uAP9k=7daJ~UY_ZOqoAP(xdE);uQ^Fif`kpt9r_1Q;Oy#5Sq}ik|ANFTL=KgNMlsFS)@30Eir&$tMW^-Omnt}6m%PbwGg*~{!4fV-F<_oi^(cXg0W|XbkR%{C3<^5QiO+~rB z_JweF|BNtN&!}X-bh?PKrclLBI@1@+HgzHf{PijuQ2+DG$IvZxdoE`22@T`r(Q1z@|;}4)ua*`133S zTUEaSP}7ExNn9aVCc*#$XIAW=_8I_vDZE~dyWjl+Le#$G;hO(YQ*f?P?ld?}VhSd!c z(i1obZ+^+W-iMF0-Z1X zY^Zh>`8|+`OoJW`P2Z|0GKTJpN2Oe%l0+e^}X3FVPjqNhDldBymoUU3J(vwuJ6nOZ>k3bOCI2atW z$&?l2+=NUm(86(SNPyJtC-rKo-Vvh>hq8gb{-P%IknFC8-JfV1+rqWZkEV=X`p4NL zyRpc1_(YV+GFSV1X!sQ=!tT`acCD#Yn9S=sjqb09l&y+U_$n7@ycGZguNaGpI2+U{ zOfZZ-*~QQXV{&(nT_jU1f)Ub$&IyLu^^SmDK|?Y{!Z-=j0QKuz$a<%hnEc2*e;$DO zYRL@v9`wFsFL+`LqWto_X3g#GWo5~)w0r8qWtZA%ZfzVY!=g=Ms~L|pDaD zd*uKIM7ys_3Z`%fPv8H1z_URRXPlhMGeqqI68Zy;Vcb~c zuhM2k8X;RgdP{1C0mIS1IQA$g!!f7VdofJG9~ov}5(J-eqzj_$PVF4YHF_pFY^f!V z;T3+@3U6))i7@1Tq!B^Y5~Al(1pNkLf2{mW#(x4(1`4;abuy6udES(7OLID09>{Ej z1_)UlLXFDz)(VT0)}UX3UI7!o;?AfsPmiZ=VushGXm2q6!A5x=^54f!mPhs(DZsor z;du%8|4x?Y#H~JO+@8Hjjec_yvBv&Hu&t5PJaRHh8)=GXKj051zT-Jv9~Rw}MvZx? zgnpVcI2N5-)%%t5S$60bYX~Ml@=F1UlvBIAW3Z@HE_KKEgP|@|CP{1StAjwtuuP2L zFM(NJY0Y+PS>Oy{Z9<}KS=bV8@vT_aeYc|Xv-5G{G^}*u8*1qN0>pDoE=i6QdWufj z!1?5!F4EIiHcd%pL&>ZW&))KlL3-<|X>GTOY37NO5Zve#1C1P=0HM>sJqDM^9v_Vm zE$qIW(xu~X)8o)6PE-n*3XKVWb>ngPm%eHTf0$~oA znbznl7|)_SHl7>=gTo!T`mR`p)Qx~!cjBFC#C}OR{_O&{T@dmroB#TwnB4m?+mmmwTN%i|d4CHW~uEF4lWEP81_If?A%3+Cn?f|7_17 zZaO+s)*vUR{crrnA?*KDx8}Rl=qZW`W8V&W(oh#Fnph2Vk);l^i6b_7=uPw{p%Em@ zkO~5X5>yer@us=JvRzGx9w7oXY&FD>5IXrmoQ3#zxH~@Uf1}M%>ky8DK~%2?4q&Ym zPFfP_7>I}%#GAzb5oEr-&292E4GiqBWhnp#=?aYVF-eEtDlX)zX-5Q;70hM}X7Mru zq#9m%A=iWmx3Kq+T_OZM@WA)(dMP>iOU&3d8ok!dN5=`n4@f37QXRuU^NeY4?0pfN zKKe?lCm;<3prMy(G2cM~jU@SgrZ2pB?PF}};vJR9(}53NAZQo#3+AfHx{H0-p_-@n z&6JHqhXYJ%F&GAl6tgHnjO8xG@oqgN*~0jL^%*c-PW>d$Q`A!eufKe<57(*&)((!W z4OPHVOQh6x3QKd6Je?LbW>5ILe;7!zsb>xTk&MC|ePci0Awrg1LSh2gKtWZYR@#uW zw9Uh}pdEBfk886fWog*^Rs5%o;D%2liA+Hu1vyKp{AvA0B{DhXFobnV;pqB5Q2;B@t4A<5?h;9P)Xs79?^D2-SG%SSVw_s1Vb~=}bKShF z(>Fu}i zzKp;7*HMKh@b+hrJ;uAwEYGhwW&p0#0q*{To~hv_89DRmE`d}BjO5LIc@Sr|MYkj7 z?`J%xqHofHBFH@kd~vcvBOej^I5CkXVT+_)KN7Bi`s_L60!4zi<|GoSeEKrwA4rMZ zC0qPE%|R$3GkBCU=y}Hzg(M$NV*3>SGdxfA1UeI9Hv=I~oBNy_=X{r)8~xw#%40HlH{`7Cp1gjtM2KF?YzH=kcyq;fcliljn2 zjm%XBv;;&fq(hm1;iMa;A+I|y$0?z?VL%^f_Ji^U##{YU>pGmhssGmXj*DqcNoOje zMFPM&*)gL|E62^ImjvM1u|6Oh&A%Krgd3~H$6v$NDs$c-Gn>_pGfq$t(hrl!-$H5Y zFM~A*O6kk}=s9fD@fT#7Imp6{LhL)a`%Q$hRXp%T#_U4$oeRw;jMP6BzRLIzko#1S z+k9fCr1waP*wYgc(qdCP%)TDq3wcfVK79l$LB4$?G!hHHm4w9YZq{NI9VFtkL|N5? zI%@^X*gm3ZR5tmvrel=4r+qr~r}{yzWew4?6J^uErtxQ{L=)m|` z+^xqUwoOlqm1nsOVGt8Tj%%udmy;?QVrSiDu}I(BcgF>qLnBfS%t6WlGuV&>as+Yk zJx~}|ASTH)u!6S|2tCXCfAs4I270Z=u_{yqIjsoNi}eWgTgW=W*D)5-k+a7s1m-G6 zdfE(*-~+4CQ|cFoHVC5=iGK*OaN(WFGGB@^HP&L8c-k7s_75q3rc<>OWTQULMul(S z2PRS$dS95A-zN*71(2 zdQ8)JmIIrbcqh7r)5nvx8&Xg1sNMBwZa1vA#?1(st`nYP724tO)wN~=*%JH2 zc1r~k64yj_8{KmNPHryvt!GZkT^Nt5DOYMh_ui0cqUo4 zX%gwVje+Nao-~ODuYtO$v`J}JuEtCaL?a;d_1T_l?rS^g=CpzAN6llb3{U>RJ zf1ipVr-mHsX0_GIKTOeXQk;e4APtWb!gp|_qH{!HF{a1TO0AzR&Ri@rN< zrPJgY`>KMFgF1iZ#>E%*`d+T=tlb zm$nO0VM9M)&yWX$Z1sw?w$eTA+briNA4nujbH&totY?NUqVtevXGJEfc)z-$Ijcuv z(H--m6`Z17_GF<_$763Uj~IK5eUq#R-Ay#bEv*v_!z%Ce2WID}^N}DfET4+l@d(HN zP@S7PG1vWEk5lyD{wp%H%Kzv8r13t^Za@>Wxbvjk*od9qQZKljp>`-})W&o&{#h^c zxU|~4AU^00OmlrsNB0l0^8bbo$RRaCEG~U@s^QVhd8r!I*f3>&7iRzora@rggHB=} zuozQOe?x6l-488oUtZoW2SWE<<({@KKgy3VLR$)q#I<~Pecb<>j=JyPBS#p~Av-h( zIuJ=(1S)9$65U;VW3M~ETWz(j9YU!wrOM}dnusw?DieQV?w7isfyDtxwdR@w)W< z*IVr2(mn-iNDBqZdv+xU$5*)ysQI}l{e||*8qKh?u2iR*JiIU6Xf%464#JN3{Bjgv zlNmFi?b77RcrNnPl@c+-k|@%ox`fMODQ@AFN}|~$$_gO{hBh>_Q{$zGn6LZU0tK}x zU!HpEXgkMw>e*vB=Pz6JibxUjoSG}FbyFlF(+ao@R>vV)KEfgiJ*dk(r3})G-aEMx zF1j%fReW9SKf{=oov5t3)f!f`@SQq^|fFTpE6L)L! zse6_jeCpfHnC-=b>@1h(10>)@}2t~H0Vfb@O3d0-2pD;f>r%+E~s)XtT#&kwltwCtiFoR|~ptgLGnt`yY zj9TtHs1!aAOw-oNay*K~$-IitVB0&hn9SPc3-+K`@dWB7K*M0wBWA>37NHzf?DwAc zx4ceB7CizDcz$+0pY3gKsuXIUuwa>D(*zc?(kE`ChMGLcC>*9IMgQeotd$GQ&3?Y( zxe(X)}R*1Q|w*tXLRbeHwZhpev2Sbu^#x$Dza6 z-SC2#)^90jjPl-snn5j|Z%&pT5h8B=1^hZ88S!u3sw@Hjo`kM*M@tXuMW7=qn?p|> zPkIFo*q`3vhM-)*sCH4o=g6MNGPe>lcWXU~P)cI^Nh9S}t)|IWKT`92lg`8LQYHc> zxJ!_^gs6vyRGAuwtVV<$X{&f#^HM6PC@BS43?$4Jx3+1f9-np0m#62e&GvI2tKH=P z+~^q3dU;8vUL0fIG=6$Xcz~N7QjMOvLZ})K9wI#Kz(YAi$hNmE!P@}fsz=T(;b^D% zHCz5C`gzN*w!)qrMmQTSVRzr#hzgTL2;e$|)l8JM^)I!t$_`O#H_!c1dP=DANl3_; z4|VM@X`WSeB^tY-F;~gvjXMhba6(SP?+0iih;t41Fhm$`B9-d~#&y8U3H1AWgh9ZF zp~5CK2cz05=@yJJ|~8J5WuqJfFCvO0r=^w zG*1{&pF7q=2bVh@Z>gx5F@b@NhX&q{cPCFKpmYlin|hCCAXg1bIz{TtJffp0A$HSa z5UYjjOhQdM(?Ok*`~oN8DT{Ne4@{2IHW<_9J{nDrP@@mHdJBuF#su*4Yh`RCO_0+?;+vbAR{5Vf5DcZ)fMZx`R%C*xrEiFmXW&)to=%3Zr78 zUBzQ;zsVkNMA3^9TP>3k$(zQwfnV52$Tu(?*l`{y+*o2zA>5#bQD6ctE92Y{BWjrX zK2fuu8~Agq&)rOGiepifx3QVXX&MW_+c-m~&J+WRI_K`FtlZrE%6nack${0t<@ifP zGfklzUUkJXHF_iOYu=uARt5sMTW>U!`CMm#Zbb1YImdG}1G~nV;*O0&rBqUglFwQ_ zZ+Y!WViE_2qh`vIL4Uza?xBf9syYmVBSPu8l$JJr9sqixg49A zRQ@7Hf+r5qFs6ueCH~ZdRnf_&PYC4&WCburV-kIt;$~psGeVO`fpx&`be5uL6Q&!I zbf094b^ykST=_VQu<*Of#8<}9!_J;y@9a%Q99zMrqBwh--!I5xfrZ@dFsmEF@;gENfj1Z=3~c zsHI03Jw`0|SRb4+up_PDwTTTkYwV917qK%v_!Jaa93rx4jCFt>(9Kuat9!=7oK%y_ zrjbmVo{G6W7xZeIkVCm4m@|48mT}$u)G1A+@Z}yfOfxkHfT+bu=2ythHa z_*RVPXL8|1jZi9SKZ1Bq{=YI>B-va>kB2%vOY|$v7CoA@0_(q9P6wFe<~|ywROkng zf%&lF$y1el_wx+1Lk`mtaZuBsLaawmBsDKsZFG`{2>E6P)pl%qgmX?iP}*Ha)57ym9F~Cg9$^!G`f4X#orM`;!4tju{W?eKc>#c0 zLI?^xMEA|~M|FaBai0#(;ht9dc$*G zw<*_B^|X^C9Ss>V8{E&b<)mCmaFcE=Y&N9)Eta5HD+Y4-)@lCZtcuKa&j3lB(nw)c zAb+hnd#uD1U#O_hE1l?HJkDGP1CIr#PMRD(lP4`O+Iua87Zq;Z$~G}y)ZU#;j(TTd z&5=`_0}UG(50&CPy=uqBuMFkYya>373ynWcIULzebZmwkHAGFURf7z&=y@dh3cc(? zXJ8hNux-hYi~J^%I!Yg#6FN3tbNZ*?yXIeuF3(ODsfIb%1VMs~Md)JSc>Q(vrP>lq zViBxHb2em8RDe6Iw|5rMU+?<4zTG%y>;&YhJT#AJn`P75|EEOuMUPc%`+U))g?;eE zmZWlZV-_y4KiQu&!LjcLgQnq6HO355>cR=tMeL{}d>#mKGJZ;O-aPjw&#q}&!HAW1 z3o5!XD@S3huKRAnLWT)2(|58ubg;MD#h!QCq4!QL)GHh;UI5?UxTxc$;PmM9V zcuFH(p00XgeN3f)!vZ_~8}`wh+4p{COzc_xQ*{`2h4`84dur&uw?VA351cK^dswzb zD+9H#`R1weN3gsNHC~(i?>Kwg!(jZ^Lh&*@Efolb1_u$AFSh3${Y}3YBl3kgrVPb7 z?KNcc6h9W%J3sjbK#iFIl%Kq=BUb?PlT`GVmEcvl-SsRA{sNdM`h5KIXTRrR3#I|2)<3YUPJdVh^giNLvijrtf;9);QFHl! znD#xQAg!E!*;z^wJ_2ATI8k4U+KUT{SM7Gv{y9ow(5h4l1d+SB^sd5wW+5Dogi6h0 zO%~VXES4owSZoQ?XLAxL=pE$AP>{u7$|jy1FnNLy2QQ2d+(}lvT`Wc3SIK}TT+vTN zGW-3`igN{)`?R!9NM$~Q8jxkk*j2-?zQNcKM&DxSJ=FnD#tZqKK+V~E-7XJhtR`z&g0!ED4DY6 z>N~fU5r)s_GW90%(f>iRF=r_cY3FAjD%rIn>Y~B_N%GptR)B2na|>H%NB~$hYtNd7t(AQF?;qE z``UY->%7*vRxiAPIDn~bC)MXRo|*ogchOZy{6f{lq@g@~BC>7s3o>@fZm6*Q@3gd6^h6TnJ9RrYdag3z@nisqj^7+~%&cuYQ?P(R(FRsmnTaK7drN zbl9WpwpEJpYH(PTC%p+9c*BDeS)1|=$P{fn|7jfEhVr~9J%&pP8F}GkVCjltM64q zxms|meIB)q=*z;HFQ(upl_Jed z5vQqDFC+3Wg0CwzYnPq!oaEB57tH=}Ei%+g1zi%XRPbrYn268Sc91lL7KGA2S&3Z~pwyWUm4 z#i12MXYE&KB7GItCW$E6c#&240WH4W^Ev1OUgf~dTp;g~%Zq(J>E9`vrG4wTW98Lw zuAW@{O*Cps?ZM^n46D0EsY4>9Z9rbv|JB-Ot)QUxE$@$ewtDBO4$fdBXhrjTy;>r> z)m4=*%r3?k1?nhE5DN}A*+?zn+E{W3zaV6_T=XhLABOKrL8h)SQ7kq%20~;l*;T%b99_O$3fAhB`z}7~&RBl z9B^}yPF@fXIeZ|J&04?MqRQLw^jHZDzP%J(c@N*2&aj}Z#Z!yk6u&+?Zhu&g3K}~) zGBPY>%FWAr_?LT455GtT$OGRnCKrz1LunJla5pBPIDe+bI~Nz=Cwts{1TD|uf=Pe@ z(oT_%%zp|Tn;Jzth5h}!dK)elr*x$M?v5_biY+PxUylVs_MOI;Tl-8=tX0piC0t{RNZ%`8ku;-Wsjc>!mq z3E4r%sKn-s_M1gPy7;?3pq6x{BQVj)Lx^UZ=K84p4iLLJt*ZUr+}@rQ?iJ*5cGtAh zcDcEcxN}W!8@Ru89aYrrIW8srV|Mdd{(JWzzneV`K0?KfQm3=FV^>cG%ekD}h0WEI zB*=B-PM-g_4UxBdE1eJjW@fGgoAM4q9=cWXe+j(@*aV2%?EAeO*IT&EnyIC;^T(>8 zyTHIs_)fU7g@5P*uW_oqJy8F!^Dsc)atgHX{UYG{A<-?GFM5IX>7TEB9p8Q77K`jC zIl{?9NnhFfO+iF^Zl@L?xY)v;@4q)R(CmKhYJMwXVzJ-{R0{xOohZwvW61x0w*D03 z)aUt9vst`F&@I6=T(sklN75BTG=Gw5F9Dt34+}`*fp{Ds(c&;j^jFm4z5nZ|z>-1! zlOw=e2}+YF;gagR{1|bnGWMt#DC`jn3=r^6^Z_?ZC_Wu&d!z=PM1_G%Bv^_ctC*9 z)mdDw%_^|IE)RVdS7vTS)a3qNx(36&f`)m{50Dw%;+SBLui3xiz=UthO6D%-3Fvuo zuroYfJGIy&_&MFlyDe8N#lg5}$Ac|zGSDP2!Ei1sO#)D`_;Vk2Gh*dJ9z2DPbnO++3(Y#KUKK}J)$eYkA21~(Jz@~v5%zvx`=9x z%>$0u6GK~GT1jl}oY5Ba4A`mh$*fRw1zlbqN?x18xB3!ZhN42UkO}$hQBf*;_DUs3 z4Di_j{l&_hT>j>DtItkz2bTNRBHnIX*6-L`ivU$zD_^7twmrS~V}#hWi{KLMx?d;Q zIQY0({NrkT=`ze|MS7%3qp(_m*Xid$jX(4TYk%4Oy-?q%oPG@!bhn%OEjT@dpM&g8m(MTM)KQ- zCOnU{J35=j(H;O*s7VsaL5J-o+R*lsMWh2F@RDyi=)D;2wgHRmzk{b8sqou#QMe>F zRl?J(+JD_Z3I9d%yNe%1bNTB@x>zJUbv=03d2#Pamn6oJ z@bq!j-qlO!$X-enekVO^s}j=Z&IA`d8ejIiJRPW?IR9;Xwy@GULh=Ym>kI!7J#r0x z6d}5(eb{6>dLlk|@72=O^f+R1pQf-zTkP7|Ir`&~N_L;7lqfM_CHOj=DlhQrPg&ls z!=fxu?&e%w`?y&`CE<9sL?p8=xs@UN_=m$HRTC+DceXEkf15+cs_(ur3&%J+OU=lV z0&?ABOM$NKcWVsy2baKoomHhq2ngid{P_GV@BMZ~LiVO<%zje%WkSClbL-=362w<( zOeVZVA^76Y&Z28e)D9!RXz+e6k-7h=|C?$Yc4s^1$1irZUF>;>%=07 z9gt{{-EJ$sU-)Zs)x}uGxa}JgKswdmSF#-RSmFe!F6cq)^I23{Mk6MsnYZgn!4+i6 zY0t&ubv!@jMMpU%X-TRr?A^g1e_7@j25a+V> z$?a2>3Qb*uP2d5c9imwbupuw{$N?J;RuIFuU0t{4bOOM!62vdk1by zv@UO2Uj_fsZa$4GzeF2vd^&xsSNQ@->viwrYaiiMlBox|L8Ba(bA`w8t?cO<65eB3 z-jmwdf2JYV|8o|=I^N*=wTc{yAOvkc;43p(A>V`LDcpa!e#s7fwU>q92ME#O_9wyo zaTD)vPVF`808vd9F4ymW&oq?>_*~xzNXVSW8(aK&<7E+iNf7mQ37Jqtj941o4Zhr8 zIr+E-93>9W{C)(1;d+25%v%L|GvExfliYk#vZ)iNPk?D?xR~Vy0l5M258(8+2Rp7E%cHwu zg`T_4ZOb1O~CJMR>CgHX2RP?vyVwsaOBJ$ z{OJ%`FwF}F$d)(s@P}z? zwJr-V;wF&%YAE}(3ZsO{i~dMDq{bD1Kj(6YayWPdg)UsYu@ zk$6VMGqo~&bzgmNW9CZe;QXp!h1U$dZKf*V{btRklU4OID{^Uc>^89-F5qp^pZbPT z*6kJKQ`@_o(8B~s2XCpkpeRN&Zd-PiM2BG(4c3ajo7U2NgnLX>YKs4_QU2=m3^zGU za(KH)bf<^>pGpC!G9mJkD~xGgCcWTIKwg|pSl+}Xvc}#^x=15$O0d;wa975hx=8X5 z^%8LPY#2q49E2pKrS(-j4#S=_H*;rL^)V@6>5ChGk|9$s?s*#3&4ikZ3O(-*DdDQb z=r1R?aIjziBMV+*A=%783c-6V64oM9@c#w(AY@m7av69Dh!StRqw?oAU`*{d(RH*+ zHSuUtZ3Gb1x))b)N6Yqm%s6YpQW_#$GS{FGaR^Q#Clw)%33#3&;(|izYoDhq4dRB7 zJ3==>-wu`ln?4)q{XEv0sNv^<()_601gb0=T0{np0f}Q|tJUU+I=mHsr|KGLdRDOY z|BQDwe&T(Dfbw-t-UL9SG+P{B3DOG6#K~}8XQ|?zw}k|NPf$@4f)XRU>u6=%#X2oF ztAAg(aj82mG%6zIvEm{xc0%3pd=At6i7!hxjg8p2qmm!*zx`(-_o-okV~4WuXCqi} zL%m^!bP+tKeNT^Hf_}Ybug}M|9hL-4dHBS0`(4Z(V~1Hx<;j|NrAI0*|M#yzH-o3Q z5`(5oti8g`%bJ@QKAeWfsOgUH0x9=^oPoc|7x>lxzoupZ8*F3P6;Le5P^?wv{omGa zeU!pEC%R)^KG5H4Nvh(X#+HibM7Oi0;&0e{qXux^QVqT5LABSi3+HO~CZwsIy8EzM zs!F#`#UyRf8NLN0nK)&FMYK>~fI7ARyGHh}TkrWZMinrr;k6K?^(iP2Y>cizE$anL zEk8COD-@GPq7$2_WAKduFDzdhk}xg~tsaIJ%Tlaw2vOd>vR;+Q!KXg0BbU%Yaq#mx zS@#a4wr-NO$nJc?jR^@uGcX_8`%!gMsy&FBZc4O#j6koOZGB5mE4sok@nADim{;Wj z*a7<{I9R~TJ4#?g+B9sGe{2VFluQB#v<~eDIlgg+b+_khSb+nd`GW_{jBx+0DzbbO zQlo48e`BDAb?(($c>nI(Esg(4y<{FIi|*C>JzVUzgixD*Au=5PURW%vEI%&D zL8anJ#b{LTj59QqFijaWx(ENJIS4%e5L+$ej}1JOM#9l@p^UIpe2gutpOqQ?N|-t- zJ^%3psTzp5@e?ECDrt|is+fI+T?5F}Y2;NsuL2AgI2s3pfF1g+F1Xh@pQ(+E1;AU9 z!Do^&Pk#$u*zn+hp}GtyO##*{CKue810b|%z(|V)e$niHLt;yeCUt2yV`qU(!7z`7 zq$o7*aDLNE$qxk*e4y`A;J7wxu(e7rI+EV#oph0Y|4T7dK-plXp~p`VB^qlPE}Fsv!k==|uS9Y3nBz3eoj1H0=6@c9aOsbPu!)HkofZ4A?qj!8b!?`S1S; ztE|}>dc4EoT!6a)-sdatZzJtRMMZBCwq#GmFTdT6E*u}YxXS*U8?E?eYXo3LeicE! z&XarF;i)n2vyXsd1fW`d1pj`ON~MO#8S*?@Ua(O=|I5vHx)dDX(+^+w)YcyVj~9=Q z)W6+$NE_MPp=vRP4$1tMOIC&KnYVL*8R6FQGDZ!XOo6ys=jP4P6>Pg7h%%Mvg*}o0 zLGa+anZR+`hhJA?ZwN^f2ZF}>`{z>=WoOX-geS^Mi;Le4X~2ZxLvm|77VwdV-a6G9 z_TyvOn?~f$18s-82OhQ|=71noe z?<9RK;9GX|KRuI<7Td>p;wmQmgodX#Pfs}&TD|vAA#Do)ploYe*>OlTd9R`c1gKOv zI8i?gZ_?QHQ&-@@zBzYKe4hlr`9nkS2b zO%gO2YTHY9cZ)0F^C2~w$?K+LkJ+t$Is$~as^%;Jf8p={4&~;4CRANSyScLGou6p_ zPYv|M#1K$8`_nro=uX;K12MYs!Uwb{djnijkGOYd&M9xrcte>EkB*@HKzI+xxHMPf zWS9dhaLMgsi&iEC2u&{YzxNi&U5T_b4FsiIB@X;vh={^Pyx%_^a5?aa4+X&cgPgG6 z_7J>gVRK`=V{s+J=2NqlfX(W)uQ=gG|JGu?%_>u3=yAu%!PLD6D^A7R=zOsp2;`nH z`BXCzI8G)1jB!O8JNWX_*CLo@;Kh%`&_E(EDQep{dWip}dF`s#v?Z%ruHR=~i-D@n zzA9IdtD5dY-qq{;jkO*-wV^Xjt}*x*GHmk+ z301R&IfS99m_=pT_NCO;)Z=L95d3l4q9?I;IrtjYc72?cD+*1uf>8X6A#s>Tgd!hjn-r04*|dahjP6<< zu$prB7IuyPC9FRe$nL~eCl6+3A>GuLmS_5@f{+X*{yfJw8|%pI&HgPP>M=(%8E2ur zN;Sf%L?x}t<4>N#oQ$X3P5v&aS@DwT@o`E6&I0g_vF}=AbD|%YnlIrF-@_InaLC*< zycDv}Mcz6XZD>>94!fk*f1GH3y2QRik3p>`JPsBE{&x))+iTU@hG0^ zAUVn#^l|2yJvRiyA1=QRRCIsaHoq;$$0L^%XLErozQ=q2f z#SPgj+;Q>6?{%oJXl-GCVmbq{zAtYJvA-+bI9ys;*-^8}J9y23lLw}v)A`o|WZi&P zjjfDDHiaEyf`p8@eR*Hcr)SRBzL^%h+#K1aK&Wy*cG6`xkzpO7W~UZH|h3eln0d2^jy&D zrQ>W;Ix6I9D)zj`?<{8ECQ-d_IXoP7cPKR!4iucXOuGz=;XnS(IlfJluCMFpKS;1Y z_i4P0FsF9Dm}JtQfkD!A*dAe}B9vk9iQEDo@2*$GYp5qS+h5Jw#EA09jE)J(lRck> z?(mN}1Uf0`HRnRk2zq9=5yPyzk(#Yt66|{*Q59*d9*D#HnI2pf>^Z7UBSGP~Ef%Y%m9uS|9l<0dr2P#36h*8a zNe!MtXoHnM7MQ8Nmny030z@y|2nu5zcai$(G5e(GNA-laIwYt}k)Rx5p5*i>OxWQniL0zXc30dJJIi)l+s zZGo)bllM4mw)0rt9 zB7%gR-ST5hJtte~SpcO|+JgPfckS}xhggQ*$s zyQ5{`Jw}_rAVmy6@BH~TN@d`FXQZ~H0SMqv!2>IznB8QdVi}_-N0xGv~+`5eZ8-x*4ruw!cj7Rq^nRJ&J1q_bE`75b||TxixtG z+@3$S|8N>h;e)U?jLO)665$oE$7}duH%b>F6{MBprQ~ih1w!5t5gwmD;@sWc5oHb@ z%K8y=B#wS-XgDSKZJ*h5c7EocDBD;O=#`>#`L z!2OCd%5abkbNDN!rbAId6|XXC@Vcpt$&5piJO`iu=bm~^he(|W#v5zsm;|wQBsU() z%ww(y6I4LK>oOOwO?6b=Z%F z>(eW9x}A=W^OlC~W7J{1O^Rh8!YTVEV{81!MHa5MF8=yBcM?0JVY_6VYsVn)*}72+ zHA;*EI>QWZtrnbk?>k#)K!&HlNFInPB--e3Ln9J%;Yy-jmQ7YzXnmIY3Hxt5Suj-4 z2_F`9meL3NM%kL6NQXZ=_BvFXh!Q&H=s)BZ9@RU!-yxN~BK_f7K@DStjXM^j0uy97 z^9nwrOcDxroB!gJLn1*Gs5@gan(>3x$M^H*8jADjTpv`K6D&Y67@fLkP+9#TNJD{+ z$S;U+pFyfmIAfRK0G1l6J-EG4Atb2_{y#DUgZIbaOdO-gmlG!drSd`lG<#JUq|i)5 zFXrYxaq`xkr zdx?eV_J1)n^$|1S1J%oCWN0=oCyPjsWO(5t3~BtxH^<-Brd)A9>@Nj8s~7nNDC6#= zKvHA7j|UG6Fu>OdFT9Xo#5;2KHN)RXYw$BoceN8k`)AyU?$hgVGC6m+?=Si{r932t zAMwEVpBAx5Qd;?7;+4&Tz1Lw5-IhK4(UvD{D;ZGy?tLjR?N3kVlM(@B9fm^5 zye!G0hdmFv*Yy?ys@b=?Chm9JY~VN#vhbAG1fdAR2)!w9gMd-1WqcL_7F;WwNBa;g z8$OJ1ytxOP4i2taMnAY^o;sN0irVG-VV|m5J)-VINFAR@C&hx=0Q8DYS|7RyI}w|f z&RQF7I4MaCL$m(+mIx8_7yrbpJcw@9#g5%cp=XX-)JYq`mG0Gjr5e$>JKLZ4;{;JW z$_tv{cvhI|R^*q#qsCLVZf>j$71L~i>!n&&jkXePX!cn4H^7BS`D<`&3a#9Z?Wp{q zild&ZW2o6|91Qj|?KKr=CcoxcbCAt(gmmHdh}DyDm^^i?lZ|w!tcDC6h&qJ%ZcGd2e^;k9fDw=V?`-+P(V+OYk~h*qLyXm++#fo6RmZ3pBkZ z#;p$*3n_T|@VZ^suYo_kAsI05TTF#E$0h9j?KmL1wi{Tb7sx7ZivIE2@}=5#V?$%z zWiQKujfkW^|EhWFMjV>(&e`Q#PSrAOh^h+CdPOvjnK6ufsw^O*sV{;n2EPzqp z-8qfr49=~NNl~UBOgh0{xL`iqSK)&0@|SOc=C^1j!oBES!h3LiwGEz4)d{48L~nI| zi)FKPb8yWTUs7>;klTriFRM1LznP7}a?Cr1BnKk}R`}U{ArKu!N2lW`2fVkggDxE+NY0;jB}57rcGDMdWnXT#@Q2GjKX z-rp+JR=Jg7kV;B?k(iQBqO<#;Ry)adov2aQiT%x}S@Mt8YfoY)b)JQnHSD^Sx=+Kc zBa}0wxR;)zHa9HoW_wQXzh;11<)w^sCz=f!bbCdUgPp@btS;(P=EUBFW!vGc4o*d6$`{M} zS091L-ERqnf1N+NR1Nstzv~M93Fct7fTvsejTXk@hcq)(5{CS3g}MoVG?%t3Npje^ zM!KG;x6zQ~*tf=;iG#Zsr_i407sYe3y6{gcahm8(jwslkvFkx;qOGE1(IA7SJmwK=iA1v}l8DFlRYv zOY-JI;gow^@SUr3#k3bBC+E_#3Qilpfs+{^@q0ks400BlhfZ{cM$&*Uo|tayTs$AA zd1+l~;}nr5U#rJfnA{&BP0))`NN-5m-a#O4O@7wj`|HVzzwTK9LOYJ(KXA7{^m)cz zU(*M{um3gqUi+b6-<)*2+ZPS=cVEwJZ;!(2lJrK`1r~NP?u3QPwfHWP2XcCQEif}EqC%xhN&kWm3b+8tx@;ugSeMmMt#kXWU zo^Tn22jfMxK@iw4#g&FH7@b%e3@$;gqY(6iBxVY(62!v^6I zar$^*sdGpu72hFO8ZUfar8{Ysq7=R2vpYswRdlTe6K%0&+JSoaOY#P$Qi(X?{_HU* zk47sdGA)jTQZ(c26{aMbXa=tdCJmel5(-7|bGTLu+hJn-4AqUKVB2;bxDOMLV9MC5 zGmU;4XTS?$qA9WhRS{!%PIRhSD?5QN3AFogw;YEAJl1$s!G@R$nr<-}z2Ugn<70@y>D57faGAU066WeB4CYvK_t%WgIm(G&97$e8&jr~Nv`XI9W2$Og6@9UQwo<5`%? z%XsT7Ys~OxCj+druPB*7ywBNJB2Nu$c{iN#*y-DsR>t2nWPhR;IUwE}1ab9zS_w{=g*Xr)S(z+#B* zvY1OUwBPe$+R4@usQ_k950PU6CG~ukB2lp}vAB6j?Fdc^W73xs`^*JHS1vLOt_*#` zC%@jT3tnq<)1CXhIod2tx___SCW_O?G7~70wb@Wa}6v6LM8~-VPy%lKKY))gAE%lz+o5YV!bKnb=X`ddmK5-XMZjg0guMJGBf8 z$YO{TMyVAhuL)$>u-GzsI%T5%kg^~8jt|R*3nl|%TH&!A1Sx>oP){0u2}bCuM$jmu zGwIw{D=jG()696meY|$Ax}PDMjt|Fg<^)8x-^G4E^;(?o-}ZBU|K0%0ViaVnuZ{DK zGX7nPWTr^7Y%==$VQlYV5c+eD@@823G_55B? zNVX#E7c=}2!DNQQlt;7q7-~iQK`xLV)KQ~bl06w&Fk)?d4{uR1`BuaDgVK&5$6d)u z?c{Gt_^y#1ht-Wcm-_5>G()X*2!TR?4?&!jniQ@I)C;kJDZgeNVO^mavY~en>$MmC z4+qXMFC2uMDXM8gRqV}b-|SFPUqb-u+Vs7bMjCeQDrRzOTy05#LMV(4T6r$7-kN~j zt*D+TtlZP#!ub(ah**I7z)1Dc3=^bj^h-FD2|n2KB)SCO-r%?d6@9m0*Yl)JP6WIG>zR*>uB0= z>F^kvSH(wcIbxiJi=aKR8#ph8tnFEPwY@r+P%dY38>R-9jPd-p7(jTY|iu?HNlDwYx)o^5$j~vlP6gtKSj;9_S8j)y8 zrgiU~EuZwP;}(1kI4`n1Wr+X;R9|tS7`Q-#NnO--us|>!wK)qovyG{~<{Y*9b7T96 z@Da@qZbY|MA$9vZ{r*NhrTyr*HX%{xX59EqqLx7$ZibMdQk1V_iOycocmA)MfnBPNPmV6wd+S} zR(#3D`#)xgmop2A6NvC`vP9_~_(3uX1-I$uxCp)u47?-C?rn0JSACZN?}E!btaE!S zCgV3uJ;aNv_9gz_WiG)A*gsTpkgfo-D$D zwu0^58XN-sRrpu2lDN-{g=1Luq%X`&e9*8sbgq{4?6#?Nw1vzs?Ps9 zFSD2IDb^0~H9+JRxcA{l^v?l0mvs@LnntlmYm(k4J7A?e5T7+n@C!`gTg{bx2Htoa z%)UM%p-S(d&x z4Z*$!oeC|^0_z*{mkSxVX+7-f=z&aNlgLwTus&XqdN;HXK3?~&Y37%9n}ns1{F^#b zDCzvvb_(j~Ii_1=mlr9*pjtb|#A*8Y)qJ1~7{ztZy3nP{ZIsXDeK1%;(O(2gcj~Fo zJKKF7MC&f5+ND|*oMV8+-ZubL>dCuGfBw4^>lG)By%UM{)vA{|02(yyN~9cFcXM-U z5?=SSB{Y;8&c8ne0nmU;Y_rV1>^6PW?kcgXRy$5CSVjfJEKj=99VkHwn z#g@gyrF{eOncg+kQ*j|A(*>0roQDKO1}4KLG;9(4@X_+%ap2jc`!EB&=WmN-a%G-n z+saXL;8!2gW607-;NBC{k7}ThsEq~60St>Zct@DASiJej*obEm_IydPcgltKF~Fbq zuDL7?3>&@%+Bn%?Q(&NK=Du^w{8-q)D^H-vu{4PpLdT#-$0Ru5zTIRCAipZN_ogR5LW4KIR9Y4D%m*K z`qeZ@iZ>1tiE5-?-w+4amHJR(Q_G#OB4gk@PQ+?~qIrydG|Ji;X3h;X-jD)DiS*ZN z?)Eu=RL4M*bD*8qQ0m^fZSTN9xFTKNb3)XIX*3Lu#i1*Y1IONhf{J6hr``w1o93U# z31$Q;O;Kd8YRfMu`VA|?1q+}Z(u7-$i6vd%eh@Fh&OXNlF2plW{-Vt8r1rm10|KP} zI@~^*-5Cm$*l^dAKPl>qh1GJ!6`waJ$SPOJNNIN24y*glb|(!dX2c90w(GBSyiE*Q z58ofZI^2KVi$0}J|L}&I8#xs&NTUH3pY{3lmq5PLv@$p@`&#H{Nj4e+_kR)oVq*jo zc~w-0wQyN0AIUODU;E|kZ*H)6Z&jR8nP(`k>cqf*hFGTIS84>)>NAxin?BP!k@O&$Ij0YqadA!~Y zG=lURkEIO8V@=>yL*R}>L97udh*VcCP^?_h8_5*>PSTxJxgvj>N&p z9#bwveAsvyV;Y-SRWAh=p?K_&?zcSmEqO&iqfBCu7S_G=#ti6b*}C1kn73f!^sUxj z-p!8EE5+`l)FdYq@tQOz?$~=b+VWrx@I6ZF0<&9AEfAiM?^ySF7#-9#z-tP5Cs}vX zoaVYs%Wxh!HtnQ8mQ<9i0{zKG)g2!?(F?t@ZX=180;7{q)s?M)de8Bvyz2qC}r<;Dd#dw^hbJLAD$G#}%RdZ$CaAy}t@*6`mBdRoSAEw^}%DSA~w1 z035zk#YKQjGhL%Ud&DRz zSHAII2|1=oh_w0ie-r1T12dz5;&8>TkQY|pUDCJ-6zrPY5IO(Ce}C|1nS5bPI`<4@ z1824RgrR_!%MHe26Z+{?@VDL259*k+2DUjp#j%&ayz8fNrp#-WUlJnvb|dB@Q8B0* z$e?58sTzvi>hpH`n7IsUPKkGVIu%oWTSukJ4=RCnD9F1qqA7d;(t76v!5n=9N{cdA zm8iWG*LZhHykIVhqu7_rC!`0%y#sVuaNC{ols?V2;==q7{A|8&rqt5GFOiEP#b)v& znT7S3QqKSx=Bk#Q*u2(n3;nh$sKyxd7OO9NJP6h^ z-FsV+airGn&Hc5!a#mr^fm%O$O_UVz@*!dWXES3t;b+OLN`DhYEl!w6eZW2^7+yJq zAI+Pkd9CV22!jY5e`@DJDi*z@!ES)@zf+&2me1NNEH1Xx&mJy}BQ+v#c>D7g&Ynoy-kWjgV48+yNF|<4FqdbMxSiK+M z4k7oG=3zY|=hT3GYE8V)V(^DyRoc?4!XV-lZ$o;McFa5!OsJHm3)-|K(h(%0>P2Z& zz>;nh5r8t9=n9~Icyp#-z50;->rfLQqx>GW8h2=aktI>Bw&LKf6jMM7hx!hweLh)C zD*Q31ryvyTNcGagOoV2%!hm4Q>IFJBwc$D@=y@Zd;*h&}S2T{aLt3+2Wg(5JQK4rv zVF;Fv&{BZctoD$0>6EMM%H3a)uixLZ2NGS`^C*7Q++XlLI%Np76{1-(7!hvhny1WC z@mD8&{Yx)5=mg*-sDdmj;f1zEy-UifPoa^LOR_Q&Qi z%8j(~njsW_dN=ybj0@Yn45MQU9gq!8uQJt*k~;JYcND5T>1NUh7dZGowp|;aL{L;Q z6*EgI4h;(7za(X{+Dl$i#+``t?oMh5{q^F+p)sCxAf1jxEUWAV9bESEopZ0iy11Q%WZDtJW?zS#=bz)Fb1`9}CoHfCPyrZMj>1i`hMTK;9?|_Dv**`^` z$9mp0g;bi|!DCKexSU#@ir$0*lMJud5C;D~`WC)W#ou_m6MW@jB$pEgY5g%Hd6h;- zqHQH6sEZsV1dVmOT50Yjotd=IX3Pl2v)gG7(Cs)_VXFu=R~#NwVAF^XXMWxUQ(Ee8 zRt>wh3NiBGeTqyIxjkjEG)P8@4M$2~;<331D?MRH0r_|MFgd8i^Ld%CJlN(b3n|0w zD*uEtIkHf-t+!Y`G_JSI5hUm zAaZUeDf_Pzc8d1$b z%ALp?Q zzo5moE%)_|gFm}en-!hQFF(pP=|X!8>*WX$24EsfgT6QT{humbfEt0LBQ4HK-q-gx zn_8R84_J*LacSv?zYG7}P;IFj`;}aFrtSJ}R@B#bE6TrA#1CEZ=aZI;r4bc1CC^ov z1XwzWAp^M-iN7z!Bs%(9=_{kZb1ae&C#Q^KM@)7?gN!XZ6SdGk?&&ixRyH$OoG@A8 zPFm`hrsikBZb|?jj$hDFQOXQL?t*P3rRO&ufmcG8VAyJ9wR>vP*V(Yul2-km5R*T? zwNVXdL2x%`+_%TL%A8i9)b))>2lA4?bYU5XY<%JeBBTfo?w`pjhBHaWRI%ab^3Acu z8jTs`42hXozIX9fsMV}(vms+|V^$eB;RWAgsKYGtYmZ8cs_U9654QBMabrs5{1o1& z3g3|}yif^lE|U)d1z*9S+u=QVOGSnopAtX?JLcumMP1tStft=Rst7dVU_X(k2=@|8 z+XZeS4BIdD0bsRRtR7s+0R=P#tzI_o)UVL9im|6GN22~<#{Hxxu~DST9oIE*T0|_1 z!zDD}n&Ld2Mh{eMjRi4w16VS5lk#pxMG(@X@jK^7a1_(M%L77ijXW;aMuIO1P zyeCA2i5z)RKOm*WSTA@TRGW-D2)k#3DhrX^>0GlMOLn6^FfuS5MMEnna5mQLaVGyX z(U?&t*sz%J-yUDV|A1Bae<5pE>D1r66h&j2C)d~7<4xY1@eoN=_luT*x1q}cZ7=WI zIw|26G8OyY|BpbhT$5~Qcss`;3hcFe1O-`BDF`rZ{Q2g>E|R6$+4(->vE0J9QS=e= zIQ=Mq+bZ^O_qg2I`BQQ66PIsalbh)Wh6IEHV3P)4uF1MA{y(+{Kwl1DLv#{O^ULyr zz!e*6Oclu6V;YPKh&9|(ANTGjVcp0>wD zjOagTqoQH>{X@ky!`9@^hN2WuQeFUb%GaBfdqhHu_k62karI&xtTDS`8KKF|wm;FQ z@RivONrtVGi=gzV%wKwNVyO?-q5=Er&OCTUJh7*YVOCy4KrXOC?=6+IqdAzdstKc? zWEPQRP1F?jaoch*aY?7lI&S3E0*rGhgR|Y6O|w>UI^011{zQmC0WZwna<~3NIKQS^ zAVcnq9lbJ>*U%I+R+Xm%f*`flE={39qFWJSGnig0WtAHO-G{&AI#j##CtxXojseGA zEg2Y~D_?taD)~hynyAN0|Iw590N7F6a+%J2QID3{F%z_UGTHyd45)*}wzb?edk#Eo zRPnRUI{87|O?1(H`8bFalEiE0DQNVJik+G6fISS#k!}^G(QP>^h7}&jXJ`45qva4+ znMLwNE6;`=Tw+!ZQKtSQ;3WU6uZxMtWF9hdGUrVT_ z<-cb(mNh2m3Oq>$F}VP`{CK!%)2nwN-T!UarpF(@2tIZEf&bM`z?l%J%MgD)1^n9Q z*YL1j#@M-k9^Cs1`|$!?3R_uToXcIFJzkzicTWkpzHIyB6>x>^>;5f+`zg1y%Ii;Q z+<)s5*Oa?`WMZM3wF$6c^~Hnu6OK1=R&*2^N~XxxVH+*yIDRtPK8e{NDVu{^Z@xo1 zn=g!hY;e^;SLpf|lb;j0)`8B@u>JXjiMYf8utuwGJlXqd+(%sH5hj|gdhg$MBCMKr zNI5J=N4rh|kp_c|pXR(7nB&}r=1n*_=%!O;mc0*gR67A&Ru__SV3vkIZYS~meR`ah z#7vnds*?}J->ccbtazQJ=2I{Io93R}$|PT2Glq+KE%9DZaAz5H48?-Y`TpE<2-)Su zV3G~lsy+{BmM9X;r97NQzX`HEKG0Qwj9g7-p@ULPSR;)jBuu)RP0$(aX{{IQ@bE@@ zBn9HkQ(rZ=I?5U+PNayvk9Kd8CmZ^LU@tnBKvur=50OjRvgPvcTlAc3t!d^Z+32zI z!-8kiqj163X2z+#j1y9AIr#kB#S-9e0#{LYhJpN1*bugUMwKiCO&}5NEBu+T=NAB^+AP+lf}5M`jy|&@&&AzftJ8hp zo!xj!_7-aGh3L~Sr5(u9;qj8+URvxk!b9?);mBn-YcK@Vx{1?2*j+V}lptkYJwI3s z3w5Xrn!;9i3O-K{f2Lx$jAtx;@U5igf5E;og>}*!X=@%9WXFr1L1r@e)3BnLNYNmq zaG&x!5AYlZ0Y&EBS{#^R+Ycq*vx=Ufg^qy-nZ#$ncg;*7uB}2sPg;5Zq6_l5xT#&N zq468gHBeDTcQ>w@l_b`!e(6Skil-pt4vPrI`rwalqlFWcA=4k$&YuV^=l#&tk6xDp zDq%<0PmTg-9NaR83kbk-Wq18qEO~xIqIJ1+K;gJ;t+BW^brc(pV_0tr@b)G0_itYt zW}WUcll90}GYL!>;nOv|vMKh*nlBNz{=t&^dBoh9BuCXUdyh+yj3<+){~=a0J+ZFd zTbQ&zySR{qB~Hq9jiIpA3;c@8TtGP1zTWy&4U|G(s(i{Hf;R*wpH-?qJ||>(y65;D zJCLR4)#^oP9f{@7hhgptUUPR+Y?yIYelG2X&k-N|zNqLolApua+w1R!>%W8X&H&FK zp?&)gh8kdB?vF3?Lag@X^~no)CP%?0K|>-`J*j>nzB&Z_yky{F6IpxYC*8S-*~r6m zd-VRxkNkzL)qk|%BHrL(0}^bJt>@+*Z^9&RC^uZx;`J!#l~K!GW?8X&lVedgCKT46 zcK9=fl#p0fn>@OLLTl{AwQ>6bX#Lq#KW4}+g^=z!UCq`=O_4fLW{?@wrY6Tu)gkj| zfI?`6JTkQ6$%?KQOq5%~RlL8edrkQa(bo){WYY;keh`N5^HV8;oukmce+BbqLVRJx zR-&hP?vhdA7&DihRM_0D5BU~7!9?ofzsP*1G>QW9ed>Qn2%x$ltRDzYDOSXG&SS2YJE6%;8j`J?DL0wokoF3zS z>9l6LrndnR2pD!WgY z;LJJroM^FEa|>s-DJL&H{i{J3h!1vy5k)v1Y3afqIJo9`5R`O%Mepm|i#3ky(F$s` zELF%?;n2Ly5xkpWx(_IuxIirrpCr!)MwK+W!`?4z%#ujI^?f=Daa|{-?X_f=yvY`k z8HhEkF{fC;E2o0uZ#`tSWTHQQV@6j`#3bmusW``5-aTs>{#13FYM2Ujt~p5-- z8s_LU1-9F^LW${?4%p33KVW4#*M=;^YDsM9MNk60Ym(9NV!_T%!|}|P&8IKTLm_Pe zX#@UL5bR?A*nM>W==WFO#-Dk+=m(t5$__~HuRIKDJ{683$Ga7Q46?WWR+t z`X18#divF;>|(x_SpNDka=eB%4PF*d-?AmLl^lQ5tXStc>5Oh@xS0Tg4Y?GDwI2V$ zg!B8K*(T%cmpzs$O#X(&{DoJ;;Ba2?0C?zg{kNb7EDRpy3wk=WT1uEcLjD8w>)#MV z@^%qptCc`<=-zHC54KNKHil$B$DJ7(qJH^HZ2-=-hx$gTu_xXH$-(LuD7X*bCGLRwC zxWxBCm;a{Xh*(NE7=A~Mlgx$q^#)2o7UwrKu)&DQ-`YrE96u7;9v0SX?LJDoN05~` zj+?V1`HhMBoyI1{8ivVYQVj=;{W0v6(k9zdO^x}IJBkTQS{dH&PrZtt`mhYLwNq&R z!nje7g!+44!6?}vNEGMEqG`y!>g%*=NzdKtIbxXVIXCj+YHCJ9;90G>Jyks~>Y_O> zM3lj62GEb1%<*(){5@c1!smr#u%33ea>J5lJFFJ3*nl$08}J~#p?ym-=Dh<&yFIu5 z^68&1`Ez`}n_Ac<#WE5_<(yTv=(6pmx)_gXwn-splP7XYZ)BrF4^(4V`?|b)^>%p@PZ{8hf!+;053?TN^jp>o8}Xp&qn zHz!SYecOG<*)A|${KP!yd9_F;`L%J6qsd|D4fV-?i|NC`9yviRYds3c#F96qF@OuD|-iKSD^O)pCAz#Yy-AMDGQmXhyAWtOwR<*20I zKk^jm46Nblt#_#B%6kZ4<>4Yxxcxp*!8ySguDdW(du@x%IN+(AeIeXP>9vB9$5kKn=5g+ExFJ4C2hb}9w<7ii%9eP`;Bo>(6{#n zJVNx=9$H90bF*=$Xoq(&-Obz{gwMsgpC75_#xQT-cho!#E@YT*7=L(WI!=DIm;(NH&6hOKlYL@V!*ZT9z_*N7~%+m zY8?p^QsNz^F*2AoU=W6LzC4vnw8-b9dc6%FzYGCe@SG(?nOlYgFHB_Ts^en0p`7>` z=?)%=>FdC-)N8R1$&IqQesw zf#>to^e|FIlEhI)o;1QXpb<~lkA-?gU?*O@qa;a*!VJ9;kM=L{5t%8=EAWU-jF$o> z4P~8Cf#!{@aG%{xMrEJQ-SXajA-XR%GgqjOrtfd^NUZ4UoZ*nz{Kxt**zM}?@GC!u zsx~vLT{lAv2xmYjCyP|6=e$Z8O863yrIPiz8)kWQ!I zX2ek*0OXP;fEj%3@oe}K$yp}wF7!qzHp!sHpU$@`oKGZLBfh~89#n)8%Ct22X_j@= z(;NI`Z(a7wHi)cF=c+=5NFbei=a0H=pV74YfO*Vqsn|Bb4KF)ksIT5z0Q!oz!?w*^YN=Kzup5S&5N)|-33IXt%P|iDG+^1S`a*QFb(Yjgr&!Qo`&L zewbJn5kK)^sz2lPRcI~GRmyD<70y<69zmf7^A5~TqCW1Dj40}-Kj|HZk*Qpp5|N5w z_S3C@VJ=*gdFUQ_tkOu(WX76i`_xbYSQWFrd^V&`o-(c;Ogri`o0v`SH$udgzv~V? z*5?d7UoBx`vt)YtF3I^@;x^^!xMC!!t%mp*eCYGGEkiYG44VjNcmS`DU~=4?8z735 zq%CcR+8%WBggYwDWVA)H4g00-MFh^OSG45GZ&@D!My(h^yU$k;DjrwWL63illvTxa z01xeKz?HLfT|X=LliG$=YoOeW%0 zi16#0m;$SgvBA>_+gPmMHInRSlX|veQ(gZiB_Jzy4ee>a%BBzmIZgaDqW8tEfc9%S zimj~@SsV0lJPgHrM#hy-A^ZM#xo4CBigcEvsOGoiX@9_XtRyUN!?p{kGPlzR6fSP5 zQ?`9p;%upewMu?O68o^aGE3a{r}uor6|{=2Jhs$SCcN_;k1oXSAF{yWFB9f2Q=-6s zzjVL&?!6{*%!^)N)!7(GFLzq^3g(g5|0^>8LnXoJ0i0#XGW4i9r$y4@Tm-G<~HNm3OKl{)#~ZTG_5@q_jB}nABu7t45q0o884UM z3F#lB>pSL6+~}H4M2cU;fObWI5`Q>biB(7;D2bnVvvj@)`Z=qy^q>uBF3`|863D=j zQD=t+SUMKF%d(XI@RN^Bl+~49=pFN2+@P?^z+)frfgrx6cFM|3*%9^1#BRGr*<5Y= zNL$H*_xY$A{P0xw2sA`yt2lgk$d4B{1Y|#F82}Rsudfn&MYpH6DQyL&2D=FmS%}WT z{w?6(09G=#3Ls$?eBin1>-Cuy(OiC|=PLq4pzk0TEBVE!m^~q@kyT0?u}|E@9Lio{ z#zengp%{;48hVen#;qyUO1O#G7zBJ?JypMKGJ2A}7u-G*$aGM-s&-I$E$SPXNxZSGuZUp&A-4rkMNO4DB;+Kr~>AJ zNf!#3c9JZDi1SSYrd=^!4Q(v(>tR4%>p7x;$L3qzv(RI_;b17l$FmI<%j|cY*@V{! zt<0|tpRGw>0Cz*`F6hV?IkR@eb)B!jF9o4)0gq4t88Wy$cQN`eR`?2QpOM5f@KoeU zVPZ=Hd%=6(uK!+@JKy$oxe8>w{%;uHzg$0({Bd2^*!7ybDqSIz$2Y!05arxOGI-r6jV4+}-oJ2agrGM%1hmi?3FD{-k?ifLQ7T@c@)nK1DH#uo=4tFBjV zqpjl;73l7iR&3KBEza=DzG{Dj>eOJR>bIT~mCgSdPzaiY96VLOimw{t*YkZoPAN2= zekS+Bs8`hKxzPfyScH-0S1K<}j7r_&MfLLu!`{~4Bb>yb9HU4dSXelp8eO?~tF_L7 zBCca{|GJy2kT*oBSVSQp#IUgvatg0VqrEiK9=!jPN8FsB)*XVl?c$#!^LOAwHhaUt9WoQ?&YqJx@7(wGkbAQmcA4mNqdZ&kEBXLmL=i=W7$rt~E;J)}tp zw8AwS?6AO~r2}%bmu=C%z9LH(L;C}JdA&ZH`h)w6Tl;HoTHvw0XQ>=1k`~8?zr7O-YaOwGsE{{D0;2iSctEtKAn@eJoM^ zDc3x~n<@xt25!!W->+hF%!6+lew^W=)CGJ;8SgLe3RbgA2nm7}xkTGx$3$4mP6%t1c3{HupJjj6BEE}Wg^)@-@5M1n>|9y2 z3*A2&0!I@{%_efL#6-RLTKWzMPg(Z78mk#3^|Vz?%*#PhfANIE-~Ruk3o~hi(4QCu z)lp{}I*h;p@H5MgW+oaI8hdmq7O-e|yZhRyI1BN0j5MHYE^L+avt*&GWNWYI7*p}% z#^MHf@l+NVv7w?iwQ7`uDyYs~OLOZ{VAPC)9=8ZI!D=&V64)?*JbE|H#^R}kc0kN| zrF^i?Y(C0b$R)(iL+Chvy;**Ys@>?$$%bbG-!P~wv~~RjUbC~;6}KuLD7v`9rmx0v z=%Q(VEJ_k)j{%d9FN?NDQSq0OvnKZ+)C}gzRT#b`a#RbzLzyX{?t81_i_yM1-Wjv1 z7q;NCpn?X4_w+>P?DG#Ql^rve$RTG{v?w_xIaYq?YfRr*`K({=49`dIat(3KQU9@+ zgV)}^9c_Jd0 zxv&=EnXN_vgBq{)O)q9b6r0^^0QH7?+}ZxaI-A68=|vt1+fcVA>CQX}wC||AmPSK1 zTOK-~$|cnBYbtp`L#fE`q`UT#+WqOdsvP?q1r_+bi|4w>*tf})*^+PVt_jHwh4gVN z_1N14)!9k@MzrZqQNm>EKbUVwo!6z75V!Zlxp+aw)Na0VT=5g3z=akHWja{hz#{(c zD{1(`GsQI0J%o9@D?M-PGoR?$%MRRVNy-tjb z&I6E!1P7+Z)C#9K5e$Fdu+X;OY zz=u7ZYeowxx}OO;Kz4S&K?WTX#gNxp0}KFBF%Q8etk1dAEgHWvK@GDQdo4VH1)8zH z#|pPUk*1Tx6c9Pdx56$m{9RdT0Zvadxi%kSEGL(bnzE(^t?0m1Sq8BVlG7;WTvrf>x z&~7zrJ9zjPUoC=D3eoMyvA$6;HAdrl4*&T=G;<3sJFG=ZKn;4DnO-G>shDn#6do}%{W@`or|MAQSAOPea z9#Sy*NOa@Z>=ZqC(-VrCC@zH)5%Pd!VID?e&laH;xX3m%<1cD08tVF{OUV?E zWF#H#EqD}`-I{x{g4q&I#;RonN&!rP0^Bj^kJp+gT^G>8iAMtqzk==pQZ^$eX<-#V zF!gsuGSdZ+J7#-&DCHBLO{$}_(~`WfRY@Gp3h|5Tz6$i?Y)cTl&z&rGyUL?kZ*tcd znv8?Op4Iu&`FZI7+~g&b{P&d80HWk6j^A{rwyR&NyBvt#ffb+#lzF2)8Q$9rmKSE~ zOE5N`D#3$bhYxQvTz_DJJI0Gjb>xt}deoJ18Zb|-48_I+!ULYk zOWbXy(H6;)sAf|N@qll4+rMQez0EA?nTnp&-znZh`mdGY_VH%lZkK|aNIFObF7{w3 z7e!G~3z1mtO|3*0E(!qRL#~LTu$^JDbYsBK5CNcO+>%lG5|fn$u+!RpZ%6+}_xK+P zq%hw}=fJ#6s*y52`hUa`ii>?qLFED;3k%EP;itpq4Q2!W-@pyV60BP}tH*Wx1#^VO N$l%76(o5Lz{{pvY*!=(i diff --git a/docs/images/08-room-card.png b/docs/images/08-room-card.png index e7d1ef7f75d230f5acc2a81fc2e8d57032ad4cc7..179689ce6a5b0a2022ac9d8a55f81d0effeab217 100644 GIT binary patch literal 32778 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"SUlkb%;+Yod+y2V^=FqFjx$P6#c@YhP%qMxZ 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%0Dg2bF3)7w)~fczhw~fM-ICFW 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Ã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 literal 136817 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 diff --git a/docs/images/screenshots.json b/docs/images/screenshots.json index 591f7eab..de442809 100644 --- a/docs/images/screenshots.json +++ b/docs/images/screenshots.json @@ -1,7 +1,7 @@ { "version": 1, "fixture": "synthetic-only", - "sourceFingerprint": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", + "sourceFingerprint": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", "captureScriptSha256": "34f2219790d46efd8250e7a1bd829cb8fc0b0547e1260635fefa52407551b41b", "command": "npm run build && node demo/docs/capture.mjs", "scenarios": { @@ -13,8 +13,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "8780c6f05a9f2af55b97512dfa8d277bb77ab9ae0dafb50640cc3237028055dc" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "2885f96e348b15ab7c696e56e99bddcd9bb2ee94218a883e5a2155f45f5042aa" }, "view-touch": { "file": "02-view-touch.png", @@ -24,8 +24,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "5e41c81ded9eb67deea49840c260eaaa404cab61abf014a1a275586dafe66e53" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "f62d8af3617c00a5e99511bd765980d2e27badf25047a1be34046b64195abe6c" }, "space-create": { "file": "03-space-create.png", @@ -35,7 +35,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", "imageSha256": "c53db2e5c642a5549c13f3c93a5b359fed69bdb2621bf71a243a877ffcb95e6b" }, "room-contour-close": { @@ -46,7 +46,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", "imageSha256": "2f13ea645af306eee9cc7c52699c928377b72f412b08c1a3db6beb848ace1b51" }, "plan-context-tray": { @@ -57,7 +57,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", "imageSha256": "a6c526fede11bc3503fd2384bd4a3f6afa008f481c5c47578f06cae6c81c6f9b" }, "device-editor": { @@ -68,8 +68,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "bfba4647c04bdf4b46dc9cea3b42e349b3ea67007bb38e16880983dbee14653e" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "9585b59add4d35b5a6f028ce5b720ef1b77a3f8b19436d192cd1a0e6fc637264" }, "device-display-preview": { "file": "06-device-display-preview.png", @@ -79,8 +79,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "8cdfe00ead5558d013265617104997fdd138337322aa82f6a3e1d15eeb36cf5e" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "cfc317da4628d079a116ff71311fbf06b1eb3b181928a5ea7ba888ab936a5e8b" }, "background-editor": { "file": "07-background-editor.png", @@ -90,7 +90,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", "imageSha256": "d7cfe70551d9260169df8efd832e32ed7df99c7f60b55d1fd4a8322bd4c47175" }, "room-card": { @@ -101,8 +101,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "ab29f6fdb31d3117e935a93a237105d42a5103687ac892ef426a4887ae7960c4" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "029a3e69ec647a8a370d99e6bb7f9225833c526739076022f6b52ba54bff30ea" }, "device-info": { "file": "09-device-info.png", @@ -112,8 +112,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "d5eb5e11c38b54fee7310db684182bb1f6280b493ee68588c33143a5c9c511a2", - "imageSha256": "30bf3f2a1311fc2bffeac6359773925fea22150df2845015c630e009016f095f" + "sourceSha256": "9da382c4687982ba911ec847e146c6730971fe79a77c6edc044512a91144306a", + "imageSha256": "a06cbf83f09e2f67b3566d7c0b10e973db060c3d20786f26f74ada6a21937c3e" } } } diff --git a/docs/specs/213-device-marker-geometry.md b/docs/specs/213-device-marker-geometry.md index 7d3ca21e..a0c1d558 100644 --- a/docs/specs/213-device-marker-geometry.md +++ b/docs/specs/213-device-marker-geometry.md @@ -26,7 +26,7 @@ капсулы не включает hover. После изменения все концентрические слои остаются визуально по центру, фактический размер маркера не меняется, глиф становится на 10% крупнее, LQI снова использует плавную шкалу, дверной замок соответствует -#179, а вся капсула является mouse-hover областью. +#179, а вся капсула является общей областью hover и действия. ## 3. Проблема и подтверждённые причины @@ -83,7 +83,7 @@ No-Blur fallback; owner override Dark Unlock остаётся amber. 3. Увеличить базовый MDI viewport на 10% без отдельного glyph multiplier. 4. Перевести opening Lock/Unlock на принятую визуальную систему #179 без изменения security/action contract. -5. Сделать всю видимую value/legacy capsule mouse-hover областью. +5. Сделать всю видимую value/legacy capsule общей областью hover и действия. 6. Вернуть marker LQI прежнюю плавную цветовую шкалу, меняя только цвет. ## 6. Scope @@ -112,7 +112,6 @@ No-Blur fallback; owner override Dark Unlock остаётся amber. значения LQI; - изменение low/mid/high категорий в aria-label/data attributes; - изменение непрерывной комнатной LQI-заливки; -- расширение либо сокращение click/tap/action области value capsule; - новый hover на touch/pen, sticky hover или новая touch-editor parity; - изменение lock service calls, подтверждения Unlock либо secure invariant; - backdrop-filter на marker/opening lock; @@ -192,8 +191,12 @@ layout без per-size special cases. Запрещены hardcoded `translateX/Y - DOM-centres core и его shell-end отличаются не более чем на один browser layout quantum; -- alpha/color-weighted painted centroids расходятся менее чем на 0.5 физического - пикселя по каждой оси; +- на изолированных solid diagnostic слоях alpha/color-weighted centroid + расходится не более чем на половину CSS-пикселя плюс один anti-alias quantum + (`DPR / 2 + 0.1` физического пикселя), а центр дискретного painted support — + не более чем на один физический raster pixel; это откалиброванные пределы + смены чётности диаметров, а не допуск устойчивого смещения на один + CSS-пиксель; - противоположные видимые inset не дают устойчивой однопиксельной ступени; - проверка умеет покраснеть на v1.65.0-beta.8 либо на документированном mutant, восстанавливающем прежний layout. @@ -229,7 +232,7 @@ Unknown/unavailable сохраняет нейтральный `lock-question` с маркеров устройств не получают нового lock action. Скрытый/disabled/missing exact opening reference ведёт себя по прежним #117 правилам. -## 11. Hover всей внешней capsule +## 11. Hover и действие всей внешней capsule Для `.device-shell.with-values` видимая border-box capsule целиком является mouse-hover областью, включая: @@ -241,15 +244,17 @@ mouse-hover областью, включая: - все четыре направления right/bottom/left/top. Над любой точкой capsule активируются те же visual hover, z-index и tooltip, -что над core. Hover остаётся instance-local и разрешён только canonical +что над core. Click/tap, long press и действие marker также работают по всей +видимой capsule, включая value/legacy sections и промежутки; используется тот +же action, confirmation и security contract, что у core. Hover остаётся +instance-local и разрешён только canonical `data-pointer-hover` после настоящей fine mouse. Touch/pen и compatibility mouse не включают и не оставляют hover; unavailable по-прежнему не получает visual hover. -Расширение касается hover/tooltip. Click/tap/action hit contract и 44×44 core -target не расширяются скрыто на value sections. Реализация обязана отделить -hover ownership от action ownership, если browser bubbling иначе превратил бы -всю capsule в новую click target. +Минимальный core-centred target 44×44 сохраняется, но больше не является +единственной action-областью для вытянутого marker. Keyboard path остаётся на +самом marker и выполняет то же действие независимо от наличия sections. Preview воспроизводит визуальный hover при переданном mouse gate, но остаётся неинтерактивным. Static plan marker остаётся read-only; его footer button не @@ -322,7 +327,10 @@ opening exact lock state real mouse modality → full capsule hover owner - → visual hover + tooltip; action owner remains unchanged + → visual hover + tooltip + +full capsule pointer target + → existing marker action / confirmation / long press ``` Ожидаемые зоны изменений: @@ -388,9 +396,10 @@ real mouse modality capsule включает один mouse visual hover/z-index/tooltip; unavailable, touch/pen и compatibility mouse не включают его. **Доказательство:** real PointerEvent desktop/hybrid browser smoke + computed styles. -8. **AC8 — action boundary.** Value/legacy section не становится новым click/ - tap action target; core/44×44 action semantics, confirmation и gesture safety - прежние. **Доказательство:** pointer target/action-count smoke. +8. **AC8 — action всей capsule.** Click/tap по value/legacy section и + промежутку выполняет то же marker action, что core; confirmation, secure + invariant и gesture safety сохраняются. Core-centred target остаётся не + меньше 44×44. **Доказательство:** four-side pointer target/action-count smoke. 9. **AC9 — continuous marker LQI.** Marker color совпадает с `lqiColor()` на representative и boundary-adjacent values; 40/41 и 179/180 не используют дискретные palette jumps. **Доказательство:** pure boundary/dense-range tests @@ -476,7 +485,7 @@ Linux CI artifact. Перед beta выполняются full smoke, golden и | Pixel тест окажется привязан к платформе | DOM invariant + alpha centroid; golden canon только Linux | | Больший glyph клиппится у сложного MDI path | representative custom/state-swapped matrix на min size | | Opening lock станет слишком крупным | сохраняется текущий compact footprint, меняются внутренние ratios | -| Hover capsule расширит click target | разные hover/action owners и action-count smoke | +| Capsule даст двойной action через bubbling | единый handler на marker и action-count smoke | | Continuous marker LQI затронет room fill | reuse `lqiColor`, отдельный marker projection и room regression | | Refactor добавит layout/compositor cost | CSS-only geometry, no observers/blur, pre-beta performance | @@ -511,7 +520,7 @@ beta; stable — только после promotion rule. 2. Перенести current effective sizes на единую base-resolution boundary и удалить late factor из face/puck. 3. Перестроить concentric shell/core tracks и увеличить direct glyph base. -4. Подключить full-capsule hover с отдельным action owner. +4. Подключить full-capsule hover и существующий marker action к единому target. 5. Вернуть continuous marker LQI color при неизменном band/a11y. 6. Перевести opening lock на #179 tokens/geometry, сохранив compact footprint и security path. @@ -528,15 +537,18 @@ beta; stable — только после promotion rule. его внутренние proportions/tokens, а не новый абсолютный размер. 2. Unknown opening lock использует package shell/default theme и текущий `lock-question`, потому что архив не содержит отдельного Unknown asset. -3. Запрос владельца расширяет именно hover/tooltip value capsule; click/tap - target остаётся прежним, так как отдельного решения расширить действие нет. +3. По уточнению владельца во время реализации вся видимая capsule является и + hover-, и action-target; отдельного hover-only слоя нет. 4. Low/mid/high band остаётся только semantic/a11y facet; цвет независимо разрешается общей continuous `lqiColor()`. 5. Base compatibility может нормализоваться один раз на границе surface size, но внутри `.dev`, puck и face запрещён любой поздний 0.9-equivalent factor. -6. Pixel-centroid smoke использует controlled solid background и color/alpha - segmentation; точные thresholds калибруются failing-before-fix/mutant и не - становятся browser-vendor whitelist. +6. Pixel-centroid smoke использует controlled solid background, изолированные + solid shell/core слои и color/alpha segmentation. Совместный тонкий annulus + не используется для centroid: вычитание большой core-площади усиливает + обычный edge-AA. Предел weighted-centroid `DPR / 2 + 0.1` и предел painted + support в один физический raster pixel получены на матрице DPR и дополняются + нулевым DOM-center delta и mutant на 1 CSS px; это не browser whitelist. 7. Общий concentric layout предпочтительнее размера, округлённого через CSS `round()`: последний зависит от поддержки WebView и не решает shared-center invariant сам по себе. diff --git a/scripts/mutation-gate.mjs b/scripts/mutation-gate.mjs index d22202f3..623aea20 100644 --- a/scripts/mutation-gate.mjs +++ b/scripts/mutation-gate.mjs @@ -574,14 +574,14 @@ export const MUTANTS = [ }, { id: 'device-visual-factor-removed', - guard: 'node --test --test-name-pattern="issue 212 applies one visual" ' + guard: 'node --test --test-name-pattern="issue 213 resolves the effective base" ' + 'test/device-marker-polish-contract.test.mjs', - because: 'the owner-requested 10% correction must stay in the shared marker geometry ' - + 'without changing stored icon_size or the interaction target', + because: 'the current effective size must be resolved once at the surface boundary; ' + + 'restoring a late face-level 0.9 factor would shrink every marker a second time', patches: [{ file: 'src/styles.ts', - find: ' --device-visual-factor: 0.9;', - replace: ' --device-visual-factor: 1;', + find: ' --dev-size: calc(var(--device-base-size, 2.25cqw) * var(--dev-scale, 1));', + replace: ' --dev-size: calc(var(--device-base-size, 2.25cqw) * var(--dev-scale, 1) * 0.9);', }], }, { diff --git a/src/device-face.ts b/src/device-face.ts index ec815434..288c030c 100644 --- a/src/device-face.ts +++ b/src/device-face.ts @@ -114,6 +114,7 @@ export function renderDeviceFace( ? html`` : nothing}

  • xM@K6qnB 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 z

    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�#DJ&tFC)4v0&Awn0u?Lu4~>9rPoS*i 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 delta 244429 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 P0f7QoRi;|XH01vPLEOP6 diff --git a/docs/images/02-view-touch.png b/docs/images/02-view-touch.png index d88d058c63e55626ab9a65be95f2e82af4be69bb..7641352d9129bed42b922ba0ee3c6a969e8ce4b6 100644 GIT binary patch literal 63198 zcmeGD^;aCv7c~mwlHeo|+$~seA0WuU;O-h+g9QSEdyv81-90$LHNo9o26vY`pYQuV z|HEDDKK)B|_v)^yuBzVWoPBnMD=Pvq-x0rqgM-7Am6241gM$x&gG0DSLx9~mryk6L zgTsN7l@wR^$T)t{ilG}$BM*Ba-!Dii{C#|iXE3X=s!>^VMh4&8kB8XuK0xB!gulU{ zD-v59f&EK5@Z8@*f=d{~q`*nGH?Fz;3!5Rz3LOC#qVbo7HX#?Oh^biv1KqzBGmmKN zqR)h%<-tASZ_SywKCmRM`I)b3#^&lc+t>p3up~-IbN5BmM^&31g{TVk zG1d@zV{%=1GO3VXVGAiklTjae^BkkyBJCS3vJyu&1HO0E5<)0pt(w~7SV)FcBpk5( z*WLT*oDT_NJNd9vUN~HpDI2E$>aL(li>C>fB;-8fJ6&7Yi zBMJJy#s3|G|GNtQ?~m~R3M}xu6)z}&At3M9|Bn*q1Uss*CCe4gYBnG+LjP8?tu?#cop--n-;BM4>V<@&qCPo!Iy>9Ag10taI~opd zSD%)f?4f5zz0lf=a40m@+sl1AkEH4Jbg?79sTj2w2pqKB-@iLuOJ%FMeXJCEx;ufM z9`-o08%Ap~CmIO3Z@5+(w)t$2Er(*ey1H)6TaE)+7BZKcHeG+KcKAGv#WrDW)1{?m zK5W08TV~R|KZ(*6c{q-*_wY81jvgInKXxj1w10UVZ9}~~gXT?B{M4zO{c*C8Rb^D} z?R9l46pDQa-CieKZrWN06*^ztcF;Idd`<-2-waP%dQ{sjw;~ts6B3-R`UXWra@^lc zZWphv8tCyl_CQ-&9zr46f3D`lKaU57LY|(Ucrmdzudn}MoW4~`pju6KJYk21hK8V^ ze)qJo@ieo0j(P37Bez?w`??(IH5cH-U9!7swg3lI@%avW#V zO?d6|`r+p8zI{D(aIn?0b!q^G&R<+Rt_Zk(H`21S^n7HOF1r!T^!csZ=5ur#+Z#GU z1{Ha}eu(HxIa!{XHmYD*`{P0}&LKNB?fZO9WJt}T;rV#={*D3w2-rVRq!@2%YV*3< zGs(!xO!s=;SzHc%xIPmFbAOrWv<_2xdx%K(3|;Sd`+jvkkt6g{czPa=-p>DY_c*=Y zQ9euNGesfxa@ulWqkAK&^QS=V>Bc1sCaum6sZ8+GV|{x0BQr8+v@0+x^|p@ZnMp0dL!rmFH)O&vs~y;0G~Tc4^@FpEvT= zt$jAb{wKS(wx{flPekb{!Y+@rmACyZavn}i%~!Coc=&g`0=-)+l#KtV_ z2JOy-f7?*JwCsF7ydK_uIVBj>gWu2K_xVuFJbO6q^Ye6@tJu?X>gj$i)62v5 z&o&$5oZ!l)B}MkhvHa0trWf|PPueFh_>-v0W%n(73r`CIr4teN#~V+w@ryvUv)h}( z*-uJH%v0gtfL*a;*>9IC#T0*(?l|yp<^;_wGqTc+nxAi)JRZras(ie*e>gg>=ORKC z0)^flm(#Po!6Dq+^YacHB0weN_NH@-mqZ94r$@il6O$?O^T5Hv{q#N!MYe!K#F)_| z@k2oKS^p5@<)qF-c&D&0(b-s~o@#*C<1zBu$XT|ac!bZxF7gfTiZe~dx(FCy~6adf1 z(yZ4+TcJjK350%Y@K<54*UNmaVk_LWO)vMeuWSAZG_XGx)&2fKPTMhjz1DMFe!Sz2 zJo}aXkFf7?W>ZOsXrB<+X>xrtJG&PO|EHH?v9-S(o@rmxX)=@|<8W8#*{4(;ut)ys z{rd>fx91hh>X6kh7I z?I3OSJgI`jL8UC;%gv{TgRMlzbJVpKn%zIK$=~joeeb)yoFBE$H^m`*U{I8jJQVtN zS^j=xsaza>6GJ4;&!DH*N1=+i6fIu*b-cTp3V_qwyzu24o$mlB7{x< zRd9!<0%Zg!qd`SszuGSQaIlx@MFd!CF?cw5%^$41M{|Uu%Os_Uf+%Hy@6cFBE^y~c zwt;F>*0A^Tn(?g$fF9B#K%=bA50|)x)Vnmo)iDrdWJZe3G+2eptvdHsq}Z9e`I#d? z4>n81zhqgvH0}JwiX;C!Sz?GT{;zu_rqN`wXXny@o~O-B0&oyRIrw@un3;-Vb5;$| z8h~Bq2dNPr0XE0SKz`UQmw|(B*mm;0;VDd{2A<*xynRl$mP4_W8S6nGa^leJM}TCz zm3rrm_2D}98y1LIoU)64rSn?GFAE>p8)O)-MEM`7Bmuf!0AgJxid6`hwzw06VpA!y ziKv3OUs;v7`efGwQ{oN?$;uM^Ny?tB=eoP$@BPxzasSa#GokxFej<;3%s}|@R?lO7 zV;-oKrKmVcDtbwvxLqB5cj0wL-fxW5X?hOP4}|}ssAW5A1a`XUy;ItX3Nxy$qNeC@ z`!1@O|LOI)JVIN`$>sUbH1+Z{Q)qx;z}9Vfa`A$=Y@jj2h?7ZTaRt-}WeY%Dp2N^6 z*Kj{uh|Tipc#U9Z&jS3!IOBc(<@WIbO@L42#b$TkNMBNLpez{Hz*dL{aO?WHhgwrc z*t^~Pf_YA(-L@8GlY3xDn@Uu~t5sE2kE#X*>-sLQv0uug-muN-y=ms*UX_EIh-T8y{^;f`kfyn6_T}&kkNB0Wd`;SMTHC1->Gpf`HoF*A8)qeF= zYinKbiV>m|$3|Z$K3(@tFD$5*vzqesKD{$w&=0ynVy1HVeV~h7QHpyZ@Q8e*2D)7YD&6l3nNjaf z`p0hPQ!&H(1$5Vq^W*?U?7J z7tM4qDA>aOl@T!=X5{npVj7~jZ6N8+zeeTtqwo&n(eJ*iYZ@4VDaxjMCjHnaB{O)B z^mQtidUM;-!wN2w=lPdwBo?7F1?$(Pp3jm00*qp#Clw?#sEXfivJ8Y!QCFay9uGT< z?_t9tUB0wm^?3-hzZc>#c*65)d+o)D0q{P2Iy_Fy^eOisLgN+>EDMag&pxZ zMs-M5b6~z>j+l*B9Zr}6S=-(lkuCo@XpTs64oc#*+alnd5cT$2hzm_4ph`er_FD5W<9(;Cc{nl zw(QzZ-&ONHr)?Naa*W#LxRPTo|5*Q2`R^-Fcc($2%?Qa{V!-R}s6sP#8t9GqTlfW3 z^~+ORqLXPi*vsu-t4I;Eo-VS-)D$?7FO?bVj4M;eJy;vj(bk%Dq0=#^lOjJ(zdZ!9 zyWHfk%|$@H=K5UhyIrj+6aCTG%(Vi?s|^lBtpt3@zakvV?}0M<=hG@9$iF#3d~ibI z9_GCJA3?5?iGUvrqF6|Df%|A`zeBfqa!>oaO;LLbKM=gr!}BdDgauvkZXV_9 zD5tJaDRBR?;L_53Mw( zW=i+W%9zhE2t0tMxS0)voe>NH*#`$=A-_DaKE@z@*?0ce;El=JOIujbkVIRBvWdh* zdnd~4qw;KJttp5)L@uiZ(odD&N}AB3$qpitxY5k>ltT;VcEyScdY8sSv%9)$_SDNDzZQizL3yN{Kfkykm|4f#cf*wWnQHLiDmI=p5Sf;wK=@0t#ZN*}mV)^L+- znp{r@eM$?cQU1tat7l>uz*M|HmZUT(1LTaWGN(no6sYBQ6O!nj?}VZgC;!MPT8P^C zO4jS-if%_rr??Oso1mP7Olz`Yg26>S%Bk7GV=J3p>rpZN+X)qvQ3DzRxumyrVIFz} zwU!FymA84*v&G5Z+hJI1XnPsE@CgE2ZeN{SYW~HA@ebyh@zD6Z_CMsaseDUh6r)oq zLy&pJ{Y_ZH*+WCiLQoOpKyMOP$3lr$M3|-+SweL;&rC^0#y9P)|L?;;zUuqQQdiON zX%<;LG!7i9B4kP?%M8z{QG5ablNW78%Kh=`NC?re%rb%t8!kQ*O`P1H@6^fdR#P-n zvo3;@2HJlp^CstHnW@e?JOq}w-xzgeNstoMk)t7NB9FZ0a+P?&A`@W{UTo~uPGBNY zc`RmPtb9#W!knxLHQx!vkv~*&FH+OA91k>Sx~1%behk|6zYCC^L{j7pFP5Y)5cnIX zS!eoOLyosvppNs4(tT~`O=dd-7iy*^UE3fA_KGt_Y1c0kV%1c-vp;gs)GZUNfpeqg zl&w5%uyP~(I9KTA81*}@aE&!)m&WzuynsjKy@NQIn}1?m`j+={QZE$S&Izje$uO=@ zCMa;>4@yh%%yRu#UW_>nALEuD(80yaAAwTjj$)L3EP!4;WL8-A3OIPnF$(dy)=4 zpnuA?qo6~R{mc4E`N-Sb0r<4BN#_j9eS}!jB{HIens}t6yZp-#bL1$S}h_%$cgIaql!K@=L2(uFA~N z&!zMw9)eXOQx9aJNEH1Ki=-newK{N9Wq83v1c}EcF3NiW{FdYB+lWStroQh43~=Oq z9$F>8N4-duXi4@-cis2V9?}rwZ*}($TCsMQsrZ42NlDS3sxhzcoaH_Y>eJ(z)8d7b z=goZD*R4TRK*C$PpeIF)mE0h@tg+Jru)%Lx5DN+ zFCk?%G2+j&4^sk7uoU&LF~CPqhGm~u94B2t!o*3{^v65_(&kzGx^Al40!W5tog!bM zT!toyZxRh_4sD-J|L0lXr2gCQQfl%<-1Ya@cXyvDHqWXMCo52pOK1<@h;EA&N`kY9 z`!$Gux^-o7%uY(S>v@)-0@&KNL((@Zt*|%>1hBj4tH0Ty0yu3yF#klqgx6Fxlz<;J zI<6q0F~21`WVxGZ7-OX8==7JQ7;Fsj_6CL-N);6((k3mxv(i%)TS23Ic;{+@Kc^qA zQc0^RLS!O^$b>iRH2vDZq2U~uqYvW2yqIjO>IK6;1yTEfucrzbzDMWuQ5!daYI<$^ zSVxAa^B8J7{fnA^u7pZSPnFaoFeO_wn_l(p&GQlMBI)S;TH3B`*sT}cd$xXGvAm$~ zeBzL&P-1TAOwisx8bYMASy7@*DxfxO@c9&&_k-jFdsg`?TbxsC>6ihi<_nuZmtd&g z?;a2p*(^w}1AF@lJoTHd6;*#aenJL6psDkO69 z6aazpCCLx?%-xa}aXqGsDJd0gNGzDMLCyrKc&%C?d!G!~i_y4eLDHAP^L<)2q>ei& zB<8H9G{!zA;x{TChQ3qurEym-?>Fy(FWwzr=?Z-8diHQNF#dKN;16QXF*D^WJg+cI zMA70b=J|>pmloA@A7cKETo)Eoq=;p~RoTNfFQgz@)-RRG)0dv)(zK&=80A|DLNU#7 zN+!w1r97Oh`vs~1iO$#U|A;Tk>YGACN}y0~qD{@9$Ged{RX1dg#nMBp3_A31GU4ER zRY{N`L7lZxcsQ`k&K6RUJl6CBEo})J21E`fMYmECG-`h~Bd?7bB?_nh*=|o;6v+*) z#X>OQG!b;S?+#Nlt5aGxY};$_z{Xr?{$ z$)W6w(t*FoVQ9DmzZ1kAua;>#TW3^ZM*m9rT+x~p#T3SIT${hL zMsYdWJE&w@w(}pbjd$`xz%%p9)6%7JoifvW>qNw$>B7A|f*Ewvbz;dnZS+O$@7iU# zAxF(0NrdqAiM|CAwc_A)oY-&oXo*K>2N-zV)>FRx`00O>?(|v^OF1sX4a85%cx<4_ z-qemJh9BxhHDw{pw>~X68j?;9T2y@ny$SG6s89%0ZNjyjstPjs#u=P{iHHm2wLLk~ zFDAWKi6^Q4;otxma3Dc}e(#{j5cGFOKPww9wbtf&hqjUh@WPGGHYlHM`1{GakTzCQ zoSeiD0eyIQFS?l*t+*!#BS0Io9Tk(8@HfZ5UjTZ_>Mx4hoDqYpM{@p)w#6~O5S2_+ zqxVWgYa>!C1m~t~jkfp?7ylwkUEtyo1cBW+hxNOSpnLT8$;N?bWAu57ObqzoXDh1a zU*Syh{oK*nFVXGs3|moy3->VieYXyaxU{Qhjb|DC;&|io?VfuzFB zEu29-s#{;CyyIthv0o)4bsaZ~%c9cCv-AgZvlP6237y;U3`8jfM=*T6-yWkjid$U9 zM>T|vKC*F9(?B?1&)xjs;C_?jf<_RGw!2;uee=PkSyL`DZPwjLj7|Qmt5=Gx zBPQT4eX%5K<1u70v0-k>_wS$GLM1z54a@uap^732-9zeggXcwLLW#5&XU_IihXxg+ z-8cowEsyc#8{!KxWxr}Y6T03C+HHBLpBjrCCew(d>S1@pZw;MQ#+llVPUw>q zY^9;VN1ZExU9U5Hm63j3#Kl00iYyhIT}!Wp7)08-;hMF=TY;LN(6!^m#1QpMQ)%J4 z2DNO+iD=Sgl~I{<6HQxSUf0~{w_A!JGX=$7So`;w0w<<%_Fzt&IGVcm$mKq+ZTJzZ>YJ;4;wxfI_BzXAw zYGi}$cQ>v!qtjQh(;-9cPiaN%iiBJx{{M#ypdrU)rU!7y5`Xa=p|?BBQyg4!3POsu z<)6-+ED{cr)ns1)S{Y{1O@#fjO}`IOWZ zr{uldUfx=sn)8)y!Q?!Vl{|b=^76YV5m6GWx_r_qJ5Nf54Lx%!eQck+hO9ik<~wMc^r3vVe42;6siQbQ!?eEV z1QR-Rsz9*JcXljeEwaGof@oj5f3(sCo5>YJwC}4w{F%HNzL-2|!?ro?D8;FT_lxE| z%vS<{JB!;$9CN~lVJrWaY@($1%o(xKlxwMH8e1WHWC%Ka*e18Unp`RuhB)It6qWE0 zQ_ag9?;rxn?|5ha2E(DDYVVtneOcB%l3@jqDmt_`^`sDw`VY&9K~;`7w)u<9RifkU zr6x1lmHn$VLjNWhg~7v>C6y{|&rQq_np0ikK>SdmTS*T1 zV3gLN@&y10e?)sgD|TFK(UR#hgqi+U^Y}~L$1^q!)r6qf!S+qI3-Gkd4g9+0=qI0i z=KEi$UDZqh6I7ht`6~!!nTuxquZBHUnW_o7Mr@1g`i3oqc2SO{!}TZ;g#ZR?)>NH|C= zrzEJ#ls7$ou9Blx)VB5;pRI$Fc}OdMpWBRkaG15%O#L$BGlvt6 zpZvMbAxeLEmz}Q8P)R8ZLO@8^$?q=UDNBM1V*#J2DK_oZ$~8=8VG*=~qCz>KOuhUY zerbRIWXjsI^eP=$m4svvx*erAk64bWSpQe)RjV>QX2SJshu~k~iMX&{wN16S-81sa zWN}X^Bl|Zavc}`y6kIStg*MGU8p+#grYx0Ef_ix9956qqP1yH4eZ*$|_k=0JG->9{ z&Cx0O`mj1Z!n{Qz6%FyZeQ3cJ^}wd)MX}i5Q>TEXK!v?|5nyp)LJ)cJC2m?~uf$78 zf52Rfe1UYIS=W51D|>1eCfI6^DdZ@ki%o*BMwo)<3F-Hw#iuVH)ZjT%SvdT0@GHdu z?p4=J_636&hh4N_Js4zTa zHOlR;I6M(U!O-WTd^$ZbV__GOi(rN=JCV$XzQFX?+@`~i6Sq?nPjb{co9}bk2we;P zSLc7A8VqKpPUR8vn0MHk+TkfOO&V&$YUwE;xSxqgAc-Zv=Hs(y%atLZfk7r5PDcSI zf-_z?1n{&Yzva1Eh1c&PI|PIQu`mpX#bn91j^j!iCtJ;$7f~Y_m^Y$}|9t)QJ2Vm} z%`vy$-^#zD^`c%+gC+jSl&d9GST3UQmv~Dc7IcN?Z{HT8(&+&e8y>oJIeI*(MlT$F_Voq1_RFcY@;w|E{9sBJ@hnL@> zyJ65u2`E12Akh63p#7saj1Of92un;-U#b9G+M5^1tCQq`YcIPkN@H24P}%81i!bd+ zaKz|c`xLd+RM=i;M1?hJg!us@w$un3O!m0%^va<;tEsxi=J6;C7R)3{PE{Fei*u6p z)YOZ*^SivCmE;M&?x#n6*Hy9ZD?{7-pb8>2Hgp&O@p_=E(lAdN@wPmSuCxa|P3Vwy z#JS)dh;b?hCMu-xxA2%)XQ%sAlTxfUyCoOu_MwP%7)p3w2P%#K_~E*-$_ZE_FO5^m z5&?P#frF--ruM{YWx_m!DO6Z`R0HmZ_IkNv#c*`FUJ<)JQ;pw&&%BkBi*Jfek|YD9 z8Py?M5cF290QOvT-gkOvO#9UQ=W8)6H@F!{;b0aLeR9XoL}ZX~ zqh?9#)Q|ymI5Zl5R!HoJs6u7yjeJ^Jtkd=PxFm@9_-Z8(K?CB6CO$`oLWC?SWaX)7 zdp%gjZgMqrlkQ`rZKmKNWn$D3-Xi7b5L$oVWVXhb|zXUq@DE9iqn;~>iS z;#vgsoL^0Q*t56`m$`6cFIud^6y}ZI{YhZH?thRI0C+MNIXKc{U}M7=iN1|4xC&xq zW!07pY2QBJ87UxT?DDnN@z=Xi>rqf%;qz^DAOqqmHN&VbXmdA3CY%b*M4 zyWz%|dF39!NZOnnNnv-4Wp~ht>sPkC{Gi0h0S}xomg>YD73QC<@Uk=V?L{W$#c`lI z#%`pj_wH$_V)8TI>g14TCc{F&O25nPZ)9XVE~ z%QPdNg)W&wL~+LRfP}~BLSS+kgK=Q?8)|5wYcTNi&Ee+hqU_y0Bi?IGD=tqDyn2ir z(Cu*LG@?il+;VdjK;xS%~8+hgkK891+^7pZpiNq-W|M;>r72SQB#mA+SU? zG#_T*t7aR2qZ|2dTgZ@0ReHUd!NT#tj|FDM9-qIG^Z4NK{c1`n z40I=N`7Ptel>2@Fio3w+-yp}0_}uF<;&UBEFsp>o`e!XvRL)A$!e#ff{riJ@$aum? za7Q(F-l$2Op;z5V7;B?|*Q4Zx=_4_x@g!%G!S`2AMO94|}Z$+c#D! zM>G0D7$r(jru}>Zmru@zQagJp&<vKUlZp#3RtsFQ^B_iCVTLhj_SD^?S_Wk`$#-6%KoB? zN8tWZsrho)vr7TKq`Jh_?1L@}(9|X#Ac(S#+n2UHUpE%0oB7+&0VKu#@Osr(Z_JHX zn(DCSCG*`E5}PkyQCEjsWRxC zon6)G>#buop;@$0E}w;Y`RCBkAs}=)d|&|PxcJ3o0Z3H5U0?RdyoJl@@qW}^23b;d z{f4i&OhV^$5mr}5GD^#ber~)ODH=AZTMyi{Fd*BDDw#(aFWlpzXTWliNm3r<+kIbz zv-Hs^n%@11jnTn{S?e!f7YDlkW#~S?08JWvk%Lq(aw^ovZv}$`cd{0=ouuI4)$mIF zg?+CIukp_J>SQzq(%RP6Xt##s$oP8d``VeAohb(zZe&frIO?035q{?S$*_Ff&G%B1O3Wv`d~;S)#iTlZ6B-BF6pd8fYm~9wyI`V+*Yx0shp7NqCIz zH;buY5!GE$^ylzo7+vIJY`k&aJu{J+nb~%Ib90(i_3(haP_n=+Tmqh1pO?%3TZM-l zO3_2a%x?KOof^2M%zXe2~pedhtK)m;~yQVFVd0r?K4)zW*w)rx{a! z^`{Q`CJvt4ebNYX7PR(Nv(&UbJ&Orpf{q3dYXQ1Rk4zJlkEd^Lln!S4ZsIMb5Uo0K zJy4lW8RdEziC!(UxBCvMYZWM!p#tDT%Uw-o$O%i(0k*h&`$xjkFOl*;)8{JfK| zTRApMTjEde;rF+91&N2@+*yjktV~=C)JIl?uEJwFjNxbTrTg`vEnBJZYSd*Q8K_TZ zLP!5Ct1&AvCFY^x!RG$T;^rW|qu}FOi41<3s!y(M%BM}hw}5?kG~4izX`k;PK46bN+3mwb+J5+*Pr|f4Oo_ir0qeFw z;D+XAG?<$^?+OO1K3G}&a4@xz=7u<0$7%PZ_(8-}De7yauLvZ1YT?yjEZ{B2gp46G z9aDAs^T20-or8wr`|k{&G0cM#6Fybc$$d8$J8HXsdM6bY;*3yH!Z~ZT*__-b znzmA4Z3I%-2#)(h18InxT#rQBKWU4hkL>Zko-K(s2*c=TR3q2&zfCC54SUBcykk5aEY zO zb8-Tt%CN1rUO_ss;J*NH;hH`%vi!5hV9zgNWdPp!iNgz_!Bj>h*woCy%}QNrbkd9r zU0zp)fv)JE;sW9nv90#6FuZ?Obbo{Lw8RHx>tDD0Ak$(x$X_$J-aFL2sIXWS^LFOB zHw#yOQmOQm$6AeaPw)UH8JXo->o_CVoUa;W!gz9po47wMK5`Fe>BQD>kx`MSRjxzQ zTlq#0_ZT1iO`YHV7yNO%=~0Z6{=4_Ugr#Y5flPL%LSnW$2@Js@JW1d3j|J&d2&c>} zwEK;DwYQlf0{EHr;RVfU)#5^wxCS5xLs8m>*D^1OayxBpk0Q>{o;f~|Uldsi_rX;y zW}j7#E%{GmoD&YSL?T6_uHRb8rcOx+}H=9{}ISb11-k1;RIZ=PQ2 zrRo#WHVmIlasL}S4%C25W_i-jfIMB#pjMGYQ?%)zfhXZt-_9bGXkzVDV`2Ek#6I7- zl7+2&X6Pf1o??b&05*BywX0wr)EVr0lYSKV^5ST7Anne7G3oE^W!#&uTORUwuzTkiAUFrhJm`qWtFaw6pM(bLPbRh@CjMffj}e9jhMmv0zj z-1R#7lM*7IMBL~5*q*N=f~HAA{|ilTPZyCL*-lryO2FI#JTE6VdNsAVjw{lDrFQG) z&T0i!x>Yh+aL{cVdOjuM6lWG>o;C+Z+NP#9s`e+MFi;v(-t4&CyUXJ48)ann*B6U` z#uhs&mrZpx5b_>VKDkTd4d^aM0A8A!qZ*zET<>geE+f1~hU##vUTRGi-Dmt9y*P*E z?KGjuIpx|eC(87s?mlwUDyK$A@_;rP%s0Ds3O!W?v|ipcQDlXe#xaFK7_Dt@80qI> zf5;Re<1Dw)KwGU2zy^y z0fv>H5U{bq>x=2N2deI4{(%Nh8p<#Q^Ee#76-7&m^QUY~%1Emqx?T4vRezK)>E>at zZBLU+ukHwL48~%o&=*jo4jQZ%HE9@JhMM(E7W_x zx(u7rI_zJRa#&w61?h+CxQYEjOfooH_;Fa$m;?Zi*ZJ5Rqy5+a^oM}+4l5y1QDf0q zyZPx&XQvDQ1-^)gFO=Yfv`naQ=}#2-qNSaee3r{cG~z`Xpmc5qN3Mb`MwcqZw#%Px zGqa5S2Ff4YC}~N|J5>1pcv=eclsznu_x&D0Ifdr}@k@769@OVG;YYNWTRe2Dl>Fiv zU#Wjm#+V+`ajbslEcnhSv|9$@H&OldZcL#k`wtUEWni*dy`P)-Qad9!$o)wf_YCdP zFmO#t0(^b3I1Nj8z?f4&t0${HI5xevZndna(R!gM77}pN&d=%d65^dwB;@HLSozX%=lGv9wR7jw2alk?oI%nw_%Kuq~h^e6904cKV-E-u1os(R`jN# zkoId|z6L#hZTxEUpL*2dVczOPo}yRingCnlMIpON%2keXWS?>T-bMQ1`WkeJf{q(5I^@lr%Y#QIwM z72;1%dBt&O`(Wb_SbxGFY`MG>T2d1z?rpb+ZBX{gaHqlt(tn!1Q|jA$mq*T3Z5oIl z?3cMPrt-O#s^tJqIxQ3Fa*8&l!P@5B5_!<2;zLY{;w8*n#1+w&#%tQU*5tg&d{Ic< z*wL5Eja0G*K_fL1^rCciUBIr;k>9N8e3iHy6AEwHo$gf`U3~0KZx@*~*hL|?nDV5b zNZ&Ts1})tIFZ)^mIKSWY^jrBIZSIPS3f%+JzjejEuZKg=rsrd0RbXk9oPy+U+u5>@ z^h;-%WKck9BN8>!1i|P{EO?md^D+(x(Nci`MF*Z->YfW2HEOPZ#D>o2w_X=$bk00D zKX8_q{5ncDI$!WeBQ<;6H4*>wSGC*_&R4hhng_ofqOk0SN%win0&Hn!^*|fdqG;-4_B^oF^xR;dcb}%3%8*e1j(C6C?l-u1d$%)HzuCC% zuR2xi_;y=ocxYzz*B0;K6IYWj|Kw8N%)4YeQ3usCvY~vOppC_S__kHj7NS}EnA#cF zp1C7Sb8V?z8kwU*k4+!0)AO0R!9pZOdoOYr-evfjF3Tvj{BZs|&BNJ_`t$^IZgtRzSNP^@fR`@G7~PTx_OD>K5QX7qNIzD6tI;0u?J20n6#~+v7TtjkHt1s@OP+= zHR6Z(^lCpVPBJ7qM#>2|I!c;W9Y+at^S>I&%^WrHem&yrm;!^qrZa%Y+e{lFyFt*F zSmpD=pGM_ve^Q|3zqbbn>f5z0d*