node-red-contrib-knx-ultimate 4.2.11 → 4.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))o(d);new MutationObserver(d=>{for(const u of d)if(u.type==="childList")for(const f of u.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&o(f)}).observe(document,{childList:!0,subtree:!0});function i(d){const u={};return d.integrity&&(u.integrity=d.integrity),d.referrerPolicy&&(u.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?u.credentials="include":d.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function o(d){if(d.ep)return;d.ep=!0;const u=i(d);fetch(d.href,u)}})();function Jn(e){const t=Object.create(null);for(const i of e.split(","))t[i]=1;return i=>i in t}const we={},Ma=[],Dt=()=>{},Fi=()=>!1,Hs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zn=e=>e.startsWith("onUpdate:"),Ke=Object.assign,Yn=(e,t)=>{const i=e.indexOf(t);i>-1&&e.splice(i,1)},wd=Object.prototype.hasOwnProperty,be=(e,t)=>wd.call(e,t),X=Array.isArray,Oa=e=>ys(e)==="[object Map]",Wa=e=>ys(e)==="[object Set]",Hr=e=>ys(e)==="[object Date]",Q=e=>typeof e=="function",Fe=e=>typeof e=="string",Rt=e=>typeof e=="symbol",Se=e=>e!==null&&typeof e=="object",Li=e=>(Se(e)||Q(e))&&Q(e.then)&&Q(e.catch),Mi=Object.prototype.toString,ys=e=>Mi.call(e),Td=e=>ys(e).slice(8,-1),Oi=e=>ys(e)==="[object Object]",Qn=e=>Fe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ns=Jn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Xs=e=>{const t=Object.create(null);return(i=>t[i]||(t[i]=e(i)))},_d=/-\w/g,pt=Xs(e=>e.replace(_d,t=>t.slice(1).toUpperCase())),Dd=/\B([A-Z])/g,pa=Xs(e=>e.replace(Dd,"-$1").toLowerCase()),zi=Xs(e=>e.charAt(0).toUpperCase()+e.slice(1)),Nn=Xs(e=>e?`on${zi(e)}`:""),_t=(e,t)=>!Object.is(e,t),Ls=(e,...t)=>{for(let i=0;i<e.length;i++)e[i](...t)},$i=(e,t,i,o=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:o,value:i})},qs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Xr;const Js=()=>Xr||(Xr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function fs(e){if(X(e)){const t={};for(let i=0;i<e.length;i++){const o=e[i],d=Fe(o)?Cd(o):fs(o);if(d)for(const u in d)t[u]=d[u]}return t}else if(Fe(e)||Se(e))return e}const Id=/;(?![^(]*\))/g,Rd=/:([^]+)/,Nd=/\/\*[^]*?\*\//g;function Cd(e){const t={};return e.replace(Nd,"").split(Id).forEach(i=>{if(i){const o=i.split(Rd);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function ce(e){let t="";if(Fe(e))t=e;else if(X(e))for(let i=0;i<e.length;i++){const o=ce(e[i]);o&&(t+=o+" ")}else if(Se(e))for(const i in e)e[i]&&(t+=i+" ");return t.trim()}const kd="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",xd=Jn(kd);function Bi(e){return!!e||e===""}function Ed(e,t){if(e.length!==t.length)return!1;let i=!0;for(let o=0;i&&o<e.length;o++)i=Ua(e[o],t[o]);return i}function Ua(e,t){if(e===t)return!0;let i=Hr(e),o=Hr(t);if(i||o)return i&&o?e.getTime()===t.getTime():!1;if(i=Rt(e),o=Rt(t),i||o)return e===t;if(i=X(e),o=X(t),i||o)return i&&o?Ed(e,t):!1;if(i=Se(e),o=Se(t),i||o){if(!i||!o)return!1;const d=Object.keys(e).length,u=Object.keys(t).length;if(d!==u)return!1;for(const f in e){const p=e.hasOwnProperty(f),m=t.hasOwnProperty(f);if(p&&!m||!p&&m||!Ua(e[f],t[f]))return!1}}return String(e)===String(t)}function er(e,t){return e.findIndex(i=>Ua(i,t))}const Vi=e=>!!(e&&e.__v_isRef===!0),S=e=>Fe(e)?e:e==null?"":X(e)||Se(e)&&(e.toString===Mi||!Q(e.toString))?Vi(e)?S(e.value):JSON.stringify(e,Ki,2):String(e),Ki=(e,t)=>Vi(t)?Ki(e,t.value):Oa(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((i,[o,d],u)=>(i[Cn(o,u)+" =>"]=d,i),{})}:Wa(t)?{[`Set(${t.size})`]:[...t.values()].map(i=>Cn(i))}:Rt(t)?Cn(t):Se(t)&&!X(t)&&!Oi(t)?String(t):t,Cn=(e,t="")=>{var i;return Rt(e)?`Symbol(${(i=e.description)!=null?i:t})`:e};let Ye;class Gd{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Ye,!t&&Ye&&(this.index=(Ye.scopes||(Ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].pause();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].resume();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].resume()}}run(t){if(this._active){const i=Ye;try{return Ye=this,t()}finally{Ye=i}}}on(){++this._on===1&&(this.prevScope=Ye,Ye=this)}off(){this._on>0&&--this._on===0&&(Ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let i,o;for(i=0,o=this.effects.length;i<o;i++)this.effects[i].stop();for(this.effects.length=0,i=0,o=this.cleanups.length;i<o;i++)this.cleanups[i]();if(this.cleanups.length=0,this.scopes){for(i=0,o=this.scopes.length;i<o;i++)this.scopes[i].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const d=this.parent.scopes.pop();d&&d!==this&&(this.parent.scopes[this.index]=d,d.index=this.index)}this.parent=void 0}}}function Fd(){return Ye}let _e;const kn=new WeakSet;class Wi{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Ye&&Ye.active&&Ye.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,kn.has(this)&&(kn.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||ji(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,qr(this),Hi(this);const t=_e,i=gt;_e=this,gt=!0;try{return this.fn()}finally{Xi(this),_e=t,gt=i,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)sr(t);this.deps=this.depsTail=void 0,qr(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?kn.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){zn(this)&&this.run()}get dirty(){return zn(this)}}let Ui=0,rs,is;function ji(e,t=!1){if(e.flags|=8,t){e.next=is,is=e;return}e.next=rs,rs=e}function tr(){Ui++}function ar(){if(--Ui>0)return;if(is){let t=is;for(is=void 0;t;){const i=t.next;t.next=void 0,t.flags&=-9,t=i}}let e;for(;rs;){let t=rs;for(rs=void 0;t;){const i=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(o){e||(e=o)}t=i}}if(e)throw e}function Hi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Xi(e){let t,i=e.depsTail,o=i;for(;o;){const d=o.prevDep;o.version===-1?(o===i&&(i=d),sr(o),Ld(o)):t=o,o.dep.activeLink=o.prevActiveLink,o.prevActiveLink=void 0,o=d}e.deps=t,e.depsTail=i}function zn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(qi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function qi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ps)||(e.globalVersion=ps,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!zn(e))))return;e.flags|=2;const t=e.dep,i=_e,o=gt;_e=e,gt=!0;try{Hi(e);const d=e.fn(e._value);(t.version===0||_t(d,e._value))&&(e.flags|=128,e._value=d,t.version++)}catch(d){throw t.version++,d}finally{_e=i,gt=o,Xi(e),e.flags&=-3}}function sr(e,t=!1){const{dep:i,prevSub:o,nextSub:d}=e;if(o&&(o.nextSub=d,e.prevSub=void 0),d&&(d.prevSub=o,e.nextSub=void 0),i.subs===e&&(i.subs=o,!o&&i.computed)){i.computed.flags&=-5;for(let u=i.computed.deps;u;u=u.nextDep)sr(u,!0)}!t&&!--i.sc&&i.map&&i.map.delete(i.key)}function Ld(e){const{prevDep:t,nextDep:i}=e;t&&(t.nextDep=i,e.prevDep=void 0),i&&(i.prevDep=t,e.nextDep=void 0)}let gt=!0;const Ji=[];function Jt(){Ji.push(gt),gt=!1}function Zt(){const e=Ji.pop();gt=e===void 0?!0:e}function qr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const i=_e;_e=void 0;try{t()}finally{_e=i}}}let ps=0;class Md{constructor(t,i){this.sub=t,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class nr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!_e||!gt||_e===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==_e)i=this.activeLink=new Md(_e,this),_e.deps?(i.prevDep=_e.depsTail,_e.depsTail.nextDep=i,_e.depsTail=i):_e.deps=_e.depsTail=i,Zi(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const o=i.nextDep;o.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=o),i.prevDep=_e.depsTail,i.nextDep=void 0,_e.depsTail.nextDep=i,_e.depsTail=i,_e.deps===i&&(_e.deps=o)}return i}trigger(t){this.version++,ps++,this.notify(t)}notify(t){tr();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{ar()}}}function Zi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let o=t.deps;o;o=o.nextDep)Zi(o)}const i=e.dep.subs;i!==e&&(e.prevSub=i,i&&(i.nextSub=e)),e.dep.subs=e}}const $n=new WeakMap,Da=Symbol(""),Bn=Symbol(""),gs=Symbol("");function Be(e,t,i){if(gt&&_e){let o=$n.get(e);o||$n.set(e,o=new Map);let d=o.get(i);d||(o.set(i,d=new nr),d.map=o,d.key=i),d.track()}}function Ht(e,t,i,o,d,u){const f=$n.get(e);if(!f){ps++;return}const p=m=>{m&&m.trigger()};if(tr(),t==="clear")f.forEach(p);else{const m=X(e),T=m&&Qn(i);if(m&&i==="length"){const A=Number(o);f.forEach((I,L)=>{(L==="length"||L===gs||!Rt(L)&&L>=A)&&p(I)})}else switch((i!==void 0||f.has(void 0))&&p(f.get(i)),T&&p(f.get(gs)),t){case"add":m?T&&p(f.get("length")):(p(f.get(Da)),Oa(e)&&p(f.get(Bn)));break;case"delete":m||(p(f.get(Da)),Oa(e)&&p(f.get(Bn)));break;case"set":Oa(e)&&p(f.get(Da));break}}ar()}function Fa(e){const t=ve(e);return t===e?t:(Be(t,"iterate",gs),lt(e)?t:t.map(ht))}function Zs(e){return Be(e=ve(e),"iterate",gs),e}function wt(e,t){return Yt(e)?Ba(Ia(e)?ht(t):t):ht(t)}const Od={__proto__:null,[Symbol.iterator](){return xn(this,Symbol.iterator,e=>wt(this,e))},concat(...e){return Fa(this).concat(...e.map(t=>X(t)?Fa(t):t))},entries(){return xn(this,"entries",e=>(e[1]=wt(this,e[1]),e))},every(e,t){return Kt(this,"every",e,t,void 0,arguments)},filter(e,t){return Kt(this,"filter",e,t,i=>i.map(o=>wt(this,o)),arguments)},find(e,t){return Kt(this,"find",e,t,i=>wt(this,i),arguments)},findIndex(e,t){return Kt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Kt(this,"findLast",e,t,i=>wt(this,i),arguments)},findLastIndex(e,t){return Kt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Kt(this,"forEach",e,t,void 0,arguments)},includes(...e){return En(this,"includes",e)},indexOf(...e){return En(this,"indexOf",e)},join(e){return Fa(this).join(e)},lastIndexOf(...e){return En(this,"lastIndexOf",e)},map(e,t){return Kt(this,"map",e,t,void 0,arguments)},pop(){return ts(this,"pop")},push(...e){return ts(this,"push",e)},reduce(e,...t){return Jr(this,"reduce",e,t)},reduceRight(e,...t){return Jr(this,"reduceRight",e,t)},shift(){return ts(this,"shift")},some(e,t){return Kt(this,"some",e,t,void 0,arguments)},splice(...e){return ts(this,"splice",e)},toReversed(){return Fa(this).toReversed()},toSorted(e){return Fa(this).toSorted(e)},toSpliced(...e){return Fa(this).toSpliced(...e)},unshift(...e){return ts(this,"unshift",e)},values(){return xn(this,"values",e=>wt(this,e))}};function xn(e,t,i){const o=Zs(e),d=o[t]();return o!==e&&!lt(e)&&(d._next=d.next,d.next=()=>{const u=d._next();return u.done||(u.value=i(u.value)),u}),d}const zd=Array.prototype;function Kt(e,t,i,o,d,u){const f=Zs(e),p=f!==e&&!lt(e),m=f[t];if(m!==zd[t]){const I=m.apply(e,u);return p?ht(I):I}let T=i;f!==e&&(p?T=function(I,L){return i.call(this,wt(e,I),L,e)}:i.length>2&&(T=function(I,L){return i.call(this,I,L,e)}));const A=m.call(f,T,o);return p&&d?d(A):A}function Jr(e,t,i,o){const d=Zs(e),u=d!==e&&!lt(e);let f=i,p=!1;d!==e&&(u?(p=o.length===0,f=function(T,A,I){return p&&(p=!1,T=wt(e,T)),i.call(this,T,wt(e,A),I,e)}):i.length>3&&(f=function(T,A,I){return i.call(this,T,A,I,e)}));const m=d[t](f,...o);return p?wt(e,m):m}function En(e,t,i){const o=ve(e);Be(o,"iterate",gs);const d=o[t](...i);return(d===-1||d===!1)&&or(i[0])?(i[0]=ve(i[0]),o[t](...i)):d}function ts(e,t,i=[]){Jt(),tr();const o=ve(e)[t].apply(e,i);return ar(),Zt(),o}const $d=Jn("__proto__,__v_isRef,__isVue"),Yi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Rt));function Bd(e){Rt(e)||(e=String(e));const t=ve(this);return Be(t,"has",e),t.hasOwnProperty(e)}class Qi{constructor(t=!1,i=!1){this._isReadonly=t,this._isShallow=i}get(t,i,o){if(i==="__v_skip")return t.__v_skip;const d=this._isReadonly,u=this._isShallow;if(i==="__v_isReactive")return!d;if(i==="__v_isReadonly")return d;if(i==="__v_isShallow")return u;if(i==="__v_raw")return o===(d?u?Zd:so:u?ao:to).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(o)?t:void 0;const f=X(t);if(!d){let m;if(f&&(m=Od[i]))return m;if(i==="hasOwnProperty")return Bd}const p=Reflect.get(t,i,Ve(t)?t:o);if((Rt(i)?Yi.has(i):$d(i))||(d||Be(t,"get",i),u))return p;if(Ve(p)){const m=f&&Qn(i)?p:p.value;return d&&Se(m)?Kn(m):m}return Se(p)?d?Kn(p):Ys(p):p}}class eo extends Qi{constructor(t=!1){super(!1,t)}set(t,i,o,d){let u=t[i];const f=X(t)&&Qn(i);if(!this._isShallow){const T=Yt(u);if(!lt(o)&&!Yt(o)&&(u=ve(u),o=ve(o)),!f&&Ve(u)&&!Ve(o))return T||(u.value=o),!0}const p=f?Number(i)<t.length:be(t,i),m=Reflect.set(t,i,o,Ve(t)?t:d);return t===ve(d)&&(p?_t(o,u)&&Ht(t,"set",i,o):Ht(t,"add",i,o)),m}deleteProperty(t,i){const o=be(t,i);t[i];const d=Reflect.deleteProperty(t,i);return d&&o&&Ht(t,"delete",i,void 0),d}has(t,i){const o=Reflect.has(t,i);return(!Rt(i)||!Yi.has(i))&&Be(t,"has",i),o}ownKeys(t){return Be(t,"iterate",X(t)?"length":Da),Reflect.ownKeys(t)}}class Vd extends Qi{constructor(t=!1){super(!0,t)}set(t,i){return!0}deleteProperty(t,i){return!0}}const Kd=new eo,Wd=new Vd,Ud=new eo(!0);const Vn=e=>e,Es=e=>Reflect.getPrototypeOf(e);function jd(e,t,i){return function(...o){const d=this.__v_raw,u=ve(d),f=Oa(u),p=e==="entries"||e===Symbol.iterator&&f,m=e==="keys"&&f,T=d[e](...o),A=i?Vn:t?Ba:ht;return!t&&Be(u,"iterate",m?Bn:Da),Ke(Object.create(T),{next(){const{value:I,done:L}=T.next();return L?{value:I,done:L}:{value:p?[A(I[0]),A(I[1])]:A(I),done:L}}})}}function Gs(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Hd(e,t){const i={get(d){const u=this.__v_raw,f=ve(u),p=ve(d);e||(_t(d,p)&&Be(f,"get",d),Be(f,"get",p));const{has:m}=Es(f),T=t?Vn:e?Ba:ht;if(m.call(f,d))return T(u.get(d));if(m.call(f,p))return T(u.get(p));u!==f&&u.get(d)},get size(){const d=this.__v_raw;return!e&&Be(ve(d),"iterate",Da),d.size},has(d){const u=this.__v_raw,f=ve(u),p=ve(d);return e||(_t(d,p)&&Be(f,"has",d),Be(f,"has",p)),d===p?u.has(d):u.has(d)||u.has(p)},forEach(d,u){const f=this,p=f.__v_raw,m=ve(p),T=t?Vn:e?Ba:ht;return!e&&Be(m,"iterate",Da),p.forEach((A,I)=>d.call(u,T(A),T(I),f))}};return Ke(i,e?{add:Gs("add"),set:Gs("set"),delete:Gs("delete"),clear:Gs("clear")}:{add(d){const u=ve(this),f=Es(u),p=ve(d),m=!t&&!lt(d)&&!Yt(d)?p:d;return f.has.call(u,m)||_t(d,m)&&f.has.call(u,d)||_t(p,m)&&f.has.call(u,p)||(u.add(m),Ht(u,"add",m,m)),this},set(d,u){!t&&!lt(u)&&!Yt(u)&&(u=ve(u));const f=ve(this),{has:p,get:m}=Es(f);let T=p.call(f,d);T||(d=ve(d),T=p.call(f,d));const A=m.call(f,d);return f.set(d,u),T?_t(u,A)&&Ht(f,"set",d,u):Ht(f,"add",d,u),this},delete(d){const u=ve(this),{has:f,get:p}=Es(u);let m=f.call(u,d);m||(d=ve(d),m=f.call(u,d)),p&&p.call(u,d);const T=u.delete(d);return m&&Ht(u,"delete",d,void 0),T},clear(){const d=ve(this),u=d.size!==0,f=d.clear();return u&&Ht(d,"clear",void 0,void 0),f}}),["keys","values","entries",Symbol.iterator].forEach(d=>{i[d]=jd(d,e,t)}),i}function rr(e,t){const i=Hd(e,t);return(o,d,u)=>d==="__v_isReactive"?!e:d==="__v_isReadonly"?e:d==="__v_raw"?o:Reflect.get(be(i,d)&&d in o?i:o,d,u)}const Xd={get:rr(!1,!1)},qd={get:rr(!1,!0)},Jd={get:rr(!0,!1)};const to=new WeakMap,ao=new WeakMap,so=new WeakMap,Zd=new WeakMap;function Yd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Qd(e){return e.__v_skip||!Object.isExtensible(e)?0:Yd(Td(e))}function Ys(e){return Yt(e)?e:ir(e,!1,Kd,Xd,to)}function eu(e){return ir(e,!1,Ud,qd,ao)}function Kn(e){return ir(e,!0,Wd,Jd,so)}function ir(e,t,i,o,d){if(!Se(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const u=Qd(e);if(u===0)return e;const f=d.get(e);if(f)return f;const p=new Proxy(e,u===2?o:i);return d.set(e,p),p}function Ia(e){return Yt(e)?Ia(e.__v_raw):!!(e&&e.__v_isReactive)}function Yt(e){return!!(e&&e.__v_isReadonly)}function lt(e){return!!(e&&e.__v_isShallow)}function or(e){return e?!!e.__v_raw:!1}function ve(e){const t=e&&e.__v_raw;return t?ve(t):e}function tu(e){return!be(e,"__v_skip")&&Object.isExtensible(e)&&$i(e,"__v_skip",!0),e}const ht=e=>Se(e)?Ys(e):e,Ba=e=>Se(e)?Kn(e):e;function Ve(e){return e?e.__v_isRef===!0:!1}function da(e){return au(e,!1)}function au(e,t){return Ve(e)?e:new su(e,t)}class su{constructor(t,i){this.dep=new nr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?t:ve(t),this._value=i?t:ht(t),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(t){const i=this._rawValue,o=this.__v_isShallow||lt(t)||Yt(t);t=o?t:ve(t),_t(t,i)&&(this._rawValue=t,this._value=o?t:ht(t),this.dep.trigger())}}function nu(e){return Ve(e)?e.value:e}const ru={get:(e,t,i)=>t==="__v_raw"?e:nu(Reflect.get(e,t,i)),set:(e,t,i,o)=>{const d=e[t];return Ve(d)&&!Ve(i)?(d.value=i,!0):Reflect.set(e,t,i,o)}};function no(e){return Ia(e)?e:new Proxy(e,ru)}class iu{constructor(t,i,o){this.fn=t,this.setter=i,this._value=void 0,this.dep=new nr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ps-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=o}notify(){if(this.flags|=16,!(this.flags&8)&&_e!==this)return ji(this,!0),!0}get value(){const t=this.dep.track();return qi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ou(e,t,i=!1){let o,d;return Q(e)?o=e:(o=e.get,d=e.set),new iu(o,d,i)}const Fs={},Bs=new WeakMap;let _a;function lu(e,t=!1,i=_a){if(i){let o=Bs.get(i);o||Bs.set(i,o=[]),o.push(e)}}function du(e,t,i=we){const{immediate:o,deep:d,once:u,scheduler:f,augmentJob:p,call:m}=i,T=q=>d?q:lt(q)||d===!1||d===0?Xt(q,1):Xt(q);let A,I,L,$,ie=!1,Z=!1;if(Ve(e)?(I=()=>e.value,ie=lt(e)):Ia(e)?(I=()=>T(e),ie=!0):X(e)?(Z=!0,ie=e.some(q=>Ia(q)||lt(q)),I=()=>e.map(q=>{if(Ve(q))return q.value;if(Ia(q))return T(q);if(Q(q))return m?m(q,2):q()})):Q(e)?t?I=m?()=>m(e,2):e:I=()=>{if(L){Jt();try{L()}finally{Zt()}}const q=_a;_a=A;try{return m?m(e,3,[$]):e($)}finally{_a=q}}:I=Dt,t&&d){const q=I,Ne=d===!0?1/0:d;I=()=>Xt(q(),Ne)}const oe=Fd(),Te=()=>{A.stop(),oe&&oe.active&&Yn(oe.effects,A)};if(u&&t){const q=t;t=(...Ne)=>{q(...Ne),Te()}}let te=Z?new Array(e.length).fill(Fs):Fs;const Pe=q=>{if(!(!(A.flags&1)||!A.dirty&&!q))if(t){const Ne=A.run();if(d||ie||(Z?Ne.some((dt,at)=>_t(dt,te[at])):_t(Ne,te))){L&&L();const dt=_a;_a=A;try{const at=[Ne,te===Fs?void 0:Z&&te[0]===Fs?[]:te,$];te=Ne,m?m(t,3,at):t(...at)}finally{_a=dt}}}else A.run()};return p&&p(Pe),A=new Wi(I),A.scheduler=f?()=>f(Pe,!1):Pe,$=q=>lu(q,!1,A),L=A.onStop=()=>{const q=Bs.get(A);if(q){if(m)m(q,4);else for(const Ne of q)Ne();Bs.delete(A)}},t?o?Pe(!0):te=A.run():f?f(Pe.bind(null,!0),!0):A.run(),Te.pause=A.pause.bind(A),Te.resume=A.resume.bind(A),Te.stop=Te,Te}function Xt(e,t=1/0,i){if(t<=0||!Se(e)||e.__v_skip||(i=i||new Map,(i.get(e)||0)>=t))return e;if(i.set(e,t),t--,Ve(e))Xt(e.value,t,i);else if(X(e))for(let o=0;o<e.length;o++)Xt(e[o],t,i);else if(Wa(e)||Oa(e))e.forEach(o=>{Xt(o,t,i)});else if(Oi(e)){for(const o in e)Xt(e[o],t,i);for(const o of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,o)&&Xt(e[o],t,i)}return e}function As(e,t,i,o){try{return o?e(...o):e()}catch(d){Qs(d,t,i)}}function Nt(e,t,i,o){if(Q(e)){const d=As(e,t,i,o);return d&&Li(d)&&d.catch(u=>{Qs(u,t,i)}),d}if(X(e)){const d=[];for(let u=0;u<e.length;u++)d.push(Nt(e[u],t,i,o));return d}}function Qs(e,t,i,o=!0){const d=t?t.vnode:null,{errorHandler:u,throwUnhandledErrorInProduction:f}=t&&t.appContext.config||we;if(t){let p=t.parent;const m=t.proxy,T=`https://vuejs.org/error-reference/#runtime-${i}`;for(;p;){const A=p.ec;if(A){for(let I=0;I<A.length;I++)if(A[I](e,m,T)===!1)return}p=p.parent}if(u){Jt(),As(u,null,10,[e,m,T]),Zt();return}}uu(e,i,d,o,f)}function uu(e,t,i,o=!0,d=!1){if(d)throw e;console.error(e)}const je=[];let Pt=-1;const za=[];let ua=null,La=0;const ro=Promise.resolve();let Vs=null;function os(e){const t=Vs||ro;return e?t.then(this?e.bind(this):e):t}function cu(e){let t=Pt+1,i=je.length;for(;t<i;){const o=t+i>>>1,d=je[o],u=hs(d);u<e||u===e&&d.flags&2?t=o+1:i=o}return t}function lr(e){if(!(e.flags&1)){const t=hs(e),i=je[je.length-1];!i||!(e.flags&2)&&t>=hs(i)?je.push(e):je.splice(cu(t),0,e),e.flags|=1,io()}}function io(){Vs||(Vs=ro.then(lo))}function fu(e){X(e)?za.push(...e):ua&&e.id===-1?ua.splice(La+1,0,e):e.flags&1||(za.push(e),e.flags|=1),io()}function Zr(e,t,i=Pt+1){for(;i<je.length;i++){const o=je[i];if(o&&o.flags&2){if(e&&o.id!==e.uid)continue;je.splice(i,1),i--,o.flags&4&&(o.flags&=-2),o(),o.flags&4||(o.flags&=-2)}}}function oo(e){if(za.length){const t=[...new Set(za)].sort((i,o)=>hs(i)-hs(o));if(za.length=0,ua){ua.push(...t);return}for(ua=t,La=0;La<ua.length;La++){const i=ua[La];i.flags&4&&(i.flags&=-2),i.flags&8||i(),i.flags&=-2}ua=null,La=0}}const hs=e=>e.id==null?e.flags&2?-1:1/0:e.id;function lo(e){try{for(Pt=0;Pt<je.length;Pt++){const t=je[Pt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),As(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Pt<je.length;Pt++){const t=je[Pt];t&&(t.flags&=-2)}Pt=-1,je.length=0,oo(),Vs=null,(je.length||za.length)&&lo()}}let ot=null,uo=null;function Ks(e){const t=ot;return ot=e,uo=e&&e.type.__scopeId||null,t}function pu(e,t=ot,i){if(!t||e._n)return e;const o=(...d)=>{o._d&&li(-1);const u=Ks(t);let f;try{f=e(...d)}finally{Ks(u),o._d&&li(1)}return f};return o._n=!0,o._c=!0,o._d=!0,o}function ge(e,t){if(ot===null)return e;const i=sn(ot),o=e.dirs||(e.dirs=[]);for(let d=0;d<t.length;d++){let[u,f,p,m=we]=t[d];u&&(Q(u)&&(u={mounted:u,updated:u}),u.deep&&Xt(f),o.push({dir:u,instance:i,value:f,oldValue:void 0,arg:p,modifiers:m}))}return e}function Sa(e,t,i,o){const d=e.dirs,u=t&&t.dirs;for(let f=0;f<d.length;f++){const p=d[f];u&&(p.oldValue=u[f].value);let m=p.dir[o];m&&(Jt(),Nt(m,i,8,[e.el,p,e,t]),Zt())}}function gu(e,t){if(He){let i=He.provides;const o=He.parent&&He.parent.provides;o===i&&(i=He.provides=Object.create(o)),i[e]=t}}function Ms(e,t,i=!1){const o=fc();if(o||$a){let d=$a?$a._context.provides:o?o.parent==null||o.ce?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides:void 0;if(d&&e in d)return d[e];if(arguments.length>1)return i&&Q(t)?t.call(o&&o.proxy):t}}const hu=Symbol.for("v-scx"),mu=()=>Ms(hu);function Re(e,t,i){return co(e,t,i)}function co(e,t,i=we){const{immediate:o,deep:d,flush:u,once:f}=i,p=Ke({},i),m=t&&o||!t&&u!=="post";let T;if(vs){if(u==="sync"){const $=mu();T=$.__watcherHandles||($.__watcherHandles=[])}else if(!m){const $=()=>{};return $.stop=Dt,$.resume=Dt,$.pause=Dt,$}}const A=He;p.call=($,ie,Z)=>Nt($,A,ie,Z);let I=!1;u==="post"?p.scheduler=$=>{Ze($,A&&A.suspense)}:u!=="sync"&&(I=!0,p.scheduler=($,ie)=>{ie?$():lr($)}),p.augmentJob=$=>{t&&($.flags|=4),I&&($.flags|=2,A&&($.id=A.uid,$.i=A))};const L=du(e,t,p);return vs&&(T?T.push(L):m&&L()),L}function vu(e,t,i){const o=this.proxy,d=Fe(e)?e.includes(".")?fo(o,e):()=>o[e]:e.bind(o,o);let u;Q(t)?u=t:(u=t.handler,i=t);const f=Ss(this),p=co(d,u.bind(o),i);return f(),p}function fo(e,t){const i=t.split(".");return()=>{let o=e;for(let d=0;d<i.length&&o;d++)o=o[i[d]];return o}}const bu=Symbol("_vte"),yu=e=>e.__isTeleport,Au=Symbol("_leaveCb");function dr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,dr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function po(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Yr(e,t){let i;return!!((i=Object.getOwnPropertyDescriptor(e,t))&&!i.configurable)}const Ws=new WeakMap;function ls(e,t,i,o,d=!1){if(X(e)){e.forEach((Z,oe)=>ls(Z,t&&(X(t)?t[oe]:t),i,o,d));return}if(ds(o)&&!d){o.shapeFlag&512&&o.type.__asyncResolved&&o.component.subTree.component&&ls(e,t,i,o.component.subTree);return}const u=o.shapeFlag&4?sn(o.component):o.el,f=d?null:u,{i:p,r:m}=e,T=t&&t.r,A=p.refs===we?p.refs={}:p.refs,I=p.setupState,L=ve(I),$=I===we?Fi:Z=>Yr(A,Z)?!1:be(L,Z),ie=(Z,oe)=>!(oe&&Yr(A,oe));if(T!=null&&T!==m){if(Qr(t),Fe(T))A[T]=null,$(T)&&(I[T]=null);else if(Ve(T)){const Z=t;ie(T,Z.k)&&(T.value=null),Z.k&&(A[Z.k]=null)}}if(Q(m))As(m,p,12,[f,A]);else{const Z=Fe(m),oe=Ve(m);if(Z||oe){const Te=()=>{if(e.f){const te=Z?$(m)?I[m]:A[m]:ie()||!e.k?m.value:A[e.k];if(d)X(te)&&Yn(te,u);else if(X(te))te.includes(u)||te.push(u);else if(Z)A[m]=[u],$(m)&&(I[m]=A[m]);else{const Pe=[u];ie(m,e.k)&&(m.value=Pe),e.k&&(A[e.k]=Pe)}}else Z?(A[m]=f,$(m)&&(I[m]=f)):oe&&(ie(m,e.k)&&(m.value=f),e.k&&(A[e.k]=f))};if(f){const te=()=>{Te(),Ws.delete(e)};te.id=-1,Ws.set(e,te),Ze(te,i)}else Qr(e),Te()}}}function Qr(e){const t=Ws.get(e);t&&(t.flags|=8,Ws.delete(e))}Js().requestIdleCallback;Js().cancelIdleCallback;const ds=e=>!!e.type.__asyncLoader,go=e=>e.type.__isKeepAlive;function Su(e,t){ho(e,"a",t)}function Pu(e,t){ho(e,"da",t)}function ho(e,t,i=He){const o=e.__wdc||(e.__wdc=()=>{let d=i;for(;d;){if(d.isDeactivated)return;d=d.parent}return e()});if(en(t,o,i),i){let d=i.parent;for(;d&&d.parent;)go(d.parent.vnode)&&wu(o,t,i,d),d=d.parent}}function wu(e,t,i,o){const d=en(t,e,o,!0);bo(()=>{Yn(o[t],d)},i)}function en(e,t,i=He,o=!1){if(i){const d=i[e]||(i[e]=[]),u=t.__weh||(t.__weh=(...f)=>{Jt();const p=Ss(i),m=Nt(t,i,e,f);return p(),Zt(),m});return o?d.unshift(u):d.push(u),u}}const Qt=e=>(t,i=He)=>{(!vs||e==="sp")&&en(e,(...o)=>t(...o),i)},Tu=Qt("bm"),mo=Qt("m"),_u=Qt("bu"),Du=Qt("u"),vo=Qt("bum"),bo=Qt("um"),Iu=Qt("sp"),Ru=Qt("rtg"),Nu=Qt("rtc");function Cu(e,t=He){en("ec",e,t)}const ku=Symbol.for("v-ndc");function ne(e,t,i,o){let d;const u=i,f=X(e);if(f||Fe(e)){const p=f&&Ia(e);let m=!1,T=!1;p&&(m=!lt(e),T=Yt(e),e=Zs(e)),d=new Array(e.length);for(let A=0,I=e.length;A<I;A++)d[A]=t(m?T?Ba(ht(e[A])):ht(e[A]):e[A],A,void 0,u)}else if(typeof e=="number"){d=new Array(e);for(let p=0;p<e;p++)d[p]=t(p+1,p,void 0,u)}else if(Se(e))if(e[Symbol.iterator])d=Array.from(e,(p,m)=>t(p,m,void 0,u));else{const p=Object.keys(e);d=new Array(p.length);for(let m=0,T=p.length;m<T;m++){const A=p[m];d[m]=t(e[A],A,m,u)}}else d=[];return d}const Wn=e=>e?zo(e)?sn(e):Wn(e.parent):null,us=Ke(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Wn(e.parent),$root:e=>Wn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ao(e),$forceUpdate:e=>e.f||(e.f=()=>{lr(e.update)}),$nextTick:e=>e.n||(e.n=os.bind(e.proxy)),$watch:e=>vu.bind(e)}),Gn=(e,t)=>e!==we&&!e.__isScriptSetup&&be(e,t),xu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:i,setupState:o,data:d,props:u,accessCache:f,type:p,appContext:m}=e;if(t[0]!=="$"){const L=f[t];if(L!==void 0)switch(L){case 1:return o[t];case 2:return d[t];case 4:return i[t];case 3:return u[t]}else{if(Gn(o,t))return f[t]=1,o[t];if(d!==we&&be(d,t))return f[t]=2,d[t];if(be(u,t))return f[t]=3,u[t];if(i!==we&&be(i,t))return f[t]=4,i[t];Un&&(f[t]=0)}}const T=us[t];let A,I;if(T)return t==="$attrs"&&Be(e.attrs,"get",""),T(e);if((A=p.__cssModules)&&(A=A[t]))return A;if(i!==we&&be(i,t))return f[t]=4,i[t];if(I=m.config.globalProperties,be(I,t))return I[t]},set({_:e},t,i){const{data:o,setupState:d,ctx:u}=e;return Gn(d,t)?(d[t]=i,!0):o!==we&&be(o,t)?(o[t]=i,!0):be(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(u[t]=i,!0)},has({_:{data:e,setupState:t,accessCache:i,ctx:o,appContext:d,props:u,type:f}},p){let m;return!!(i[p]||e!==we&&p[0]!=="$"&&be(e,p)||Gn(t,p)||be(u,p)||be(o,p)||be(us,p)||be(d.config.globalProperties,p)||(m=f.__cssModules)&&m[p])},defineProperty(e,t,i){return i.get!=null?e._.accessCache[t]=0:be(i,"value")&&this.set(e,t,i.value,null),Reflect.defineProperty(e,t,i)}};function ei(e){return X(e)?e.reduce((t,i)=>(t[i]=null,t),{}):e}let Un=!0;function Eu(e){const t=Ao(e),i=e.proxy,o=e.ctx;Un=!1,t.beforeCreate&&ti(t.beforeCreate,e,"bc");const{data:d,computed:u,methods:f,watch:p,provide:m,inject:T,created:A,beforeMount:I,mounted:L,beforeUpdate:$,updated:ie,activated:Z,deactivated:oe,beforeDestroy:Te,beforeUnmount:te,destroyed:Pe,unmounted:q,render:Ne,renderTracked:dt,renderTriggered:at,errorCaptured:a,serverPrefetch:ea,expose:ut,inheritAttrs:Ct,components:mt,directives:kt,filters:xt}=t;if(T&&Gu(T,o,null),f)for(const fe in f){const he=f[fe];Q(he)&&(o[fe]=he.bind(i))}if(d){const fe=d.call(i,i);Se(fe)&&(e.data=Ys(fe))}if(Un=!0,u)for(const fe in u){const he=u[fe],ct=Q(he)?he.bind(i,i):Q(he.get)?he.get.bind(i,i):Dt,Et=!Q(he)&&Q(he.set)?he.set.bind(i):Dt,nt=j({get:ct,set:Et});Object.defineProperty(o,fe,{enumerable:!0,configurable:!0,get:()=>nt.value,set:Xe=>nt.value=Xe})}if(p)for(const fe in p)yo(p[fe],o,i,fe);if(m){const fe=Q(m)?m.call(i):m;Reflect.ownKeys(fe).forEach(he=>{gu(he,fe[he])})}A&&ti(A,e,"c");function De(fe,he){X(he)?he.forEach(ct=>fe(ct.bind(i))):he&&fe(he.bind(i))}if(De(Tu,I),De(mo,L),De(_u,$),De(Du,ie),De(Su,Z),De(Pu,oe),De(Cu,a),De(Nu,dt),De(Ru,at),De(vo,te),De(bo,q),De(Iu,ea),X(ut))if(ut.length){const fe=e.exposed||(e.exposed={});ut.forEach(he=>{Object.defineProperty(fe,he,{get:()=>i[he],set:ct=>i[he]=ct,enumerable:!0})})}else e.exposed||(e.exposed={});Ne&&e.render===Dt&&(e.render=Ne),Ct!=null&&(e.inheritAttrs=Ct),mt&&(e.components=mt),kt&&(e.directives=kt),ea&&po(e)}function Gu(e,t,i=Dt){X(e)&&(e=jn(e));for(const o in e){const d=e[o];let u;Se(d)?"default"in d?u=Ms(d.from||o,d.default,!0):u=Ms(d.from||o):u=Ms(d),Ve(u)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>u.value,set:f=>u.value=f}):t[o]=u}}function ti(e,t,i){Nt(X(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,i)}function yo(e,t,i,o){let d=o.includes(".")?fo(i,o):()=>i[o];if(Fe(e)){const u=t[e];Q(u)&&Re(d,u)}else if(Q(e))Re(d,e.bind(i));else if(Se(e))if(X(e))e.forEach(u=>yo(u,t,i,o));else{const u=Q(e.handler)?e.handler.bind(i):t[e.handler];Q(u)&&Re(d,u,e)}}function Ao(e){const t=e.type,{mixins:i,extends:o}=t,{mixins:d,optionsCache:u,config:{optionMergeStrategies:f}}=e.appContext,p=u.get(t);let m;return p?m=p:!d.length&&!i&&!o?m=t:(m={},d.length&&d.forEach(T=>Us(m,T,f,!0)),Us(m,t,f)),Se(t)&&u.set(t,m),m}function Us(e,t,i,o=!1){const{mixins:d,extends:u}=t;u&&Us(e,u,i,!0),d&&d.forEach(f=>Us(e,f,i,!0));for(const f in t)if(!(o&&f==="expose")){const p=Fu[f]||i&&i[f];e[f]=p?p(e[f],t[f]):t[f]}return e}const Fu={data:ai,props:si,emits:si,methods:ss,computed:ss,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:ss,directives:ss,watch:Mu,provide:ai,inject:Lu};function ai(e,t){return t?e?function(){return Ke(Q(e)?e.call(this,this):e,Q(t)?t.call(this,this):t)}:t:e}function Lu(e,t){return ss(jn(e),jn(t))}function jn(e){if(X(e)){const t={};for(let i=0;i<e.length;i++)t[e[i]]=e[i];return t}return e}function Ue(e,t){return e?[...new Set([].concat(e,t))]:t}function ss(e,t){return e?Ke(Object.create(null),e,t):t}function si(e,t){return e?X(e)&&X(t)?[...new Set([...e,...t])]:Ke(Object.create(null),ei(e),ei(t??{})):t}function Mu(e,t){if(!e)return t;if(!t)return e;const i=Ke(Object.create(null),e);for(const o in t)i[o]=Ue(e[o],t[o]);return i}function So(){return{app:null,config:{isNativeTag:Fi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Ou=0;function zu(e,t){return function(o,d=null){Q(o)||(o=Ke({},o)),d!=null&&!Se(d)&&(d=null);const u=So(),f=new WeakSet,p=[];let m=!1;const T=u.app={_uid:Ou++,_component:o,_props:d,_container:null,_context:u,_instance:null,version:bc,get config(){return u.config},set config(A){},use(A,...I){return f.has(A)||(A&&Q(A.install)?(f.add(A),A.install(T,...I)):Q(A)&&(f.add(A),A(T,...I))),T},mixin(A){return u.mixins.includes(A)||u.mixins.push(A),T},component(A,I){return I?(u.components[A]=I,T):u.components[A]},directive(A,I){return I?(u.directives[A]=I,T):u.directives[A]},mount(A,I,L){if(!m){const $=T._ceVNode||It(o,d);return $.appContext=u,L===!0?L="svg":L===!1&&(L=void 0),e($,A,L),m=!0,T._container=A,A.__vue_app__=T,sn($.component)}},onUnmount(A){p.push(A)},unmount(){m&&(Nt(p,T._instance,16),e(null,T._container),delete T._container.__vue_app__)},provide(A,I){return u.provides[A]=I,T},runWithContext(A){const I=$a;$a=T;try{return A()}finally{$a=I}}};return T}}let $a=null;const $u=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${pt(t)}Modifiers`]||e[`${pa(t)}Modifiers`];function Bu(e,t,...i){if(e.isUnmounted)return;const o=e.vnode.props||we;let d=i;const u=t.startsWith("update:"),f=u&&$u(o,t.slice(7));f&&(f.trim&&(d=i.map(A=>Fe(A)?A.trim():A)),f.number&&(d=i.map(qs)));let p,m=o[p=Nn(t)]||o[p=Nn(pt(t))];!m&&u&&(m=o[p=Nn(pa(t))]),m&&Nt(m,e,6,d);const T=o[p+"Once"];if(T){if(!e.emitted)e.emitted={};else if(e.emitted[p])return;e.emitted[p]=!0,Nt(T,e,6,d)}}const Vu=new WeakMap;function Po(e,t,i=!1){const o=i?Vu:t.emitsCache,d=o.get(e);if(d!==void 0)return d;const u=e.emits;let f={},p=!1;if(!Q(e)){const m=T=>{const A=Po(T,t,!0);A&&(p=!0,Ke(f,A))};!i&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}return!u&&!p?(Se(e)&&o.set(e,null),null):(X(u)?u.forEach(m=>f[m]=null):Ke(f,u),Se(e)&&o.set(e,f),f)}function tn(e,t){return!e||!Hs(t)?!1:(t=t.slice(2).replace(/Once$/,""),be(e,t[0].toLowerCase()+t.slice(1))||be(e,pa(t))||be(e,t))}function ni(e){const{type:t,vnode:i,proxy:o,withProxy:d,propsOptions:[u],slots:f,attrs:p,emit:m,render:T,renderCache:A,props:I,data:L,setupState:$,ctx:ie,inheritAttrs:Z}=e,oe=Ks(e);let Te,te;try{if(i.shapeFlag&4){const q=d||o,Ne=q;Te=Tt(T.call(Ne,q,A,I,$,L,ie)),te=p}else{const q=t;Te=Tt(q.length>1?q(I,{attrs:p,slots:f,emit:m}):q(I,null)),te=t.props?p:Ku(p)}}catch(q){cs.length=0,Qs(q,e,1),Te=It(fa)}let Pe=Te;if(te&&Z!==!1){const q=Object.keys(te),{shapeFlag:Ne}=Pe;q.length&&Ne&7&&(u&&q.some(Zn)&&(te=Wu(te,u)),Pe=Va(Pe,te,!1,!0))}return i.dirs&&(Pe=Va(Pe,null,!1,!0),Pe.dirs=Pe.dirs?Pe.dirs.concat(i.dirs):i.dirs),i.transition&&dr(Pe,i.transition),Te=Pe,Ks(oe),Te}const Ku=e=>{let t;for(const i in e)(i==="class"||i==="style"||Hs(i))&&((t||(t={}))[i]=e[i]);return t},Wu=(e,t)=>{const i={};for(const o in e)(!Zn(o)||!(o.slice(9)in t))&&(i[o]=e[o]);return i};function Uu(e,t,i){const{props:o,children:d,component:u}=e,{props:f,children:p,patchFlag:m}=t,T=u.emitsOptions;if(t.dirs||t.transition)return!0;if(i&&m>=0){if(m&1024)return!0;if(m&16)return o?ri(o,f,T):!!f;if(m&8){const A=t.dynamicProps;for(let I=0;I<A.length;I++){const L=A[I];if(wo(f,o,L)&&!tn(T,L))return!0}}}else return(d||p)&&(!p||!p.$stable)?!0:o===f?!1:o?f?ri(o,f,T):!0:!!f;return!1}function ri(e,t,i){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let d=0;d<o.length;d++){const u=o[d];if(wo(t,e,u)&&!tn(i,u))return!0}return!1}function wo(e,t,i){const o=e[i],d=t[i];return i==="style"&&Se(o)&&Se(d)?!Ua(o,d):o!==d}function ju({vnode:e,parent:t},i){for(;t;){const o=t.subTree;if(o.suspense&&o.suspense.activeBranch===e&&(o.el=e.el),o===e)(e=t.vnode).el=i,t=t.parent;else break}}const To={},_o=()=>Object.create(To),Do=e=>Object.getPrototypeOf(e)===To;function Hu(e,t,i,o=!1){const d={},u=_o();e.propsDefaults=Object.create(null),Io(e,t,d,u);for(const f in e.propsOptions[0])f in d||(d[f]=void 0);i?e.props=o?d:eu(d):e.type.props?e.props=d:e.props=u,e.attrs=u}function Xu(e,t,i,o){const{props:d,attrs:u,vnode:{patchFlag:f}}=e,p=ve(d),[m]=e.propsOptions;let T=!1;if((o||f>0)&&!(f&16)){if(f&8){const A=e.vnode.dynamicProps;for(let I=0;I<A.length;I++){let L=A[I];if(tn(e.emitsOptions,L))continue;const $=t[L];if(m)if(be(u,L))$!==u[L]&&(u[L]=$,T=!0);else{const ie=pt(L);d[ie]=Hn(m,p,ie,$,e,!1)}else $!==u[L]&&(u[L]=$,T=!0)}}}else{Io(e,t,d,u)&&(T=!0);let A;for(const I in p)(!t||!be(t,I)&&((A=pa(I))===I||!be(t,A)))&&(m?i&&(i[I]!==void 0||i[A]!==void 0)&&(d[I]=Hn(m,p,I,void 0,e,!0)):delete d[I]);if(u!==p)for(const I in u)(!t||!be(t,I))&&(delete u[I],T=!0)}T&&Ht(e.attrs,"set","")}function Io(e,t,i,o){const[d,u]=e.propsOptions;let f=!1,p;if(t)for(let m in t){if(ns(m))continue;const T=t[m];let A;d&&be(d,A=pt(m))?!u||!u.includes(A)?i[A]=T:(p||(p={}))[A]=T:tn(e.emitsOptions,m)||(!(m in o)||T!==o[m])&&(o[m]=T,f=!0)}if(u){const m=ve(i),T=p||we;for(let A=0;A<u.length;A++){const I=u[A];i[I]=Hn(d,m,I,T[I],e,!be(T,I))}}return f}function Hn(e,t,i,o,d,u){const f=e[i];if(f!=null){const p=be(f,"default");if(p&&o===void 0){const m=f.default;if(f.type!==Function&&!f.skipFactory&&Q(m)){const{propsDefaults:T}=d;if(i in T)o=T[i];else{const A=Ss(d);o=T[i]=m.call(null,t),A()}}else o=m;d.ce&&d.ce._setProp(i,o)}f[0]&&(u&&!p?o=!1:f[1]&&(o===""||o===pa(i))&&(o=!0))}return o}const qu=new WeakMap;function Ro(e,t,i=!1){const o=i?qu:t.propsCache,d=o.get(e);if(d)return d;const u=e.props,f={},p=[];let m=!1;if(!Q(e)){const A=I=>{m=!0;const[L,$]=Ro(I,t,!0);Ke(f,L),$&&p.push(...$)};!i&&t.mixins.length&&t.mixins.forEach(A),e.extends&&A(e.extends),e.mixins&&e.mixins.forEach(A)}if(!u&&!m)return Se(e)&&o.set(e,Ma),Ma;if(X(u))for(let A=0;A<u.length;A++){const I=pt(u[A]);ii(I)&&(f[I]=we)}else if(u)for(const A in u){const I=pt(A);if(ii(I)){const L=u[A],$=f[I]=X(L)||Q(L)?{type:L}:Ke({},L),ie=$.type;let Z=!1,oe=!0;if(X(ie))for(let Te=0;Te<ie.length;++Te){const te=ie[Te],Pe=Q(te)&&te.name;if(Pe==="Boolean"){Z=!0;break}else Pe==="String"&&(oe=!1)}else Z=Q(ie)&&ie.name==="Boolean";$[0]=Z,$[1]=oe,(Z||be($,"default"))&&p.push(I)}}const T=[f,p];return Se(e)&&o.set(e,T),T}function ii(e){return e[0]!=="$"&&!ns(e)}const ur=e=>e==="_"||e==="_ctx"||e==="$stable",cr=e=>X(e)?e.map(Tt):[Tt(e)],Ju=(e,t,i)=>{if(t._n)return t;const o=pu((...d)=>cr(t(...d)),i);return o._c=!1,o},No=(e,t,i)=>{const o=e._ctx;for(const d in e){if(ur(d))continue;const u=e[d];if(Q(u))t[d]=Ju(d,u,o);else if(u!=null){const f=cr(u);t[d]=()=>f}}},Co=(e,t)=>{const i=cr(t);e.slots.default=()=>i},ko=(e,t,i)=>{for(const o in t)(i||!ur(o))&&(e[o]=t[o])},Zu=(e,t,i)=>{const o=e.slots=_o();if(e.vnode.shapeFlag&32){const d=t._;d?(ko(o,t,i),i&&$i(o,"_",d,!0)):No(t,o)}else t&&Co(e,t)},Yu=(e,t,i)=>{const{vnode:o,slots:d}=e;let u=!0,f=we;if(o.shapeFlag&32){const p=t._;p?i&&p===1?u=!1:ko(d,t,i):(u=!t.$stable,No(t,d)),f=t}else t&&(Co(e,t),f={default:1});if(u)for(const p in d)!ur(p)&&f[p]==null&&delete d[p]},Ze=sc;function Qu(e){return ec(e)}function ec(e,t){const i=Js();i.__VUE__=!0;const{insert:o,remove:d,patchProp:u,createElement:f,createText:p,createComment:m,setText:T,setElementText:A,parentNode:I,nextSibling:L,setScopeId:$=Dt,insertStaticContent:ie}=e,Z=(g,y,_,x=null,N=null,D=null,w=void 0,k=null,F=!!y.dynamicChildren)=>{if(g===y)return;g&&!as(g,y)&&(x=ga(g),Xe(g,N,D,!0),g=null),y.patchFlag===-2&&(F=!1,y.dynamicChildren=null);const{type:C,ref:W,shapeFlag:M}=y;switch(C){case an:oe(g,y,_,x);break;case fa:Te(g,y,_,x);break;case Os:g==null&&te(y,_,x,w);break;case H:mt(g,y,_,x,N,D,w,k,F);break;default:M&1?Ne(g,y,_,x,N,D,w,k,F):M&6?kt(g,y,_,x,N,D,w,k,F):(M&64||M&128)&&C.process(g,y,_,x,N,D,w,k,F,ta)}W!=null&&N?ls(W,g&&g.ref,D,y||g,!y):W==null&&g&&g.ref!=null&&ls(g.ref,null,D,g,!0)},oe=(g,y,_,x)=>{if(g==null)o(y.el=p(y.children),_,x);else{const N=y.el=g.el;y.children!==g.children&&T(N,y.children)}},Te=(g,y,_,x)=>{g==null?o(y.el=m(y.children||""),_,x):y.el=g.el},te=(g,y,_,x)=>{[g.el,g.anchor]=ie(g.children,y,_,x,g.el,g.anchor)},Pe=({el:g,anchor:y},_,x)=>{let N;for(;g&&g!==y;)N=L(g),o(g,_,x),g=N;o(y,_,x)},q=({el:g,anchor:y})=>{let _;for(;g&&g!==y;)_=L(g),d(g),g=_;d(y)},Ne=(g,y,_,x,N,D,w,k,F)=>{if(y.type==="svg"?w="svg":y.type==="math"&&(w="mathml"),g==null)dt(y,_,x,N,D,w,k,F);else{const C=g.el&&g.el._isVueCE?g.el:null;try{C&&C._beginPatch(),ea(g,y,N,D,w,k,F)}finally{C&&C._endPatch()}}},dt=(g,y,_,x,N,D,w,k)=>{let F,C;const{props:W,shapeFlag:M,transition:B,dirs:J}=g;if(F=g.el=f(g.type,D,W&&W.is,W),M&8?A(F,g.children):M&16&&a(g.children,F,null,x,N,Fn(g,D),w,k),J&&Sa(g,null,x,"created"),at(F,g,g.scopeId,w,x),W){for(const ye in W)ye!=="value"&&!ns(ye)&&u(F,ye,null,W[ye],D,x);"value"in W&&u(F,"value",null,W.value,D),(C=W.onVnodeBeforeMount)&&St(C,x,g)}J&&Sa(g,null,x,"beforeMount");const re=tc(N,B);re&&B.beforeEnter(F),o(F,y,_),((C=W&&W.onVnodeMounted)||re||J)&&Ze(()=>{C&&St(C,x,g),re&&B.enter(F),J&&Sa(g,null,x,"mounted")},N)},at=(g,y,_,x,N)=>{if(_&&$(g,_),x)for(let D=0;D<x.length;D++)$(g,x[D]);if(N){let D=N.subTree;if(y===D||Fo(D.type)&&(D.ssContent===y||D.ssFallback===y)){const w=N.vnode;at(g,w,w.scopeId,w.slotScopeIds,N.parent)}}},a=(g,y,_,x,N,D,w,k,F=0)=>{for(let C=F;C<g.length;C++){const W=g[C]=k?jt(g[C]):Tt(g[C]);Z(null,W,y,_,x,N,D,w,k)}},ea=(g,y,_,x,N,D,w)=>{const k=y.el=g.el;let{patchFlag:F,dynamicChildren:C,dirs:W}=y;F|=g.patchFlag&16;const M=g.props||we,B=y.props||we;let J;if(_&&Pa(_,!1),(J=B.onVnodeBeforeUpdate)&&St(J,_,y,g),W&&Sa(y,g,_,"beforeUpdate"),_&&Pa(_,!0),(M.innerHTML&&B.innerHTML==null||M.textContent&&B.textContent==null)&&A(k,""),C?ut(g.dynamicChildren,C,k,_,x,Fn(y,N),D):w||he(g,y,k,null,_,x,Fn(y,N),D,!1),F>0){if(F&16)Ct(k,M,B,_,N);else if(F&2&&M.class!==B.class&&u(k,"class",null,B.class,N),F&4&&u(k,"style",M.style,B.style,N),F&8){const re=y.dynamicProps;for(let ye=0;ye<re.length;ye++){const le=re[ye],Oe=M[le],ze=B[le];(ze!==Oe||le==="value")&&u(k,le,Oe,ze,N,_)}}F&1&&g.children!==y.children&&A(k,y.children)}else!w&&C==null&&Ct(k,M,B,_,N);((J=B.onVnodeUpdated)||W)&&Ze(()=>{J&&St(J,_,y,g),W&&Sa(y,g,_,"updated")},x)},ut=(g,y,_,x,N,D,w)=>{for(let k=0;k<y.length;k++){const F=g[k],C=y[k],W=F.el&&(F.type===H||!as(F,C)||F.shapeFlag&198)?I(F.el):_;Z(F,C,W,null,x,N,D,w,!0)}},Ct=(g,y,_,x,N)=>{if(y!==_){if(y!==we)for(const D in y)!ns(D)&&!(D in _)&&u(g,D,y[D],null,N,x);for(const D in _){if(ns(D))continue;const w=_[D],k=y[D];w!==k&&D!=="value"&&u(g,D,k,w,N,x)}"value"in _&&u(g,"value",y.value,_.value,N)}},mt=(g,y,_,x,N,D,w,k,F)=>{const C=y.el=g?g.el:p(""),W=y.anchor=g?g.anchor:p("");let{patchFlag:M,dynamicChildren:B,slotScopeIds:J}=y;J&&(k=k?k.concat(J):J),g==null?(o(C,_,x),o(W,_,x),a(y.children||[],_,W,N,D,w,k,F)):M>0&&M&64&&B&&g.dynamicChildren&&g.dynamicChildren.length===B.length?(ut(g.dynamicChildren,B,_,N,D,w,k),(y.key!=null||N&&y===N.subTree)&&xo(g,y,!0)):he(g,y,_,W,N,D,w,k,F)},kt=(g,y,_,x,N,D,w,k,F)=>{y.slotScopeIds=k,g==null?y.shapeFlag&512?N.ctx.activate(y,_,x,w,F):xt(y,_,x,N,D,w,F):st(g,y,F)},xt=(g,y,_,x,N,D,w)=>{const k=g.component=cc(g,x,N);if(go(g)&&(k.ctx.renderer=ta),pc(k,!1,w),k.asyncDep){if(N&&N.registerDep(k,De,w),!g.el){const F=k.subTree=It(fa);Te(null,F,y,_),g.placeholder=F.el}}else De(k,g,y,_,N,D,w)},st=(g,y,_)=>{const x=y.component=g.component;if(Uu(g,y,_))if(x.asyncDep&&!x.asyncResolved){fe(x,y,_);return}else x.next=y,x.update();else y.el=g.el,x.vnode=y},De=(g,y,_,x,N,D,w)=>{const k=()=>{if(g.isMounted){let{next:M,bu:B,u:J,parent:re,vnode:ye}=g;{const $e=Eo(g);if($e){M&&(M.el=ye.el,fe(g,M,w)),$e.asyncDep.then(()=>{Ze(()=>{g.isUnmounted||C()},N)});return}}let le=M,Oe;Pa(g,!1),M?(M.el=ye.el,fe(g,M,w)):M=ye,B&&Ls(B),(Oe=M.props&&M.props.onVnodeBeforeUpdate)&&St(Oe,re,M,ye),Pa(g,!0);const ze=ni(g),qe=g.subTree;g.subTree=ze,Z(qe,ze,I(qe.el),ga(qe),g,N,D),M.el=ze.el,le===null&&ju(g,ze.el),J&&Ze(J,N),(Oe=M.props&&M.props.onVnodeUpdated)&&Ze(()=>St(Oe,re,M,ye),N)}else{let M;const{el:B,props:J}=y,{bm:re,m:ye,parent:le,root:Oe,type:ze}=g,qe=ds(y);Pa(g,!1),re&&Ls(re),!qe&&(M=J&&J.onVnodeBeforeMount)&&St(M,le,y),Pa(g,!0);{Oe.ce&&Oe.ce._hasShadowRoot()&&Oe.ce._injectChildStyle(ze,g.parent?g.parent.type:void 0);const $e=g.subTree=ni(g);Z(null,$e,_,x,g,N,D),y.el=$e.el}if(ye&&Ze(ye,N),!qe&&(M=J&&J.onVnodeMounted)){const $e=y;Ze(()=>St(M,le,$e),N)}(y.shapeFlag&256||le&&ds(le.vnode)&&le.vnode.shapeFlag&256)&&g.a&&Ze(g.a,N),g.isMounted=!0,y=_=x=null}};g.scope.on();const F=g.effect=new Wi(k);g.scope.off();const C=g.update=F.run.bind(F),W=g.job=F.runIfDirty.bind(F);W.i=g,W.id=g.uid,F.scheduler=()=>lr(W),Pa(g,!0),C()},fe=(g,y,_)=>{y.component=g;const x=g.vnode.props;g.vnode=y,g.next=null,Xu(g,y.props,x,_),Yu(g,y.children,_),Jt(),Zr(g),Zt()},he=(g,y,_,x,N,D,w,k,F=!1)=>{const C=g&&g.children,W=g?g.shapeFlag:0,M=y.children,{patchFlag:B,shapeFlag:J}=y;if(B>0){if(B&128){Et(C,M,_,x,N,D,w,k,F);return}else if(B&256){ct(C,M,_,x,N,D,w,k,F);return}}J&8?(W&16&&Gt(C,N,D),M!==C&&A(_,M)):W&16?J&16?Et(C,M,_,x,N,D,w,k,F):Gt(C,N,D,!0):(W&8&&A(_,""),J&16&&a(M,_,x,N,D,w,k,F))},ct=(g,y,_,x,N,D,w,k,F)=>{g=g||Ma,y=y||Ma;const C=g.length,W=y.length,M=Math.min(C,W);let B;for(B=0;B<M;B++){const J=y[B]=F?jt(y[B]):Tt(y[B]);Z(g[B],J,_,null,N,D,w,k,F)}C>W?Gt(g,N,D,!0,!1,M):a(y,_,x,N,D,w,k,F,M)},Et=(g,y,_,x,N,D,w,k,F)=>{let C=0;const W=y.length;let M=g.length-1,B=W-1;for(;C<=M&&C<=B;){const J=g[C],re=y[C]=F?jt(y[C]):Tt(y[C]);if(as(J,re))Z(J,re,_,null,N,D,w,k,F);else break;C++}for(;C<=M&&C<=B;){const J=g[M],re=y[B]=F?jt(y[B]):Tt(y[B]);if(as(J,re))Z(J,re,_,null,N,D,w,k,F);else break;M--,B--}if(C>M){if(C<=B){const J=B+1,re=J<W?y[J].el:x;for(;C<=B;)Z(null,y[C]=F?jt(y[C]):Tt(y[C]),_,re,N,D,w,k,F),C++}}else if(C>B)for(;C<=M;)Xe(g[C],N,D,!0),C++;else{const J=C,re=C,ye=new Map;for(C=re;C<=B;C++){const Me=y[C]=F?jt(y[C]):Tt(y[C]);Me.key!=null&&ye.set(Me.key,C)}let le,Oe=0;const ze=B-re+1;let qe=!1,$e=0;const ma=new Array(ze);for(C=0;C<ze;C++)ma[C]=0;for(C=J;C<=M;C++){const Me=g[C];if(Oe>=ze){Xe(Me,N,D,!0);continue}let xe;if(Me.key!=null)xe=ye.get(Me.key);else for(le=re;le<=B;le++)if(ma[le-re]===0&&as(Me,y[le])){xe=le;break}xe===void 0?Xe(Me,N,D,!0):(ma[xe-re]=C+1,xe>=$e?$e=xe:qe=!0,Z(Me,y[xe],_,null,N,D,w,k,F),Oe++)}const Ca=qe?ac(ma):Ma;for(le=Ca.length-1,C=ze-1;C>=0;C--){const Me=re+C,xe=y[Me],va=y[Me+1],Xa=Me+1<W?va.el||Go(va):x;ma[C]===0?Z(null,xe,_,Xa,N,D,w,k,F):qe&&(le<0||C!==Ca[le]?nt(xe,_,Xa,2):le--)}}},nt=(g,y,_,x,N=null)=>{const{el:D,type:w,transition:k,children:F,shapeFlag:C}=g;if(C&6){nt(g.component.subTree,y,_,x);return}if(C&128){g.suspense.move(y,_,x);return}if(C&64){w.move(g,y,_,ta);return}if(w===H){o(D,y,_);for(let M=0;M<F.length;M++)nt(F[M],y,_,x);o(g.anchor,y,_);return}if(w===Os){Pe(g,y,_);return}if(x!==2&&C&1&&k)if(x===0)k.beforeEnter(D),o(D,y,_),Ze(()=>k.enter(D),N);else{const{leave:M,delayLeave:B,afterLeave:J}=k,re=()=>{g.ctx.isUnmounted?d(D):o(D,y,_)},ye=()=>{D._isLeaving&&D[Au](!0),M(D,()=>{re(),J&&J()})};B?B(D,re,ye):ye()}else o(D,y,_)},Xe=(g,y,_,x=!1,N=!1)=>{const{type:D,props:w,ref:k,children:F,dynamicChildren:C,shapeFlag:W,patchFlag:M,dirs:B,cacheIndex:J}=g;if(M===-2&&(N=!1),k!=null&&(Jt(),ls(k,null,_,g,!0),Zt()),J!=null&&(y.renderCache[J]=void 0),W&256){y.ctx.deactivate(g);return}const re=W&1&&B,ye=!ds(g);let le;if(ye&&(le=w&&w.onVnodeBeforeUnmount)&&St(le,y,g),W&6)ja(g.component,_,x);else{if(W&128){g.suspense.unmount(_,x);return}re&&Sa(g,null,y,"beforeUnmount"),W&64?g.type.remove(g,y,_,ta,x):C&&!C.hasOnce&&(D!==H||M>0&&M&64)?Gt(C,y,_,!1,!0):(D===H&&M&384||!N&&W&16)&&Gt(F,y,_),x&&Ra(g)}(ye&&(le=w&&w.onVnodeUnmounted)||re)&&Ze(()=>{le&&St(le,y,g),re&&Sa(g,null,y,"unmounted")},_)},Ra=g=>{const{type:y,el:_,anchor:x,transition:N}=g;if(y===H){Na(_,x);return}if(y===Os){q(g);return}const D=()=>{d(_),N&&!N.persisted&&N.afterLeave&&N.afterLeave()};if(g.shapeFlag&1&&N&&!N.persisted){const{leave:w,delayLeave:k}=N,F=()=>w(_,D);k?k(g.el,D,F):F()}else D()},Na=(g,y)=>{let _;for(;g!==y;)_=L(g),d(g),g=_;d(y)},ja=(g,y,_)=>{const{bum:x,scope:N,job:D,subTree:w,um:k,m:F,a:C}=g;oi(F),oi(C),x&&Ls(x),N.stop(),D&&(D.flags|=8,Xe(w,g,y,_)),k&&Ze(k,y),Ze(()=>{g.isUnmounted=!0},y)},Gt=(g,y,_,x=!1,N=!1,D=0)=>{for(let w=D;w<g.length;w++)Xe(g[w],y,_,x,N)},ga=g=>{if(g.shapeFlag&6)return ga(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const y=L(g.anchor||g.el),_=y&&y[bu];return _?L(_):y};let ha=!1;const Ha=(g,y,_)=>{let x;g==null?y._vnode&&(Xe(y._vnode,null,null,!0),x=y._vnode.component):Z(y._vnode||null,g,y,null,null,null,_),y._vnode=g,ha||(ha=!0,Zr(x),oo(),ha=!1)},ta={p:Z,um:Xe,m:nt,r:Ra,mt:xt,mc:a,pc:he,pbc:ut,n:ga,o:e};return{render:Ha,hydrate:void 0,createApp:zu(Ha)}}function Fn({type:e,props:t},i){return i==="svg"&&e==="foreignObject"||i==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:i}function Pa({effect:e,job:t},i){i?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function tc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function xo(e,t,i=!1){const o=e.children,d=t.children;if(X(o)&&X(d))for(let u=0;u<o.length;u++){const f=o[u];let p=d[u];p.shapeFlag&1&&!p.dynamicChildren&&((p.patchFlag<=0||p.patchFlag===32)&&(p=d[u]=jt(d[u]),p.el=f.el),!i&&p.patchFlag!==-2&&xo(f,p)),p.type===an&&(p.patchFlag===-1&&(p=d[u]=jt(p)),p.el=f.el),p.type===fa&&!p.el&&(p.el=f.el)}}function ac(e){const t=e.slice(),i=[0];let o,d,u,f,p;const m=e.length;for(o=0;o<m;o++){const T=e[o];if(T!==0){if(d=i[i.length-1],e[d]<T){t[o]=d,i.push(o);continue}for(u=0,f=i.length-1;u<f;)p=u+f>>1,e[i[p]]<T?u=p+1:f=p;T<e[i[u]]&&(u>0&&(t[o]=i[u-1]),i[u]=o)}}for(u=i.length,f=i[u-1];u-- >0;)i[u]=f,f=t[f];return i}function Eo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Eo(t)}function oi(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Go(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Go(t.subTree):null}const Fo=e=>e.__isSuspense;function sc(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):fu(e)}const H=Symbol.for("v-fgt"),an=Symbol.for("v-txt"),fa=Symbol.for("v-cmt"),Os=Symbol.for("v-stc"),cs=[];let tt=null;function v(e=!1){cs.push(tt=e?null:[])}function nc(){cs.pop(),tt=cs[cs.length-1]||null}let ms=1;function li(e,t=!1){ms+=e,e<0&&tt&&t&&(tt.hasOnce=!0)}function Lo(e){return e.dynamicChildren=ms>0?tt||Ma:null,nc(),ms>0&&tt&&tt.push(e),e}function b(e,t,i,o,d,u){return Lo(l(e,t,i,o,d,u,!0))}function rc(e,t,i,o,d){return Lo(It(e,t,i,o,d,!0))}function Mo(e){return e?e.__v_isVNode===!0:!1}function as(e,t){return e.type===t.type&&e.key===t.key}const Oo=({key:e})=>e??null,zs=({ref:e,ref_key:t,ref_for:i})=>(typeof e=="number"&&(e=""+e),e!=null?Fe(e)||Ve(e)||Q(e)?{i:ot,r:e,k:t,f:!!i}:e:null);function l(e,t=null,i=null,o=0,d=null,u=e===H?0:1,f=!1,p=!1){const m={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Oo(t),ref:t&&zs(t),scopeId:uo,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:u,patchFlag:o,dynamicProps:d,dynamicChildren:null,appContext:null,ctx:ot};return p?(fr(m,i),u&128&&e.normalize(m)):i&&(m.shapeFlag|=Fe(i)?8:16),ms>0&&!f&&tt&&(m.patchFlag>0||u&6)&&m.patchFlag!==32&&tt.push(m),m}const It=ic;function ic(e,t=null,i=null,o=0,d=null,u=!1){if((!e||e===ku)&&(e=fa),Mo(e)){const p=Va(e,t,!0);return i&&fr(p,i),ms>0&&!u&&tt&&(p.shapeFlag&6?tt[tt.indexOf(e)]=p:tt.push(p)),p.patchFlag=-2,p}if(vc(e)&&(e=e.__vccOpts),t){t=oc(t);let{class:p,style:m}=t;p&&!Fe(p)&&(t.class=ce(p)),Se(m)&&(or(m)&&!X(m)&&(m=Ke({},m)),t.style=fs(m))}const f=Fe(e)?1:Fo(e)?128:yu(e)?64:Se(e)?4:Q(e)?2:0;return l(e,t,i,o,d,f,u,!0)}function oc(e){return e?or(e)||Do(e)?Ke({},e):e:null}function Va(e,t,i=!1,o=!1){const{props:d,ref:u,patchFlag:f,children:p,transition:m}=e,T=t?lc(d||{},t):d,A={__v_isVNode:!0,__v_skip:!0,type:e.type,props:T,key:T&&Oo(T),ref:t&&t.ref?i&&u?X(u)?u.concat(zs(t)):[u,zs(t)]:zs(t):u,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:p,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==H?f===-1?16:f|16:f,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:m,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Va(e.ssContent),ssFallback:e.ssFallback&&Va(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return m&&o&&dr(A,m.clone(A)),A}function ue(e=" ",t=0){return It(an,null,e,t)}function wa(e,t){const i=It(Os,null,e);return i.staticCount=t,i}function G(e="",t=!1){return t?(v(),rc(fa,null,e)):It(fa,null,e)}function Tt(e){return e==null||typeof e=="boolean"?It(fa):X(e)?It(H,null,e.slice()):Mo(e)?jt(e):It(an,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Va(e)}function fr(e,t){let i=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(X(t))i=16;else if(typeof t=="object")if(o&65){const d=t.default;d&&(d._c&&(d._d=!1),fr(e,d()),d._c&&(d._d=!0));return}else{i=32;const d=t._;!d&&!Do(t)?t._ctx=ot:d===3&&ot&&(ot.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Q(t)?(t={default:t,_ctx:ot},i=32):(t=String(t),o&64?(i=16,t=[ue(t)]):i=8);e.children=t,e.shapeFlag|=i}function lc(...e){const t={};for(let i=0;i<e.length;i++){const o=e[i];for(const d in o)if(d==="class")t.class!==o.class&&(t.class=ce([t.class,o.class]));else if(d==="style")t.style=fs([t.style,o.style]);else if(Hs(d)){const u=t[d],f=o[d];f&&u!==f&&!(X(u)&&u.includes(f))&&(t[d]=u?[].concat(u,f):f)}else d!==""&&(t[d]=o[d])}return t}function St(e,t,i,o=null){Nt(e,t,7,[i,o])}const dc=So();let uc=0;function cc(e,t,i){const o=e.type,d=(t?t.appContext:e.appContext)||dc,u={uid:uc++,vnode:e,type:o,parent:t,appContext:d,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Gd(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(d.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ro(o,d),emitsOptions:Po(o,d),emit:null,emitted:null,propsDefaults:we,inheritAttrs:o.inheritAttrs,ctx:we,data:we,props:we,attrs:we,slots:we,refs:we,setupState:we,setupContext:null,suspense:i,suspenseId:i?i.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return u.ctx={_:u},u.root=t?t.root:u,u.emit=Bu.bind(null,u),e.ce&&e.ce(u),u}let He=null;const fc=()=>He||ot;let js,Xn;{const e=Js(),t=(i,o)=>{let d;return(d=e[i])||(d=e[i]=[]),d.push(o),u=>{d.length>1?d.forEach(f=>f(u)):d[0](u)}};js=t("__VUE_INSTANCE_SETTERS__",i=>He=i),Xn=t("__VUE_SSR_SETTERS__",i=>vs=i)}const Ss=e=>{const t=He;return js(e),e.scope.on(),()=>{e.scope.off(),js(t)}},di=()=>{He&&He.scope.off(),js(null)};function zo(e){return e.vnode.shapeFlag&4}let vs=!1;function pc(e,t=!1,i=!1){t&&Xn(t);const{props:o,children:d}=e.vnode,u=zo(e);Hu(e,o,u,t),Zu(e,d,i||t);const f=u?gc(e,t):void 0;return t&&Xn(!1),f}function gc(e,t){const i=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,xu);const{setup:o}=i;if(o){Jt();const d=e.setupContext=o.length>1?mc(e):null,u=Ss(e),f=As(o,e,0,[e.props,d]),p=Li(f);if(Zt(),u(),(p||e.sp)&&!ds(e)&&po(e),p){if(f.then(di,di),t)return f.then(m=>{ui(e,m)}).catch(m=>{Qs(m,e,0)});e.asyncDep=f}else ui(e,f)}else $o(e)}function ui(e,t,i){Q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Se(t)&&(e.setupState=no(t)),$o(e)}function $o(e,t,i){const o=e.type;e.render||(e.render=o.render||Dt);{const d=Ss(e);Jt();try{Eu(e)}finally{Zt(),d()}}}const hc={get(e,t){return Be(e,"get",""),e[t]}};function mc(e){const t=i=>{e.exposed=i||{}};return{attrs:new Proxy(e.attrs,hc),slots:e.slots,emit:e.emit,expose:t}}function sn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(no(tu(e.exposed)),{get(t,i){if(i in t)return t[i];if(i in us)return us[i](e)},has(t,i){return i in t||i in us}})):e.proxy}function vc(e){return Q(e)&&"__vccOpts"in e}const j=(e,t)=>ou(e,t,vs),bc="3.5.30";let qn;const ci=typeof window<"u"&&window.trustedTypes;if(ci)try{qn=ci.createPolicy("vue",{createHTML:e=>e})}catch{}const Bo=qn?e=>qn.createHTML(e):e=>e,yc="http://www.w3.org/2000/svg",Ac="http://www.w3.org/1998/Math/MathML",Ut=typeof document<"u"?document:null,fi=Ut&&Ut.createElement("template"),Sc={insert:(e,t,i)=>{t.insertBefore(e,i||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,i,o)=>{const d=t==="svg"?Ut.createElementNS(yc,e):t==="mathml"?Ut.createElementNS(Ac,e):i?Ut.createElement(e,{is:i}):Ut.createElement(e);return e==="select"&&o&&o.multiple!=null&&d.setAttribute("multiple",o.multiple),d},createText:e=>Ut.createTextNode(e),createComment:e=>Ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ut.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,i,o,d,u){const f=i?i.previousSibling:t.lastChild;if(d&&(d===u||d.nextSibling))for(;t.insertBefore(d.cloneNode(!0),i),!(d===u||!(d=d.nextSibling)););else{fi.innerHTML=Bo(o==="svg"?`<svg>${e}</svg>`:o==="mathml"?`<math>${e}</math>`:e);const p=fi.content;if(o==="svg"||o==="mathml"){const m=p.firstChild;for(;m.firstChild;)p.appendChild(m.firstChild);p.removeChild(m)}t.insertBefore(p,i)}return[f?f.nextSibling:t.firstChild,i?i.previousSibling:t.lastChild]}},Pc=Symbol("_vtc");function wc(e,t,i){const o=e[Pc];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):i?e.setAttribute("class",t):e.className=t}const pi=Symbol("_vod"),Tc=Symbol("_vsh"),_c=Symbol(""),Dc=/(?:^|;)\s*display\s*:/;function Ic(e,t,i){const o=e.style,d=Fe(i);let u=!1;if(i&&!d){if(t)if(Fe(t))for(const f of t.split(";")){const p=f.slice(0,f.indexOf(":")).trim();i[p]==null&&$s(o,p,"")}else for(const f in t)i[f]==null&&$s(o,f,"");for(const f in i)f==="display"&&(u=!0),$s(o,f,i[f])}else if(d){if(t!==i){const f=o[_c];f&&(i+=";"+f),o.cssText=i,u=Dc.test(i)}}else t&&e.removeAttribute("style");pi in e&&(e[pi]=u?o.display:"",e[Tc]&&(o.display="none"))}const gi=/\s*!important$/;function $s(e,t,i){if(X(i))i.forEach(o=>$s(e,t,o));else if(i==null&&(i=""),t.startsWith("--"))e.setProperty(t,i);else{const o=Rc(e,t);gi.test(i)?e.setProperty(pa(o),i.replace(gi,""),"important"):e[o]=i}}const hi=["Webkit","Moz","ms"],Ln={};function Rc(e,t){const i=Ln[t];if(i)return i;let o=pt(t);if(o!=="filter"&&o in e)return Ln[t]=o;o=zi(o);for(let d=0;d<hi.length;d++){const u=hi[d]+o;if(u in e)return Ln[t]=u}return t}const mi="http://www.w3.org/1999/xlink";function vi(e,t,i,o,d,u=xd(t)){o&&t.startsWith("xlink:")?i==null?e.removeAttributeNS(mi,t.slice(6,t.length)):e.setAttributeNS(mi,t,i):i==null||u&&!Bi(i)?e.removeAttribute(t):e.setAttribute(t,u?"":Rt(i)?String(i):i)}function bi(e,t,i,o,d){if(t==="innerHTML"||t==="textContent"){i!=null&&(e[t]=t==="innerHTML"?Bo(i):i);return}const u=e.tagName;if(t==="value"&&u!=="PROGRESS"&&!u.includes("-")){const p=u==="OPTION"?e.getAttribute("value")||"":e.value,m=i==null?e.type==="checkbox"?"on":"":String(i);(p!==m||!("_value"in e))&&(e.value=m),i==null&&e.removeAttribute(t),e._value=i;return}let f=!1;if(i===""||i==null){const p=typeof e[t];p==="boolean"?i=Bi(i):i==null&&p==="string"?(i="",f=!0):p==="number"&&(i=0,f=!0)}try{e[t]=i}catch{}f&&e.removeAttribute(d||t)}function ca(e,t,i,o){e.addEventListener(t,i,o)}function Nc(e,t,i,o){e.removeEventListener(t,i,o)}const yi=Symbol("_vei");function Cc(e,t,i,o,d=null){const u=e[yi]||(e[yi]={}),f=u[t];if(o&&f)f.value=o;else{const[p,m]=kc(t);if(o){const T=u[t]=Gc(o,d);ca(e,p,T,m)}else f&&(Nc(e,p,f,m),u[t]=void 0)}}const Ai=/(?:Once|Passive|Capture)$/;function kc(e){let t;if(Ai.test(e)){t={};let o;for(;o=e.match(Ai);)e=e.slice(0,e.length-o[0].length),t[o[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):pa(e.slice(2)),t]}let Mn=0;const xc=Promise.resolve(),Ec=()=>Mn||(xc.then(()=>Mn=0),Mn=Date.now());function Gc(e,t){const i=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=i.attached)return;Nt(Fc(o,i.value),t,5,[o])};return i.value=e,i.attached=Ec(),i}function Fc(e,t){if(X(t)){const i=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{i.call(e),e._stopped=!0},t.map(o=>d=>!d._stopped&&o&&o(d))}else return t}const Si=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Lc=(e,t,i,o,d,u)=>{const f=d==="svg";t==="class"?wc(e,o,f):t==="style"?Ic(e,i,o):Hs(t)?Zn(t)||Cc(e,t,i,o,u):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Mc(e,t,o,f))?(bi(e,t,o),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&vi(e,t,o,f,u,t!=="value")):e._isVueCE&&(Oc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Fe(o)))?bi(e,pt(t),o,u,t):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),vi(e,t,o,f))};function Mc(e,t,i,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&Si(t)&&Q(i));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const d=e.tagName;if(d==="IMG"||d==="VIDEO"||d==="CANVAS"||d==="SOURCE")return!1}return Si(t)&&Fe(i)?!1:t in e}function Oc(e,t){const i=e._def.props;if(!i)return!1;const o=pt(t);return Array.isArray(i)?i.some(d=>pt(d)===o):Object.keys(i).some(d=>pt(d)===o)}const Ka=e=>{const t=e.props["onUpdate:modelValue"]||!1;return X(t)?i=>Ls(t,i):t};function zc(e){e.target.composing=!0}function Pi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const qt=Symbol("_assign");function wi(e,t,i){return t&&(e=e.trim()),i&&(e=qs(e)),e}const ke={created(e,{modifiers:{lazy:t,trim:i,number:o}},d){e[qt]=Ka(d);const u=o||d.props&&d.props.type==="number";ca(e,t?"change":"input",f=>{f.target.composing||e[qt](wi(e.value,i,u))}),(i||u)&&ca(e,"change",()=>{e.value=wi(e.value,i,u)}),t||(ca(e,"compositionstart",zc),ca(e,"compositionend",Pi),ca(e,"change",Pi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:i,modifiers:{lazy:o,trim:d,number:u}},f){if(e[qt]=Ka(f),e.composing)return;const p=(u||e.type==="number")&&!/^0\d/.test(e.value)?qs(e.value):e.value,m=t??"";p!==m&&(document.activeElement===e&&e.type!=="range"&&(o&&t===i||d&&e.value.trim()===m)||(e.value=m))}},On={deep:!0,created(e,t,i){e[qt]=Ka(i),ca(e,"change",()=>{const o=e._modelValue,d=bs(e),u=e.checked,f=e[qt];if(X(o)){const p=er(o,d),m=p!==-1;if(u&&!m)f(o.concat(d));else if(!u&&m){const T=[...o];T.splice(p,1),f(T)}}else if(Wa(o)){const p=new Set(o);u?p.add(d):p.delete(d),f(p)}else f(Vo(e,u))})},mounted:Ti,beforeUpdate(e,t,i){e[qt]=Ka(i),Ti(e,t,i)}};function Ti(e,{value:t,oldValue:i},o){e._modelValue=t;let d;if(X(t))d=er(t,o.props.value)>-1;else if(Wa(t))d=t.has(o.props.value);else{if(t===i)return;d=Ua(t,Vo(e,!0))}e.checked!==d&&(e.checked=d)}const Ta={deep:!0,created(e,{value:t,modifiers:{number:i}},o){const d=Wa(t);ca(e,"change",()=>{const u=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>i?qs(bs(f)):bs(f));e[qt](e.multiple?d?new Set(u):u:u[0]),e._assigning=!0,os(()=>{e._assigning=!1})}),e[qt]=Ka(o)},mounted(e,{value:t}){_i(e,t)},beforeUpdate(e,t,i){e[qt]=Ka(i)},updated(e,{value:t}){e._assigning||_i(e,t)}};function _i(e,t){const i=e.multiple,o=X(t);if(!(i&&!o&&!Wa(t))){for(let d=0,u=e.options.length;d<u;d++){const f=e.options[d],p=bs(f);if(i)if(o){const m=typeof p;m==="string"||m==="number"?f.selected=t.some(T=>String(T)===String(p)):f.selected=er(t,p)>-1}else f.selected=t.has(p);else if(Ua(bs(f),t)){e.selectedIndex!==d&&(e.selectedIndex=d);return}}!i&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function bs(e){return"_value"in e?e._value:e.value}function Vo(e,t){const i=t?"_trueValue":"_falseValue";return i in e?e[i]:t}const $c=["ctrl","shift","alt","meta"],Bc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>$c.some(i=>e[`${i}Key`]&&!t.includes(i))},Wt=(e,t)=>{if(!e)return e;const i=e._withMods||(e._withMods={}),o=t.join(".");return i[o]||(i[o]=((d,...u)=>{for(let f=0;f<t.length;f++){const p=Bc[t[f]];if(p&&p(d,t))return}return e(d,...u)}))},Vc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Kc=(e,t)=>{const i=e._withKeys||(e._withKeys={}),o=t.join(".");return i[o]||(i[o]=(d=>{if(!("key"in d))return;const u=pa(d.key);if(t.some(f=>f===u||Vc[f]===u))return e(d)}))},Wc=Ke({patchProp:Lc},Sc);let Di;function Uc(){return Di||(Di=Qu(Wc))}const jc=((...e)=>{const t=Uc().createApp(...e),{mount:i}=t;return t.mount=o=>{const d=Xc(o);if(!d)return;const u=t._component;!Q(u)&&!u.render&&!u.template&&(u.template=d.innerHTML),d.nodeType===1&&(d.textContent="");const f=i(d,!1,Hc(d));return d instanceof Element&&(d.removeAttribute("v-cloak"),d.setAttribute("data-v-app","")),f},t});function Hc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Xc(e){return Fe(e)?document.querySelector(e):e}const qc="modulepreload",Jc=function(e){return"/knxUltimateAI/sidebar/page/"+e},Ii={},Zc=function(t,i,o){let d=Promise.resolve();if(i&&i.length>0){let m=function(T){return Promise.all(T.map(A=>Promise.resolve(A).then(I=>({status:"fulfilled",value:I}),I=>({status:"rejected",reason:I}))))};document.getElementsByTagName("link");const f=document.querySelector("meta[property=csp-nonce]"),p=f?.nonce||f?.getAttribute("nonce");d=m(i.map(T=>{if(T=Jc(T),T in Ii)return;Ii[T]=!0;const A=T.endsWith(".css"),I=A?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${T}"]${I}`))return;const L=document.createElement("link");if(L.rel=A?"stylesheet":qc,A||(L.as="script"),L.crossOrigin="",L.href=T,p&&L.setAttribute("nonce",p),document.head.appendChild(L),A)return new Promise(($,ie)=>{L.addEventListener("load",$),L.addEventListener("error",()=>ie(new Error(`Unable to preload CSS for ${T}`)))})}))}function u(f){const p=new Event("vite:preloadError",{cancelable:!0});if(p.payload=f,window.dispatchEvent(p),!p.defaultPrevented)throw f}return d.then(f=>{for(const p of f||[])p.status==="rejected"&&u(p.reason);return t().catch(u)})},Yc={en:{},it:{"{{count}} areas":"{{count}} aree","{{count}} available":"{{count}} disponibile","{{count}} event types":"{{count}} tipi di eventi","{{count}} recent":"{{count}} recente","{{count}} saved plans":"{{count}} piani salvati","{{count}} visible":"{{count}} visibile","Activate main actuators":"Attiva gli attuatori principali","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Attivare i principali attuatori presenti nell'area e verificare il feedback di stato per confermare che segua i comandi.","Active Read Request To Status GA":"Richiesta di lettura attiva allo stato GA","Actuator preset deleted":"Preimpostazione dell'attuatore cancellata","Actuator preset saved":"Preimpostazione dell'attuatore salvata","Actuator test complete":"Test dell'attuatore completato","Add group addresses to this area":"Aggiungi indirizzi di gruppo a quest'area","Add Step":"Aggiungi passaggio","Add Wait":"Aggiungi Aspetta","AI Area Builder":"Costruttore di aree AI","AI is selecting area GA...":"L'IA sta selezionando l'area GA...","anomaly x{{value}}":"anomalia x{{value}}","Applies to all matching lighting command GA in the selected area.":"Si applica a tutti i comandi di illuminazione corrispondenti GA nell'area selezionata.",Area:"Zona","Area {{value}}":"Area {{value}}","Area deleted":"Area eliminata","Area editor closed":"Redazione di area chiusa","Area GA membership":"Iscrizione all'area GA","Area name":"Nome dell'area","Area reset":"Reimpostazione dell'area","Area to test":"Zona da testare",Areas:"Aree","Ask failed":"Domanda fallita","Asking...":"Asking...",Assistant:"Assistente","Assistant prompt":"Richiesta dell'assistente","Available GA":"Disponibile GA","Building test plan...":"Piano di prova della costruzione...","Builds a deterministic active test using the supported command GA in the selected area.":"Costruisce un test attivo deterministico utilizzando il comando supportato GA nell'area selezionata.","Bus Connection Persistence":"Persistenza della connessione bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Scegli un report per esaminare metriche, controlli dettagliati e suggerimenti.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Scegli un modello di test standard per l'area selezionata, quindi crea il piano in modo deterministico dal catalogo ETS.",Close:"Chiudi","Close menu":"Chiudi menù",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carico utile del comando",Completed:"Completato","Config exported":"Configurazione esportata","Config imported":"Configurazione importata","Connected {{value}}":"Connesso {{value}}","Coverage {{value}}%":"Copertura {{value}}%","Define at least one area before creating a test plan":"Definire almeno un'area prima di creare un piano di test","Define at least one area before using Tests":"Definire almeno un'area prima di utilizzare i test","Delete Area":"Elimina area","Deleting actuator preset...":"Eliminazione della preimpostazione dell'attuatore...","Deleting area...":"Eliminazione area...","Deleting profile...":"Eliminazione profilo...","Deleting test plan...":"Eliminazione del piano di test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Descrivi la stanza, la zona o la funzione che desideri.L'intelligenza artificiale suggerirà gli indirizzi dei gruppi più rilevanti per questa bozza.",Description:"Descrizione","Disconnected {{value}}":"Disconnesso {{value}}","Documentation: KNX AI Vue":"Documentazione: KNX AI Vue","Donate via PayPal":"Dona tramite PayPal","Drag step":"Trascina il passaggio",Duplicate:"Duplicato","Duplicate Plan":"Piano duplicato","Edit Area":"Modifica area","Edit Plan":"Modifica piano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Abilita l'IA nel nodo KNX AI per rigenerare aree o suggerire GA per una nuova bozza.","Event distribution will appear after the first samples.":"La distribuzione degli eventi apparirà dopo i primi campioni.","Event Mix":"Mix di eventi","Example: Add all technical room lighting command and status GA.":"Esempio: aggiungere tutti i comandi e lo stato dell'illuminazione del locale tecnico GA.",Expected:"Previsto","Expected feedback value":"Valore di feedback previsto","Expected payload":"Carico utile previsto","Explain any anomalies you see and suggest what to check first.":"Spiega eventuali anomalie riscontrate e suggerisci cosa controllare prima.","Export PDF":"Esporta PDF","Exporting config...":"Esportazione della configurazione...",Fail:"Fallire","Failed to build the test plan":"Impossibile creare il piano di test","Failed to delete actuator preset":"Impossibile eliminare la preimpostazione dell'attuatore","Failed to delete area":"Impossibile eliminare l'area","Failed to delete profile":"Impossibile eliminare il profilo","Failed to delete test plan":"Impossibile eliminare il piano di test","Failed to delete test result":"Impossibile eliminare il risultato del test","Failed to export config":"Impossibile esportare la configurazione","Failed to import config":"Impossibile importare la configurazione","Failed to load area command/status catalog":"Impossibile caricare il catalogo comandi/stati dell'area","Failed to load GA catalog":"Impossibile caricare il catalogo GA","Failed to load nodes":"Impossibile caricare i nodi","Failed to load state":"Impossibile caricare lo stato","Failed to regenerate AI areas":"Impossibile rigenerare le aree AI","Failed to reset area":"Impossibile reimpostare l'area","Failed to run actuator test":"Impossibile eseguire il test dell'attuatore","Failed to run profile":"Impossibile eseguire il profilo","Failed to run test plan":"Impossibile eseguire il piano di test","Failed to save actuator preset":"Impossibile salvare la preimpostazione dell'attuatore","Failed to save area":"Impossibile salvare l'area","Failed to save GA role":"Impossibile salvare il ruolo GA","Failed to save profile":"Impossibile salvare il profilo","Failed to save test plan":"Impossibile salvare il piano di test","Failed to save test result":"Impossibile salvare il risultato del test","Failed to suggest area GA":"Impossibile suggerire l'area GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genera un grafico a barre SVG dei principali indirizzi del gruppo con conteggi e titolo.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Il verde mostra l'ora collegata al bus KNX.Il rosso mostra i tempi di inattività all'interno della finestra della cronologia selezionata.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC controllo attivo","Importing config...":"Importazione configurazione...","in progress":"in corso","Installer alias":"Alias dell'installatore","KNX active test name":"KNX nome del test attivo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luci accese, poi spente","Live and saved reports generated by KNX active and read-only tests.":"Report in tempo reale e salvati generati da test attivi e di sola lettura di KNX.","Loading nodes...":"Caricamento nodi...","Loading...":"Loading...","n/a":"n/a","New Area":"Nuova zona","New Plan":"Nuovo piano","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Nessuna area corrisponde alla ricerca corrente oppure il file ETS non espone ancora una gerarchia utilizzabile.","No detailed entries stored for this report yet.":"Nessuna voce dettagliata ancora memorizzata per questo rapporto.","No feedback":"Nessun feedback","No GA selected for this area yet.":"Nessun GA ancora selezionato per quest'area.","No KNX AI nodes found.":"Nessun nodo KNX AI trovato.","No saved plans yet.":"Nessun piano ancora salvato.","No saved test results yet.":"Nessun risultato del test ancora salvato.","No test result selected to export":"Nessun risultato del test selezionato per l'esportazione","No test result selected.":"Nessun risultato del test selezionato.","No top group address data available yet.":"Nessun dato sugli indirizzi dei gruppi principali ancora disponibile.","Nodes {{nodes}} | Links {{links}}":"Nodi {{nodes}} |Collegamenti {{links}}",Now:"Adesso","Open and close shading":"Apri e chiudi l'ombreggiatura","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Aprire e chiudere gli attuatori ombreggianti presenti nell'area, quindi verificare che lo stato corrisponda ai comandi inviati.","Open Source Test":"Prova dell'open source","Optional note for diagnostics and reports":"Nota facoltativa per diagnostica e report","Original ETS path:":"Percorso ETS originale:",Overview:"Panoramica",Pass:"Passa",Payload:"Carico utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Scegli dal catalogo ETS.Gli GA già selezionati sono nascosti da questo elenco.","Plan changes discarded":"Modifiche al piano annullate","Plan duplicated":"Piano duplicato","Plan name":"Nome del piano",Plans:"Piani","Profile deleted":"Profilo eliminato","Profile report ready":"Rapporto sul profilo pronto","Profile saved":"Profilo salvato","Provider: {{provider}} | Model: {{model}}":"Fornitore: {{provider}} |Modello: {{model}}",Rate:"Vota","Read response timeout ms":"Leggi il timeout della risposta ms",Ready:"Pronto",Reason:"Motivo",Refresh:"Aggiorna","Regenerating AI areas...":"Rigenerazione delle aree AI...",Remove:"Rimuovi",Repeat:"Ripeti",Reset:"Ripristina","Resetting area...":"Reimpostazione dell'area...","Response timeout":"Timeout della risposta","Returned to the Tests page for the source actuator test.":"Ritornato alla pagina Test per il test dell'attuatore sorgente.","Returned to the Tests page for the source read-only profile.":"Ritornato alla pagina Test per il profilo di sola lettura di origine.","Returned to the Tests page.":"Ritornato alla pagina dei test.","Reusable deterministic active tests saved by the installer.":"Test attivi deterministici riutilizzabili salvati dall'installatore.",Role:"Ruolo","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Eseguire un test completo dei comandi HVAC nell'area e verificare che i setpoint e gli stati siano coerenti.",Running:"Correre","Running actuator test...":"Esecuzione del test dell'attuatore in corso...","Running profile...":"Profilo in esecuzione...","Running...":"Running...","Saving actuator preset...":"Salvataggio della preimpostazione dell'attuatore...","Saving profile...":"Salvataggio profilo...","Saving test plan...":"Salvataggio del piano di test...","Search GA, label or ETS path":"Cerca GA, etichetta o percorso ETS","Select an Area":"Seleziona un'area","Select area":"Seleziona zona","Select command GA":"Seleziona il comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleziona uno dei modelli standard.Il piano viene costruito solo dal comando GA disponibile nell'area selezionata.","Select test plan":"Seleziona il piano di prova","Select Test Result":"Seleziona Risultato del test","Selected template":"Modello selezionato","Send a":"Invia un",Settings:"Impostazioni","Short operator-facing description":"Breve descrizione rivolta all'operatore","Show AI Area Builder":"Mostra AI Area Builder","Show Template Builder":"Mostra generatore di modelli","Spontaneous Write From Status GA":"Scrittura spontanea dallo stato GA",Status:"Stato","Status DPT":"Stato DPT","Status GA":"Stato GA","Status write timeout ms":"Timeout scrittura stato ms","Step title":"Titolo del passaggio","Stopping repeat mode after the current cycle...":"Interruzione della modalità di ripetizione dopo il ciclo corrente...",Subscribe:"Iscriviti",Suggestions:"Suggerimenti","Summarize the current KNX traffic and highlight the busiest group addresses.":"Riepiloga il traffico corrente KNX ed evidenzia gli indirizzi dei gruppi più trafficati.",Summary:"Sommario","Targets supported HVAC command GA in the selected area.":"Bersagli supportati HVAC comando GA nell'area selezionata.","Targets supported shading command GA in the selected area.":"Gli obiettivi supportano il comando di ombreggiatura GA nell'area selezionata.","telegram from the status GA.":"telegramma dallo stato GA.","telegram to the status GA and wait for a":"telegramma allo stato GA e attendere un",Telegrams:"Telegrammi","Template Builder":"Generatore di modelli","Test editor closed":"Editor del test chiuso","Test plan deleted":"Piano di test eliminato","Test plan ready":"Piano di prova pronto","Test plan saved":"Piano di test salvato","Test result deleted":"Risultato del test cancellato","Test Results":"Risultati dei test","Test Running":"Prova in esecuzione",Tests:"Test","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installatore può rinominare l'area e decidere esattamente a quali indirizzi di gruppo appartenere.Tutto è persistente per nodo KNX AI.",Timeout:"Timeout",Title:"Titolo","Toggle menu":"Cambia menu","Toggle sidebar":"Attiva/disattiva la barra laterale","Top Group Addresses":"Indirizzi di gruppo principali","true, false, 50":"vero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Accendi le luci, poi spegnile e verifica che i relativi valori di stato siano coerenti.","Unknown DPT":"Sconosciuto DPT","Unsaved changes":"Modifiche non salvate",Voice:"Voce",Wait:"Aspetta","Wait for a spontaneous":"Aspetta uno spontaneo","Wait ms":"Aspetta, signorina",Warn:"Avvertire","What this step checks":"Cosa controlla questo passaggio","Why this step exists":"Perché esiste questo passaggio","Window {{value}}s.":"Finestra {{value}}s.","Write timeout":"Scrivi timeout"},de:{"{{count}} areas":"{{count}} Bereiche","{{count}} available":"{{count}} verfügbar","{{count}} event types":"{{count}} Ereignistypen","{{count}} recent":"{{count}} aktuell","{{count}} saved plans":"{{count}} gespeicherte Pläne","{{count}} visible":"{{count}} sichtbar","Activate main actuators":"Hauptaktoren aktivieren","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Aktivieren Sie die Hauptaktoren im Bereich und überprüfen Sie die Statusrückmeldung, um zu bestätigen, dass die Befehle befolgt werden.","Active Read Request To Status GA":"Aktive Leseanforderung an Status GA","Actuator preset deleted":"Aktorvoreinstellung gelöscht","Actuator preset saved":"Aktorvoreinstellung gespeichert","Actuator test complete":"Aktuatortest abgeschlossen","Add group addresses to this area":"Fügen Sie diesem Bereich Gruppenadressen hinzu","Add Step":"Schritt hinzufügen","Add Wait":"Warten hinzufügen","AI Area Builder":"AI Area Builder","AI is selecting area GA...":"KI wählt Bereich GA aus...","anomaly x{{value}}":"Anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"Gilt für alle passenden Beleuchtungsbefehle GA im ausgewählten Bereich.",Area:"Bereich","Area {{value}}":"Bereich {{value}}","Area deleted":"Bereich gelöscht","Area editor closed":"Bereichseditor geschlossen","Area GA membership":"Bereich GA Mitgliedschaft","Area name":"Gebietsname","Area reset":"Bereich zurückgesetzt","Area to test":"Bereich zum Testen",Areas:"Bereiche","Ask failed":"Die Anfrage ist fehlgeschlagen","Asking...":"Asking...",Assistant:"Assistent","Assistant prompt":"Eingabeaufforderung des Assistenten","Available GA":"Verfügbar GA","Building test plan...":"Bautestplan...","Builds a deterministic active test using the supported command GA in the selected area.":"Erstellt einen deterministischen aktiven Test mit dem unterstützten Befehl GA im ausgewählten Bereich.","Bus Connection Persistence":"Persistenz der Busverbindung","Choose a report to inspect metrics, detailed checks, and suggestions.":"Wählen Sie einen Bericht aus, um Metriken, detaillierte Prüfungen und Vorschläge zu prüfen.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Wählen Sie eine Standardtestvorlage für den ausgewählten Bereich und erstellen Sie dann den Plan deterministisch aus dem Katalog ETS.",Close:"Schließen","Close menu":"Menü schließen",Command:"Befehl","Command DPT":"Befehl DPT","Command GA":"Befehl GA","Command payload":"Befehlsnutzlast",Completed:"Abgeschlossen","Config exported":"Konfiguration exportiert","Config imported":"Konfiguration importiert","Connected {{value}}":"Verbunden {{value}}","Coverage {{value}}%":"Abdeckung {{value}}%","Define at least one area before creating a test plan":"Definieren Sie mindestens einen Bereich, bevor Sie einen Testplan erstellen","Define at least one area before using Tests":"Definieren Sie mindestens einen Bereich, bevor Sie Tests verwenden","Delete Area":"Bereich löschen","Deleting actuator preset...":"Aktor-Preset wird gelöscht...","Deleting area...":"Bereich wird gelöscht...","Deleting profile...":"Profil wird gelöscht...","Deleting test plan...":"Testplan wird gelöscht...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Beschreiben Sie den Raum, die Zone oder die Funktion, die Sie wünschen.Die KI schlägt für diesen Entwurf die relevantesten Gruppenadressen vor.",Description:"Beschreibung","Disconnected {{value}}":"Getrennt {{value}}","Documentation: KNX AI Vue":"Dokumentation: KNX AI Vue","Donate via PayPal":"Spenden Sie über PayPal","Drag step":"Schritt ziehen",Duplicate:"Duplizieren","Duplicate Plan":"Doppelter Plan","Edit Area":"Bereich bearbeiten","Edit Plan":"Plan bearbeiten","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Aktivieren Sie die KI im Knoten KNX AI, um Bereiche neu zu generieren, oder schlagen Sie GA für einen neuen Entwurf vor.","Event distribution will appear after the first samples.":"Die Ereignisverteilung erscheint nach den ersten Proben.","Event Mix":"Event-Mix","Example: Add all technical room lighting command and status GA.":"Beispiel: Alle technischen Raumbeleuchtungsbefehle und den Status GA hinzufügen.",Expected:"Erwartet","Expected feedback value":"Erwarteter Feedbackwert","Expected payload":"Erwartete Nutzlast","Explain any anomalies you see and suggest what to check first.":"Erklären Sie alle Anomalien, die Sie sehen, und schlagen Sie vor, was Sie zuerst überprüfen sollten.","Export PDF":"PDF exportieren","Exporting config...":"Konfiguration wird exportiert...",Fail:"Scheitern","Failed to build the test plan":"Der Testplan konnte nicht erstellt werden","Failed to delete actuator preset":"Aktorvoreinstellung konnte nicht gelöscht werden","Failed to delete area":"Bereich konnte nicht gelöscht werden","Failed to delete profile":"Profil konnte nicht gelöscht werden","Failed to delete test plan":"Testplan konnte nicht gelöscht werden","Failed to delete test result":"Testergebnis konnte nicht gelöscht werden","Failed to export config":"Konfiguration konnte nicht exportiert werden","Failed to import config":"Konfiguration konnte nicht importiert werden","Failed to load area command/status catalog":"Der Befehls-/Statuskatalog für den Bereich konnte nicht geladen werden","Failed to load GA catalog":"Der Katalog GA konnte nicht geladen werden","Failed to load nodes":"Knoten konnten nicht geladen werden","Failed to load state":"Status konnte nicht geladen werden","Failed to regenerate AI areas":"KI-Bereiche konnten nicht regeneriert werden","Failed to reset area":"Bereich konnte nicht zurückgesetzt werden","Failed to run actuator test":"Aktuatortest konnte nicht ausgeführt werden","Failed to run profile":"Profil konnte nicht ausgeführt werden","Failed to run test plan":"Testplan konnte nicht ausgeführt werden","Failed to save actuator preset":"Aktorvoreinstellung konnte nicht gespeichert werden","Failed to save area":"Bereich konnte nicht gespeichert werden","Failed to save GA role":"Die Rolle GA konnte nicht gespeichert werden","Failed to save profile":"Profil konnte nicht gespeichert werden","Failed to save test plan":"Der Testplan konnte nicht gespeichert werden","Failed to save test result":"Testergebnis konnte nicht gespeichert werden","Failed to suggest area GA":"Bereich GA konnte nicht vorgeschlagen werden","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Erstellen Sie ein SVG-Balkendiagramm der Top-Gruppenadressen mit Anzahl und Titel.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Grün zeigt die mit dem Bus KNX verbundene Zeit an.Rot zeigt Ausfallzeiten im ausgewählten Verlaufsfenster an.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC aktive Prüfung","Importing config...":"Konfiguration wird importiert...","in progress":"in Bearbeitung","Installer alias":"Installer-Alias","KNX active test name":"KNX aktiver Testname","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Licht an, dann aus","Live and saved reports generated by KNX active and read-only tests.":"Live- und gespeicherte Berichte, die von KNX aktiven und schreibgeschützten Tests generiert wurden.","Loading nodes...":"Knoten werden geladen...","Loading...":"Loading...","n/a":"n/a","New Area":"Neuer Bereich","New Plan":"Neuer Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Keine Bereiche stimmten mit der aktuellen Suche überein oder die Datei ETS stellt noch keine verwendbare Hierarchie bereit.","No detailed entries stored for this report yet.":"Für diesen Bericht sind noch keine detaillierten Einträge hinterlegt.","No feedback":"Keine Rückmeldung","No GA selected for this area yet.":"Für diesen Bereich wurde noch kein GA ausgewählt.","No KNX AI nodes found.":"Keine KNX AI Knoten gefunden.","No saved plans yet.":"Noch keine gespeicherten Pläne.","No saved test results yet.":"Noch keine gespeicherten Testergebnisse.","No test result selected to export":"Kein Testergebnis zum Exportieren ausgewählt","No test result selected.":"Kein Testergebnis ausgewählt.","No top group address data available yet.":"Es sind noch keine Daten zur Top-Gruppenadresse verfügbar.","Nodes {{nodes}} | Links {{links}}":"Knoten {{nodes}} |Links {{links}}",Now:"Jetzt","Open and close shading":"Beschattung öffnen und schließen","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Öffnen und schließen Sie die Beschattungsaktoren im Bereich und überprüfen Sie dann, ob der Status mit den gesendeten Befehlen übereinstimmt.","Open Source Test":"Open-Source-Test","Optional note for diagnostics and reports":"Optionaler Hinweis für Diagnosen und Berichte","Original ETS path:":"Ursprünglicher ETS Pfad:",Overview:"Übersicht",Pass:"Pass",Payload:"Nutzlast","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Wählen Sie aus dem Katalog ETS.Bereits ausgewählte GA werden aus dieser Liste ausgeblendet.","Plan changes discarded":"Planänderungen verworfen","Plan duplicated":"Plan dupliziert","Plan name":"Planname",Plans:"Pläne","Profile deleted":"Profil gelöscht","Profile report ready":"Profilbericht bereit","Profile saved":"Profil gespeichert","Provider: {{provider}} | Model: {{model}}":"Anbieter: {{provider}} |Modell: {{model}}",Rate:"Bewerten","Read response timeout ms":"Leseantwort-Timeout ms",Ready:"Bereit",Reason:"Grund",Refresh:"Aktualisieren","Regenerating AI areas...":"KI-Bereiche werden regeneriert...",Remove:"Entfernen",Repeat:"Wiederholen",Reset:"Zurücksetzen","Resetting area...":"Bereich wird zurückgesetzt...","Response timeout":"Antwortzeitüberschreitung","Returned to the Tests page for the source actuator test.":"Zurück zur Seite „Tests“ für den Quellaktuatortest.","Returned to the Tests page for the source read-only profile.":"Kehrt zur Seite „Tests“ für das schreibgeschützte Quellprofil zurück.","Returned to the Tests page.":"Zurück zur Seite „Tests“.","Reusable deterministic active tests saved by the installer.":"Wiederverwendbare deterministische aktive Tests, die vom Installationsprogramm gespeichert werden.",Role:"Rolle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Führen Sie einen vollständigen Test der HVAC-Befehle im Bereich durch und stellen Sie sicher, dass Sollwerte und Status kohärent sind.",Running:"Laufen","Running actuator test...":"Aktuatortest wird ausgeführt...","Running profile...":"Laufprofil...","Running...":"Running...","Saving actuator preset...":"Aktorvoreinstellung speichern...","Saving profile...":"Profil wird gespeichert...","Saving test plan...":"Testplan wird gespeichert...","Search GA, label or ETS path":"Suchen Sie nach GA, Label oder ETS Pfad","Select an Area":"Wählen Sie einen Bereich aus","Select area":"Bereich auswählen","Select command GA":"Wählen Sie den Befehl GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Wählen Sie eine der Standardvorlagen aus.Der Plan wird nur mit dem Befehl GA erstellt, der im ausgewählten Bereich verfügbar ist.","Select test plan":"Testplan auswählen","Select Test Result":"Wählen Sie Testergebnis","Selected template":"Ausgewählte Vorlage","Send a":"Senden Sie eine",Settings:"Einstellungen","Short operator-facing description":"Kurze Beschreibung für den Bediener","Show AI Area Builder":"AI Area Builder anzeigen","Show Template Builder":"Template Builder anzeigen","Spontaneous Write From Status GA":"Spontanes Schreiben aus Status GA",Status:"Status","Status DPT":"Status DPT","Status GA":"Status GA","Status write timeout ms":"Statusschreib-Timeout ms","Step title":"Schritttitel","Stopping repeat mode after the current cycle...":"Stoppen des Wiederholungsmodus nach dem aktuellen Zyklus...",Subscribe:"Abonnieren",Suggestions:"Vorschläge","Summarize the current KNX traffic and highlight the busiest group addresses.":"Fassen Sie den aktuellen KNX-Verkehr zusammen und markieren Sie die am stärksten ausgelasteten Gruppenadressen.",Summary:"Zusammenfassung","Targets supported HVAC command GA in the selected area.":"Unterstützte Ziele: HVAC Befehl GA im ausgewählten Bereich.","Targets supported shading command GA in the selected area.":"Zielt auf den unterstützten Schattierungsbefehl GA im ausgewählten Bereich.","telegram from the status GA.":"Telegramm vom Status GA.","telegram to the status GA and wait for a":"Telegramm auf den Status GA und warten Sie auf a",Telegrams:"Telegramme","Template Builder":"Vorlagenersteller","Test editor closed":"Testeditor geschlossen","Test plan deleted":"Testplan gelöscht","Test plan ready":"Testplan fertig","Test plan saved":"Testplan gespeichert","Test result deleted":"Testergebnis gelöscht","Test Results":"Testergebnisse","Test Running":"Testlauf",Tests:"Tests","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"Der Installateur kann den Bereich umbenennen und genau entscheiden, welche Gruppenadressen dazu gehören.Alles wird pro KNX AI-Knoten beibehalten.",Timeout:"Auszeit",Title:"Titel","Toggle menu":"Menü umschalten","Toggle sidebar":"Seitenleiste umschalten","Top Group Addresses":"Top-Gruppenadressen","true, false, 50":"wahr, falsch, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Schalten Sie die Lichter ein und wieder aus und überprüfen Sie, ob die zugehörigen Statuswerte kohärent sind.","Unknown DPT":"Unbekannt DPT","Unsaved changes":"Nicht gespeicherte Änderungen",Voice:"Stimme",Wait:"Warte","Wait for a spontaneous":"Warten Sie auf eine spontane","Wait ms":"Warten Sie, Frau",Warn:"Warnen","What this step checks":"Was dieser Schritt prüft","Why this step exists":"Warum es diesen Schritt gibt","Window {{value}}s.":"Fenster {{value}}s.","Write timeout":"Timeout schreiben"},fr:{"{{count}} areas":"Zones {{count}}","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} types d'événements","{{count}} recent":"{{count}} récent","{{count}} saved plans":"{{count}} plans enregistrés","{{count}} visible":"{{count}} visible","Activate main actuators":"Activer les actionneurs principaux","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Activez les principaux actionneurs de la zone et vérifiez le retour d'état pour confirmer qu'il suit les commandes.","Active Read Request To Status GA":"Demande de lecture active vers l'état GA","Actuator preset deleted":"Préréglage de l'actionneur supprimé","Actuator preset saved":"Préréglage de l'actionneur enregistré","Actuator test complete":"Test de l'actionneur terminé","Add group addresses to this area":"Ajouter des adresses de groupe à cette zone","Add Step":"Ajouter une étape","Add Wait":"Ajouter une attente","AI Area Builder":"Générateur de zones IA","AI is selecting area GA...":"L'IA sélectionne la zone GA...","anomaly x{{value}}":"anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"S'applique à toutes les commandes d'éclairage correspondantes GA dans la zone sélectionnée.",Area:"Zone","Area {{value}}":"Zone {{value}}","Area deleted":"Zone supprimée","Area editor closed":"Éditeur de zone fermé","Area GA membership":"Adhésion à la zone GA","Area name":"Nom de la zone","Area reset":"Réinitialisation de la zone","Area to test":"Zone à tester",Areas:"Domaines","Ask failed":"La demande a échoué","Asking...":"Asking...",Assistant:"Assistante","Assistant prompt":"Invite de l'assistant","Available GA":"Disponible GA","Building test plan...":"Plan de test de construction...","Builds a deterministic active test using the supported command GA in the selected area.":"Construit un test actif déterministe à l'aide de la commande prise en charge GA dans la zone sélectionnée.","Bus Connection Persistence":"Persistance de la connexion de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Choisissez un rapport pour inspecter les métriques, les contrôles détaillés et les suggestions.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Choisissez un modèle de test standard pour la zone sélectionnée, puis construisez le plan de manière déterministe à partir du catalogue ETS.",Close:"Fermer","Close menu":"Fermer le menu",Command:"Commande","Command DPT":"Commande DPT","Command GA":"Commande GA","Command payload":"Charge utile de commande",Completed:"Terminé","Config exported":"Configuration exportée","Config imported":"Configuration importée","Connected {{value}}":"Connecté {{value}}","Coverage {{value}}%":"Couverture {{value}}%","Define at least one area before creating a test plan":"Définir au moins un domaine avant de créer un plan de test","Define at least one area before using Tests":"Définir au moins une zone avant d'utiliser les tests","Delete Area":"Supprimer la zone","Deleting actuator preset...":"Suppression du préréglage de l'actionneur...","Deleting area...":"Suppression de la zone...","Deleting profile...":"Suppression du profil...","Deleting test plan...":"Suppression du plan de test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Décrivez la pièce, la zone ou la fonction souhaitée.L'IA proposera les adresses de groupes les plus pertinentes pour ce projet.",Description:"Descriptif","Disconnected {{value}}":"Déconnecté {{value}}","Documentation: KNX AI Vue":"Documentation : KNX AI Vue","Donate via PayPal":"Faites un don via PayPal","Drag step":"Glisser l'étape",Duplicate:"Dupliquer","Duplicate Plan":"Plan en double","Edit Area":"Modifier la zone","Edit Plan":"Modifier le forfait","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Activez l'IA dans le nœud KNX AI pour régénérer les zones ou suggérez GA pour un nouveau brouillon.","Event distribution will appear after the first samples.":"La distribution des événements apparaîtra après les premiers échantillons.","Event Mix":"Mélange d'événements","Example: Add all technical room lighting command and status GA.":"Exemple : Ajouter toutes les commandes et statuts d'éclairage du local technique GA.",Expected:"Attendu","Expected feedback value":"Valeur attendue des commentaires","Expected payload":"Charge utile attendue","Explain any anomalies you see and suggest what to check first.":"Expliquez toutes les anomalies que vous voyez et suggérez quoi vérifier en premier.","Export PDF":"Exporter un PDF","Exporting config...":"Exportation de la configuration...",Fail:"Échec","Failed to build the test plan":"Échec de la création du plan de test","Failed to delete actuator preset":"Échec de la suppression du préréglage de l'actionneur","Failed to delete area":"Échec de la suppression de la zone","Failed to delete profile":"Échec de la suppression du profil","Failed to delete test plan":"Échec de la suppression du plan de test","Failed to delete test result":"Échec de la suppression du résultat du test","Failed to export config":"Échec de l'exportation de la configuration","Failed to import config":"Échec de l'importation de la configuration","Failed to load area command/status catalog":"Échec du chargement du catalogue de commandes/statuts de zone","Failed to load GA catalog":"Échec du chargement du catalogue GA","Failed to load nodes":"Échec du chargement des nœuds","Failed to load state":"Échec du chargement de l'état","Failed to regenerate AI areas":"Échec de la régénération des zones IA","Failed to reset area":"Échec de la réinitialisation de la zone","Failed to run actuator test":"Échec de l'exécution du test de l'actionneur","Failed to run profile":"Échec de l'exécution du profil","Failed to run test plan":"Échec de l'exécution du plan de test","Failed to save actuator preset":"Échec de l'enregistrement du préréglage de l'actionneur","Failed to save area":"Échec de l'enregistrement de la zone","Failed to save GA role":"Échec de l'enregistrement du rôle GA","Failed to save profile":"Échec de l'enregistrement du profil","Failed to save test plan":"Échec de l'enregistrement du plan de test","Failed to save test result":"Échec de l'enregistrement du résultat du test","Failed to suggest area GA":"Échec de la suggestion de la zone GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Générez un graphique à barres SVG des principales adresses des groupes avec le nombre et le titre.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Le vert indique l'heure connectée au bus KNX.Le rouge affiche les temps d'arrêt dans la fenêtre d'historique sélectionnée.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC chèque actif","Importing config...":"Importation de la configuration...","in progress":"en cours","Installer alias":"Alias de l'installateur","KNX active test name":"KNX nom du test actif","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Les lumières s'allument, puis s'éteignent","Live and saved reports generated by KNX active and read-only tests.":"Rapports en direct et enregistrés générés par KNX tests actifs et en lecture seule.","Loading nodes...":"Chargement des nœuds...","Loading...":"Loading...","n/a":"n/a","New Area":"Nouvelle zone","New Plan":"Nouveau forfait","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Aucune zone ne correspond à la recherche actuelle ou le fichier ETS n'expose pas encore de hiérarchie utilisable.","No detailed entries stored for this report yet.":"Aucune entrée détaillée n'est encore stockée pour ce rapport.","No feedback":"Aucun retour","No GA selected for this area yet.":"Aucun GA n'est encore sélectionné pour cette zone.","No KNX AI nodes found.":"Aucun nœud KNX AI trouvé.","No saved plans yet.":"Aucun plan enregistré pour l'instant.","No saved test results yet.":"Aucun résultat de test enregistré pour l'instant.","No test result selected to export":"Aucun résultat de test sélectionné pour exporter","No test result selected.":"Aucun résultat de test sélectionné.","No top group address data available yet.":"Aucune donnée d'adresse du groupe principal n'est encore disponible.","Nodes {{nodes}} | Links {{links}}":"Nœuds {{nodes}} |Liens {{links}}",Now:"Maintenant","Open and close shading":"Ombrage ouvert et fermé","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Ouvrez et fermez les actionneurs d'ombrage de la zone, puis vérifiez que l'état correspond aux commandes envoyées.","Open Source Test":"Test Open Source","Optional note for diagnostics and reports":"Remarque facultative pour les diagnostics et les rapports","Original ETS path:":"Chemin ETS d'origine :",Overview:"Aperçu",Pass:"Passer",Payload:"Charge utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Choisissez dans le catalogue ETS.Les GA déjà sélectionnés sont masqués de cette liste.","Plan changes discarded":"Modifications du plan rejetées","Plan duplicated":"Plan dupliqué","Plan name":"Nom du forfait",Plans:"Forfaits","Profile deleted":"Profil supprimé","Profile report ready":"Rapport de profil prêt","Profile saved":"Profil enregistré","Provider: {{provider}} | Model: {{model}}":"Fournisseur : {{provider}} |Modèle : {{model}}",Rate:"Tarif","Read response timeout ms":"Lire le délai de réponse ms",Ready:"Prêt",Reason:"Raison",Refresh:"Actualiser","Regenerating AI areas...":"Régénérer les zones d'IA...",Remove:"Supprimer",Repeat:"Répéter",Reset:"Réinitialiser","Resetting area...":"Zone de réinitialisation...","Response timeout":"Délai de réponse","Returned to the Tests page for the source actuator test.":"Retour à la page Tests pour le test de l'actionneur source.","Returned to the Tests page for the source read-only profile.":"Renvoyé à la page Tests pour le profil source en lecture seule.","Returned to the Tests page.":"Retour à la page Tests.","Reusable deterministic active tests saved by the installer.":"Tests actifs déterministes réutilisables enregistrés par l'installateur.",Role:"Rôle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Exécutez un test complet des commandes HVAC dans la zone et vérifiez que les consignes et les états sont cohérents.",Running:"Courir","Running actuator test...":"Test de l'actionneur en cours...","Running profile...":"Profil de course...","Running...":"Running...","Saving actuator preset...":"Enregistrement du préréglage de l'actionneur...","Saving profile...":"Enregistrement du profil...","Saving test plan...":"Sauvegarde du plan de test...","Search GA, label or ETS path":"Recherchez GA, l'étiquette ou le chemin ETS","Select an Area":"Sélectionnez une zone","Select area":"Sélectionnez une zone","Select command GA":"Sélectionnez la commande GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Sélectionnez l'un des modèles standard.Le plan est construit uniquement à partir de la commande GA disponible dans la zone sélectionnée.","Select test plan":"Sélectionnez le plan de test","Select Test Result":"Sélectionnez le résultat du test","Selected template":"Modèle sélectionné","Send a":"Envoyez un",Settings:"Paramètres","Short operator-facing description":"Brève description destinée à l'opérateur","Show AI Area Builder":"Afficher le générateur de zone AI","Show Template Builder":"Afficher le générateur de modèles","Spontaneous Write From Status GA":"Écriture spontanée à partir du statut GA",Status:"Statut","Status DPT":"Statut DPT","Status GA":"Statut GA","Status write timeout ms":"Délai d'expiration de l'état en ms","Step title":"Titre de l'étape","Stopping repeat mode after the current cycle...":"Arrêt du mode répétition après le cycle en cours...",Subscribe:"Abonnez-vous",Suggestions:"Suggestions","Summarize the current KNX traffic and highlight the busiest group addresses.":"Résumez le trafic KNX actuel et mettez en surbrillance les adresses de groupe les plus fréquentées.",Summary:"Résumé","Targets supported HVAC command GA in the selected area.":"Cibles prises en charge par la commande HVAC GA dans la zone sélectionnée.","Targets supported shading command GA in the selected area.":"Cibles prenant en charge la commande d'ombrage GA dans la zone sélectionnée.","telegram from the status GA.":"télégramme du statut GA.","telegram to the status GA and wait for a":"télégramme au statut GA et attendez un",Telegrams:"Télégrammes","Template Builder":"Générateur de modèles","Test editor closed":"Éditeur de tests fermé","Test plan deleted":"Plan de test supprimé","Test plan ready":"Plan de test prêt","Test plan saved":"Plan de test enregistré","Test result deleted":"Résultat du test supprimé","Test Results":"Résultats des tests","Test Running":"Test en cours",Tests:"Essais","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installateur peut renommer la zone et décider exactement quelles adresses de groupe lui appartiennent.Tout est conservé par nœud KNX AI.",Timeout:"Délai d'attente",Title:"Titre","Toggle menu":"Changer de menu","Toggle sidebar":"Basculer la barre latérale","Top Group Addresses":"Principales adresses des groupes","true, false, 50":"vrai, faux, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Allumez puis éteignez les lumières et vérifiez que les valeurs d'état associées sont cohérentes.","Unknown DPT":"Inconnu DPT","Unsaved changes":"Modifications non enregistrées",Voice:"Voix",Wait:"Attends","Wait for a spontaneous":"Attendez un spontané","Wait ms":"Attends madame",Warn:"Avertir","What this step checks":"Ce que cette étape vérifie","Why this step exists":"Pourquoi cette étape existe","Window {{value}}s.":"Fenêtre {{value}}s.","Write timeout":"Délai d'écriture"},es:{"{{count}} areas":"{{count}} áreas","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} tipos de eventos","{{count}} recent":"{{count}} reciente","{{count}} saved plans":"{{count}} planes guardados","{{count}} visible":"{{count}} visible","Activate main actuators":"Activar actuadores principales","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Active los principales actuadores del área y verifique la retroalimentación de estado para confirmar que sigue los comandos.","Active Read Request To Status GA":"Solicitud de lectura activa al estado GA","Actuator preset deleted":"Preajuste del actuador eliminado","Actuator preset saved":"Preajuste del actuador guardado","Actuator test complete":"Prueba del actuador completa","Add group addresses to this area":"Agregar direcciones de grupo a esta área","Add Step":"Agregar paso","Add Wait":"Agregar esperar","AI Area Builder":"Generador de áreas de IA","AI is selecting area GA...":"La IA está seleccionando el área GA...","anomaly x{{value}}":"anomalía x{{value}}","Applies to all matching lighting command GA in the selected area.":"Se aplica a todos los comandos de iluminación coincidentes GA en el área seleccionada.",Area:"Área","Area {{value}}":"Área {{value}}","Area deleted":"Área eliminada","Area editor closed":"Editor de área cerrado","Area GA membership":"Membresía del área GA","Area name":"Nombre del área","Area reset":"Restablecer área","Area to test":"Área para probar",Areas:"Áreas","Ask failed":"Pregunta fallida","Asking...":"Asking...",Assistant:"Asistente","Assistant prompt":"Aviso del asistente","Available GA":"Disponible GA","Building test plan...":"Plano de pruebas del edificio...","Builds a deterministic active test using the supported command GA in the selected area.":"Crea una prueba activa determinista utilizando el comando admitido GA en el área seleccionada.","Bus Connection Persistence":"Persistencia de la conexión de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Elija un informe para inspeccionar métricas, comprobaciones detalladas y sugerencias.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Elija una plantilla de prueba estándar para el área seleccionada y luego cree el plan de manera determinista a partir del catálogo ETS.",Close:"Cerrar","Close menu":"Cerrar menú",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carga útil de comando",Completed:"Completado","Config exported":"Configuración exportada","Config imported":"Configuración importada","Connected {{value}}":"Conectado {{value}}","Coverage {{value}}%":"Cobertura {{value}}%","Define at least one area before creating a test plan":"Defina al menos un área antes de crear un plan de prueba","Define at least one area before using Tests":"Defina al menos un área antes de usar Pruebas","Delete Area":"Eliminar área","Deleting actuator preset...":"Eliminando preajuste del actuador...","Deleting area...":"Eliminando área...","Deleting profile...":"Eliminando perfil...","Deleting test plan...":"Eliminando plan de prueba...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Describe la habitación, zona o función que deseas.La AI sugerirá las direcciones de grupo más relevantes para este borrador.",Description:"Descripción","Disconnected {{value}}":"Desconectado {{value}}","Documentation: KNX AI Vue":"Documentación: KNX AI Vue","Donate via PayPal":"Donar a través de PayPal","Drag step":"Paso de arrastre",Duplicate:"Duplicar","Duplicate Plan":"Plan duplicado","Edit Area":"Editar área","Edit Plan":"Editar plano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Habilite la IA en el nodo KNX AI para regenerar áreas o sugiera GA para un nuevo borrador.","Event distribution will appear after the first samples.":"La distribución de eventos aparecerá después de las primeras muestras.","Event Mix":"Mezcla de eventos","Example: Add all technical room lighting command and status GA.":"Ejemplo: agregue todos los comandos y estados de iluminación de la sala técnica GA.",Expected:"esperado","Expected feedback value":"Valor de retroalimentación esperado","Expected payload":"Carga útil esperada","Explain any anomalies you see and suggest what to check first.":"Explique cualquier anomalía que observe y sugiera qué comprobar primero.","Export PDF":"Exportar PDF","Exporting config...":"Exportando configuración...",Fail:"fallar","Failed to build the test plan":"No se pudo construir el plan de prueba","Failed to delete actuator preset":"No se pudo eliminar el ajuste preestablecido del actuador","Failed to delete area":"No se pudo eliminar el área","Failed to delete profile":"No se pudo eliminar el perfil","Failed to delete test plan":"No se pudo eliminar el plan de prueba","Failed to delete test result":"No se pudo eliminar el resultado de la prueba","Failed to export config":"No se pudo exportar la configuración","Failed to import config":"No se pudo importar la configuración","Failed to load area command/status catalog":"No se pudo cargar el catálogo de comando/estado del área","Failed to load GA catalog":"No se pudo cargar el catálogo GA","Failed to load nodes":"No se pudieron cargar los nodos","Failed to load state":"No se pudo cargar el estado","Failed to regenerate AI areas":"No se pudieron regenerar las áreas de IA","Failed to reset area":"No se pudo restablecer el área","Failed to run actuator test":"No se pudo ejecutar la prueba del actuador","Failed to run profile":"No se pudo ejecutar el perfil","Failed to run test plan":"No se pudo ejecutar el plan de prueba","Failed to save actuator preset":"No se pudo guardar el ajuste preestablecido del actuador","Failed to save area":"No se pudo guardar el área","Failed to save GA role":"No se pudo guardar el rol GA","Failed to save profile":"No se pudo guardar el perfil","Failed to save test plan":"No se pudo guardar el plan de prueba","Failed to save test result":"No se pudo guardar el resultado de la prueba","Failed to suggest area GA":"No se pudo sugerir el área GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genere un gráfico de barras SVG de direcciones de grupos principales con recuentos y título.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"El verde muestra el tiempo conectado al bus KNX.El rojo muestra el tiempo de inactividad dentro de la ventana del historial seleccionado.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC verificación activa","Importing config...":"Importando configuración...","in progress":"en progreso","Installer alias":"Alias del instalador","KNX active test name":"KNX nombre de prueba activo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luces encendidas y luego apagadas","Live and saved reports generated by KNX active and read-only tests.":"Informes en vivo y guardados generados por KNX pruebas activas y de solo lectura.","Loading nodes...":"Cargando nodos...","Loading...":"Loading...","n/a":"n/a","New Area":"Nueva Área","New Plan":"Nuevo Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Ninguna área coincidió con la búsqueda actual o el archivo ETS aún no expone una jerarquía utilizable.","No detailed entries stored for this report yet.":"Aún no se han almacenado entradas detalladas para este informe.","No feedback":"Sin comentarios","No GA selected for this area yet.":"Aún no se ha seleccionado ningún GA para esta área.","No KNX AI nodes found.":"No se encontraron nodos KNX AI.","No saved plans yet.":"Aún no hay planes guardados.","No saved test results yet.":"Aún no hay resultados de pruebas guardados.","No test result selected to export":"No se seleccionó ningún resultado de prueba para exportar","No test result selected.":"No se seleccionó ningún resultado de prueba.","No top group address data available yet.":"Aún no hay datos de direcciones de grupos principales disponibles.","Nodes {{nodes}} | Links {{links}}":"Nodos {{nodes}} |Enlaces {{links}}",Now:"Ahora","Open and close shading":"Abrir y cerrar sombreado","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Abra y cierre los actuadores de sombreado del área, luego verifique que el estado coincida con los comandos enviados.","Open Source Test":"Prueba de código abierto","Optional note for diagnostics and reports":"Nota opcional para diagnósticos e informes.","Original ETS path:":"Ruta original ETS:",Overview:"Descripción general",Pass:"Pase",Payload:"Carga útil","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Elija del catálogo ETS.Los GA ya seleccionados están ocultos de esta lista.","Plan changes discarded":"Cambios de plan descartados","Plan duplicated":"Plano duplicado","Plan name":"Nombre del plan",Plans:"Planes","Profile deleted":"Perfil eliminado","Profile report ready":"Informe de perfil listo","Profile saved":"Perfil guardado","Provider: {{provider}} | Model: {{model}}":"Proveedor: {{provider}} |Modelo: {{model}}",Rate:"Tarifa","Read response timeout ms":"Tiempo de espera de respuesta de lectura ms",Ready:"Listo",Reason:"Razón",Refresh:"Actualizar","Regenerating AI areas...":"Regenerando áreas de IA...",Remove:"Quitar",Repeat:"repetir",Reset:"Reiniciar","Resetting area...":"Restableciendo área...","Response timeout":"Tiempo de espera de respuesta","Returned to the Tests page for the source actuator test.":"Regresó a la página Pruebas para la prueba del actuador fuente.","Returned to the Tests page for the source read-only profile.":"Regresó a la página Pruebas para el perfil de solo lectura de origen.","Returned to the Tests page.":"Regresó a la página de Pruebas.","Reusable deterministic active tests saved by the installer.":"Pruebas activas deterministas reutilizables guardadas por el instalador.",Role:"Rol","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Ejecute una prueba completa de los comandos HVAC en el área y verifique que los puntos de ajuste y los estados sean coherentes.",Running:"corriendo","Running actuator test...":"Ejecutando la prueba del actuador...","Running profile...":"Perfil de carrera...","Running...":"Running...","Saving actuator preset...":"Guardando preajuste del actuador...","Saving profile...":"Guardando perfil...","Saving test plan...":"Guardando plan de prueba...","Search GA, label or ETS path":"Buscar GA, etiqueta o ruta ETS","Select an Area":"Seleccione un área","Select area":"Seleccionar área","Select command GA":"Seleccione el comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleccione una de las plantillas estándar.El plan se construye únicamente a partir del comando GA disponible en el área seleccionada.","Select test plan":"Seleccionar plan de prueba","Select Test Result":"Seleccionar resultado de la prueba","Selected template":"Plantilla seleccionada","Send a":"Enviar un",Settings:"Configuración","Short operator-facing description":"Breve descripción orientada al operador","Show AI Area Builder":"Mostrar generador de áreas de IA","Show Template Builder":"Mostrar generador de plantillas","Spontaneous Write From Status GA":"Escritura espontánea desde el estado GA",Status:"Estado","Status DPT":"Estado DPT","Status GA":"Estado GA","Status write timeout ms":"Tiempo de espera de escritura de estado ms","Step title":"Título del paso","Stopping repeat mode after the current cycle...":"Deteniendo el modo de repetición después del ciclo actual...",Subscribe:"Suscríbete",Suggestions:"Sugerencias","Summarize the current KNX traffic and highlight the busiest group addresses.":"Resuma el tráfico KNX actual y resalte las direcciones de grupo más ocupadas.",Summary:"Resumen","Targets supported HVAC command GA in the selected area.":"Los objetivos admitieron el comando HVAC GA en el área seleccionada.","Targets supported shading command GA in the selected area.":"Los objetivos admiten el comando de sombreado GA en el área seleccionada.","telegram from the status GA.":"telegrama del estado GA.","telegram to the status GA and wait for a":"telegrama al estado GA y espere un",Telegrams:"telegramas","Template Builder":"Generador de plantillas","Test editor closed":"Editor de pruebas cerrado","Test plan deleted":"Plan de prueba eliminado","Test plan ready":"Plan de prueba listo","Test plan saved":"Plan de prueba guardado","Test result deleted":"Resultado de la prueba eliminado","Test Results":"Resultados de la prueba","Test Running":"Ejecución de prueba",Tests:"Pruebas","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"El instalador puede cambiar el nombre del área y decidir exactamente qué direcciones de grupo pertenecen a ella.Todo persiste por nodo KNX AI.",Timeout:"Tiempo de espera",Title:"Título","Toggle menu":"Alternar menú","Toggle sidebar":"Alternar barra lateral","Top Group Addresses":"Direcciones de grupos principales","true, false, 50":"verdadero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Encienda las luces, luego apáguelas y verifique que los valores de estado relacionados sean coherentes.","Unknown DPT":"Desconocido DPT","Unsaved changes":"Cambios no guardados",Voice:"Voz",Wait:"espera","Wait for a spontaneous":"Espere un espontaneo","Wait ms":"Espere señora",Warn:"Advertir","What this step checks":"Lo que verifica este paso","Why this step exists":"Por qué existe este paso","Window {{value}}s.":"Ventana {{value}}s.","Write timeout":"Escribir tiempo de espera"},"zh-CN":{"{{count}} areas":"{{count}} 区域","{{count}} available":"{{count}} 可用","{{count}} event types":"{{count}} 事件类型","{{count}} recent":"{{count}} 最近","{{count}} saved plans":"{{count}} 已保存计划","{{count}} visible":"{{count}} 可见","Activate main actuators":"激活主执行器","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"激活该区域的主执行器并验证状态反馈以确认其遵循命令。","Active Read Request To Status GA":"对状态 GA 的主动读取请求","Actuator preset deleted":"执行器预设已删除","Actuator preset saved":"执行器预设已保存","Actuator test complete":"执行器测试完成","Add group addresses to this area":"将组地址添加到该区域","Add Step":"添加步骤","Add Wait":"添加等待","AI Area Builder":"人工智能区域生成器","AI is selecting area GA...":"AI 正在选择区域 GA...","anomaly x{{value}}":"异常 x{{value}}","Applies to all matching lighting command GA in the selected area.":"适用于所选区域中所有匹配的照明命令 GA。",Area:"面积","Area {{value}}":"区域 {{value}}","Area deleted":"区域已删除","Area editor closed":"区域编辑器已关闭","Area GA membership":"区域 GA 会员资格","Area name":"地区名称","Area reset":"区域重置","Area to test":"测试区域",Areas:"领域","Ask failed":"询问失败","Asking...":"Asking...",Assistant:"助理","Assistant prompt":"助手提示","Available GA":"可用 GA","Building test plan...":"构建测试计划...","Builds a deterministic active test using the supported command GA in the selected area.":"在选定区域中使用支持的命令 GA 构建确定性主动测试。","Bus Connection Persistence":"总线连接持久性","Choose a report to inspect metrics, detailed checks, and suggestions.":"选择报告来检查指标、详细检查和建议。","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"为所选区域选择一个标准测试模板,然后从 ETS 目录中确定性地构建计划。",Close:"关闭","Close menu":"关闭菜单",Command:"命令","Command DPT":"命令 DPT","Command GA":"命令 GA","Command payload":"命令负载",Completed:"已完成","Config exported":"配置导出","Config imported":"配置已导入","Connected {{value}}":"已连接 {{value}}","Coverage {{value}}%":"覆盖率 {{value}}%","Define at least one area before creating a test plan":"在创建测试计划之前至少定义一个区域","Define at least one area before using Tests":"使用测试之前至少定义一个区域","Delete Area":"删除区域","Deleting actuator preset...":"正在删除执行器预设...","Deleting area...":"正在删除区域...","Deleting profile...":"正在删除个人资料...","Deleting test plan...":"正在删除测试计划...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"描述您想要的房间、区域或功能。AI 将为该草案建议最相关的群组地址。",Description:"描述","Disconnected {{value}}":"已断开连接 {{value}}","Documentation: KNX AI Vue":"文档:KNX AI Vue","Donate via PayPal":"通过 PayPal 捐赠","Drag step":"拖步",Duplicate:"重复","Duplicate Plan":"重复计划","Edit Area":"编辑区","Edit Plan":"编辑计划","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"启用 KNX AI 节点中的 AI 来重新生成区域或建议 GA 进行新草稿。","Event distribution will appear after the first samples.":"事件分布将出现在第一个样本之后。","Event Mix":"活动组合","Example: Add all technical room lighting command and status GA.":"示例:添加所有技术室照明命令和状态 GA。",Expected:"预计","Expected feedback value":"期望反馈值","Expected payload":"预期有效负载","Explain any anomalies you see and suggest what to check first.":"解释您看到的任何异常情况并建议首先检查哪些内容。","Export PDF":"导出PDF","Exporting config...":"正在导出配置...",Fail:"失败","Failed to build the test plan":"无法构建测试计划","Failed to delete actuator preset":"删除执行器预设失败","Failed to delete area":"删除区域失败","Failed to delete profile":"删除个人资料失败","Failed to delete test plan":"删除测试计划失败","Failed to delete test result":"删除测试结果失败","Failed to export config":"导出配置失败","Failed to import config":"导入配置失败","Failed to load area command/status catalog":"无法加载区域命令/状态目录","Failed to load GA catalog":"无法加载 GA 目录","Failed to load nodes":"加载节点失败","Failed to load state":"加载状态失败","Failed to regenerate AI areas":"无法重新生成AI区域","Failed to reset area":"重置区域失败","Failed to run actuator test":"无法运行执行器测试","Failed to run profile":"运行配置文件失败","Failed to run test plan":"无法运行测试计划","Failed to save actuator preset":"无法保存执行器预设","Failed to save area":"保存区域失败","Failed to save GA role":"无法保存 GA 角色","Failed to save profile":"保存个人资料失败","Failed to save test plan":"保存测试计划失败","Failed to save test result":"无法保存测试结果","Failed to suggest area GA":"无法建议区域 GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"生成包含计数和标题的顶级组地址的 SVG 条形图。","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"绿色显示连接到 KNX 总线的时间。红色显示所选历史窗口内的停机时间。",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC 主动检查","Importing config...":"正在导入配置...","in progress":"进行中","Installer alias":"安装人员别名","KNX active test name":"KNX 活动测试名称","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"灯亮,然后灭","Live and saved reports generated by KNX active and read-only tests.":"由 KNX 活动和只读测试生成的实时和保存的报告。","Loading nodes...":"正在加载节点...","Loading...":"Loading...","n/a":"n/a","New Area":"新区","New Plan":"新计划","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"没有区域与当前搜索匹配,或者 ETS 文件尚未公开可用的层次结构。","No detailed entries stored for this report yet.":"尚未存储此报告的详细条目。","No feedback":"无反馈","No GA selected for this area yet.":"尚未为此区域选择 GA。","No KNX AI nodes found.":"未找到 KNX AI 节点。","No saved plans yet.":"尚未保存计划。","No saved test results yet.":"尚未保存测试结果。","No test result selected to export":"未选择导出测试结果","No test result selected.":"未选择测试结果。","No top group address data available yet.":"尚无可用的顶级组地址数据。","Nodes {{nodes}} | Links {{links}}":"节点 {{nodes}} |链接 {{links}}",Now:"现在","Open and close shading":"打开和关闭阴影","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"打开和关闭该区域中的遮阳执行器,然后验证状态是否与发送的命令匹配。","Open Source Test":"开源测试","Optional note for diagnostics and reports":"诊断和报告的可选注释","Original ETS path:":"原始 ETS 路径:",Overview:"概述",Pass:"通行证",Payload:"有效载荷","Pick from the ETS catalog. Already selected GA are hidden from this list.":"从 ETS 目录中选择。已选择的 GA 从此列表中隐藏。","Plan changes discarded":"计划变更被放弃","Plan duplicated":"计划重复","Plan name":"计划名称",Plans:"计划","Profile deleted":"个人资料已删除","Profile report ready":"概况报告已准备就绪","Profile saved":"个人资料已保存","Provider: {{provider}} | Model: {{model}}":"提供商:{{provider}} |型号:{{model}}",Rate:"率","Read response timeout ms":"读取响应超时毫秒",Ready:"准备好",Reason:"原因",Refresh:"刷新","Regenerating AI areas...":"再生人工智能领域...",Remove:"删除",Repeat:"重复",Reset:"重置","Resetting area...":"重置区域...","Response timeout":"响应超时","Returned to the Tests page for the source actuator test.":"返回到源执行器测试的测试页面。","Returned to the Tests page for the source read-only profile.":"返回源只读配置文件的测试页面。","Returned to the Tests page.":"返回测试页面。","Reusable deterministic active tests saved by the installer.":"安装程序保存的可重复使用的确定性主动测试。",Role:"角色","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"在该区域中运行 HVAC 命令的完整测试,并验证设定点和状态是否一致。",Running:"跑步","Running actuator test...":"运行执行器测试...","Running profile...":"运行配置文件...","Running...":"Running...","Saving actuator preset...":"正在保存执行器预设...","Saving profile...":"正在保存个人资料...","Saving test plan...":"正在保存测试计划...","Search GA, label or ETS path":"搜索 GA、标签或 ETS 路径","Select an Area":"选择一个区域","Select area":"选择区域","Select command GA":"选择命令 GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"选择标准模板之一。该计划仅根据所选区域中可用的命令 GA 构建。","Select test plan":"选择测试计划","Select Test Result":"选择测试结果","Selected template":"选定的模板","Send a":"发送一个",Settings:"设置","Short operator-facing description":"面向操作员的简短描述","Show AI Area Builder":"显示 AI 区域生成器","Show Template Builder":"显示模板生成器","Spontaneous Write From Status GA":"从状态 GA 自发写入",Status:"状态","Status DPT":"状态 DPT","Status GA":"状态 GA","Status write timeout ms":"状态写入超时毫秒","Step title":"步骤标题","Stopping repeat mode after the current cycle...":"在当前周期后停止重复模式...",Subscribe:"订阅",Suggestions:"建议","Summarize the current KNX traffic and highlight the busiest group addresses.":"总结当前 KNX 流量并突出显示最繁忙的组地址。",Summary:"总结","Targets supported HVAC command GA in the selected area.":"所选区域中支持 HVAC 命令 GA 的目标。","Targets supported shading command GA in the selected area.":"目标在选定区域中支持着色命令 GA。","telegram from the status GA.":"来自状态 GA 的电报。","telegram to the status GA and wait for a":"电报到状态 GA 并等待",Telegrams:"电报","Template Builder":"模板生成器","Test editor closed":"测试编辑器已关闭","Test plan deleted":"测试计划已删除","Test plan ready":"测试计划准备就绪","Test plan saved":"测试计划已保存","Test result deleted":"测试结果已删除","Test Results":"测试结果","Test Running":"试运行",Tests:"测试","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"安装程序可以重命名该区域并准确决定哪些组地址属于该区域。一切都保存在每个 KNX AI 节点上。",Timeout:"超时",Title:"标题","Toggle menu":"切换菜单","Toggle sidebar":"切换侧边栏","Top Group Addresses":"顶级组地址","true, false, 50":"真、假、50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"打开灯,然后关闭它们,并验证相关状态值是否一致。","Unknown DPT":"未知 DPT","Unsaved changes":"未保存的更改",Voice:"语音",Wait:"等等","Wait for a spontaneous":"等待自发的","Wait ms":"等待毫秒",Warn:"警告","What this step checks":"此步骤检查什么","Why this step exists":"为什么存在这一步","Window {{value}}s.":"窗口 {{value}}s。","Write timeout":"写入超时"}},Qc=(e,t)=>{const i=e.__vccOpts||e;for(const[o,d]of t)i[o]=d;return i},ef={class:"m-header"},tf=["aria-expanded"],af={class:"app-sidebar"},sf={id:"knx-ai-sidebar",class:"sidebar-brand-wrap"},nf=["aria-expanded"],rf={class:"sidebar-collapse-icon"},of={class:"sidebar-nav"},lf=["disabled"],df={key:0,class:"sidebar-panel sidebar-actions"},uf=["disabled"],cf={key:1,class:"sidebar-footer"},ff={key:0,class:"running-spinner status-pill-spinner","aria-hidden":"true"},pf={key:0,class:"status-detail"},gf={class:"workspace-shell"},hf={class:"content-grid workspace-main"},mf={key:0,class:"card card-summary"},vf={class:"card-head"},bf={key:0,class:"meta-chip"},yf={class:"summary-pre"},Af={class:"metric-grid"},Sf={class:"metric"},Pf={class:"metric"},wf={class:"metric"},Tf={class:"metric"},_f={key:1,class:"card card-areas"},Df={class:"card-head"},If={class:"card-head-actions"},Rf={class:"meta-chip"},Nf=["disabled"],Cf={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},kf=["disabled"],xf={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Ef={key:0,class:"planner-error-banner area-regenerate-error"},Gf={class:"areas-toolbar"},Ff={class:"pill-row"},Lf={class:"pill neutral"},Mf={class:"pill neutral"},Of={class:"pill neutral"},zf={class:"pill neutral"},$f={key:1,class:"areas-layout"},Bf={key:0,class:"area-listbox-shell"},Vf={class:"flow-field"},Kf={class:"area-search-select"},Wf=["placeholder"],Uf={key:0,class:"area-search-select-menu"},jf=["onMousedown"],Hf={class:"area-editor"},Xf={key:0,class:"card-head"},qf={class:"card-head-actions action-cluster"},Jf=["disabled"],Zf=["disabled"],Yf=["disabled"],Qf=["disabled"],ep={key:1,class:"area-editor-grid"},tp={class:"flow-field"},ap={class:"flow-field area-editor-span"},sp={class:"flow-field area-editor-span"},np={key:2,class:"ai-planner-shell area-llm-shell"},rp={key:0,class:"card-head-actions action-cluster"},ip={class:"area-editor-grid"},op={class:"flow-field area-editor-span"},lp={class:"profile-runbar"},dp=["disabled"],up={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},cp={key:0,class:"planner-error-banner"},fp={key:1,class:"area-detail-subhead"},pp={key:3,class:"area-ga-editor"},gp={key:0,class:"simple-list simple-list-mono area-ga-list"},hp={class:"area-ga-main"},mp={key:0},vp={key:0},bp={class:"area-ga-actions"},yp={class:"flow-field area-ga-role-field"},Ap=["value","disabled","onChange"],Sp=["value"],Pp=["onClick"],wp={key:1,class:"empty-state"},Tp={class:"card-head"},_p={class:"meta-chip"},Dp={class:"area-ga-catalog"},Ip=["onClick"],Rp={class:"area-list-title"},Np={class:"area-list-meta"},Cp={class:"area-list-tags"},kp={key:0},xp={key:4,class:"area-editor-note"},Ep={key:2,class:"empty-state"},Gp={class:"card-head"},Fp={class:"area-detail-subhead"},Lp={key:0,class:"card-head-actions"},Mp={class:"meta-chip"},Op={class:"meta-chip"},zp=["disabled"],$p={key:1,class:"card-head-actions"},Bp={class:"meta-chip"},Vp=["disabled"],Kp={class:"profile-editor-stack"},Wp={key:0,class:"area-detail planner-sidecard"},Up={class:"area-listbox-shell"},jp={class:"flow-field"},Hp={class:"area-search-select"},Xp=["placeholder"],qp={key:0,class:"area-search-select-menu"},Jp=["onMousedown"],Zp={key:0,class:"empty-state"},Yp={key:1,class:"area-detail"},Qp={key:0,class:"card-head"},eg={key:0,class:"area-detail-subhead"},tg={class:"card-head-actions action-cluster"},ag={key:0,class:"meta-chip"},sg={class:"checkbox flow-toggle compact-toggle"},ng=["disabled"],rg=["disabled"],ig=["disabled"],og={key:2,class:"plan-run-actions"},lg=["disabled"],dg=["disabled"],ug={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},cg={key:1,class:"ai-planner-shell"},fg={key:0,class:"card-head-actions action-cluster"},pg={class:"area-editor-grid"},gg={class:"flow-field"},hg=["value"],mg={class:"flow-field area-editor-span"},vg=["value"],bg={class:"preset-row compact-preset-row"},yg=["onClick"],Ag={class:"area-detail-subhead"},Sg={class:"profile-runbar"},Pg=["disabled"],wg={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Tg={key:0,class:"planner-error-banner"},_g={key:1,class:"planner-generation"},Dg={key:0,class:"area-detail-subhead"},Ig={key:1,class:"area-detail-subhead"},Rg={key:2,class:"area-detail planner-run-focus"},Ng={class:"card-head"},Cg={class:"area-detail-subhead"},kg={class:"meta-chip"},xg={class:"metric-grid area-metrics"},Eg={class:"metric"},Gg={class:"metric"},Fg={class:"metric"},Lg={class:"metric"},Mg={key:0,class:"report-check report-pass planner-step-card planner-step-running"},Og={class:"anomaly-head"},zg={class:"area-detail-subhead"},$g={key:0,class:"planner-step-grid"},Bg={key:1,class:"planner-step-grid"},Vg={key:2,class:"planner-check-sections"},Kg={class:"planner-check-section"},Wg={class:"planner-step-grid compact-grid"},Ug={class:"planner-check-section"},jg={class:"planner-step-grid compact-grid"},Hg={class:"card-head"},Xg={class:"area-detail-subhead"},qg={class:"card-head-actions action-cluster"},Jg={class:"meta-chip"},Zg={key:0,class:"meta-chip"},Yg={class:"meta-chip"},Qg={class:"metric-grid area-metrics"},eh={class:"report-checks"},th={class:"anomaly-head"},ah={class:"area-detail-subhead"},sh={key:0,class:"planner-check-sections result-check-sections"},nh={class:"planner-step-grid compact-grid"},rh={key:1,class:"planner-step-grid"},ih={key:0,class:"empty-state"},oh={key:1},lh={class:"simple-list"},dh={key:4,class:"area-detail plan-draft-shell"},uh={class:"card-head"},ch={class:"running-headline"},fh={key:0,class:"running-spinner","aria-hidden":"true"},ph={class:"card-head-actions action-cluster"},gh={class:"meta-chip"},hh={class:"area-editor-grid"},mh={class:"flow-field"},vh=["value","disabled"],bh=["value"],yh={class:"flow-field"},Ah={class:"flow-field area-editor-span"},Sh={class:"report-checks plan-steps-stack"},Ph=["onDragenter","onDrop"],wh={class:"anomaly-head"},Th={class:"planner-step-title"},_h=["onDragstart"],Dh=["aria-expanded","title","onClick"],Ih={class:"card-head-actions action-cluster compact-actions"},Rh=["onClick"],Nh=["onClick"],Ch={key:0,class:"planner-step-summary"},kh={key:0},xh={key:1},Eh={key:2},Gh={key:3},Fh={key:4},Lh={key:5},Mh={key:1,class:"planner-step-editor"},Oh={class:"flow-field"},zh=["onUpdate:modelValue"],$h={class:"flow-field area-editor-span"},Bh=["onUpdate:modelValue"],Vh={key:0,class:"flow-field"},Kh=["onUpdate:modelValue"],Wh={key:1,class:"planner-field-group area-editor-span"},Uh={class:"planner-field-group-grid"},jh={class:"flow-field"},Hh=["onUpdate:modelValue","onChange"],Xh=["value"],qh={class:"flow-field"},Jh=["onUpdate:modelValue","onChange"],Zh={class:"flow-field group-span"},Yh=["onUpdate:modelValue"],Qh=["value"],em=["onUpdate:modelValue"],tm={key:2,class:"planner-field-group area-editor-span"},am={class:"planner-field-group-grid"},sm={class:"flow-field group-span"},nm=["onUpdate:modelValue","onChange"],rm=["value"],im={class:"flow-field"},om=["onUpdate:modelValue","onChange"],lm={class:"flow-field"},dm=["onUpdate:modelValue"],um=["value"],cm=["onUpdate:modelValue"],fm={key:3,class:"planner-check-sections editor-check-sections area-editor-span"},pm={class:"planner-check-section"},gm={class:"flow-field"},hm=["onUpdate:modelValue"],mm={class:"planner-check-section"},vm={class:"flow-field"},bm=["onUpdate:modelValue"],ym={class:"flow-field area-editor-span"},Am=["onUpdate:modelValue"],Sm={key:3,class:"card card-profiles"},Pm={class:"card-head"},wm={class:"card-head-actions"},Tm={class:"meta-chip"},_m={class:"profiles-layout results-page-layout"},Dm={class:"area-detail planner-sidecard"},Im={class:"sidebar-results-list results-page-list"},Rm=["onClick"],Nm={class:"sidebar-result-head"},Cm={class:"sidebar-result-title"},km={key:0,class:"running-spinner","aria-hidden":"true"},xm={class:"area-list-meta"},Em={key:0},Gm={class:"area-list-tags"},Fm={class:"area-list-tags"},Lm=["disabled","onClick"],Mm={key:0,class:"empty-state sidebar-empty-state"},Om={class:"card-head"},zm={class:"area-detail-subhead"},$m={class:"card-head-actions action-cluster"},Bm={class:"meta-chip"},Vm={key:0,class:"meta-chip"},Km={class:"meta-chip"},Wm=["disabled"],Um={class:"metric-grid area-metrics"},jm={class:"report-checks"},Hm={class:"anomaly-head"},Xm={class:"area-detail-subhead"},qm={key:0,class:"planner-check-sections result-check-sections"},Jm={class:"planner-step-grid compact-grid"},Zm={key:1,class:"planner-step-grid"},Ym={key:0,class:"empty-state"},Qm={key:1},ev={class:"simple-list"},tv={key:1,class:"area-detail"},av={key:4,class:"card"},sv={class:"card-head"},nv={class:"meta-chip"},rv={key:0,class:"rank-list"},iv={class:"rank-title"},ov={class:"rank-label"},lv={key:1,class:"empty-state"},dv={key:5,class:"card"},uv={class:"card-head"},cv={class:"meta-chip"},fv={key:0,class:"event-list"},pv={class:"event-name"},gv={class:"event-bar"},hv={key:1,class:"empty-state"},mv={key:6,class:"card card-bus"},vv={class:"card-head"},bv={key:0,class:"meta-chip"},yv={class:"pill-row"},Av={class:"pill success"},Sv={class:"pill danger"},Pv={class:"pill neutral"},wv={class:"bus-track"},Tv=["title"],_v={class:"bus-scale"},Dv={key:1,class:"empty-state"},Iv={class:"card-head"},Rv={class:"card-head-actions"},Nv={class:"meta-chip"},Cv={class:"flow-toolbar"},kv={class:"flow-field"},xv={class:"flow-field flow-field-search"},Ev={class:"flow-field flow-field-select"},Gv=["value"],Fv={class:"checkbox flow-toggle flow-toggle-inline"},Lv={class:"flow-frame"},Mv=["viewBox"],Ov=["id"],zv=["fill"],$v=["d","stroke","stroke-width","opacity","marker-end"],Bv=["cx","cy"],Vv=["x","y"],Kv=["x","y"],Wv=["x","y"],Uv=["x","y"],jv={key:1,class:"empty-state flow-empty"},Hv={class:"flow-note"},Xv={key:8,class:"card card-anomalies"},qv={class:"card-head"},Jv={class:"meta-chip"},Zv={key:0,class:"anomaly-list"},Yv={class:"anomaly-head"},Qv={class:"anomaly-time"},eb={key:1,class:"empty-state"},tb={key:9,class:"card card-chat"},ab={class:"card-head"},sb={class:"meta-chip"},nb={class:"chat-log"},rb=["innerHTML"],ib={key:1},ob={key:0,class:"chat-message chat-pending"},lb={class:"preset-row"},db=["disabled","onClick"],ub={class:"ask-row"},cb=["disabled"],fb=["disabled"],pb={key:10,class:"card card-settings"},gb={class:"settings-tab-strip"},hb={key:0,class:"area-detail settings-panel"},mb={class:"settings-node-grid"},vb={class:"flow-field"},bb=["value"],yb={class:"checkbox settings-node-checkbox"},Ab={key:1,class:"area-detail settings-panel"},Sb={class:"card-head-actions action-cluster settings-config-actions"},Pb=["disabled"],wb=["disabled"],Tb={key:0,class:"global-wait-overlay",role:"status","aria-live":"polite","aria-busy":"true"},_b={class:"global-wait-card"},Db={class:"area-detail-subhead"},Ib={class:"modal-actions"},Rb=["disabled"],Nb={class:"area-detail-subhead"},Cb={class:"modal-actions"},kb=["disabled"],Ri="knxUltimateAI:selectedNodeId",Ni="knxUltimateAI:autoRefresh",Ci="knxUltimateAI:activeTab",ki="knxUltimateAI:settingsTab",xi="knxUltimateAI:flowPreview",Ei="knxUltimateAI:voiceEnabled",Gi="knxUltimateAI:sidebarExpanded",xb="knxUltimateAI:selectedTestAreaId:",Eb="https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/knxUltimateAI-vue",Gb="https://www.paypal.com/donate/?hosted_button_id=S8SKPUBSPK758",Fb="https://www.youtube.com/@maxsupervibe",Lb={__name:"App",setup(e){const t=["Summarize the current KNX traffic and highlight the busiest group addresses.","Explain any anomalies you see and suggest what to check first.","Generate an SVG bar chart of Top Group Addresses with counts and title."],i=[{id:"lights_on_off",title:"Lights on, then off",prompt:"Turn the lights on, then turn them off, and verify that the related status values are coherent.",description:"Applies to all matching lighting command GA in the selected area."},{id:"area_activate",title:"Activate main actuators",prompt:"Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.",description:"Builds a deterministic active test using the supported command GA in the selected area."},{id:"shading_open_close",title:"Open and close shading",prompt:"Open and close the shading actuators in the area, then verify that the status matches the commands sent.",description:"Targets supported shading command GA in the selected area."},{id:"hvac_check",title:"HVAC active check",prompt:"Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.",description:"Targets supported HVAC command GA in the selected area."}],o=[{value:"command",label:"Command"},{value:"status",label:"Status"},{value:"neutral",label:"Don't use in tests"}],d={write:"#ff9800",response:"#46b86d",read:"#d99a34",repeat:"#c34747",other:"#8d8578"},u=(()=>{try{return new URLSearchParams(window.location.search).get("nodeId")||""}catch{return""}})(),f=da("en");let p=null,m=0,T=!1;const A={it:{countAreas:"{{count}} aree",countSavedPlans:"{{count}} piani salvati",countAvailable:"{{count}} disponibili",countVisible:"{{count}} visibili",countEventTypes:"{{count}} tipi di eventi",countRecent:"{{count}} recenti",nodesLinks:"Nodi {{nodes}} | Link {{links}}",connected:"Connesso {{value}}",disconnected:"Disconnesso {{value}}",coverage:"Copertura {{value}}%",windowSec:"Finestra {{value}}s.",anomalyCount:"anomalia x{{value}}",areaLabel:"Area {{value}}",providerModel:"Provider: {{provider}} | Modello: {{model}}"},de:{countAreas:"{{count}} Bereiche",countSavedPlans:"{{count}} gespeicherte Pläne",countAvailable:"{{count}} verfügbar",countVisible:"{{count}} sichtbar",countEventTypes:"{{count}} Ereignistypen",countRecent:"{{count}} aktuell",nodesLinks:"Knoten {{nodes}} | Verbindungen {{links}}",connected:"Verbunden {{value}}",disconnected:"Getrennt {{value}}",coverage:"Abdeckung {{value}}%",windowSec:"Fenster {{value}}s.",anomalyCount:"Anomalie x{{value}}",areaLabel:"Bereich {{value}}",providerModel:"Anbieter: {{provider}} | Modell: {{model}}"},fr:{countAreas:"{{count}} zones",countSavedPlans:"{{count}} plans enregistrés",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} types d'événements",countRecent:"{{count}} récents",nodesLinks:"Nœuds {{nodes}} | Liens {{links}}",connected:"Connecté {{value}}",disconnected:"Déconnecté {{value}}",coverage:"Couverture {{value}}%",windowSec:"Fenêtre {{value}}s.",anomalyCount:"anomalie x{{value}}",areaLabel:"Zone {{value}}",providerModel:"Fournisseur : {{provider}} | Modèle : {{model}}"},es:{countAreas:"{{count}} áreas",countSavedPlans:"{{count}} planes guardados",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} tipos de eventos",countRecent:"{{count}} recientes",nodesLinks:"Nodos {{nodes}} | Enlaces {{links}}",connected:"Conectado {{value}}",disconnected:"Desconectado {{value}}",coverage:"Cobertura {{value}}%",windowSec:"Ventana {{value}}s.",anomalyCount:"anomalía x{{value}}",areaLabel:"Área {{value}}",providerModel:"Proveedor: {{provider}} | Modelo: {{model}}"},"zh-CN":{countAreas:"{{count}} 个区域",countSavedPlans:"{{count}} 个已保存计划",countAvailable:"{{count}} 可用",countVisible:"{{count}} 可见",countEventTypes:"{{count}} 种事件类型",countRecent:"{{count}} 条最近记录",nodesLinks:"节点 {{nodes}} | 连线 {{links}}",connected:"已连接 {{value}}",disconnected:"已断开 {{value}}",coverage:"覆盖率 {{value}}%",windowSec:"窗口 {{value}} 秒。",anomalyCount:"异常 x{{value}}",areaLabel:"区域 {{value}}",providerModel:"提供方: {{provider}} | 模型: {{model}}"}},I={en:"en","en-us":"en","en-gb":"en",it:"it","it-it":"it",de:"de","de-de":"de",fr:"fr","fr-fr":"fr",es:"es","es-es":"es",zh:"zh-CN","zh-cn":"zh-CN","zh-hans":"zh-CN","zh-hans-cn":"zh-CN"},L=new Set(["KNX AI","KNX Ultimate","GroupValue_Write","GroupValue_Response","GA","DPT","ETS","SVG"]),$={it:{"Open Source Test":"Apri Test Sorgente","Asking...":"Sto chiedendo...","Loading...":"Caricamento...","Running...":"In esecuzione...",Running:"In esecuzione","Flow Map":"Mappa Flussi",Anomalies:"Anomalie",Rate:"Frequenza",Pass:"OK",Fail:"Errore",Warn:"Attenzione",Wait:"Attesa","Wait ms":"Attesa (ms)","Response timeout":"Timeout risposta","Read response timeout ms":"Timeout risposta lettura (ms)","Status write timeout ms":"Timeout scrittura stato (ms)","Regenerating...":"Rigenerazione...","Regenerate AI Areas":"Rigenera Aree AI","Deleting...":"Eliminazione...","Delete AI Areas":"Elimina Aree AI","Test Results":"Risultati Test","Select Test Result":"Seleziona risultato test","No test result selected.":"Nessun risultato test selezionato.","Open and close shading":"Apri e chiudi schermature"},de:{"Open Source Test":"Quelltest öffnen","Asking...":"Anfrage läuft...","Loading...":"Wird geladen...","Running...":"Läuft...",Running:"Läuft","Flow Map":"Flusskarte",Anomalies:"Anomalien",Rate:"Rate",Pass:"OK",Fail:"Fehler",Warn:"Warnung",Wait:"Warten","Wait ms":"Warten (ms)","Regenerating...":"Wird neu erstellt...","Regenerate AI Areas":"KI-Bereiche neu erstellen","Deleting...":"Wird gelöscht...","Delete AI Areas":"KI-Bereiche löschen"},fr:{"Open Source Test":"Ouvrir le test source","Asking...":"Interrogation en cours...","Loading...":"Chargement...","Running...":"En cours...",Running:"En cours","Flow Map":"Carte des flux",Anomalies:"Anomalies",Rate:"Débit",Pass:"OK",Fail:"Échec",Warn:"Alerte",Wait:"Attente","Wait ms":"Attente (ms)","Regenerating...":"Régénération...","Regenerate AI Areas":"Régénérer les zones IA","Deleting...":"Suppression...","Delete AI Areas":"Supprimer les zones IA"},es:{"Open Source Test":"Abrir prueba de origen","Asking...":"Consultando...","Loading...":"Cargando...","Running...":"En ejecución...",Running:"En ejecución","Flow Map":"Mapa de flujo",Anomalies:"Anomalías",Rate:"Tasa",Pass:"OK",Fail:"Fallo",Warn:"Aviso",Wait:"Espera","Wait ms":"Espera (ms)","Regenerating...":"Regenerando...","Regenerate AI Areas":"Regenerar áreas de IA","Deleting...":"Eliminando...","Delete AI Areas":"Eliminar áreas de IA"},"zh-CN":{"Open Source Test":"打开源测试","Asking...":"正在提问...","Loading...":"加载中...","Running...":"运行中...",Running:"运行中","Flow Map":"流量拓扑图",Anomalies:"异常",Rate:"速率",Pass:"通过",Fail:"失败",Warn:"警告",Wait:"等待","Wait ms":"等待(毫秒)","Regenerating...":"正在重新生成...","Regenerate AI Areas":"重新生成 AI 区域","Deleting...":"正在删除...","Delete AI Areas":"删除 AI 区域"}};function ie(n,s="en"){const r=String(n||"").trim().toLowerCase();if(!r)return s;if(I[r])return I[r];if(r.includes("-")){const c=r.split("-")[0];if(I[c])return I[c]}return s}function Z(){try{const r=new URLSearchParams(window.location.search).get("lang");if(r)return ie(r,"en")}catch{}const n=ie(String(navigator.language||""),"");if(n)return n;const s=String(document&&document.documentElement&&document.documentElement.lang?document.documentElement.lang:"").trim();return s?ie(s,"en"):"en"}function oe(n,s={}){return String(n||"").replace(/\{\{\s*([^}\s]+)\s*\}\}/g,(r,c)=>Object.prototype.hasOwnProperty.call(s,c)?String(s[c]):r)}function Te(n){const s=A[f.value];if(!s)return"";let r=n.match(/^(\d+)\sareas$/i);return r?oe(s.countAreas,{count:r[1]}):(r=n.match(/^(\d+)\ssaved plans$/i),r?oe(s.countSavedPlans,{count:r[1]}):(r=n.match(/^(\d+)\savailable$/i),r?oe(s.countAvailable,{count:r[1]}):(r=n.match(/^(\d+)\svisible$/i),r?oe(s.countVisible,{count:r[1]}):(r=n.match(/^(\d+)\sevent types$/i),r?oe(s.countEventTypes,{count:r[1]}):(r=n.match(/^(\d+)\srecent$/i),r?oe(s.countRecent,{count:r[1]}):(r=n.match(/^Nodes\s+(.+?)\s+\|\s+Links\s+(.+)$/),r?oe(s.nodesLinks,{nodes:r[1],links:r[2]}):(r=n.match(/^Connected\s+(.+)$/),r?oe(s.connected,{value:r[1]}):(r=n.match(/^Disconnected\s+(.+)$/),r?oe(s.disconnected,{value:r[1]}):(r=n.match(/^Coverage\s+(.+?)%$/),r?oe(s.coverage,{value:r[1]}):(r=n.match(/^Window\s+(.+?)s\.$/),r?oe(s.windowSec,{value:r[1]}):(r=n.match(/^anomaly x(.+)$/i),r?oe(s.anomalyCount,{value:r[1]}):(r=n.match(/^Area\s+(.+)$/),r?oe(s.areaLabel,{value:r[1]}):(r=n.match(/^Provider:\s+(.+?)\s+\|\s+Model:\s+(.+)$/),r?oe(s.providerModel,{provider:r[1],model:r[2]}):"")))))))))))))}function te(n){const s=String(n||""),r=s.trim();if(!r||f.value==="en"||L.has(r))return s;const c=$[f.value]||{},h=Yc[f.value]||{},R=c[r]||h[r]||Te(r);return!R||R===r?s:s.replace(r,R)}function Pe(n){const s=n&&n.parentElement;if(!s)return!0;const r=String(s.tagName||"").toUpperCase();return!!(r==="SCRIPT"||r==="STYLE"||r==="CODE"||r==="PRE"||s.closest(".chat-log"))}function q(n){const s=n||document.body;if(!(!s||f.value==="en")&&!T){T=!0;try{const r=document.createTreeWalker(s,NodeFilter.SHOW_TEXT);let c=r.nextNode();for(;c;){if(!Pe(c)){const R=te(c.nodeValue);R!==c.nodeValue&&(c.nodeValue=R)}c=r.nextNode()}const h=s.querySelectorAll("[placeholder], [title], [aria-label]");for(const R of h){const E=R.getAttribute("placeholder");if(E){const Y=te(E);Y!==E&&R.setAttribute("placeholder",Y)}const z=R.getAttribute("title");if(z){const Y=te(z);Y!==z&&R.setAttribute("title",Y)}const O=R.getAttribute("aria-label");if(O){const Y=te(O);Y!==O&&R.setAttribute("aria-label",Y)}}}finally{T=!1}}}function Ne(){f.value!=="en"&&(m||(m=window.requestAnimationFrame(()=>{m=0,q(document.body)})))}function dt(){p&&(p.disconnect(),p=null),m&&(window.cancelAnimationFrame(m),m=0)}function at(){f.value!=="en"&&(dt(),p=new MutationObserver(()=>{T||Ne()}),p.observe(document.body,{childList:!0,subtree:!0,characterData:!0}),Ne())}const a=Ys({nodes:[],selectedNodeId:"",activeTab:nt(Ci,"overview"),settingsTab:nt(ki,"config"),autoRefresh:Xe(Ni,!0),voiceEnabled:Xe(Ei,!0),flowMaxNodes:Ra().maxNodes,flowSelectedGa:Ra().selectedGa,flowShowUniversalNodes:Ra().showUniversalNodes,flowSearch:"",areaSearch:"",areaSearchOpen:!1,areaSelectedId:"",testAreaSelectedId:"",areaDraftName:"",areaDraftDescription:"",areaDraftTags:"",areaDraftGaList:[],areaDraftId:"",areaDraftIsNew:!1,areaLlmPrompt:"",areaLlmBusy:!1,areaLlmError:"",areaLlmRegenerating:!1,areaLlmBulkDeleting:!1,gaCatalog:[],gaCatalogSearch:"",gaCatalogLoading:!1,areaGaRoleSavingGa:"",areaSaving:!1,profileSelectedId:"",profileDraftMode:!1,profileDraftId:"",profileDraftName:"",profileDraftDescription:"",profileDraftTargetTags:"",profileDraftMinActivityPct:20,profileDraftMaxSilentPct:60,profileDraftMaxAnomalies:2,profileSaving:!1,profileRunning:!1,actuatorPresetSelectedId:"",actuatorDraftMode:!1,actuatorDraftId:"",actuatorDraftName:"",actuatorDraftDescription:"",actuatorDraftCommandGA:"",actuatorDraftCommandDPT:"",actuatorDraftCommandPayload:"",actuatorDraftStatusGA:"",actuatorDraftStatusDPT:"",actuatorDraftStatusWriteTimeoutMs:5e3,actuatorDraftStatusResponseTimeoutMs:5e3,actuatorSaving:!1,actuatorRunning:!1,testPlanSelectedId:"",testPlanSearch:"",testPlanSearchOpen:!1,selectedTestResultId:"",liveTestResultId:"",testResultsMenuOpen:!0,testResultFocusMode:!1,deletingTestResultId:"",testPlanPrompt:"",testPlanDraft:null,testPlanCatalog:null,testPlanCatalogLoading:!1,testPlanCatalogError:"",testPlanGenerating:!1,testPlanSaving:!1,testPlanDeleting:!1,testPlanRunning:!1,testPlanGeneration:null,testPlanGenerationError:"",testPlanRunConfirmOpen:!1,testPlanRunMode:"single",testPlanRunningStepId:"",testPlanRepeatForever:!1,testPlanRepeatStopRequested:!1,testPlanDraftBaseline:"",testPlanUnsavedConfirmOpen:!1,areaUnsavedConfirmOpen:!1,testPlanPendingActionLabel:"",draggedTestPlanStepId:"",dragOverTestPlanStepId:"",showAiPlanner:!0,testTemplateBuilderFocus:!1,showAiAreaBuilder:!1,areaBuilderFocus:!1,status:"Ready",loadingNodes:!1,loadingState:!1,asking:!1,stateData:null,lastError:"",chatMessages:[],chatDraft:"",pollStateHandle:null,pollNodesHandle:null}),ea=da(null),ut=da(!1),Ct=da(null),mt=da(null),kt=da(Xe(Gi,!0)),xt=da(!1),st=da(!1),De=j(()=>st.value?xt.value:kt.value);let fe=null,he=null,ct=null;function Et(){if(fe){try{fe.pause(),fe.src=""}catch{}fe=null}}function nt(n,s=""){try{return window.localStorage&&window.localStorage.getItem(n)||s}catch{return s}}function Xe(n,s){try{if(!window.localStorage)return s;const r=window.localStorage.getItem(n);return r==null||r===""?s:r==="true"}catch{return s}}function Ra(){try{if(!window.localStorage)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const n=window.localStorage.getItem(xi);if(!n)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const s=JSON.parse(n),r=Math.max(4,Math.min(32,Number(s&&s.maxNodes)||14)),c=Array.isArray(s&&s.selectedGa)?Array.from(new Set(s.selectedGa.map(R=>String(R||"").trim()).filter(Boolean))).slice(0,80):[],h=s&&s.showUniversalNodes===!0;return{maxNodes:r,selectedGa:c,showUniversalNodes:h}}catch{return{maxNodes:14,selectedGa:[],showUniversalNodes:!1}}}function Na(n,s){try{window.localStorage&&window.localStorage.setItem(n,String(s??""))}catch{}}function ja(n,s){try{window.localStorage&&window.localStorage.setItem(n,s?"true":"false")}catch{}}function Gt(){try{st.value=window.matchMedia("(max-width: 1100px)").matches}catch{st.value=window.innerWidth<=1100}st.value||(xt.value=!1)}function ga(){if(st.value){xt.value=xt.value!==!0;return}kt.value=kt.value!==!0}function ha(){st.value&&(xt.value=!1)}function Ha(n){!n||n.key!=="Escape"||ha()}function ta(n){const s=String(n||"").trim();return s?`${xb}${s}`:""}function Ps(n){const s=ta(n);return s?nt(s,""):""}function g(n,s){const r=ta(n);if(!r)return;const c=String(s||"").trim();c&&Na(r,c)}function y(){const n=Ps(a.selectedNodeId);return!n||!Ae.value.find(s=>s.id===n)?!1:(a.testAreaSelectedId===n||(a.testAreaSelectedId=n),!0)}function _(){try{if(!window.localStorage)return;window.localStorage.setItem(xi,JSON.stringify({maxNodes:Math.max(4,Math.min(32,Number(a.flowMaxNodes)||14)),selectedGa:Array.from(new Set((a.flowSelectedGa||[]).map(n=>String(n||"").trim()).filter(Boolean))).slice(0,80),showUniversalNodes:a.flowShowUniversalNodes===!0}))}catch{}}async function x(){const n=ea.value;if(!(!n||typeof n.requestFullscreen!="function"))try{document.fullscreenElement===n?await document.exitFullscreen():document.fullscreenElement||await n.requestFullscreen()}catch{}}function N(){ut.value=document.fullscreenElement===ea.value}function D(n){return new URL(n,window.location.href).toString()}function w(n){a.status=te(String(n||""))}async function k(n,s){const r=await fetch(n,Object.assign({credentials:"same-origin"},s||{})),c=await r.text();let h={};try{h=c?JSON.parse(c):{}}catch{h={error:c||`HTTP ${r.status}`}}if(!r.ok){const R=h&&h.error?h.error:`HTTP ${r.status}`;throw r.status===401||r.status===403?new Error(`Authentication required or insufficient permissions (${r.status}).`):new Error(R)}return h}async function F(n,s){const r=await fetch(n,Object.assign({credentials:"same-origin",cache:"no-store"},s||{}));if(!r.ok){const c=await r.text();let h=c||`HTTP ${r.status}`;try{const R=c?JSON.parse(c):{};h=R&&R.error?R.error:h}catch{}throw r.status===401||r.status===403?new Error(`Authentication required or insufficient permissions (${r.status}).`):new Error(h)}return await r.blob()}function C(n){if(n==null)return"";if(typeof n=="string")return n;try{return JSON.stringify(n,null,2)}catch{return String(n)}}function W(n){return String(n||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function M(n){const s=String(n||"").trim();return s.includes("-")&&/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(s)}function B(n){let s=String(n||"").trim();return s.startsWith("|")&&(s=s.slice(1)),s.endsWith("|")&&(s=s.slice(0,-1)),s.split("|").map(r=>String(r||"").trim())}function J(n){return B(n).map(s=>{const r=String(s||"").trim(),c=r.startsWith(":"),h=r.endsWith(":");return c&&h?"center":h?"right":"left"})}function re(n){const s=String(n||"").split(/\r?\n/);let r="",c=!1;const h=R=>{let E=String(R||"");return E=E.replace(/`([^`]+)`/g,"<code>$1</code>"),E=E.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),E=E.replace(/\*([^*]+)\*/g,"<em>$1</em>"),E=E.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(z,O,Y)=>`<a href="${/^javascript:/i.test(String(Y||"").trim())?"#":Y}" target="_blank" rel="noopener noreferrer">${O}</a>`),E};for(let R=0;R<s.length;R++){const E=s[R];if(/^```/.test(E.trim())){c=!c,r+=c?"<pre><code>":"</code></pre>";continue}if(c){r+=`${E}
2
- `;continue}if(/^###\s+/.test(E)){r+=`<h3>${E.replace(/^###\s+/,"")}</h3>`;continue}if(/^##\s+/.test(E)){r+=`<h2>${E.replace(/^##\s+/,"")}</h2>`;continue}if(/^#\s+/.test(E)){r+=`<h1>${E.replace(/^#\s+/,"")}</h1>`;continue}if(E.includes("|")&&R+1<s.length&&M(s[R+1])){const Y=B(E),K=J(s[R+1]),pe=[];for(R+=2;R<s.length&&s[R]&&s[R].includes("|")&&!/^```/.test(s[R].trim());)pe.push(B(s[R])),R++;R-=1;const se=Math.max(Y.length,K.length,...pe.map(U=>U.length),0);r+='<div class="chat-table-wrap"><table><thead><tr>';for(let U=0;U<se;U++)r+=`<th style="text-align:${K[U]||"left"};">${h(Y[U]||"")}</th>`;r+="</tr></thead><tbody>",pe.forEach(U=>{r+="<tr>";for(let de=0;de<se;de++)r+=`<td style="text-align:${K[de]||"left"};">${h(U[de]||"")}</td>`;r+="</tr>"}),r+="</tbody></table></div>";continue}const z=/^\s*[-*]\s+/.test(E),O=/^\s*\d+\.\s+/.test(E);if(z||O){const Y=O?"ol":"ul",K=O?/^\s*\d+\.\s+/:/^\s*[-*]\s+/;for(r+=`<${Y}>`;R<s.length&&K.test(s[R]);)r+=`<li>${h(s[R].replace(K,""))}</li>`,R++;R-=1,r+=`</${Y}>`;continue}if(E.trim()===""){r+="<br>";continue}r+=`<p>${h(E)}</p>`}return c&&(r+="</code></pre>"),r}function ye(n){return String(n||"").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/&amp;/gi,"&")}function le(n){const s=[],r=/<svg[\s\S]*?<\/svg>/gi;let c;for(;(c=r.exec(String(n||"")))!==null;)c&&c[0]&&s.push(String(c[0]));return s}const Oe=new Set(["svg","g","path","line","polyline","polygon","circle","ellipse","rect","text","tspan","title","desc","defs","marker","lineargradient","radialgradient","stop","clippath"]),ze=new Set(["xmlns","xmlns:xlink","viewbox","preserveaspectratio","width","height","role","aria-label","id","class","x","y","x1","y1","x2","y2","cx","cy","r","rx","ry","d","points","transform","fill","fill-opacity","stroke","stroke-width","stroke-opacity","stroke-dasharray","stroke-linecap","stroke-linejoin","opacity","font-size","font-family","font-weight","text-anchor","dominant-baseline","offset","stop-color","stop-opacity","gradientunits","gradienttransform","fx","fy","marker-start","marker-mid","marker-end","markerwidth","markerheight","refx","refy","orient","markerunits","href","xlink:href","clip-path","clippathunits"]);function qe(n){try{const r=new window.DOMParser().parseFromString(String(n||""),"image/svg+xml");if(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)return"";const c=r.documentElement;if(String(c.tagName||"").toLowerCase()!=="svg")return"";const h=E=>{const z=String(E.tagName||"").toLowerCase();if(!Oe.has(z)){E.remove();return}Array.from(E.attributes||[]).forEach(O=>{const Y=String(O.name||"").toLowerCase(),K=String(O.value||"");if(Y.startsWith("on")||!ze.has(Y)){E.removeAttribute(O.name);return}(Y==="href"||Y==="xlink:href")&&K&&!String(K).trim().startsWith("#")&&E.removeAttribute(O.name)}),Array.from(E.childNodes||[]).forEach(O=>{O.nodeType===1?h(O):O.nodeType!==3&&O.remove()})};h(c),!c.getAttribute("viewBox")&&!c.getAttribute("viewbox")&&c.setAttribute("viewBox","0 0 920 360"),c.setAttribute("role",c.getAttribute("role")||"img");const R=new window.XMLSerializer().serializeToString(c);return R.length>12e4?"":R}catch{return""}}function $e(n){return re(W(n||""))}function ma(n){const s=C(n),r=s.trim();if(!r)return $e("(empty answer)");const c=/```(?:svg|xml|html)?\s*([\s\S]*?)```/gi;let h="",R=0,E=!1,z;for(;(z=c.exec(s))!==null;){const Y=s.slice(R,z.index);Y.trim()&&(h+=$e(Y));const K=String(z[1]||""),pe=ye(K),se=le(pe);if(se.length){let U=0;se.forEach(de=>{const me=qe(de);me&&(U++,E=!0,h+=`<div class="chat-svg-wrap">${me}</div>`)}),U||(h+=`<pre><code>${W(K)}</code></pre>`)}else{const U=qe(pe);U?(E=!0,h+=`<div class="chat-svg-wrap">${U}</div>`):h+=`<pre><code>${W(K)}</code></pre>`}R=z.index+z[0].length}const O=s.slice(R);if(O.trim()&&(h+=$e(O)),!E){const Y=ye(s),K=Array.from(new Set([...le(s),...le(Y)])).map(pe=>qe(pe)).filter(Boolean);if(K.length){const pe=s.replace(/<svg[\s\S]*?<\/svg>/gi,"").replace(/&lt;svg[\s\S]*?&lt;\/svg&gt;/gi,"").trim();h=pe?$e(pe):"",K.forEach(se=>{h+=`<div class="chat-svg-wrap">${se}</div>`})}}return h||$e(r)}function Ca(n){const s=Math.max(0,Math.round(Number(n)||0)),r=Math.floor(s/3600),c=Math.floor(s%3600/60),h=s%60;return r?`${r}h ${c}m`:c?`${c}m ${h}s`:`${h}s`}function Me(n){if(!n)return"n/a";try{return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return"n/a"}}function xe(n){if(!n)return"";try{return new Date(n).toLocaleString()}catch{return String(n)}}function va(n){return n&&n.payload&&typeof n.payload=="object"?n.payload:{}}function Xa(n){return n==null?"":String(n).trim()}function Ft(n,s=null){try{return JSON.parse(JSON.stringify(n))}catch{return s}}function nn(n=[]){return Array.from(new Set((Array.isArray(n)?n:[]).map(s=>String(s||"").trim()).filter(Boolean))).sort()}function Ko(n=""){return nn(String(n||"").split(","))}function rn(n={}){return JSON.stringify({isNew:n.isNew===!0,areaId:String(n.areaId||"").trim(),name:String(n.name||"").trim(),description:String(n.description||"").trim(),tags:nn(n.tags||[]),gaList:nn(n.gaList||[]),llmPrompt:String(n.llmPrompt||"").trim()})}function pr(n={}){return JSON.stringify({prompt:String(n.prompt||""),draft:Ft(n.draft,null)})}function Wo(){return{selectedId:String(a.testPlanSelectedId||""),prompt:String(a.testPlanPrompt||""),draft:Ft(a.testPlanDraft,null),generation:Ft(a.testPlanGeneration,null),showAiPlanner:a.showAiPlanner===!0}}function ka(){he=Wo(),a.testPlanDraftBaseline=pr(he)}function Uo(){const n=Ft(he,null);if(!n){a.testPlanSelectedId="",a.testPlanPrompt="",a.testPlanDraft=null,a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!0;return}a.testPlanSelectedId=String(n.selectedId||""),a.testPlanPrompt=String(n.prompt||""),a.testPlanDraft=Ft(n.draft,null),a.testPlanGeneration=Ft(n.generation,null),a.testPlanRunConfirmOpen=!1,a.showAiPlanner=n.showAiPlanner!==!1,n.draft&&n.draft.areaId&&Ae.value.find(s=>s.id===n.draft.areaId)&&(a.areaSelectedId=n.draft.areaId)}function jo(n){const s=String(n||"").trim();return s.length>14?`${s.slice(0,12)}..`:s}function Ho(n){const s=String(n||"").trim();return s?s.length>28?`${s.slice(0,26)}..`:s:""}function Xo(n){const s=Xa(n).replace(/\s+/g," ");return s?s.length>30?`${s.slice(0,28)}..`:s:""}function qo(n){const s=String(n||"").toLowerCase();return s.includes("repeat")?"repeat":s.includes("write")?"write":s.includes("response")?"response":s.includes("read")?"read":"other"}function Jo(n){const s={write:0,response:0,read:0,repeat:0,other:0};return Object.keys(n||{}).forEach(r=>{const c=Number(n[r]||0);c<=0||(s[qo(r)]+=c)}),Object.keys(s).sort((r,c)=>s[c]-s[r])[0]||"other"}function on(n){return!!(n&&n.kind==="node"&&n.listenAllGA)}function Zo(n){const s=n&&n.summary?n.summary:{},r=Array.isArray(n&&n.anomalies)?n.anomalies:[],c=Array.isArray(s.patternTransitions)?s.patternTransitions:[],h=Array.isArray(s.patterns)?s.patterns:[],R=s&&typeof s.gaLabels=="object"?s.gaLabels:{},E=s&&typeof s.gaLastPayload=="object"?s.gaLastPayload:{},z=s&&typeof s.gaLastSeenAt=="object"?s.gaLastSeenAt:{},O=new Set((Array.isArray(s.flowKnownGAs)?s.flowKnownGAs:[]).map(P=>String(P||"").trim()).filter(Boolean)),Y={};r.forEach(P=>{const V=String(P&&P.payload&&P.payload.ga?P.payload.ga:"BUS").trim()||"BUS";Y[V]=(Y[V]||0)+1});const K=s&&s.flowMapTopology&&typeof s.flowMapTopology=="object"?s.flowMapTopology:null,pe=Array.isArray(K&&K.nodes)?K.nodes:[],se=Array.isArray(K&&K.edges)?K.edges:[],U=new Map,de=P=>{const V=String(P&&P.from?P.from:"").trim(),ee=String(P&&P.to?P.to:"").trim();if(!V||!ee||V===ee)return;const Le=`${V}->${ee}`,We={key:Le,from:V,to:ee,weight:Math.max(1,Number(P&&(P.weight??P.currentWindowCount??P.totalCount??P.count)||1)),delta:Number(P&&P.delta?P.delta:0),edgeByEvent:P&&typeof P.edgeByEvent=="object"?P.edgeByEvent:{},lastAtMs:(()=>{const et=Number(P&&P.lastAtMs?P.lastAtMs:0);if(Number.isFinite(et)&&et>0)return et;const la=new Date(String(P&&P.lastAt?P.lastAt:"")).getTime();return Number.isFinite(la)?la:0})(),linkType:String(P&&P.linkType?P.linkType:"").trim()};if(!U.has(Le)){U.set(Le,We);return}const Je=U.get(Le);Je.weight+=We.weight,Je.delta+=We.delta,Je.lastAtMs=Math.max(Number(Je.lastAtMs||0),Number(We.lastAtMs||0)),Object.keys(We.edgeByEvent||{}).forEach(et=>{Je.edgeByEvent[et]=Number(Je.edgeByEvent[et]||0)+Number(We.edgeByEvent[et]||0)})};se.length?se.forEach(de):c.length?c.forEach(de):h.forEach(P=>de({from:P&&P.from,to:P&&P.to,count:P&&P.count,edgeByEvent:{}}));const me=new Map,oa=(P,V={})=>{const ee=String(P||"").trim();return ee?(me.has(ee)||me.set(ee,{id:ee,displayId:String(V.displayId||ee).trim()||ee,kind:String(V.kind||(ee.startsWith("N:")?"node":"ga")).trim()||"ga",subtitle:String(V.subtitle||"").trim(),payload:Xa(V.payload),anomalyCount:Number(V.anomalyCount||Y[ee]||0),inFlow:V.inFlow!==void 0?!!V.inFlow:O.size?O.has(ee)||ee==="BUS"||ee.startsWith("N:"):!0,lastSeenAtMs:Number(V.lastSeenAtMs||0),score:Number(V.score||0),listenAllGA:V.listenAllGA===!0}),me.get(ee)):null};return pe.forEach(P=>{const V=String(P&&P.id?P.id:"").trim();V&&oa(V,{displayId:P&&P.displayId,kind:P&&P.kind,subtitle:P&&P.subtitle?P.subtitle:R[V],payload:P&&P.payload!==void 0?P.payload:E[V],anomalyCount:Number(P&&P.anomalyCount?P.anomalyCount:Y[V]||0),inFlow:P&&P.inFlow!==void 0?!!P.inFlow:void 0,lastSeenAtMs:Number(P&&P.lastSeenAtMs?P.lastSeenAtMs:new Date(String(P&&P.lastAt?P.lastAt:z[V]||"")).getTime()||0),score:Number(P&&P.score?P.score:0),listenAllGA:P&&P.listenAllGA===!0})}),Array.from(U.values()).forEach(P=>{oa(P.from,{subtitle:R[P.from],payload:E[P.from],lastSeenAtMs:new Date(String(z[P.from]||"")).getTime()||P.lastAtMs||0}),oa(P.to,{subtitle:R[P.to],payload:E[P.to],lastSeenAtMs:new Date(String(z[P.to]||"")).getTime()||P.lastAtMs||0});const V=me.get(P.from),ee=me.get(P.to);V&&(V.score+=Number(P.weight||0)),ee&&(ee.score+=Number(P.weight||0))}),(Array.isArray(s.topGAs)?s.topGAs:[]).slice(0,12).forEach(P=>{const V=String(P&&P.ga?P.ga:"").trim();if(!V)return;const ee=oa(V,{subtitle:P&&P.label?P.label:R[V],payload:E[V],lastSeenAtMs:new Date(String(z[V]||"")).getTime()||0});ee&&(ee.score+=Number(P&&P.count?P.count:0))}),{nodes:Array.from(me.values()),edges:Array.from(U.values()).sort((P,V)=>Number(V.weight||0)-Number(P.weight||0)).slice(0,48),telemetryWindowSec:Number(s&&s.graph&&s.graph.windowSec?s.graph.windowSec:s?.meta?.analysisWindowSec||0)}}function Yo(n){let s=Array.isArray(n&&n.nodes)?n.nodes.slice():[];const r=Array.isArray(n&&n.edges)?n.edges.slice():[];a.flowShowUniversalNodes!==!0&&(s=s.filter(P=>!on(P)));const c=new Set(s.map(P=>P.id)),h=new Set((a.flowSelectedGa||[]).map(P=>String(P||"").trim()).filter(P=>P&&c.has(P))),R=Math.max(4,Math.min(32,Number(a.flowMaxNodes)||14));let E=s.slice().sort((P,V)=>{const ee=Number(P.anomalyCount||0)*10+Number(P.score||0),Le=Number(V.anomalyCount||0)*10+Number(V.score||0);return Le!==ee?Le-ee:String(P.id||"").localeCompare(String(V.id||""))});if(h.size){const P=new Set(h);r.forEach(V=>{h.has(V.from)&&P.add(V.to),h.has(V.to)&&P.add(V.from)}),E=E.filter(V=>P.has(V.id))}else E=E.slice(0,R);const z=new Set(E.map(P=>P.id)),O=r.filter(P=>z.has(P.from)&&z.has(P.to)),Y=Math.max(...O.map(P=>Number(P.weight||0)),1),K=Math.max(2,Math.min(6,Math.ceil(Math.sqrt(Math.max(E.length,4)*1.5)))),pe=Math.max(1,Math.ceil(E.length/K)),se=1080,U=Math.max(420,140+(pe-1)*150),de=new Map;E.forEach((P,V)=>{const ee=Math.floor(V/K),Le=V%K,We=K===1?se/2:90+Le*((se-180)/Math.max(K-1,1)),Je=92+ee*148;de.set(P.id,{x:We,y:Je,row:ee,col:Le})});const me=Date.now(),oa=O.map((P,V)=>{const ee=de.get(P.from),Le=de.get(P.to);if(!ee||!Le)return null;const We=Le.x-ee.x,Je=Le.y-ee.y,et=Math.max(Math.hypot(We,Je),1),la=We/et,Ga=Je/et,Ie=24,At=ee.x+la*(Ie+2),$t=ee.y+Ga*(Ie+2),Bt=Le.x-la*(Ie+8),Vt=Le.y-Ga*(Ie+8),Cs=-Ga,ks=la,es=28+V%3*14,xs=V%2===0?1:-1,Rn=(At+Bt)/2+Cs*es*xs,Pd=($t+Vt)/2+ks*es*xs,Ur=Jo(P.edgeByEvent),jr=Number(P.lastAtMs||0)>0&&me-Number(P.lastAtMs||0)<=5e3;return{key:P.key,from:P.from,to:P.to,d:`M ${At} ${$t} Q ${Rn} ${Pd} ${Bt} ${Vt}`,width:(.9+Number(P.weight||0)/Y*1.7).toFixed(2),color:d[Ur]||d.other,opacity:jr?.82:.24,markerId:`flow-arrow-${Ur}`,tooltip:`${P.from} -> ${P.to} | traffic: ${Number(P.weight||0)}${P.delta?` | delta: ${P.delta>0?"+":""}${P.delta}`:""}`,active:jr}}).filter(Boolean);return{width:se,height:U,telemetryWindowSec:Number(n&&n.telemetryWindowSec?n.telemetryWindowSec:0),nodes:E.map(P=>{const V=de.get(P.id),ee=Number(P.lastSeenAtMs||0);return Object.assign({},P,V,{shortLabel:jo(P.displayId||P.id),shortSubtitle:Ho(P.subtitle),shortPayload:Xo(P.payload),isIdle:ee>0&&me-ee>45e3})}),edges:oa,maxNodes:R,selectedCount:h.size}}const ws=j(()=>a.nodes.find(n=>n.id===a.selectedNodeId)||null),Ee=j(()=>a.stateData&&a.stateData.summary?a.stateData.summary:{}),aa=j(()=>a.stateData&&a.stateData.node?a.stateData.node:{}),ba=j(()=>a.stateData&&a.stateData.areas?a.stateData.areas:{suggested:[],totals:{}}),Ae=j(()=>Array.isArray(ba.value&&ba.value.suggested)?ba.value.suggested:[]),Qo=j(()=>Ae.value.filter(n=>String(n&&n.id?n.id:"").startsWith("llm:"))),gr=j(()=>Number(Qo.value.length||0)),qa=j(()=>ba.value&&ba.value.totals?ba.value.totals:{}),ya=j(()=>Array.isArray(a.stateData&&a.stateData.profiles)?a.stateData.profiles:[]),el=j(()=>a.stateData&&a.stateData.profileReport?a.stateData.profileReport:null),Aa=j(()=>Array.isArray(a.stateData&&a.stateData.actuatorTests)?a.stateData.actuatorTests:[]),tl=j(()=>a.stateData&&a.stateData.actuatorTestReport?a.stateData.actuatorTestReport:null),vt=j(()=>Array.isArray(a.stateData&&a.stateData.testPlans)?a.stateData.testPlans:[]),hr=j(()=>{const n=String(a.testPlanSearch||"").trim().toLowerCase();return vt.value.filter(s=>n?[s.name,s.description,s.areaName,s.areaId].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),ft=j(()=>a.stateData&&a.stateData.testPlanReport?a.stateData.testPlanReport:null),Ja=j(()=>Array.isArray(a.stateData&&a.stateData.testResults)?a.stateData.testResults:[]),mr=j(()=>!a.liveTestResultId||!ft.value||ft.value.id!==a.liveTestResultId?null:Object.assign({},ft.value,{live:a.testPlanRunning===!0})),sa=j(()=>{const n=[],s=new Set,r=(c,h=!1)=>{if(!c||typeof c!="object"||!c.id)return;const R=String(c.id);s.has(R)||(s.add(R),n.push(Object.assign({},c,{live:h})))};return r(mr.value,!0),Ja.value.forEach(c=>r(c,!1)),n}),ae=j(()=>{if(a.selectedTestResultId){const n=sa.value.find(s=>s&&s.id===a.selectedTestResultId);if(n)return n}return mr.value||Ja.value[0]||null}),bt=j(()=>a.activeTab==="tests"&&a.testResultFocusMode===!0&&!!ae.value),ln=j(()=>{const n=String(a.areaSearch||"").trim().toLowerCase();return Ae.value.filter(s=>n?[s.path,s.name,s.parentName,...Array.isArray(s.tags)?s.tags:[],...Array.isArray(s.sampleLabels)?s.sampleLabels:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),Ge=j(()=>{if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim())return null;if(a.areaSelectedId){const n=Ae.value.find(s=>s.id===a.areaSelectedId);if(n)return n}return null}),rt=j(()=>{if(a.testAreaSelectedId){const n=Ae.value.find(s=>s.id===a.testAreaSelectedId);if(n)return n}return Ae.value[0]||null}),Lt=j(()=>{const n=String(a.testPlanDraft&&a.testPlanDraft.areaId?a.testPlanDraft.areaId:"").trim();if(n){const s=Ae.value.find(r=>r.id===n);if(s)return s}return rt.value}),vr=j(()=>{const n=String(a.gaCatalogSearch||"").trim().toLowerCase(),s=new Set((a.areaDraftGaList||[]).map(r=>String(r||"").trim()).filter(Boolean));return(Array.isArray(a.gaCatalog)?a.gaCatalog:[]).filter(r=>!r||!r.ga||s.has(r.ga)?!1:n?[r.ga,r.label,r.hierarchyPath,...Array.isArray(r.tags)?r.tags:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0).slice(0,80)}),br=j(()=>{const n=new Map((Array.isArray(a.gaCatalog)?a.gaCatalog:[]).map(s=>[String(s&&s.ga?s.ga:"").trim(),s]));return(a.areaDraftGaList||[]).map(s=>n.get(String(s||"").trim())||{ga:String(s||"").trim(),label:"",dpt:"",hierarchyPath:"",tags:[]})}),dn=j(()=>Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.commandSignals)?a.testPlanCatalog.commandSignals:[]),yr=j(()=>Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.statusSignals)?a.testPlanCatalog.statusSignals:[]),yt=j(()=>{if(a.profileDraftMode===!0)return null;if(a.profileSelectedId){const n=ya.value.find(s=>s.id===a.profileSelectedId);if(n)return n}return ya.value[0]||null}),it=j(()=>{if(a.actuatorDraftMode===!0)return null;if(a.actuatorPresetSelectedId){const n=Aa.value.find(s=>s.id===a.actuatorPresetSelectedId);if(n)return n}return Aa.value[0]||null}),na=j(()=>a.testPlanSelectedId&&vt.value.find(n=>n.id===a.testPlanSelectedId)||null),Ce=j(()=>!a.testPlanRunningStepId||!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)?null:a.testPlanDraft.steps.find(n=>String(n&&n.id?n.id:"")===a.testPlanRunningStepId)||null),al=j(()=>!!(a.testPlanDraft&&Array.isArray(a.testPlanDraft.steps)&&a.testPlanDraft.steps.length>0)),un=j(()=>a.showAiPlanner===!0),Ar=j(()=>a.showAiAreaBuilder===!0),Sr=j(()=>a.testPlanDraft?pr({prompt:a.testPlanPrompt,draft:a.testPlanDraft})!==a.testPlanDraftBaseline:!1),sl=j(()=>{if(!(a.areaDraftIsNew===!0||!!Ge.value))return!1;const s=rn({isNew:a.areaDraftIsNew===!0,areaId:String(a.areaDraftId||a.areaSelectedId||"").trim(),name:a.areaDraftName,description:a.areaDraftDescription,tags:Ko(a.areaDraftTags),gaList:a.areaDraftGaList||[],llmPrompt:a.areaLlmPrompt});if(a.areaDraftIsNew===!0){const h=rn({isNew:!0,areaId:"",name:"New Area",description:"",tags:[],gaList:[],llmPrompt:""});return s!==h}const r=Ge.value;if(!r)return!1;const c=rn({isNew:!1,areaId:String(r.id||"").trim(),name:String(r.name||""),description:String(r.customDescription||""),tags:Array.isArray(r.tags)?r.tags:[],gaList:Array.isArray(r.gaList)?r.gaList:[],llmPrompt:""});return s!==c}),cn=j(()=>Array.isArray(a.stateData&&a.stateData.anomalies)?a.stateData.anomalies.slice().reverse():[]),fn=j(()=>{const n=Array.isArray(Ee.value.topGAs)?Ee.value.topGAs:[],s=Ee.value&&typeof Ee.value.gaLabels=="object"?Ee.value.gaLabels:{};return n.slice(0,10).map(r=>{const c=r&&typeof r=="object"?r:{},h=String(c.ga||"").trim(),R=String(c.label||"").trim(),E=h?String(s[h]||"").trim():"";return Object.assign({},c,{ga:h,label:R||E})})}),Ts=j(()=>{const n=Ee.value&&Ee.value.byEvent&&typeof Ee.value.byEvent=="object"?Ee.value.byEvent:{};return Object.keys(n).map(s=>({name:s,count:Number(n[s]||0)})).filter(s=>s.count>0).sort((s,r)=>r.count-s.count)}),nl=j(()=>Math.max(...Ts.value.map(n=>n.count),1)),pn=j(()=>Zo(a.stateData)),ra=j(()=>Yo(pn.value)),rl=j(()=>{const n=String(a.flowSearch||"").trim().toLowerCase();return pn.value.nodes.slice().filter(s=>a.flowShowUniversalNodes===!0||!on(s)).sort((s,r)=>String(s.id||"").localeCompare(String(r.id||""))).filter(s=>n?`${s.id} ${s.subtitle||""}`.toLowerCase().includes(n):!0).slice(0,120)}),Qe=j(()=>Ee.value&&Ee.value.busConnection&&typeof Ee.value.busConnection=="object"?Ee.value.busConnection:null),il=j(()=>{const n=Ee.value||{};if(!Object.keys(n).length)return"No data available.";const s=n.counters||{},r=[];return r.push(aa.value.name||ws.value?.name||"KNX AI"),r.push(`Analysis window: ${Number(n.meta?.analysisWindowSec||0)}s`),r.push(`Telegrams: ${Number(s.telegrams||0)} | Rate: ${Number(s.overallRatePerSec||0)}/s`),r.push(`Echoed: ${Number(s.echoed||0)} | Repeat: ${Number(s.repeated||0)} | Unknown DPT: ${Number(s.unknownDpt||0)}`),Qe.value&&r.push(`Bus: ${String(Qe.value.currentState||"unknown")} | Connected: ${Number(Qe.value.connectedPct||0)}% | Disconnected: ${Number(Qe.value.disconnectedPct||0)}%`),r.join(`
3
- `)}),ol=j(()=>{const n=Qe.value;return!n||!Array.isArray(n.segments)?[]:n.segments.map((s,r)=>{const c=Math.max(0,Math.min(1,Number(s&&s.ratioStart)||0)),h=Math.max(0,Math.min(1,Number(s&&s.ratioWidth)||0));return{key:`${r}-${s?.startedAt||""}`,left:`${(c*100).toFixed(3)}%`,width:`${Math.max(h*100,.4).toFixed(3)}%`,title:`${s?.state==="connected"?"Connected":"Disconnected"} | ${Me(s?.startedAt)} -> ${Me(s?.endedAt)} | ${Ca(s?.durationSec||0)}`,className:s?.state==="connected"?"segment-connected":"segment-disconnected"}}).filter(s=>Number.parseFloat(s.width)>0)}),ll=j(()=>a.chatMessages.map((n,s)=>({key:`${s}-${n.kind}`,kind:n.kind,rawText:C(n.text),html:n.kind==="assistant"?ma(n.text):""})));Re(()=>a.selectedNodeId,n=>{Na(Ri,n||""),a.areaSelectedId="",a.testAreaSelectedId=Ps(n||"")}),Re(()=>a.autoRefresh,n=>{ja(Ni,n)}),Re(()=>a.voiceEnabled,n=>{ja(Ei,n),n!==!0&&Et()}),Re(kt,n=>{ja(Gi,n)}),Re(()=>a.activeTab,n=>{Na(Ci,n||"overview")}),Re(()=>a.settingsTab,n=>{Na(ki,n||"config")}),Re(()=>a.flowMaxNodes,n=>{a.flowMaxNodes=Math.max(4,Math.min(32,Number(n)||14)),_()}),Re(()=>(a.flowSelectedGa||[]).join("|"),()=>{_()}),Re(()=>a.flowShowUniversalNodes,n=>{n!==!0&&(a.flowSelectedGa=(a.flowSelectedGa||[]).filter(s=>{const r=pn.value.nodes.find(c=>c.id===s);return!on(r)})),_()}),Re(()=>Ae.value.map(n=>n.id).join("|"),()=>{if(!Ae.value.length){a.areaSelectedId="",a.testAreaSelectedId="",a.activeTab==="tests"&&(a.activeTab="areas");return}if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim()){const r=String(a.testAreaSelectedId||"").trim();if(y())return;(!r||!Ae.value.find(c=>c.id===r))&&(a.testAreaSelectedId=Ae.value[0].id);return}const n=String(a.areaSelectedId||"").trim();n&&!Ae.value.find(r=>r.id===n)&&(a.areaSelectedId="");const s=String(a.testAreaSelectedId||"").trim();y()||(!s||!Ae.value.find(r=>r.id===s))&&(a.testAreaSelectedId=Ae.value[0].id)}),Re(()=>a.testAreaSelectedId,n=>{a.selectedNodeId&&g(a.selectedNodeId,n||"")}),Re(()=>Ge.value?JSON.stringify({id:Ge.value.id,name:Ge.value.name,customDescription:Ge.value.customDescription||"",tags:Ge.value.tags||[]}):"",()=>{if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim())return;const n=Ge.value;if(!n){a.areaDraftId="",a.areaDraftName="",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1;return}a.areaDraftId=String(n.id||""),a.areaDraftName=String(n.name||""),a.areaDraftDescription=String(n.customDescription||""),a.areaDraftTags=Array.isArray(n.tags)?n.tags.join(", "):"",a.areaDraftGaList=Array.isArray(n.gaList)?n.gaList.slice():[],a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1}),Re(()=>Lt.value?Lt.value.id:"",async(n,s)=>{if(!n||!a.selectedNodeId){a.testPlanCatalog=null,a.testPlanCatalogError="";return}s&&n!==s&&(a.testPlanRunConfirmOpen=!1,a.testPlanDraft&&!a.testPlanSelectedId&&(a.testPlanDraft.areaId=String(n||""),a.testPlanDraft.areaName=Lt.value?String(Lt.value.path||Lt.value.name||""):"")),await xr()}),Re(()=>ya.value.map(n=>n.id).join("|"),()=>{if(!ya.value.length){a.profileSelectedId="";return}a.profileDraftMode!==!0&&(!a.profileSelectedId||!ya.value.find(n=>n.id===a.profileSelectedId))&&(a.profileSelectedId=ya.value[0].id)}),Re(()=>yt.value?JSON.stringify({id:yt.value.id,name:yt.value.name,description:yt.value.description,targetTags:yt.value.targetTags||[],minActivityPct:yt.value.minActivityPct,maxSilentPct:yt.value.maxSilentPct,maxAnomalies:yt.value.maxAnomalies,builtIn:yt.value.builtIn===!0}):"",()=>{const n=yt.value;if(!n){a.profileDraftId="",a.profileDraftName="",a.profileDraftDescription="",a.profileDraftTargetTags="",a.profileDraftMinActivityPct=20,a.profileDraftMaxSilentPct=60,a.profileDraftMaxAnomalies=2;return}a.profileDraftId=String(n.id||""),a.profileDraftName=String(n.name||""),a.profileDraftDescription=String(n.description||""),a.profileDraftTargetTags=Array.isArray(n.targetTags)?n.targetTags.join(", "):"",a.profileDraftMinActivityPct=Number(n.minActivityPct||20),a.profileDraftMaxSilentPct=Number(n.maxSilentPct||60),a.profileDraftMaxAnomalies=Number(n.maxAnomalies||2)}),Re(()=>Aa.value.map(n=>n.id).join("|"),()=>{if(!Aa.value.length){a.actuatorPresetSelectedId="";return}a.actuatorDraftMode!==!0&&(!a.actuatorPresetSelectedId||!Aa.value.find(n=>n.id===a.actuatorPresetSelectedId))&&(a.actuatorPresetSelectedId=Aa.value[0].id)}),Re(()=>it.value?JSON.stringify({id:it.value.id,name:it.value.name,description:it.value.description,commandGA:it.value.commandGA,commandDPT:it.value.commandDPT,commandPayload:it.value.commandPayload,statusGA:it.value.statusGA,statusDPT:it.value.statusDPT,statusWriteTimeoutMs:it.value.statusWriteTimeoutMs,statusResponseTimeoutMs:it.value.statusResponseTimeoutMs}):"",()=>{const n=it.value;if(!n){a.actuatorDraftId="",a.actuatorDraftName="",a.actuatorDraftDescription="",a.actuatorDraftCommandGA="",a.actuatorDraftCommandDPT="",a.actuatorDraftCommandPayload="",a.actuatorDraftStatusGA="",a.actuatorDraftStatusDPT="",a.actuatorDraftStatusWriteTimeoutMs=5e3,a.actuatorDraftStatusResponseTimeoutMs=5e3;return}a.actuatorDraftId=String(n.id||""),a.actuatorDraftName=String(n.name||""),a.actuatorDraftDescription=String(n.description||""),a.actuatorDraftCommandGA=String(n.commandGA||""),a.actuatorDraftCommandDPT=String(n.commandDPT||""),a.actuatorDraftCommandPayload=String(n.commandPayload||""),a.actuatorDraftStatusGA=String(n.statusGA||""),a.actuatorDraftStatusDPT=String(n.statusDPT||""),a.actuatorDraftStatusWriteTimeoutMs=Number(n.statusWriteTimeoutMs||5e3),a.actuatorDraftStatusResponseTimeoutMs=Number(n.statusResponseTimeoutMs||5e3)}),Re(()=>vt.value.map(n=>n.id).join("|"),()=>{if(!vt.value.length){a.testPlanSelectedId="";return}a.testPlanSelectedId&&!vt.value.find(n=>n.id===a.testPlanSelectedId)&&(a.testPlanSelectedId="")}),Re(()=>sa.value.map(n=>n.id).join("|"),()=>{if(!sa.value.length){a.selectedTestResultId="";return}(!a.selectedTestResultId||!sa.value.find(n=>n.id===a.selectedTestResultId))&&(a.selectedTestResultId=String(sa.value[0].id||"")),a.liveTestResultId&&Ja.value.some(n=>String(n&&n.id?n.id:"")===a.liveTestResultId)&&a.testPlanRunning!==!0&&(a.liveTestResultId="")}),Re(()=>`${a.selectedTestResultId}|${a.activeTab}`,()=>{a.activeTab!=="results"||!a.selectedTestResultId||requestAnimationFrame(()=>{const n=document.querySelector(".results-page-list .area-list-item.active");n&&typeof n.scrollIntoView=="function"&&n.scrollIntoView({block:"nearest",behavior:"smooth"})})});function gn(n,s){a.chatMessages.push({kind:n,text:s})}function dl(){a.chatMessages=[]}function ul(n,s=null){const r=Array.isArray(n)?n:[];return{totalSteps:Math.max(r.length,Number(s||0)),pass:r.filter(h=>h&&h.status==="pass").length,warn:r.filter(h=>h&&h.status==="warn").length,fail:r.filter(h=>h&&h.status==="fail").length}}function cl(n){const s=[];return Number(n&&n.fail)>0&&s.push("At least one feedback object returned an incoherent value. Check the actuator/status pairing in ETS first."),Number(n&&n.warn)>0&&s.push("Some steps did not receive feedback in time. Verify the status group address and the actuator programming."),s.length||s.push("The selected active test completed with coherent feedback on all verified steps."),s}function hn({plan:n,area:s,stepResults:r,reportId:c=""}){const h=ul(r,Array.isArray(n&&n.steps)?n.steps.length:0),R=h.fail>0?"fail":h.warn>0?"warn":"pass";return{id:String(c||`${n.id||"plan"}:${Date.now()}`),generatedAt:new Date().toISOString(),mode:"ai_test_plan",overallStatus:R,name:n.name,description:n.description,prompt:n.prompt,area:s,metrics:h,steps:r,suggestions:cl(h)}}function _s(n){return!n||typeof n!="object"?"Test result":String(n.name||n.profile?.name||"Test result")}function Ds(n){return!n||typeof n!="object"?"":String(n.area?.path||n.area?.name||n.area?.id||"")}function Za(n){const s=String(n&&n.mode?n.mode:"").trim().toLowerCase();return s==="ai_test_plan"?"Test Plan":s==="active_test"?"Actuator":s==="read_only"?"Read-only":s||"Test"}function mn(n){const s=n&&n.metrics&&typeof n.metrics=="object"?n.metrics:{};return String(n&&n.mode?n.mode:"")==="read_only"?[{label:"Total GA",value:Number(s.totalGAs||0)},{label:"Active GA",value:Number(s.activeGaCount||0)},{label:"Silent GA",value:Number(s.silentGaCount||0)},{label:"Anomalies",value:Number(s.anomalyCount||0)}]:String(n&&n.mode?n.mode:"")==="active_test"?[{label:"Command GA",value:n&&n.command&&n.command.ga?n.command.ga:"n/a"},{label:"Status GA",value:n&&(n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga)?n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga:"n/a"},{label:"Status",value:n&&n.overallStatus?n.overallStatus:"n/a"},{label:"Generated",value:xe(n&&n.generatedAt?n.generatedAt:"")||"n/a"}]:[{label:"Total Steps",value:Number(s.totalSteps||0)},{label:"Pass",value:Number(s.pass||0)},{label:"Warn",value:Number(s.warn||0)},{label:"Fail",value:Number(s.fail||0)}]}function Mt(n){if(n==null||n==="")return"n/a";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function vn(n,s,r="n/a"){const c=String(s||"").trim(),h=n==null?"":String(n);if(!c)return h||r;const R=wn(h,c),E=ia(c).find(z=>String(z.value)===String(R));return E&&E.label?E.label:h||r}function Pr(n){if(!n||typeof n!="object")return"n/a";const s=n.ga||"n/a";if(n.ok===!0){const r=n.payloadLabel||Mt(n.payload),c=n.coherent===!1?"mismatch":"ok";return`${s} / ${r} / ${c}`}return`${s} / ${n.error||"timeout"}`}function bn(n){return xe(n||"")||"n/a"}function fl(n,s="report"){return String(n||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||s}function wr({command:n,statusWrite:s,statusResponse:r,statusRead:c,expectedPayloadLabel:h,expectedPayload:R}){const E=r||c;return[{title:"Command",items:[{label:"Command",value:`${n?.ga||"n/a"} / ${n?.payloadLabel||Mt(n?.payload)}`},{label:"Command Sent",value:bn(n?.sentAt)}]},{title:"Spontaneous Write From Status GA",items:[{label:"Result",value:Pr(s)},{label:"Expected",value:s?.expectedPayloadLabel||h||Mt(R)},{label:"Received At",value:bn(s?.at)},{label:"Event",value:s?.event||"n/a"}]},{title:"Active Read Request To Status GA",items:[{label:"Result",value:Pr(E)},{label:"Expected",value:E?.expectedPayloadLabel||h||Mt(R)},{label:"Received At",value:bn(E?.at)},{label:"Event",value:E?.event||"n/a"}]}]}function Ya(n){return!n||typeof n!="object"?[]:Array.isArray(n.steps)&&n.steps.length?n.steps.map(s=>{const r=s.kind==="wait"?[{label:"Wait",value:`${Number(s.delayMs||0)} ms`},{label:"Reason",value:s.reason||"Pause before next action"}]:[];return{id:String(s.id||`${n.id}-step`),title:s.title||s.id||"Step",status:s.status||"pass",message:s.message||s.description||"",details:r,detailGroups:s.kind==="wait"?[]:wr({command:s.command,statusWrite:s.statusWrite,statusResponse:s.statusResponse,statusRead:s.statusRead,expectedPayloadLabel:s.expectedPayloadLabel,expectedPayload:s.expectedPayload})}}):Array.isArray(n.checks)&&n.checks.length?n.checks.map(s=>({id:String(s.id||`${n.id}-check`),title:s.title||s.id||"Check",status:s.status||"pass",message:s.message||"",details:[{label:"Metrics",value:Mt(s.metrics||{})},{label:"Sample",value:Mt(s.sample||[])}]})):String(n.mode||"")==="active_test"?[{id:String(n.id||"active-test"),title:n.name||"Actuator Test",status:n.overallStatus||"pass",message:n.overallStatus==="pass"?"Both feedback checks passed.":n.overallStatus==="warn"?"One feedback check passed and one failed.":"Both feedback checks failed.",details:[],detailGroups:wr({command:n.command,statusWrite:n.statusWrite,statusResponse:n.statusResponse,statusRead:n.statusRead,expectedPayloadLabel:n.statusResponse?.expectedPayloadLabel||n.statusWrite?.expectedPayloadLabel||n.statusRead?.expectedPayloadLabel,expectedPayload:n.statusRead?.expectedPayload})}]:[]}function Qa(n){return Array.isArray(n&&n.suggestions)?n.suggestions:[]}function pl(n){const s=n&&n.source&&typeof n.source=="object"?n.source:{},r=String(n&&n.mode?n.mode:"").trim().toLowerCase(),c=String(s.areaId||n?.area?.id||"").trim();return r==="ai_test_plan"?{type:"ai_test_plan",planId:String(s.planId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:r==="read_only"?{type:"profile",profileId:String(s.profileId||n?.profile?.id||"").trim(),areaId:c}:r==="active_test"?{type:"actuator_test",presetId:String(s.presetId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:{type:"",areaId:c}}async function Tr(){const n=ae.value;if(!n||typeof n!="object"){w("No test result selected to export");return}try{const{jsPDF:s}=await Zc(async()=>{const{jsPDF:Ie}=await import("./chunk-jspdf.es.min.js").then(At=>At.j);return{jsPDF:Ie}},[]),r=new s({orientation:"portrait",unit:"pt",format:"a4"}),c=r.internal.pageSize.getWidth(),h=r.internal.pageSize.getHeight(),R=42,E=42,z=44,O=42,Y=c-R-E;let K=z;const pe=(Ie=14)=>{K+Ie<=h-O||(r.addPage(),K=z)},se=(Ie,{size:At=11,bold:$t=!1,indent:Bt=0,color:Vt=[35,41,52],lineHeight:Cs=14,gapAfter:ks=0}={})=>{const es=String(Ie||"").trim();if(!es)return;r.setFont("helvetica",$t?"bold":"normal"),r.setFontSize(At),r.setTextColor(Vt[0],Vt[1],Vt[2]);const xs=r.splitTextToSize(es,Math.max(80,Y-Bt));for(const Rn of xs)pe(Cs),r.text(String(Rn),R+Bt,K),K+=Cs;ks>0&&(K+=ks)},U=()=>{pe(12),r.setDrawColor(210,214,222),r.line(R,K,c-E,K),K+=12},de=_s(n),me=xe(new Date().toISOString())||new Date().toISOString(),oa=xe(n.generatedAt||"")||String(n.generatedAt||"n/a"),P=Ds(n)||"n/a",V=Za(n),ee=String(n.overallStatus||"n/a"),Le=mn(n),We=Ya(n),Je=Qa(n);se("KNX AI Test Result",{size:17,bold:!0,color:[20,28,39],lineHeight:20}),se(de,{size:14,bold:!0,color:[20,28,39],lineHeight:17,gapAfter:4}),se(`Exported: ${me}`,{size:10,color:[88,96,113]}),se(`Generated: ${oa}`,{size:10,color:[88,96,113]}),se(`Mode: ${V}`,{size:10,color:[88,96,113]}),se(`Status: ${ee}`,{size:10,color:[88,96,113]}),se(`Area: ${P}`,{size:10,color:[88,96,113]}),se(`Report ID: ${String(n.id||"n/a")}`,{size:10,color:[88,96,113],gapAfter:2}),U(),Le.length&&(se("Metrics",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Le.forEach(Ie=>{se(`${Ie.label}: ${Mt(Ie.value)}`,{size:10,color:[35,41,52]})}),K+=4,U()),se(`Checks (${We.length})`,{size:12,bold:!0,color:[20,28,39],gapAfter:2}),We.length?We.forEach((Ie,At)=>{se(`${At+1}. ${Ie.title||"Check"} [${String(Ie.status||"n/a").toUpperCase()}]`,{size:11,bold:!0,color:[31,41,55]}),se(Ie.message||"No additional details available.",{size:10,color:[70,78,94]}),Array.isArray(Ie.detailGroups)&&Ie.detailGroups.length?Ie.detailGroups.forEach($t=>{se($t.title||"Details",{size:10,bold:!0,indent:12,color:[35,41,52]}),(Array.isArray($t.items)?$t.items:[]).forEach(Vt=>{se(`${Vt.label}: ${Mt(Vt.value)}`,{size:10,indent:24,color:[70,78,94]})})}):(Array.isArray(Ie.details)?Ie.details:[]).forEach(Bt=>{se(`${Bt.label}: ${Mt(Bt.value)}`,{size:10,indent:12,color:[70,78,94]})}),K+=2}):se("No detailed entries stored for this report yet.",{size:10,color:[88,96,113]}),Je.length&&(K+=4,U(),se("Suggestions",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Je.forEach((Ie,At)=>{se(`${At+1}. ${String(Ie||"")}`,{size:10,color:[35,41,52]})}));const et=new Date(n.generatedAt||Date.now()),la=Number.isFinite(et.getTime())?et.toISOString().replace(/[:.]/g,"-"):String(Date.now()),Ga=`knx-ai-test-result-${fl(de,"report")}-${la}.pdf`;r.save(Ga),w(`PDF exported (${Ga})`)}catch(s){a.lastError=s&&s.message?s.message:"Failed to export PDF",w(a.lastError)}}function _r(n,s,r=new Date().toISOString()){const c=n&&n.kind==="wait";return{id:n&&n.id?n.id:`step-${Date.now()}`,title:n&&n.title?n.title:"Test Step",description:n&&n.description?n.description:"",reason:n&&n.reason?n.reason:"",kind:n&&n.kind?n.kind:"write_and_verify",status:"warn",command:c?null:{ga:n&&n.commandGA?n.commandGA:"",dpt:n&&n.commandDPT?n.commandDPT:"",payload:n?n.commandPayload:void 0,sentAt:r},statusWrite:null,statusResponse:null,statusRead:null,expectedPayload:c?void 0:n?n.expectedPayload:void 0,delayMs:Number(n&&n.delayMs?n.delayMs:0),statusWriteTimeoutMs:c?0:Number(n&&n.statusWriteTimeoutMs?n.statusWriteTimeoutMs:0),statusResponseTimeoutMs:c?0:Number(n&&n.statusResponseTimeoutMs?n.statusResponseTimeoutMs:0),message:s&&s.message?s.message:"Failed to run step"}}async function Dr(n){return Et(),await new Promise((s,r)=>{const c=URL.createObjectURL(n),h=new Audio(c);fe=h;const R=()=>{fe===h&&(fe=null),h.onended=null,h.onerror=null,URL.revokeObjectURL(c)};h.onended=()=>{R(),s()},h.onerror=()=>{R(),r(new Error("Audio playback failed"))};const E=h.play();E&&typeof E.then=="function"&&E.catch(z=>{R(),r(z instanceof Error?z:new Error(String(z)))})})}function gl(n,s=null){const r=String(n||"").trim();return!r||!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)?s:a.testPlanDraft.steps.find(c=>String(c&&c.id?c.id:"")===r)||s}function Ir(n,s=""){const r=`${String(n||"")} ${String(s||"")}`.trim().toLowerCase(),c=` ${r} `;if(!r)return String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it";const h=z=>z.some(O=>c.includes(O)),R=[{voice:"it",score:[h([" accendi "," spegni "," stato "," verifica "," coerente "," leggi "," apri "," chiudi "," attiva "," controlla "," area "," luce "," luci "," tapparella "," tapparelle "," clima "])?3:0,/[àèéìíîòóù]/.test(r)?2:0].reduce((z,O)=>z+O,0)},{voice:"en",score:[h([" turn on "," turn off "," verify "," feedback "," status "," check "," read "," open "," close "," command "," area "," light "," lights "])?3:0].reduce((z,O)=>z+O,0)},{voice:"fr",score:[h([" allume "," éteins "," etat "," état "," vérifier "," ouvre "," ferme "," lumière "," lumières "," zone "])?3:0,/[àâçéèêëîïôûùüÿœ]/.test(r)?2:0].reduce((z,O)=>z+O,0)},{voice:"de",score:[h([" einschalten "," ausschalten "," status "," prüfen "," öffne "," schließe "," licht "," bereich "])?3:0,/[äöüß]/.test(r)?2:0].reduce((z,O)=>z+O,0)},{voice:"es",score:[h([" enciende "," apaga "," estado "," verifica "," abre "," cierra "," luz "," luces "," zona "])?3:0,/[áéíóúñü]/.test(r)?2:0].reduce((z,O)=>z+O,0)},{voice:"pt",score:[h([" liga "," desliga "," estado "," verificar "," abre "," fecha "," luz "," luzes "," área "])?3:0,/[ãõâêôçáéíóú]/.test(r)?2:0].reduce((z,O)=>z+O,0)}];return R.sort((z,O)=>O.score-z.score),R[0]&&R[0].score>0?R[0].voice:String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it"}function hl(n={},s=null){const r=gl(n&&n.id?n.id:"",n),c=String(r&&r.title?r.title:"").trim(),h=String(r&&r.description?r.description:"").trim();return{text:`${Number.isInteger(s)&&s>0?`${s}. `:""}${c}`.trim(),voice:Ir(c,h)}}async function ml(n={},s=null){if(a.voiceEnabled!==!0)return;const r=hl(n,s),c=String(r.text||"").trim();if(!c||!a.selectedNodeId)return;const h=await F(`${D("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,text:c,voice:r.voice,slow:!1})});await Dr(h)}async function vl(n,s=""){if(a.voiceEnabled!==!0||!a.selectedNodeId)return;const r=String(n).trim();if(!r)return;const c=Ir(r,s),h=await F(`${D("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,text:r,voice:c,slow:!1})});await Dr(h)}function bl(n){const s=u&&n.find(h=>h.id===u)?u:"",r=nt(Ri,""),c=r&&n.find(h=>h.id===r)?r:"";return s||c||(n[0]?n[0].id:"")}async function yn({preserveSelection:n=!0}={}){a.loadingNodes=!0,w("Loading nodes...");try{const s=await k(D("nodes")),r=Array.isArray(s&&s.nodes)?s.nodes:[];if(a.nodes=r,!r.length){a.selectedNodeId="",a.stateData=null,a.lastError="No KNX AI nodes found.",w(a.lastError);return}const c=n&&a.selectedNodeId&&r.find(h=>h.id===a.selectedNodeId)?a.selectedNodeId:bl(r);a.selectedNodeId=c,a.lastError="",w("Ready")}catch(s){a.lastError=s.message||"Failed to load nodes",w(a.lastError)}finally{a.loadingNodes=!1}}async function Ot({fresh:n=!1}={}){if(!(!a.selectedNodeId||a.loadingState)){a.loadingState=!0,n&&w("Loading...");try{const s=a.testPlanRunning===!0&&a.liveTestResultId?Ft(a.stateData&&a.stateData.testPlanReport?a.stateData.testPlanReport:null,null):null,r=await k(D(`state?nodeId=${encodeURIComponent(a.selectedNodeId)}&fresh=${n?1:0}`));s&&s.id===a.liveTestResultId&&(r.testPlanReport=s),a.stateData=r,os(()=>{a.areaDraftIsNew!==!0&&a.areaSelectedId&&!Ae.value.find(c=>c.id===a.areaSelectedId)&&(a.areaSelectedId=""),!y()&&!a.testAreaSelectedId&&Ae.value[0]&&(a.testAreaSelectedId=Ae.value[0].id)}),a.lastError="",w("Ready")}catch(s){a.lastError=s.message||"Failed to load state",w(a.lastError)}finally{a.loadingState=!1}}}async function yl(){await yn({preserveSelection:!0}),await Ot({fresh:!0}),await Ea()}async function Al(){dl(),a.selectedTestResultId="",a.liveTestResultId="",a.testResultFocusMode=!1,a.testAreaSelectedId=Ps(a.selectedNodeId),await Ot({fresh:!0}),await Ea()}function Rr(){a.selectedTestResultId="",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanDraft=null,a.testPlanPrompt="",a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.testPlanUnsavedConfirmOpen=!1,a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,!y()&&!a.testAreaSelectedId&&Ae.value[0]&&(a.testAreaSelectedId=Ae.value[0].id),Dn(),_n()}function Sl(){a.showAiPlanner=!0,a.testTemplateBuilderFocus=!0}function Pl(){a.testTemplateBuilderFocus=!1,a.showAiPlanner=!1}function wl(){a.showAiAreaBuilder=!0,a.areaBuilderFocus=!0}function Tl(){a.areaBuilderFocus=!1,a.showAiAreaBuilder=!1}function An(){a.areaSelectedId="",a.areaDraftIsNew=!1,a.areaDraftId="",a.areaDraftName="",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.areaSearch="",a.areaSearchOpen=!1,a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,a.areaUnsavedConfirmOpen=!1}function _l(){if(sl.value){a.areaUnsavedConfirmOpen=!0;return}An(),w("Area editor closed")}function Nr(){a.areaUnsavedConfirmOpen=!1}function Dl(){a.areaUnsavedConfirmOpen=!1,An(),w("Area editor closed")}function Il(){a.testPlanRunning||In(()=>{Rr(),a.testPlanSearchOpen=!1,w("Test editor closed")},"close the current test editor")}function Cr(n){const s=String(n||"").trim();s!=="node"&&s!=="config"||(a.settingsTab=s)}function xa(n){const s=String(n||"").trim();if(s){if(s==="tests"&&Ae.value.length===0){w("Define at least one area before using Tests");return}if(s==="areas"){const r=!!String(a.areaSelectedId||"").trim(),c=a.areaDraftIsNew===!0;!r&&!c&&An()}if(s==="tests"){const r=!!String(a.testPlanSelectedId||"").trim(),c=!!String(a.selectedTestResultId||"").trim(),h=!!a.testPlanDraft;!r&&!c&&!h&&Rr()}a.activeTab!==s?a.activeTab=s:(a.activeTab="",os(()=>{a.activeTab=s})),ha()}}async function Sn(n){const s=String(n||"").trim();if(!(!s||!a.selectedNodeId||a.deletingTestResultId)){a.deletingTestResultId=s;try{const r=await k(D("test-results/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,reportId:s})}),c=Array.isArray(r&&r.testResults)?r.testResults:[];a.stateData=Object.assign({},a.stateData||{},{testResults:c}),a.selectedTestResultId===s&&(a.selectedTestResultId=c[0]&&c[0].id?String(c[0].id):"",c.length||(a.testResultFocusMode=!1)),a.liveTestResultId===s&&(a.liveTestResultId=""),w("Test result deleted")}catch(r){a.lastError=r.message||"Failed to delete test result",w(a.lastError)}finally{a.deletingTestResultId=""}}}function Is(n,{openMenu:s=!0,activateTestsTab:r=!1,activateResultsTab:c=!1,resultOnly:h=!0}={}){const R=String(n||"").trim();if(!R)return;s&&(a.testResultsMenuOpen=!0);const E=c?"results":r?"tests":"",z=()=>{E&&(a.activeTab=E),a.selectedTestResultId=R,a.testResultFocusMode=h===!0,os(()=>{const O=document.querySelector(".results-page-list .area-list-item.active");O&&typeof O.scrollIntoView=="function"&&O.scrollIntoView({block:"nearest",behavior:"smooth"})})};a.selectedTestResultId===R&&(!E||a.activeTab===E)||z()}function kr(){const n=ae.value;if(!n)return;if(!Ae.value.length){w("Define at least one area before using Tests");return}const s=pl(n);if(a.activeTab="tests",a.testResultFocusMode=!1,s.type==="ai_test_plan"&&s.planId){const r=vt.value.find(c=>c&&c.id===s.planId);if(r){$r(r),w(`Opened source plan "${r.name||r.id}"`);return}}if(s.type==="profile"){w("Returned to the Tests page for the source read-only profile.");return}if(s.type==="actuator_test"){w("Returned to the Tests page for the source actuator test.");return}w("Returned to the Tests page.")}async function Rl(n){if(!a.selectedNodeId||!n||typeof n!="object")return null;const s=await k(D("test-results/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,report:n})});return a.stateData=Object.assign({},a.stateData||{},{testResults:s.testResults||Ja.value,testPlanReport:s.report&&s.report.mode==="ai_test_plan"?s.report:ft.value,actuatorTestReport:s.report&&s.report.mode==="active_test"?s.report:tl.value,profileReport:s.report&&s.report.mode==="read_only"?s.report:el.value}),s&&s.report&&s.report.id&&(a.liveTestResultId="",Is(s.report.id,{openMenu:!0,activateResultsTab:!0,resultOnly:!0})),s}async function Pn(n=""){const s=String(n||"").trim(),r=s||String(a.chatDraft||"").trim();if(!(!r||!a.selectedNodeId)){gn("user",r),s||(a.chatDraft=""),a.asking=!0,w("Asking...");try{const c=await k(D("ask"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,question:r})});gn("assistant",c&&c.answer!==void 0?c.answer:""),w("Ready")}catch(c){gn("error",c.message||"Ask failed"),w(c.message||"Ask failed")}finally{a.asking=!1}}}async function Nl(){const n=Ge.value;if(!a.selectedNodeId||a.areaSaving||!a.areaDraftIsNew&&!n)return;const s=a.areaDraftIsNew===!0;a.areaSaving=!0,w(s?"Creating area...":"Saving area...");try{const c=await k(D(s?"areas/create":"areas/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:a.areaDraftIsNew?void 0:n.id,name:a.areaDraftName,description:a.areaDraftDescription,tags:String(a.areaDraftTags||"").split(",").map(h=>String(h||"").trim()).filter(Boolean),gaList:a.areaDraftGaList||[]})});c&&c.areas?(a.stateData=Object.assign({},a.stateData||{},{areas:c.areas}),c.areaId&&(a.areaSelectedId=c.areaId),a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1):await Ot({fresh:!0}),w(s?"Area created":"Area saved")}catch(r){a.lastError=r.message||"Failed to save area",w(a.lastError)}finally{a.areaSaving=!1}}async function Cl(){const n=Ge.value;if(!(!n||!a.selectedNodeId||a.areaSaving)){a.areaSaving=!0,w("Resetting area...");try{const s=await k(D("areas/reset"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});s&&s.areas?a.stateData=Object.assign({},a.stateData||{},{areas:s.areas}):await Ot({fresh:!0}),w("Area reset")}catch(s){a.lastError=s.message||"Failed to reset area",w(a.lastError)}finally{a.areaSaving=!1}}}async function kl(){const n=Ge.value;if(!(!n||!a.selectedNodeId||a.areaSaving)){a.areaSaving=!0,w("Deleting area...");try{const s=await k(D("areas/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});if(s&&s.areas){a.stateData=Object.assign({},a.stateData||{},{areas:s.areas});const r=Array.isArray(s.areas&&s.areas.suggested)?s.areas.suggested:[];a.areaDraftIsNew=!1,a.areaSelectedId=r[0]&&r[0].id?r[0].id:""}else await Ot({fresh:!0});w("Area deleted")}catch(s){a.lastError=s.message||"Failed to delete area",w(a.lastError)}finally{a.areaSaving=!1}}}async function xr(){const n=Lt.value;if(!n||!a.selectedNodeId){a.testPlanCatalog=null,a.testPlanCatalogError="";return}a.testPlanCatalogLoading=!0,a.testPlanCatalogError="";try{const s=await k(D("test-plans/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});a.testPlanCatalog=s&&s.catalog?s.catalog:null,s&&s.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:s.testPlans}))}catch(s){a.testPlanCatalog=null,a.testPlanCatalogError=s.message||"Failed to load area command/status catalog"}finally{a.testPlanCatalogLoading=!1}}async function Ea(){if(!(!a.selectedNodeId||a.gaCatalogLoading)){a.gaCatalogLoading=!0;try{const n=await k(D("areas/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId})});a.gaCatalog=Array.isArray(n&&n.gaCatalog)?n.gaCatalog:[]}catch(n){a.lastError=n.message||"Failed to load GA catalog",w(a.lastError)}finally{a.gaCatalogLoading=!1}}}function xl(n){const s=String(n||"").trim();s&&((a.areaDraftGaList||[]).includes(s)||(a.areaDraftGaList=[...a.areaDraftGaList||[],s]))}function Er(n){const s=String(n||"").trim().toLowerCase(),r=o.find(c=>c.value===s);return r?r.label:s==="auto"?"Auto":"Command"}function Gr(n){const s=n&&typeof n=="object"?n:{},r=String(s.path||s.name||"Area").trim(),c=String(s.kind||"").trim(),h=Number(s.gaCount||0),R=Number(s.activeGaCount||0),E=[c,`${h} GA`,`active ${R}`].filter(Boolean).join(" | ");return E?`${r} ${E}`:r}function El(n){const s=n&&typeof n=="object"?n:null;!s||!s.id||(a.areaDraftIsNew=!1,a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,a.areaSelectedId=s.id,a.areaSearch="",a.areaSearchOpen=!1)}function Gl(){setTimeout(()=>{a.areaSearchOpen=!1},150)}function Fr(n){const s=n&&typeof n=="object"?n:{},r=String(s.name||"Plan").trim(),c=String(s.areaName||s.areaId||"").trim(),h=Number(s.steps&&s.steps.length?s.steps.length:0),R=[c,`${h} steps`].filter(Boolean).join(" | ");return R?`${r} ${R}`:r}function Fl(n){const s=n&&typeof n=="object"?n:null;!s||!s.id||(dd(s),a.testPlanSearch="",a.testPlanSearchOpen=!1)}function Ll(){setTimeout(()=>{a.testPlanSearchOpen=!1},150)}function Ml(){return ie(f.value,"en")}function Ol(n){const s=String(n||"").trim();s&&(a.areaDraftGaList=(a.areaDraftGaList||[]).filter(r=>r!==s))}async function zl(n,s){const r=String(n||"").trim();if(!(!a.selectedNodeId||!r||a.areaGaRoleSavingGa===r)){a.areaGaRoleSavingGa=r,w(`Saving role for ${r}...`);try{const c=await k(D("areas/ga-role/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,ga:r,role:s})});Array.isArray(c&&c.gaCatalog)&&(a.gaCatalog=c.gaCatalog),c&&c.areas&&(a.stateData=Object.assign({},a.stateData||{},{areas:c.areas})),Lt.value&&Array.isArray(Lt.value.gaList)&&Lt.value.gaList.includes(r)&&await xr(),w(`Role saved for ${r}`)}catch(c){a.lastError=c.message||"Failed to save GA role",w(a.lastError)}finally{a.areaGaRoleSavingGa=""}}}function $l(){a.activeTab="areas",a.areaDraftIsNew=!0,a.areaSelectedId="",a.areaDraftId="",a.areaDraftName="New Area",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1}async function Bl(){const n=String(a.selectedNodeId||"").trim();if(!(a.areaLlmRegenerating||a.areaLlmBulkDeleting)){if(!n){a.areaLlmError="Select a KNX AI node first",w(a.areaLlmError);return}a.areaLlmRegenerating=!0,a.areaLlmError="",w("Regenerating AI areas...");try{const s=await k(D("areas/regenerate-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})}),r=Array.isArray(s&&s.gaCatalog);if(r&&(a.gaCatalog=s.gaCatalog),s&&(s.areas||s.profiles||s.actuatorTests||s.testPlans)){const c=Object.assign({},a.stateData||{});s.areas&&(c.areas=s.areas),s.profiles&&(c.profiles=s.profiles),s.actuatorTests&&(c.actuatorTests=s.actuatorTests),s.testPlans&&(c.testPlans=s.testPlans),a.stateData=c}else await Ot({fresh:!0});r||await Ea(),w(`AI areas regenerated (${Number(s&&s.generatedCount?s.generatedCount:0)})`)}catch(s){a.areaLlmError=s.message||"Failed to regenerate AI areas",w(a.areaLlmError)}finally{a.areaLlmRegenerating=!1}}}async function Vl(){const n=String(a.selectedNodeId||"").trim();if(a.areaLlmRegenerating||a.areaLlmBulkDeleting)return;if(!n){a.areaLlmError="Select a KNX AI node first",w(a.areaLlmError);return}const s=Number(gr.value||0);if(s<=0){w("No AI areas to delete");return}if(window.confirm(`Delete all AI-generated areas (${s})?`)){a.areaLlmBulkDeleting=!0,a.areaLlmError="",w("Deleting AI areas...");try{const c=await k(D("areas/delete-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})});if(Array.isArray(c&&c.gaCatalog)&&(a.gaCatalog=c.gaCatalog),c&&(c.areas||c.profiles||c.actuatorTests||c.testPlans)){const h=Object.assign({},a.stateData||{});c.areas&&(h.areas=c.areas),c.profiles&&(h.profiles=c.profiles),c.actuatorTests&&(h.actuatorTests=c.actuatorTests),c.testPlans&&(h.testPlans=c.testPlans),a.stateData=h}else await Ot({fresh:!0});Array.isArray(c&&c.gaCatalog)||await Ea(),w(`AI areas deleted (${Number(c&&c.deletedCount?c.deletedCount:s)})`)}catch(c){a.areaLlmError=c.message||"Failed to delete AI areas",w(a.areaLlmError)}finally{a.areaLlmBulkDeleting=!1}}}async function Kl(){if(!a.selectedNodeId||a.areaLlmBusy)return;const n=String(a.areaLlmPrompt||"").trim();if(n){a.areaLlmBusy=!0,a.areaLlmError="",w("AI is selecting area GA...");try{const s=await k(D("areas/suggest-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,prompt:n,name:a.areaDraftName,description:a.areaDraftDescription,gaList:a.areaDraftGaList||[]})}),r=s&&s.suggestion?s.suggestion:null;if(Array.isArray(s&&s.gaCatalog)&&(a.gaCatalog=s.gaCatalog),!r||!Array.isArray(r.gaList)||!r.gaList.length)throw new Error("The AI did not return any group addresses");!String(a.areaDraftName||"").trim()&&r.name&&(a.areaDraftName=String(r.name)),!String(a.areaDraftDescription||"").trim()&&r.description&&(a.areaDraftDescription=String(r.description)),(!a.areaDraftTags||!String(a.areaDraftTags).trim())&&Array.isArray(r.tags)&&r.tags.length&&(a.areaDraftTags=r.tags.join(", ")),a.areaDraftGaList=Array.from(new Set([...a.areaDraftGaList||[],...r.gaList.map(c=>String(c||"").trim()).filter(Boolean)])),a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,w(`AI added ${Number(r.gaList.length||0)} GA to the draft`)}catch(s){a.areaLlmError=s.message||"Failed to suggest area GA",w(a.areaLlmError)}finally{a.areaLlmBusy=!1}}}function Wl(n){if(n&&typeof n=="object"){a.testPlanPrompt=String(n.prompt||"").trim();return}a.testPlanPrompt=String(n||"").trim()}function Lr(n){const s=String(n||"").trim();return s&&(Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.pairs)?a.testPlanCatalog.pairs:[]).find(c=>c&&c.command&&c.command.ga===s)||null}function Mr(n){const s=String(n||"").trim();return dn.value.find(r=>r&&r.ga===s)||null}function Ul(n){const s=String(n||"").trim();return yr.value.find(r=>r&&r.ga===s)||null}function ia(n){const s=String(n||"").trim();if(!s)return[];const r=a.testPlanCatalog&&a.testPlanCatalog.dptOptionsById&&typeof a.testPlanCatalog.dptOptionsById=="object"?a.testPlanCatalog.dptOptionsById:{};return Array.isArray(r[s])?r[s]:[]}function zt(n){return String(n||"").trim().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}const jl=[{type:"on",patterns:[/\bturn on\b/g,/\bturn(?:\s+\w+){1,4}\s+on\b/g,/\bswitch on\b/g,/\bswitch(?:\s+\w+){1,4}\s+on\b/g,/\bpower on\b/g,/\bpower(?:\s+\w+){1,4}\s+on\b/g,/\bstart\b/g,/\benable\b/g,/\bactivate\b/g,/\baccendi\b/g,/\battiva\b/g,/\ballume\b/g,/\bactive\b/g,/\beinschalten\b/g,/\baktivieren\b/g,/\benciende\b/g,/\bactivar\b/g,/\bliga\b/g,/\bativa\b/g,/\baan\b/g,/\binschakelen\b/g]},{type:"off",patterns:[/\bturn off\b/g,/\bturn(?:\s+\w+){1,4}\s+off\b/g,/\bswitch off\b/g,/\bswitch(?:\s+\w+){1,4}\s+off\b/g,/\bpower off\b/g,/\bpower(?:\s+\w+){1,4}\s+off\b/g,/\bdisable\b/g,/\bdeactivate\b/g,/\bshutdown\b/g,/\bspegni\b/g,/\bdisattiva\b/g,/\beteins\b/g,/\bdesactive\b/g,/\bausschalten\b/g,/\bdeaktivieren\b/g,/\bapaga\b/g,/\bdesactiva\b/g,/\bdesliga\b/g,/\bdesativa\b/g,/\buit\b/g,/\buitschakelen\b/g]},{type:"open",patterns:[/\bopen\b/g,/\braise\b/g,/\blift\b/g,/\bmove up\b/g,/\bapri\b/g,/\balza\b/g,/\bsolleva\b/g,/\bouvre\b/g,/\bmonte\b/g,/\boffnen\b/g,/\bhoch\b/g,/\bauf\b/g,/\babre\b/g,/\bsube\b/g,/\babrir\b/g,/\bsobe\b/g,/\bopenen\b/g,/\bomhoog\b/g]},{type:"close",patterns:[/\bclose\b/g,/\blower\b/g,/\bmove down\b/g,/\bchiudi\b/g,/\babbassa\b/g,/\bferme\b/g,/\bdescends?\b/g,/\bschliessen\b/g,/\brunter\b/g,/\bzu\b/g,/\bcierra\b/g,/\bbaja\b/g,/\bfechar\b/g,/\bdesce\b/g,/\bsluiten\b/g,/\bomlaag\b/g]},{type:"stop",patterns:[/\bstop\b/g,/\bhalt\b/g,/\bpause\b/g,/\bferma\b/g,/\barresta\b/g,/\barrete\b/g,/\bstoppe\b/g,/\banhalten\b/g,/\bstopp\b/g,/\bdeten\b/g,/\bparar\b/g,/\bpare\b/g,/\bstoppen\b/g]}];function Hl(n){const s=zt(n);if(!s)return"";const r=[];return jl.forEach(c=>{c.patterns.forEach(h=>{h.lastIndex=0;let R;for(;(R=h.exec(s))!==null;)r.push({type:c.type,index:R.index})})}),r.sort((c,h)=>c.index-h.index),r[0]?r[0].type:""}function Xl(n){return["on","open"].includes(String(n||"").trim().toLowerCase())}function ql(n){return["off","close","stop"].includes(String(n||"").trim().toLowerCase())}function wn(n,s,r=""){const c=ia(s);if(!c.length)return String(n??"");const h=String(n??"").trim(),R=zt(h),E=zt(r),z=`${R} ${E}`.trim(),O=Hl(r||z);if(O){if(Xl(O)){const U=c.find(me=>["true","1","100"].includes(String(me.value)));if(U)return String(U.value);const de=c.find(me=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su|einschalten|allume|enciende|liga|aan)\b/.test(zt(me.label)));if(de)return String(de.value)}if(ql(O)){const U=c.find(me=>["false","0"].includes(String(me.value)));if(U)return String(U.value);const de=c.find(me=>/\b(off|close|down|stop|disable|disabled|inactive|chiuso|spento|giu|ausschalten|eteins|apaga|desliga|uit)\b/.test(zt(me.label)));if(de)return String(de.value)}}if(c.some(U=>String(U.value)===h))return h;const Y=c.find(U=>zt(U.label)===R);if(Y)return String(Y.value);const K=c.find(U=>{const de=zt(U.label);return R&&(de.includes(R)||R.includes(de))});if(K)return String(K.value);const pe=/\b(on|open|up|true|1|accendi|attiva|apri|su|acceso|accesa|accesi|accese|aperto|aperta|enabled|enable|start|allume|einschalten|enciende|liga|aan)\b/,se=/\b(off|close|down|false|0|spegni|disattiva|chiudi|giu|spento|spenta|spenti|spente|chiuso|chiusa|disabled|disable|stop|ferma|eteins|ausschalten|apaga|desliga|uit)\b/;if(pe.test(z)){const U=c.find(me=>["true","1","100"].includes(String(me.value)));if(U)return String(U.value);const de=c.find(me=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su)\b/.test(zt(me.label)));if(de)return String(de.value)}if(se.test(z)){const U=c.find(me=>["false","0"].includes(String(me.value)));if(U)return String(U.value);const de=c.find(me=>/\b(off|close|down|stop|disable|disabled|inactive|spento|spenta|chiuso|chiusa|giu)\b/.test(zt(me.label)));if(de)return String(de.value)}return String(c[0].value)}function Rs(n){if(!n)return;const s=ia(n.commandDPT),r=ia(n.statusDPT||n.commandDPT),c=String(n.action||"").trim().toLowerCase();s.length&&(n.commandPayload=wn(n.commandPayload,n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`)),r.length&&(n.expectedPayload=wn(n.expectedPayload,n.statusDPT||n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`))}function Tn(n={}){if(String(n.kind||"").trim().toLowerCase()==="wait")return{id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:"wait",action:"",collapsed:n.collapsed!==!1,title:String(n.title||"Wait"),description:String(n.description||""),reason:String(n.reason||""),delayMs:Number(n.delayMs||n.readDelayMs||1200),commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:0,statusResponseTimeoutMs:0};const r=String(n.commandGA||"").trim()||String(dn.value[0]?.ga||""),c=Lr(r),h=Mr(r),R=c&&c.status?c.status:null,E={id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:String(n.kind||(R?"write_and_verify":"write_only")),action:String(n.action||"").trim().toLowerCase(),collapsed:n.collapsed!==!1,title:String(n.title||(h?`Step ${h.label}`:"Manual Step")),description:String(n.description||""),reason:String(n.reason||""),commandGA:r,commandDPT:String(n.commandDPT||h?.dpt||""),commandPayload:String(n.commandPayload??""),statusGA:String(n.statusGA||R?.ga||""),statusDPT:String(n.statusDPT||R?.dpt||""),expectedPayload:String(n.expectedPayload??n.commandPayload??""),statusWriteTimeoutMs:Number(n.statusWriteTimeoutMs||n.timeoutMs||5e3),statusResponseTimeoutMs:Number(n.statusResponseTimeoutMs||n.timeoutMs||5e3)};return Rs(E),E}function Ns(n){const s=Ft(n,null);return s?(s.steps=(Array.isArray(s.steps)?s.steps:[]).map(r=>Tn(r)),s):null}function Jl(){return Ns({id:"",name:"",description:"",areaId:rt.value?String(rt.value.id||""):"",areaName:rt.value?String(rt.value.path||rt.value.name||""):"",prompt:"",source:"manual",generatedAt:new Date().toISOString(),steps:[]})}function Or(n){if(!n||n.kind==="wait")return;const s=Mr(n.commandGA),r=Ul(n.statusGA),c=Lr(n.commandGA);s&&(n.commandDPT=String(s.dpt||"")),r&&(n.statusDPT=String(r.dpt||"")),c&&c.status&&(!n.statusGA||n.statusGA==="")&&(n.statusGA=String(c.status.ga||""),n.statusDPT=String(c.status.dpt||""),n.kind="write_and_verify"),n.statusGA&&(n.kind="write_and_verify"),n.expectedPayload||(n.expectedPayload=String(n.commandPayload??"")),n.statusGA||(n.statusDPT="",n.kind="write_only"),Rs(n)}function Zl(){if(!a.testPlanDraft)return;const n={id:`step-${Date.now()}-${Math.round(Math.random()*1e3)}`,kind:"write_only",action:"",collapsed:!0,title:"Manual Step",description:"",reason:"",commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:5e3,statusResponseTimeoutMs:5e3};a.testPlanDraft.steps=[...a.testPlanDraft.steps||[],n]}function Yl(){if(!a.testPlanDraft)return;const n=Tn({id:`wait-${(a.testPlanDraft.steps?.length||0)+1}`,kind:"wait",title:"Wait",description:"Pause the test before the next action.",delayMs:1200});a.testPlanDraft.steps=[...a.testPlanDraft.steps||[],n]}function Ql(n){if(!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps))return;const s=a.testPlanDraft.steps[n];if(!s)return;const r=Tn(Object.assign({},s,{id:`${s.id||"step"}-copy`}));a.testPlanDraft.steps.splice(n+1,0,r)}function ed(n){!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)||a.testPlanDraft.steps.splice(n,1)}function td(n){n&&(n.collapsed=n.collapsed!==!0)}function _n(){a.draggedTestPlanStepId="",a.dragOverTestPlanStepId=""}function ad(n,s){const r=String(n||"").trim();r&&(a.draggedTestPlanStepId=r,a.dragOverTestPlanStepId="",s&&s.dataTransfer&&(s.dataTransfer.effectAllowed="move",s.dataTransfer.setData("text/plain",r)))}function sd(n){const s=String(n||"").trim();!s||!a.draggedTestPlanStepId||s===a.draggedTestPlanStepId||(a.dragOverTestPlanStepId=s)}function nd(n,s){if(!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps))return;const r=String(n||"").trim(),c=String(s||"").trim();if(!r||!c||r===c)return;const h=a.testPlanDraft.steps.slice(),R=h.findIndex(O=>String(O&&O.id?O.id:"")===r),E=h.findIndex(O=>String(O&&O.id?O.id:"")===c);if(R===-1||E===-1)return;const[z]=h.splice(R,1);h.splice(E,0,z),a.testPlanDraft.steps=h}function rd(n,s){s&&s.preventDefault();const r=String(a.draggedTestPlanStepId||"").trim(),c=String(n||"").trim();r&&c&&r!==c&&nd(r,c),_n()}function id(){!a.testPlanDraft||a.testPlanRunning||(a.testPlanRunMode="single",a.testPlanRepeatStopRequested=!1,a.testPlanRunConfirmOpen=!0)}function od(){!a.testPlanDraft||a.testPlanRunning||(a.testPlanRunMode="repeat",a.testPlanRepeatStopRequested=!1,a.testPlanRunConfirmOpen=!0)}function zr(){a.testPlanRunConfirmOpen=!1,a.testPlanRunMode="single"}function ld(){a.testPlanRepeatForever===!0&&(a.testPlanRepeatStopRequested=!0,w("Stopping repeat mode after the current cycle..."))}function $r(n=null){const s=n||na.value;s&&(a.testResultFocusMode=!1,a.testPlanSelectedId=String(s.id||""),a.testPlanDraft=Ns(s),a.testPlanPrompt=String(s.prompt||""),a.testPlanGeneration={provider:String(s.source||"saved"),model:"",fallback:!1,error:""},a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,ka())}function Dn(){ct=null,a.testPlanPendingActionLabel=""}function Br(){a.testPlanUnsavedConfirmOpen=!1,Dn()}function Vr(){const n=ct;a.testPlanUnsavedConfirmOpen=!1,Dn(),typeof n=="function"&&n()}function In(n,s="another plan"){if(!Sr.value){n();return}ct=n,a.testPlanPendingActionLabel=String(s||"another plan"),a.testPlanUnsavedConfirmOpen=!0}function dd(n){if(!n||!n.id)return;const s=String(n.id);a.testPlanSelectedId!==s&&In(()=>$r(n),`plan "${n.name||s}"`)}function ud(){Uo(),w("Plan changes discarded")}async function cd(){await Wr()&&Vr()}function Kr(){if(!Ae.value.length){w("Define at least one area before creating a test plan");return}In(()=>{a.activeTab="tests",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanDraft=Jl(),a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.testPlanPrompt="",a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,ka()},"a new plan")}function fd(n){const s=String(n||"").trim();if(!s)return;const r=Ae.value.find(c=>c&&c.id===s);r&&(a.testAreaSelectedId=s,a.testPlanDraft&&(a.testPlanDraft.areaId=s,a.testPlanDraft.areaName=String(r.path||r.name||"")))}function pd(){const n=Ft(a.testPlanDraft||na.value,null);n&&(a.activeTab="tests",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanRunConfirmOpen=!1,a.testPlanGeneration={provider:"duplicated",model:"",fallback:!1,error:""},n.id="",n.name=String(n.name||"Plan Draft").trim()?`${String(n.name||"Plan Draft").trim()} Copy`:"Plan Copy",a.testPlanPrompt=String(n.prompt||a.testPlanPrompt||""),a.testPlanDraft=Ns(n),a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,ka(),w("Plan duplicated"))}async function gd(){const n=rt.value,s=String(a.testPlanPrompt||"").trim(),r=Ml();if(!(!a.selectedNodeId||!n||!s||a.testPlanGenerating)){a.testPlanGenerating=!0,a.testTemplateBuilderFocus=!1,a.showAiPlanner=!1,a.testResultFocusMode=!1,a.testPlanGenerationError="",w("Building test plan...");try{const c=await k(D("test-plans/generate"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id,prompt:s,language:r})});a.testPlanDraft=c&&c.plan?Ns(c.plan):null,a.testPlanCatalog=c&&c.catalog?c.catalog:a.testPlanCatalog,a.testPlanGeneration=c&&c.generation?c.generation:null,a.testPlanGenerationError="",a.testPlanSelectedId="",a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!1,c&&c.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:c.testPlans})),ka(),w("Test plan ready")}catch(c){const h=c.message||"Failed to build the test plan";a.lastError=h,a.testPlanGenerationError=h,a.testPlanGeneration={provider:"",model:"",fallback:!1,error:h},w(h)}finally{a.testPlanGenerating=!1}}}async function Wr(){if(!a.selectedNodeId||!a.testPlanDraft||a.testPlanSaving)return!1;a.testPlanSaving=!0,w("Saving test plan...");try{const n=await k(D("test-plans/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,plan:Object.assign({},a.testPlanDraft,{prompt:a.testPlanPrompt})})});return n&&n.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:n.testPlans})),n&&n.planId&&(a.testPlanSelectedId=n.planId),n&&n.planId&&a.testPlanDraft&&(a.testPlanDraft.id=n.planId),a.testPlanRunConfirmOpen=!1,ka(),w("Test plan saved"),!0}catch(n){return a.lastError=n.message||"Failed to save test plan",w(a.lastError),!1}finally{a.testPlanSaving=!1}}async function hd(){const n=na.value;if(!(!n||!a.selectedNodeId||a.testPlanDeleting)){a.testPlanDeleting=!0,w("Deleting test plan...");try{const s=await k(D("test-plans/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,planId:n.id})});s&&s.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:s.testPlans})),a.testPlanDraft=null,a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,ka(),w("Test plan deleted")}catch(s){a.lastError=s.message||"Failed to delete test plan",w(a.lastError)}finally{a.testPlanDeleting=!1}}}async function md(n="single"){if(!a.selectedNodeId||!a.testPlanDraft||a.testPlanRunning)return;const r=String(n||a.testPlanRunMode||"single").trim().toLowerCase()==="repeat";a.testPlanRunning=!0,a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,a.testPlanRepeatForever=r,a.testPlanRepeatStopRequested=!1,a.testPlanRunningStepId="",a.testPlanRunConfirmOpen=!1,a.lastError="",w(r?"Running test plan in repeat mode...":"Running test plan...");try{const c=JSON.parse(JSON.stringify(Object.assign({},a.testPlanDraft,{prompt:a.testPlanPrompt}))),h=Array.isArray(c.steps)?c.steps:[];if(!c.areaId)throw new Error("Missing areaId in test plan");if(!h.length)throw new Error("The test plan has no executable steps");let R=rt.value,E=0;do{E+=1;const z=`${c.id||"plan"}:${Date.now()}`,O=[];a.liveTestResultId=z,a.testResultsMenuOpen=!0,Is(z,{openMenu:!0,activateResultsTab:!0,resultOnly:!0}),a.stateData=Object.assign({},a.stateData||{},{testPlanReport:hn({plan:c,area:R,stepResults:[],reportId:z})});try{await vl(c.name||"Test plan",c.description||"")}catch{}for(let K=0;K<h.length;K+=1){const pe=h[K];a.testPlanRunningStepId=pe&&pe.id?pe.id:"";const se=r?`Cycle ${E} · `:"";w(`${se}Step ${K+1}/${h.length}: ${pe&&pe.title?pe.title:"Running..."}`);try{await ml(pe||{title:`Step ${K+1}`},K+1)}catch{w(`Voice unavailable for step ${K+1}. Continuing test...`)}try{const U=await k(D("test-plans/run-step"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:c.areaId,step:pe})});U&&U.area&&(R=U.area),O.push(U&&U.stepResult?U.stepResult:_r(pe,new Error("Step returned no result")))}catch(U){O.push(_r(pe,U))}a.stateData=Object.assign({},a.stateData||{},{testPlanReport:hn({plan:c,area:R,stepResults:O.slice(),reportId:z})})}const Y=hn({plan:c,area:R,stepResults:O,reportId:z});a.stateData=Object.assign({},a.stateData||{},{testPlans:vt.value,testPlanReport:Y}),Is(z,{openMenu:!0,activateResultsTab:!0,resultOnly:!0});try{await Rl(Y)}catch(K){a.lastError=K.message||"Failed to save test result",w(`Test completed, but the result was not saved: ${a.lastError}`)}r&&a.testPlanRepeatStopRequested!==!0&&(a.testResultFocusMode=!1,w(`Cycle ${E} completed. Starting the next cycle...`))}while(r&&a.testPlanRepeatStopRequested!==!0);a.testPlanRunConfirmOpen=!1,a.lastError||w(r?"Repeat mode stopped":"Test completed"),requestAnimationFrame(()=>{try{mt.value&&typeof mt.value.scrollIntoView=="function"&&mt.value.scrollIntoView({behavior:"smooth",block:"start"})}catch{}})}catch(c){a.lastError=c.message||"Failed to run test plan",w(a.lastError)}finally{a.testPlanRunningStepId="",Et(),a.testPlanRunning=!1,a.testPlanRepeatForever=!1,a.testPlanRepeatStopRequested=!1,a.testPlanRunMode="single"}}async function vd(){if(a.selectedNodeId){w("Exporting config...");try{const n=await k(D("config/export"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId})}),s=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),r=window.URL.createObjectURL(s),c=document.createElement("a");c.href=r,c.download=`knx-ai-config-${a.selectedNodeId}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(r),w("Config exported")}catch(n){a.lastError=n.message||"Failed to export config",w(a.lastError)}}}function bd(){Ct.value&&Ct.value.click()}async function yd(n){const s=n&&n.target&&n.target.files&&n.target.files[0]?n.target.files[0]:null;if(!(!s||!a.selectedNodeId)){w("Importing config...");try{const r=await s.text(),c=JSON.parse(r),h=await k(D("config/import"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,config:c})});a.stateData=Object.assign({},a.stateData||{},{areas:h.areas||ba.value,profiles:h.profiles||ya.value,actuatorTests:h.actuatorTests||Aa.value,testPlans:h.testPlans||vt.value,testResults:h.testResults||Ja.value}),await Ea(),w("Config imported")}catch(r){a.lastError=r.message||"Failed to import config",w(a.lastError)}finally{n&&n.target&&(n.target.value="")}}}function Ad(){a.pollStateHandle||(a.pollStateHandle=window.setInterval(()=>{a.autoRefresh&&Ot({fresh:!1})},1500)),a.pollNodesHandle||(a.pollNodesHandle=window.setInterval(()=>{yn({preserveSelection:!0})},15e3))}function Sd(){a.pollStateHandle&&(window.clearInterval(a.pollStateHandle),a.pollStateHandle=null),a.pollNodesHandle&&(window.clearInterval(a.pollNodesHandle),a.pollNodesHandle=null)}return mo(async()=>{f.value=Z(),Gt(),window.addEventListener("resize",Gt),document.addEventListener("keydown",Ha),document.addEventListener("fullscreenchange",N),await yn({preserveSelection:!1}),await Ot({fresh:!0}),await Ea(),Ad(),at()}),vo(()=>{window.removeEventListener("resize",Gt),document.removeEventListener("keydown",Ha),document.removeEventListener("fullscreenchange",N),dt(),Sd(),Et()}),(n,s)=>(v(),b(H,null,[l("header",ef,[s[42]||(s[42]=l("div",{class:"m-header-brand"},[l("span",{class:"m-logo-mark"},"K"),l("span",{class:"hb-logo-text-mobile"},"KNX AI")],-1)),l("button",{class:ce(["hamburger-icon",{"hamburger-icon-cross":De.value}]),type:"button","aria-expanded":De.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle menu",onClick:ga},[...s[41]||(s[41]=[l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1)])],10,tf)]),st.value&&De.value?(v(),b("button",{key:0,class:"sidebar-overlay",type:"button","aria-label":"Close menu",onClick:ha})):G("",!0),l("div",{class:ce(["page-shell",{"sidebar-collapsed":!De.value,"sidebar-mobile-open":st.value&&De.value}])},[l("aside",af,[l("div",sf,[s[43]||(s[43]=l("div",{class:"sidebar-brand-mark","aria-hidden":"true"},"K",-1)),s[44]||(s[44]=l("div",{class:"sidebar-brand"},[l("p",{class:"eyebrow"},"KNX Ultimate")],-1)),l("button",{class:"sidebar-collapse-toggle",type:"button","aria-expanded":De.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle sidebar",onClick:ga},[l("span",rf,S(De.value?st.value?"×":"‹":"›"),1)],8,nf)]),l("nav",of,[l("button",{class:ce(["tab-button",{active:a.activeTab==="overview"}]),type:"button",title:"Overview","aria-label":"Overview",onClick:s[0]||(s[0]=r=>xa("overview"))},[...s[45]||(s[45]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M3 10.8 12 3l9 7.8v9.2a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Overview</span></span>',2)])],2),l("button",{class:ce(["tab-button",{active:a.activeTab==="areas"}]),type:"button",title:"Areas","aria-label":"Areas",onClick:s[1]||(s[1]=r=>xa("areas"))},[...s[46]||(s[46]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M3 3h8v8H3zm10 0h8v8h-8zM3 13h8v8H3zm10 0h8v8h-8z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Areas</span></span>',2)])],2),l("button",{class:ce(["tab-button sidebar-nav-child",{active:a.activeTab==="tests"}]),type:"button",title:"Tests","aria-label":"Tests",disabled:!Ae.value.length,onClick:s[2]||(s[2]=r=>xa("tests"))},[...s[47]||(s[47]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M9 3h6v2h-1v4.3l5.5 8.8A2 2 0 0 1 17.8 21H6.2a2 2 0 0 1-1.7-2.9L10 9.3V5H9zm1.9 8.2L6.9 18h10.2l-4-6.8z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Tests</span></span>',2)])],10,lf),l("button",{class:ce(["tab-button sidebar-nav-child",{active:a.activeTab==="results"}]),type:"button",title:"Test Results","aria-label":"Test Results",onClick:s[3]||(s[3]=r=>xa("results"))},[...s[48]||(s[48]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M4 4h16v4H4zm0 6h16v4H4zm0 6h16v4H4z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Test Results</span></span>',2)])],2),l("button",{class:ce(["tab-button",{active:a.activeTab==="assistant"}]),type:"button",title:"Assistant","aria-label":"Assistant",onClick:s[4]||(s[4]=r=>xa("assistant"))},[...s[49]||(s[49]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M4 5h16a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-5 4v-4H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Assistant</span></span>',2)])],2),l("button",{class:ce(["tab-button",{active:a.activeTab==="settings"}]),type:"button",title:"Settings","aria-label":"Settings",onClick:s[5]||(s[5]=r=>xa("settings"))},[...s[50]||(s[50]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-d23f4b5c><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-d23f4b5c><path d="M19.14 12.94a7.43 7.43 0 0 0 .05-.94 7.43 7.43 0 0 0-.05-.94l2.03-1.58a.5.5 0 0 0 .12-.64l-1.92-3.32a.5.5 0 0 0-.6-.22l-2.39.96a7.18 7.18 0 0 0-1.63-.94l-.36-2.54A.5.5 0 0 0 13.9 2h-3.8a.5.5 0 0 0-.49.42l-.36 2.54a7.18 7.18 0 0 0-1.63.94l-2.39-.96a.5.5 0 0 0-.6.22L2.71 8.48a.5.5 0 0 0 .12.64l2.03 1.58a7.43 7.43 0 0 0-.05.94 7.43 7.43 0 0 0 .05.94l-2.03 1.58a.5.5 0 0 0-.12.64l1.92 3.32a.5.5 0 0 0 .6.22l2.39-.96c.5.39 1.04.71 1.63.94l.36 2.54a.5.5 0 0 0 .49.42h3.8a.5.5 0 0 0 .49-.42l.36-2.54c.59-.23 1.13-.55 1.63-.94l2.39.96a.5.5 0 0 0 .6-.22l1.92-3.32a.5.5 0 0 0-.12-.64zM12 15.2A3.2 3.2 0 1 1 12 8.8a3.2 3.2 0 0 1 0 6.4z" data-v-d23f4b5c></path></svg></span><span class="sidebar-nav-copy" data-v-d23f4b5c><span class="sidebar-nav-title" data-v-d23f4b5c>Settings</span></span>',2)])],2)]),De.value?(v(),b("div",df,[l("button",{class:"primary-button sidebar-action-button",type:"button",disabled:a.loadingNodes||a.loadingState,onClick:yl}," Refresh ",8,uf),l("div",{class:"support-link-row"},[l("a",{class:"secondary-button support-link-button",href:Gb,target:"_blank",rel:"noopener noreferrer"}," Donate via PayPal "),l("a",{class:"secondary-button support-link-button support-link-button-youtube",href:Fb,target:"_blank",rel:"noopener noreferrer"}," Subscribe ")])])):G("",!0),De.value?(v(),b("div",cf,[l("span",{class:ce(["status-pill",{error:!!a.lastError}])},[a.loadingNodes||a.loadingState||a.areaLlmRegenerating||a.areaLlmBulkDeleting||a.areaLlmBusy||a.testPlanGenerating||a.asking?(v(),b("span",ff)):G("",!0),l("span",null,S(a.status),1)],2),ws.value?(v(),b("span",pf,"Provider: "+S(ws.value.llmProvider||"n/a")+" | Model: "+S(ws.value.llmModel||"n/a"),1)):G("",!0),l("a",{class:"sidebar-doc-link",href:Eb,target:"_blank",rel:"noopener noreferrer"}," Documentation: KNX AI Vue ")])):G("",!0)]),l("section",gf,[l("main",hf,[a.activeTab==="overview"?(v(),b("section",mf,[l("div",vf,[s[51]||(s[51]=l("h2",null,"Summary",-1)),Ee.value.meta?.generatedAt?(v(),b("span",bf,S(xe(Ee.value.meta.generatedAt)),1)):G("",!0)]),l("pre",yf,S(il.value),1),l("div",Af,[l("article",Sf,[s[52]||(s[52]=l("span",null,"Telegrams",-1)),l("strong",null,S(Number(Ee.value.counters?.telegrams||0)),1)]),l("article",Pf,[s[53]||(s[53]=l("span",null,"Rate",-1)),l("strong",null,S(Number(Ee.value.counters?.overallRatePerSec||0))+"/s",1)]),l("article",wf,[s[54]||(s[54]=l("span",null,"Repeat",-1)),l("strong",null,S(Number(Ee.value.counters?.repeated||0)),1)]),l("article",Tf,[s[55]||(s[55]=l("span",null,"Unknown DPT",-1)),l("strong",null,S(Number(Ee.value.counters?.unknownDpt||0)),1)])])])):G("",!0),a.activeTab==="areas"?(v(),b("section",_f,[l("div",Df,[s[56]||(s[56]=l("h2",null,"Select an Area",-1)),l("div",If,[l("span",Rf,S(Number(qa.value.suggestedAreaCount||0))+" areas",1),l("button",{class:"secondary-button",type:"button",disabled:a.areaLlmRegenerating||a.areaLlmBulkDeleting||!aa.value.llmEnabled,onClick:Bl},[a.areaLlmRegenerating?(v(),b("span",Cf)):G("",!0),l("span",null,S(a.areaLlmRegenerating?"Regenerating...":"Regenerate AI Areas"),1)],8,Nf),l("button",{class:"danger-button",type:"button",disabled:a.areaLlmRegenerating||a.areaLlmBulkDeleting||gr.value<=0,onClick:Vl},[a.areaLlmBulkDeleting?(v(),b("span",xf)):G("",!0),l("span",null,S(a.areaLlmBulkDeleting?"Deleting...":"Delete AI Areas"),1)],8,kf),l("button",{class:"secondary-button new-button",type:"button",onClick:$l}," New Area ")])]),a.areaLlmError?(v(),b("p",Ef,S(a.areaLlmError),1)):G("",!0),l("div",Gf,[l("div",Ff,[l("span",Lf,"GA "+S(Number(qa.value.gaCount||0)),1),l("span",Mf,"Hierarchical "+S(Number(qa.value.hierarchicalGaCount||0)),1),l("span",Of,"Secondary "+S(Number(qa.value.secondaryGroupCount||0)),1),l("span",zf,"Active "+S(Number(qa.value.activeAreaCount||0)),1)])]),ln.value.length||a.areaDraftIsNew?(v(),b("div",$f,[!Ge.value&&!a.areaDraftIsNew?(v(),b("div",Bf,[l("label",Vf,[s[57]||(s[57]=l("span",null,"Areas",-1)),l("div",Kf,[ge(l("input",{"onUpdate:modelValue":s[6]||(s[6]=r=>a.areaSearch=r),class:"area-search-select-input",type:"text",placeholder:Ge.value?Gr(Ge.value):"Search area...",onFocus:s[7]||(s[7]=r=>a.areaSearchOpen=!0),onInput:s[8]||(s[8]=r=>a.areaSearchOpen=!0),onBlur:Gl},null,40,Wf),[[ke,a.areaSearch]]),a.areaSearchOpen&&ln.value.length?(v(),b("div",Uf,[(v(!0),b(H,null,ne(ln.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ce(["area-search-select-option",{active:Ge.value&&Ge.value.id===r.id}]),onMousedown:Wt(c=>El(r),["prevent"])},S(Gr(r)),43,jf))),128))])):G("",!0)])])])):G("",!0),Ge.value||a.areaDraftIsNew?(v(),b("article",{key:1,class:ce(["area-detail",{"area-detail-wide":a.areaDraftIsNew}])},[l("div",Hf,[a.areaBuilderFocus!==!0?(v(),b("div",Xf,[s[58]||(s[58]=l("div",null,[l("h4",null,"Edit Area"),l("p",{class:"area-detail-subhead"},"The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.")],-1)),l("div",qf,[a.areaDraftIsNew&&!Ar.value?(v(),b("button",{key:0,class:"secondary-button",type:"button",onClick:wl}," Show AI Area Builder ")):G("",!0),a.areaDraftIsNew?G("",!0):(v(),b("button",{key:1,class:"danger-button",type:"button",disabled:a.areaSaving,onClick:kl}," Delete Area ",8,Jf)),l("button",{class:"secondary-button",type:"button",disabled:a.areaSaving,onClick:Cl}," Reset ",8,Zf),l("button",{class:"primary-button",type:"button",disabled:a.areaSaving,onClick:Nl},S(a.areaSaving?"Saving...":"Save Area"),9,Yf),l("button",{class:"secondary-button",type:"button",disabled:a.areaSaving,onClick:_l}," Close ",8,Qf)])])):G("",!0),a.areaBuilderFocus!==!0?(v(),b("div",ep,[l("label",tp,[s[59]||(s[59]=l("span",null,"Area name",-1)),ge(l("input",{"onUpdate:modelValue":s[9]||(s[9]=r=>a.areaDraftName=r),type:"text",placeholder:"Installer alias"},null,512),[[ke,a.areaDraftName]])]),l("label",ap,[s[60]||(s[60]=l("span",null,"Description",-1)),ge(l("textarea",{"onUpdate:modelValue":s[10]||(s[10]=r=>a.areaDraftDescription=r),rows:"3",placeholder:"Optional note for diagnostics and reports"},null,512),[[ke,a.areaDraftDescription]])]),l("label",sp,[s[61]||(s[61]=l("span",null,"Add group addresses to this area",-1)),ge(l("input",{"onUpdate:modelValue":s[11]||(s[11]=r=>a.gaCatalogSearch=r),type:"text",placeholder:"Search GA, label or ETS path"},null,512),[[ke,a.gaCatalogSearch]])])])):G("",!0),a.areaDraftIsNew&&Ar.value?(v(),b("div",np,[l("div",{class:ce(["ai-planner-shell-head",{"template-builder-focus-head":a.areaBuilderFocus===!0}])},[s[62]||(s[62]=l("div",null,[l("h4",null,"AI Area Builder"),l("p",{class:"area-detail-subhead"},"Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.")],-1)),a.areaBuilderFocus===!0?(v(),b("div",rp,[l("button",{class:"secondary-button",type:"button",onClick:Tl}," Close ")])):G("",!0)],2),l("div",ip,[l("label",op,[s[63]||(s[63]=l("span",null,"Assistant prompt",-1)),ge(l("textarea",{"onUpdate:modelValue":s[12]||(s[12]=r=>a.areaLlmPrompt=r),rows:"3",placeholder:"Example: Add all technical room lighting command and status GA."},null,512),[[ke,a.areaLlmPrompt]])])]),l("div",lp,[l("button",{class:"primary-button",type:"button",disabled:a.areaLlmBusy||!a.areaLlmPrompt.trim()||!aa.value.llmEnabled,onClick:Kl},[a.areaLlmBusy?(v(),b("span",up)):G("",!0),ue(" "+S(a.areaLlmBusy?"Suggesting...":"Suggest GA with AI"),1)],8,dp)]),a.areaLlmError?(v(),b("p",cp,S(a.areaLlmError),1)):G("",!0),aa.value.llmEnabled?G("",!0):(v(),b("p",fp," Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft. "))])):G("",!0),a.areaBuilderFocus!==!0?(v(),b("div",pp,[l("div",null,[s[65]||(s[65]=l("h4",null,"Area GA membership",-1)),br.value.length?(v(),b("ul",gp,[(v(!0),b(H,null,ne(br.value,r=>(v(),b("li",{key:r.ga,class:"area-ga-item"},[l("div",hp,[l("strong",null,S(r.ga),1),l("span",null,[ue(S(r.label||"Unlabeled GA"),1),r.dpt?(v(),b("span",mp," | DPT "+S(r.dpt),1)):G("",!0)]),l("span",null,[ue("Role "+S(Er(r.role)),1),r.roleSource?(v(),b("span",vp," | source "+S(r.roleSource),1)):G("",!0)])]),l("div",bp,[l("label",yp,[s[64]||(s[64]=l("span",null,"Role",-1)),l("select",{value:r.roleOverride&&r.roleOverride!=="auto"?r.roleOverride:r.role||"neutral",disabled:a.areaGaRoleSavingGa===r.ga,onChange:c=>zl(r.ga,c.target.value)},[(v(),b(H,null,ne(o,c=>l("option",{key:c.value,value:c.value},S(c.label),9,Sp)),64))],40,Ap)]),l("button",{class:"secondary-button",type:"button",onClick:c=>Ol(r.ga)}," Remove ",8,Pp)])]))),128))])):(v(),b("p",wp,"No GA selected for this area yet."))]),l("div",null,[l("div",Tp,[s[66]||(s[66]=l("div",null,[l("h4",null,"Available GA"),l("p",{class:"area-detail-subhead"},"Pick from the ETS catalog. Already selected GA are hidden from this list.")],-1)),l("span",_p,S(a.gaCatalogLoading?"Loading...":`${vr.value.length} visible`),1)]),l("div",Dp,[(v(!0),b(H,null,ne(vr.value,r=>(v(),b("button",{key:r.ga,type:"button",class:"area-list-item",onClick:c=>xl(r.ga)},[l("span",Rp,S(r.ga),1),l("span",Np,S(r.label||"Unlabeled GA"),1),l("span",Cp,[ue(S(r.hierarchyPath||r.dpt||""),1),r.role?(v(),b("span",kp," | "+S(Er(r.role)),1)):G("",!0)])],8,Ip))),128))])])])):G("",!0),a.areaBuilderFocus!==!0?(v(),b("p",xp,[s[67]||(s[67]=ue(" Original ETS path: ",-1)),l("strong",null,S(a.areaDraftIsNew?"Manual area":Ge.value.basePath||Ge.value.path||Ge.value.name),1)])):G("",!0)])],2)):G("",!0)])):(v(),b("p",Ep,"No areas matched the current search or the ETS file does not expose a usable hierarchy yet."))])):G("",!0),a.activeTab==="tests"?(v(),b("section",{key:2,class:ce(["card card-profiles",{"card-results-focus":bt.value}])},[l("div",Gp,[l("div",null,[l("h2",null,S(bt.value?"Test Result":"Test Planner"),1),l("p",Fp,S(bt.value?"Showing only the selected test report.":"Select an area, choose a standard test template, review the generated plan, then save or run it."),1)]),bt.value?(v(),b("div",$p,[l("span",Bp,S(Za(ae.value)),1),l("button",{class:"danger-button",type:"button",disabled:!ae.value||a.deletingTestResultId===ae.value.id,onClick:s[13]||(s[13]=r=>Sn(ae.value?.id))},S(a.deletingTestResultId===ae.value?.id?"Deleting...":"Delete"),9,Vp),l("button",{class:"secondary-button",type:"button",onClick:kr}," Open Source Test ")])):(v(),b("div",Lp,[l("span",Mp,"Area "+S(rt.value?rt.value.path||rt.value.name:"n/a"),1),l("span",Op,S(vt.value.length)+" saved plans",1),l("button",{class:"secondary-button",type:"button",disabled:!a.testPlanDraft,onClick:pd}," Duplicate Plan ",8,zp),l("button",{class:"secondary-button new-button",type:"button",onClick:Kr}," New Plan ")]))]),l("div",{class:ce(["profiles-layout test-planner-layout",{"result-only-layout":bt.value}])},[l("div",Kp,[!bt.value&&!a.testPlanDraft&&!a.testPlanRunning?(v(),b("article",Wp,[s[69]||(s[69]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select test plan"),l("p",{class:"area-detail-subhead"},"Reusable deterministic active tests saved by the installer.")])],-1)),l("div",Up,[l("label",jp,[s[68]||(s[68]=l("span",null,"Plans",-1)),l("div",Hp,[ge(l("input",{"onUpdate:modelValue":s[14]||(s[14]=r=>a.testPlanSearch=r),class:"area-search-select-input",type:"text",placeholder:na.value?Fr(na.value):"Search saved plan...",onFocus:s[15]||(s[15]=r=>a.testPlanSearchOpen=!0),onInput:s[16]||(s[16]=r=>a.testPlanSearchOpen=!0),onBlur:Ll},null,40,Xp),[[ke,a.testPlanSearch]]),a.testPlanSearchOpen&&hr.value.length?(v(),b("div",qp,[(v(!0),b(H,null,ne(hr.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:ce(["area-search-select-option",{active:na.value&&na.value.id===r.id}]),onMousedown:Wt(c=>Fl(r),["prevent"])},S(Fr(r)),43,Jp))),128))])):G("",!0)])])]),vt.value.length?G("",!0):(v(),b("p",Zp,"No saved plans yet."))])):G("",!0),!bt.value&&a.testPlanDraft?(v(),b("article",Yp,[a.testTemplateBuilderFocus!==!0?(v(),b("div",Qp,[l("div",null,[l("h3",null,S(a.testPlanDraft?.name||"Plan Draft"),1),un.value?(v(),b("p",eg,"Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.")):G("",!0)]),l("div",tg,[Sr.value?(v(),b("span",ag,"Unsaved changes")):G("",!0),l("button",{class:"secondary-button new-button",type:"button",onClick:Kr}," New Plan "),un.value?G("",!0):(v(),b("button",{key:1,class:"secondary-button",type:"button",onClick:Sl}," Show Template Builder ")),l("label",sg,[ge(l("input",{"onUpdate:modelValue":s[17]||(s[17]=r=>a.voiceEnabled=r),type:"checkbox"},null,512),[[On,a.voiceEnabled]]),s[70]||(s[70]=l("span",null,"Voice",-1))]),l("button",{class:"danger-button",type:"button",disabled:a.testPlanDeleting||!na.value,onClick:hd},S(a.testPlanDeleting?"Deleting...":"Delete"),9,ng),l("button",{class:"secondary-button",type:"button",disabled:a.testPlanSaving||a.testPlanRunning,onClick:Il}," Close ",8,rg),l("button",{class:"secondary-button",type:"button",disabled:a.testPlanSaving||!a.testPlanDraft,onClick:Wr},S(a.testPlanSaving?"Saving...":"Save Plan"),9,ig),al.value?(v(),b("div",og,[l("button",{class:"secondary-button",type:"button",disabled:!a.testPlanDraft&&a.testPlanRepeatForever!==!0||a.testPlanRunning&&a.testPlanRepeatForever!==!0||a.testPlanRepeatStopRequested===!0,onClick:s[18]||(s[18]=r=>a.testPlanRepeatForever===!0?ld():od())},S(a.testPlanRepeatForever===!0?a.testPlanRepeatStopRequested===!0?"Stopping...":"Stop Repeat":"Repeat Forever"),9,lg),l("button",{class:"primary-button",type:"button",disabled:a.testPlanRunning||!a.testPlanDraft,onClick:id},[a.testPlanRunning?(v(),b("span",ug)):G("",!0),l("span",null,S(a.testPlanRunning?"Running...":"Run Plan"),1)],8,dg)])):G("",!0)])])):G("",!0),un.value?(v(),b("div",cg,[l("div",{class:ce(["ai-planner-shell-head",{"template-builder-focus-head":a.testTemplateBuilderFocus===!0}])},[s[71]||(s[71]=l("div",null,[l("h4",null,"Template Builder"),l("p",{class:"area-detail-subhead"},"Select one of the standard templates. The plan is built only from the command GA available in the selected area.")],-1)),a.testTemplateBuilderFocus===!0?(v(),b("div",fg,[l("button",{class:"secondary-button",type:"button",onClick:Pl}," Close ")])):G("",!0)],2),l("div",pg,[l("label",gg,[s[72]||(s[72]=l("span",null,"Area to test",-1)),ge(l("select",{"onUpdate:modelValue":s[19]||(s[19]=r=>a.testAreaSelectedId=r)},[(v(!0),b(H,null,ne(Ae.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,hg))),128))],512),[[Ta,a.testAreaSelectedId]])]),l("label",mg,[s[73]||(s[73]=l("span",null,"Selected template",-1)),l("textarea",{value:a.testPlanPrompt||"Select one of the templates below.",rows:"4",readonly:""},null,8,vg)])]),l("div",bg,[(v(),b(H,null,ne(i,r=>l("button",{key:r.id,class:ce(["preset-button",{active:a.testPlanPrompt===r.prompt}]),type:"button",onClick:c=>Wl(r)},S(r.title),11,yg)),64))]),l("p",Ag,S((i.find(r=>r.prompt===a.testPlanPrompt)||{}).description||"Choose a template to see what the deterministic builder will do in the selected area."),1),l("div",Sg,[l("button",{class:"primary-button",type:"button",disabled:a.testPlanGenerating||!rt.value||!a.testPlanPrompt.trim(),onClick:gd},[a.testPlanGenerating?(v(),b("span",wg)):G("",!0),ue(" "+S(a.testPlanGenerating?"Building...":"Build Test Plan"),1)],8,Pg)]),a.testPlanGenerationError?(v(),b("p",Tg,S(a.testPlanGenerationError),1)):G("",!0),a.testPlanGeneration?(v(),b("div",_g,[a.testPlanGeneration.error?G("",!0):(v(),b("p",Dg," Built with "+S(a.testPlanGeneration.provider||"deterministic builder")+". ",1)),a.testPlanGeneration.error?(v(),b("p",Ig,S(a.testPlanGeneration.error),1)):G("",!0)])):G("",!0)])):G("",!0)])):G("",!0),a.testPlanRunning&&!bt.value?(v(),b("article",Rg,[l("div",Ng,[l("div",null,[s[74]||(s[74]=l("h3",{class:"running-headline"},[l("span",{class:"running-spinner","aria-hidden":"true"}),l("span",null,"Test Running")],-1)),l("p",Cg,S(Ce.value?.title||"Executing current step..."),1)]),l("span",kg,S(ft.value?.metrics?.totalSteps?`${Number(ft.value.steps?.length||0)}/${Number(ft.value.metrics.totalSteps||0)}`:"in progress"),1)]),l("div",xg,[l("article",Eg,[s[75]||(s[75]=l("span",null,"Completed",-1)),l("strong",null,S(Number(ft.value?.steps?.length||0)),1)]),l("article",Gg,[s[76]||(s[76]=l("span",null,"Pass",-1)),l("strong",null,S(Number(ft.value?.metrics?.pass||0)),1)]),l("article",Fg,[s[77]||(s[77]=l("span",null,"Warn",-1)),l("strong",null,S(Number(ft.value?.metrics?.warn||0)),1)]),l("article",Lg,[s[78]||(s[78]=l("span",null,"Fail",-1)),l("strong",null,S(Number(ft.value?.metrics?.fail||0)),1)])]),Ce.value?(v(),b("div",Mg,[l("div",Og,[l("strong",null,S(Ce.value.title||Ce.value.id),1),l("span",null,S(Ce.value.kind),1)]),l("p",zg,S(Ce.value.description||"Current step in execution."),1),Ce.value.kind==="wait"?(v(),b("div",$g,[l("span",null,[s[79]||(s[79]=l("strong",null,"Wait",-1)),ue(" "+S(Number(Ce.value.delayMs||0))+" ms",1)]),l("span",null,[s[80]||(s[80]=l("strong",null,"Reason",-1)),ue(" "+S(Ce.value.reason||"Pause before next action"),1)])])):(v(),b("div",Bg,[l("span",null,[s[81]||(s[81]=l("strong",null,"Command",-1)),ue(" "+S(Ce.value.commandGA||"n/a"),1)]),l("span",null,[s[82]||(s[82]=l("strong",null,"Status GA",-1)),ue(" "+S(Ce.value.statusGA||"n/a"),1)]),l("span",null,[s[83]||(s[83]=l("strong",null,"Payload",-1)),ue(" "+S(vn(Ce.value.commandPayload,Ce.value.commandDPT)),1)]),l("span",null,[s[84]||(s[84]=l("strong",null,"Expected",-1)),ue(" "+S(vn(Ce.value.expectedPayload,Ce.value.statusDPT||Ce.value.commandDPT)),1)])])),Ce.value.kind!=="wait"&&Ce.value.statusGA?(v(),b("div",Vg,[l("section",Kg,[s[87]||(s[87]=l("h4",null,"Spontaneous Write From Status GA",-1)),l("div",Wg,[l("span",null,[s[85]||(s[85]=l("strong",null,"Status GA",-1)),ue(" "+S(Ce.value.statusGA||"n/a"),1)]),l("span",null,[s[86]||(s[86]=l("strong",null,"Timeout",-1)),ue(" "+S(Number(Ce.value.statusWriteTimeoutMs||0))+" ms",1)])])]),l("section",Ug,[s[90]||(s[90]=l("h4",null,"Active Read Request To Status GA",-1)),l("div",jg,[l("span",null,[s[88]||(s[88]=l("strong",null,"Status GA",-1)),ue(" "+S(Ce.value.statusGA||"n/a"),1)]),l("span",null,[s[89]||(s[89]=l("strong",null,"Timeout",-1)),ue(" "+S(Number(Ce.value.statusResponseTimeoutMs||0))+" ms",1)])])])])):G("",!0)])):G("",!0)])):G("",!0),ae.value&&bt.value?(v(),b("article",{key:3,ref_key:"testPlanReportRef",ref:mt,class:"area-detail"},[l("div",Hg,[l("div",null,[l("h3",null,S(_s(ae.value)),1),l("p",Xg,S(Ds(ae.value)||xe(ae.value.generatedAt)),1)]),l("div",qg,[l("span",Jg,S(Za(ae.value)),1),ae.value.live===!0?(v(),b("span",Zg,[...s[91]||(s[91]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",Yg,S(ae.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Tr}," Export PDF ")])]),l("div",Qg,[(v(!0),b(H,null,ne(mn(ae.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",eh,[(v(!0),b(H,null,ne(Ya(ae.value),r=>(v(),b("article",{key:r.id,class:ce(["report-check",`report-${r.status}`])},[l("div",th,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",ah,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",sh,[(v(!0),b(H,null,ne(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",nh,[(v(!0),b(H,null,ne(c.items,h=>(v(),b("span",{key:`${r.id}-${c.title}-${h.label}`},[l("strong",null,S(h.label),1),ue(" "+S(h.value),1)]))),128))])]))),128))])):(v(),b("div",rh,[(v(!0),b(H,null,ne(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),ue(" "+S(c.value),1)]))),128))]))],2))),128))]),Ya(ae.value).length?G("",!0):(v(),b("p",ih,"No detailed entries stored for this report yet.")),Qa(ae.value).length?(v(),b("div",oh,[s[92]||(s[92]=l("h4",null,"Suggestions",-1)),l("ul",lh,[(v(!0),b(H,null,ne(Qa(ae.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):G("",!0),a.testPlanDraft&&!a.testPlanRunning&&!bt.value&&a.testTemplateBuilderFocus!==!0?(v(),b("article",dh,[l("div",uh,[l("div",null,[l("h3",ch,[s[93]||(s[93]=l("span",null,"Edit Plan",-1)),a.testPlanGenerating?(v(),b("span",fh)):G("",!0)])]),l("div",ph,[l("span",gh,S(Number(a.testPlanDraft.steps?.length||0))+" steps",1),l("button",{class:"secondary-button",type:"button",onClick:Zl}," Add Step "),l("button",{class:"secondary-button",type:"button",onClick:Yl}," Add Wait ")])]),l("div",hh,[l("label",mh,[s[95]||(s[95]=l("span",null,"Area",-1)),l("select",{value:a.testPlanDraft.areaId||a.testAreaSelectedId||"",disabled:!Ae.value.length,onChange:s[20]||(s[20]=r=>fd(r.target.value))},[s[94]||(s[94]=l("option",{value:"",disabled:""},"Select area",-1)),(v(!0),b(H,null,ne(Ae.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,bh))),128))],40,vh)]),l("label",yh,[s[96]||(s[96]=l("span",null,"Plan name",-1)),ge(l("input",{"onUpdate:modelValue":s[21]||(s[21]=r=>a.testPlanDraft.name=r),type:"text",placeholder:"KNX active test name"},null,512),[[ke,a.testPlanDraft.name]])]),l("label",Ah,[s[97]||(s[97]=l("span",null,"Description",-1)),ge(l("textarea",{"onUpdate:modelValue":s[22]||(s[22]=r=>a.testPlanDraft.description=r),rows:"2",placeholder:"Short operator-facing description"},null,512),[[ke,a.testPlanDraft.description]])])]),l("div",Sh,[(v(!0),b(H,null,ne(a.testPlanDraft.steps||[],(r,c)=>(v(),b("article",{key:r.id,class:ce(["report-check report-pass planner-step-card",{"planner-step-running":a.testPlanRunning&&a.testPlanRunningStepId===r.id,"planner-step-dragging":a.draggedTestPlanStepId===r.id,"planner-step-drop-target":a.dragOverTestPlanStepId===r.id}]),onDragenter:Wt(h=>sd(r.id),["prevent"]),onDragover:s[23]||(s[23]=Wt(()=>{},["prevent"])),onDrop:h=>rd(r.id,h)},[l("div",wh,[l("div",Th,[l("button",{class:"drag-handle",type:"button",draggable:"true",tabindex:"-1","aria-label":"Drag step",title:"Drag step",onDragstart:h=>ad(r.id,h),onDragend:_n}," ⋮⋮ ",40,_h),l("button",{class:"collapse-toggle",type:"button","aria-expanded":r.collapsed!==!0,title:r.collapsed===!0?"Expand step":"Collapse step",onClick:h=>td(r)},[l("span",{class:ce(["collapse-icon",{collapsed:r.collapsed===!0}])},"▾",2)],8,Dh),l("strong",null,S(r.title||r.id),1)]),l("div",Ih,[l("span",null,S(r.kind),1),l("button",{class:"secondary-button",type:"button",onClick:h=>Ql(c)}," Duplicate ",8,Rh),l("button",{class:"secondary-button",type:"button",onClick:h=>ed(c)}," Remove ",8,Nh)])]),r.collapsed===!0?(v(),b("div",Ch,[r.kind==="wait"?(v(),b("span",kh,[s[98]||(s[98]=l("strong",null,"Wait",-1)),ue(" "+S(Number(r.delayMs||0))+" ms",1)])):(v(),b("span",xh,[s[99]||(s[99]=l("strong",null,"Command",-1)),ue(" "+S(r.commandGA||"n/a"),1)])),r.kind!=="wait"?(v(),b("span",Eh,[s[100]||(s[100]=l("strong",null,"Status GA",-1)),ue(" "+S(r.statusGA||"n/a"),1)])):G("",!0),r.kind!=="wait"?(v(),b("span",Gh,[s[101]||(s[101]=l("strong",null,"Payload",-1)),ue(" "+S(vn(r.commandPayload,r.commandDPT)),1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",Fh,[s[102]||(s[102]=l("strong",null,"Write timeout",-1)),ue(" "+S(Number(r.statusWriteTimeoutMs||0))+" ms",1)])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",Lh,[s[103]||(s[103]=l("strong",null,"Response timeout",-1)),ue(" "+S(Number(r.statusResponseTimeoutMs||0))+" ms",1)])):G("",!0)])):(v(),b("div",Mh,[l("label",Oh,[s[104]||(s[104]=l("span",null,"Title",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.title=h,type:"text",placeholder:"Step title"},null,8,zh),[[ke,r.title]])]),l("label",$h,[s[105]||(s[105]=l("span",null,"Description",-1)),ge(l("textarea",{"onUpdate:modelValue":h=>r.description=h,rows:"2",placeholder:"What this step checks"},null,8,Bh),[[ke,r.description]])]),r.kind==="wait"?(v(),b("label",Vh,[s[106]||(s[106]=l("span",null,"Wait ms",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.delayMs=h,type:"number",min:"0",max:"30000",step:"100"},null,8,Kh),[[ke,r.delayMs,void 0,{number:!0}]])])):G("",!0),r.kind!=="wait"?(v(),b("section",Wh,[s[111]||(s[111]=l("h4",null,"Command",-1)),l("div",Uh,[l("label",jh,[s[108]||(s[108]=l("span",null,"Command GA",-1)),ge(l("select",{"onUpdate:modelValue":h=>r.commandGA=h,onChange:h=>Or(r)},[s[107]||(s[107]=l("option",{value:""},"Select command GA",-1)),(v(!0),b(H,null,ne(dn.value,h=>(v(),b("option",{key:h.ga,value:h.ga},S(`${h.ga} | ${h.label}`),9,Xh))),128))],40,Hh),[[Ta,r.commandGA]])]),l("label",qh,[s[109]||(s[109]=l("span",null,"Command DPT",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.commandDPT=h,type:"text",placeholder:"1.001",onChange:h=>Rs(r)},null,40,Jh),[[ke,r.commandDPT]])]),l("label",Zh,[s[110]||(s[110]=l("span",null,"Command payload",-1)),ia(r.commandDPT).length?ge((v(),b("select",{key:0,"onUpdate:modelValue":h=>r.commandPayload=h},[(v(!0),b(H,null,ne(ia(r.commandDPT),h=>(v(),b("option",{key:`${r.id}-command-${h.value}`,value:String(h.value)},S(h.label),9,Qh))),128))],8,Yh)),[[Ta,r.commandPayload]]):ge((v(),b("input",{key:1,"onUpdate:modelValue":h=>r.commandPayload=h,type:"text",placeholder:"true, false, 50"},null,8,em)),[[ke,r.commandPayload]])])])])):G("",!0),r.kind!=="wait"?(v(),b("section",tm,[s[116]||(s[116]=l("h4",null,"Status",-1)),l("div",am,[l("label",sm,[s[113]||(s[113]=l("span",null,"Status GA",-1)),ge(l("select",{"onUpdate:modelValue":h=>r.statusGA=h,onChange:h=>Or(r)},[s[112]||(s[112]=l("option",{value:""},"No feedback",-1)),(v(!0),b(H,null,ne(yr.value,h=>(v(),b("option",{key:h.ga,value:h.ga},S(`${h.ga} | ${h.label}`),9,rm))),128))],40,nm),[[Ta,r.statusGA]])]),l("label",im,[s[114]||(s[114]=l("span",null,"Status DPT",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.statusDPT=h,type:"text",placeholder:"1.001",onChange:h=>Rs(r)},null,40,om),[[ke,r.statusDPT]])]),l("label",lm,[s[115]||(s[115]=l("span",null,"Expected payload",-1)),ia(r.statusDPT||r.commandDPT).length?ge((v(),b("select",{key:0,"onUpdate:modelValue":h=>r.expectedPayload=h},[(v(!0),b(H,null,ne(ia(r.statusDPT||r.commandDPT),h=>(v(),b("option",{key:`${r.id}-expected-${h.value}`,value:String(h.value)},S(h.label),9,um))),128))],8,dm)),[[Ta,r.expectedPayload]]):ge((v(),b("input",{key:1,"onUpdate:modelValue":h=>r.expectedPayload=h,type:"text",placeholder:"Expected feedback value"},null,8,cm)),[[ke,r.expectedPayload]])])])])):G("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("div",fm,[l("section",pm,[s[118]||(s[118]=l("h4",null,"Spontaneous Write From Status GA",-1)),s[119]||(s[119]=l("p",{class:"area-detail-subhead"},[ue("Wait for a spontaneous "),l("code",null,"GroupValue_Write"),ue(" telegram from the status GA.")],-1)),l("label",gm,[s[117]||(s[117]=l("span",null,"Status write timeout ms",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.statusWriteTimeoutMs=h,type:"number",min:"500",max:"60000",step:"100"},null,8,hm),[[ke,r.statusWriteTimeoutMs,void 0,{number:!0}]])])]),l("section",mm,[s[121]||(s[121]=l("h4",null,"Active Read Request To Status GA",-1)),s[122]||(s[122]=l("p",{class:"area-detail-subhead"},[ue("Send a "),l("code",null,"read"),ue(" telegram to the status GA and wait for a "),l("code",null,"GroupValue_Response"),ue(".")],-1)),l("label",vm,[s[120]||(s[120]=l("span",null,"Read response timeout ms",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.statusResponseTimeoutMs=h,type:"number",min:"500",max:"60000",step:"100"},null,8,bm),[[ke,r.statusResponseTimeoutMs,void 0,{number:!0}]])])])])):G("",!0),l("label",ym,[s[123]||(s[123]=l("span",null,"Reason",-1)),ge(l("input",{"onUpdate:modelValue":h=>r.reason=h,type:"text",placeholder:"Why this step exists"},null,8,Am),[[ke,r.reason]])])]))],42,Ph))),128))])])):G("",!0)])],2)],2)):G("",!0),a.activeTab==="results"?(v(),b("section",Sm,[l("div",Pm,[s[124]||(s[124]=l("div",null,[l("h2",null,"Test Results"),l("p",{class:"area-detail-subhead"},"Live and saved reports generated by KNX active and read-only tests.")],-1)),l("div",wm,[l("span",Tm,S(sa.value.length)+" available",1)])]),l("div",_m,[l("article",Dm,[s[125]||(s[125]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select Test Result"),l("p",{class:"area-detail-subhead"},"Choose a report to inspect metrics, detailed checks, and suggestions.")])],-1)),l("div",Im,[(v(!0),b(H,null,ne(sa.value,r=>(v(),b("div",{key:r.id,class:"sidebar-result-row"},[l("button",{type:"button",class:ce(["area-list-item sidebar-result-item",{active:ae.value&&ae.value.id===r.id,running:r.live===!0}]),onClick:c=>Is(r.id,{openMenu:!1,activateResultsTab:!0,resultOnly:!0})},[l("span",Nm,[l("strong",Cm,[r.live===!0?(v(),b("span",km)):G("",!0),l("span",null,S(_s(r)),1)]),l("span",{class:ce(["sidebar-result-status",`status-${r.overallStatus||"pass"}`])},S(r.overallStatus||"n/a"),3)]),l("span",xm,[ue(S(Za(r)),1),r.live===!0?(v(),b("span",Em," | running")):G("",!0)]),l("span",Gm,S(Ds(r)||xe(r.generatedAt)),1),l("span",Fm,S(xe(r.generatedAt)),1)],10,Rm),l("button",{class:"sidebar-result-delete-button",type:"button",disabled:a.deletingTestResultId===r.id,onClick:Wt(c=>Sn(r.id),["stop"])},S(a.deletingTestResultId===r.id?"Deleting...":"Delete"),9,Lm)]))),128)),sa.value.length?G("",!0):(v(),b("p",Mm,"No saved test results yet."))])]),ae.value?(v(),b("article",{key:0,ref_key:"testPlanReportRef",ref:mt,class:"area-detail"},[l("div",Om,[l("div",null,[l("h3",null,S(_s(ae.value)),1),l("p",zm,S(Ds(ae.value)||xe(ae.value.generatedAt)),1)]),l("div",$m,[l("span",Bm,S(Za(ae.value)),1),ae.value.live===!0?(v(),b("span",Vm,[...s[126]||(s[126]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):G("",!0),l("span",Km,S(ae.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:Tr}," Export PDF "),l("button",{class:"danger-button",type:"button",disabled:!ae.value||a.deletingTestResultId===ae.value.id,onClick:s[24]||(s[24]=r=>Sn(ae.value?.id))},S(a.deletingTestResultId===ae.value?.id?"Deleting...":"Delete"),9,Wm),l("button",{class:"secondary-button",type:"button",onClick:kr}," Open Source Test ")])]),l("div",Um,[(v(!0),b(H,null,ne(mn(ae.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",jm,[(v(!0),b(H,null,ne(Ya(ae.value),r=>(v(),b("article",{key:r.id,class:ce(["report-check",`report-${r.status}`])},[l("div",Hm,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",Xm,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",qm,[(v(!0),b(H,null,ne(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",Jm,[(v(!0),b(H,null,ne(c.items,h=>(v(),b("span",{key:`${r.id}-${c.title}-${h.label}`},[l("strong",null,S(h.label),1),ue(" "+S(h.value),1)]))),128))])]))),128))])):(v(),b("div",Zm,[(v(!0),b(H,null,ne(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),ue(" "+S(c.value),1)]))),128))]))],2))),128))]),Ya(ae.value).length?G("",!0):(v(),b("p",Ym,"No detailed entries stored for this report yet.")),Qa(ae.value).length?(v(),b("div",Qm,[s[127]||(s[127]=l("h4",null,"Suggestions",-1)),l("ul",ev,[(v(!0),b(H,null,ne(Qa(ae.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):G("",!0)],512)):(v(),b("article",tv,[...s[128]||(s[128]=[l("p",{class:"empty-state"},"No test result selected.",-1)])]))])])):G("",!0),a.activeTab==="overview"?(v(),b("section",av,[l("div",sv,[s[129]||(s[129]=l("h2",null,"Top Group Addresses",-1)),l("span",nv,S(fn.value.length)+" visible",1)]),fn.value.length?(v(),b("ul",rv,[(v(!0),b(H,null,ne(fn.value,r=>(v(),b("li",{key:r.ga,class:"rank-row"},[l("span",iv,S(r.ga),1),l("span",ov,S(r.label||"Unlabeled"),1),l("strong",null,S(Number(r.count||0)),1)]))),128))])):(v(),b("p",lv,"No top group address data available yet."))])):G("",!0),a.activeTab==="overview"?(v(),b("section",dv,[l("div",uv,[s[130]||(s[130]=l("h2",null,"Event Mix",-1)),l("span",cv,S(Ts.value.length)+" event types",1)]),Ts.value.length?(v(),b("ul",fv,[(v(!0),b(H,null,ne(Ts.value,r=>(v(),b("li",{key:r.name,class:"event-row"},[l("span",pv,S(r.name),1),l("div",gv,[l("span",{class:"event-bar-fill",style:fs({width:`${Math.max(r.count/nl.value*100,6)}%`})},null,4)]),l("strong",null,S(r.count),1)]))),128))])):(v(),b("p",hv,"Event distribution will appear after the first samples."))])):G("",!0),a.activeTab==="overview"?(v(),b("section",mv,[l("div",vv,[s[131]||(s[131]=l("h2",null,"Bus Connection Persistence",-1)),Qe.value?(v(),b("span",bv,S(String(Qe.value.currentState||"unknown")),1)):G("",!0)]),Qe.value?(v(),b(H,{key:0},[l("div",yv,[l("span",Av,"Connected "+S(Ca(Qe.value.connectedSec||0)),1),l("span",Sv,"Disconnected "+S(Ca(Qe.value.disconnectedSec||0)),1),l("span",Pv,"Coverage "+S(Number(Qe.value.knownCoveragePct||0))+"%",1)]),l("div",wv,[(v(!0),b(H,null,ne(ol.value,r=>(v(),b("span",{key:r.key,class:ce(["bus-segment",r.className]),style:fs({left:r.left,width:r.width}),title:r.title},null,14,Tv))),128))]),l("div",_v,[l("span",null,S(Me(Qe.value.windowStartAt)),1),l("span",null,S(Me(Qe.value.windowEndAt)),1),s[132]||(s[132]=l("span",null,"Now",-1))]),s[133]||(s[133]=l("p",{class:"bus-note"},"Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.",-1))],64)):(v(),b("p",Dv,"Waiting for connection persistence data..."))])):G("",!0),a.activeTab==="overview"?(v(),b("section",{key:7,ref_key:"flowCardRef",ref:ea,class:ce(["card card-flow",{"is-fullscreen":ut.value}])},[l("div",Iv,[s[134]||(s[134]=l("h2",null,"Flow Map",-1)),l("div",Rv,[l("span",Nv," Nodes "+S(ra.value.nodes.length)+" | Links "+S(ra.value.edges.length),1),l("button",{class:"secondary-button",type:"button",onClick:x},S(ut.value?"Exit Fullscreen":"Fullscreen"),1)])]),l("div",Cv,[l("label",kv,[s[135]||(s[135]=l("span",null,"Max nodes",-1)),ge(l("input",{"onUpdate:modelValue":s[25]||(s[25]=r=>a.flowMaxNodes=r),type:"number",min:"4",max:"32",step:"1"},null,512),[[ke,a.flowMaxNodes,void 0,{number:!0}]])]),l("label",xv,[s[136]||(s[136]=l("span",null,"Find GA",-1)),ge(l("input",{"onUpdate:modelValue":s[26]||(s[26]=r=>a.flowSearch=r),type:"text",placeholder:"Search GA or label"},null,512),[[ke,a.flowSearch]])]),l("div",Ev,[s[138]||(s[138]=l("span",null,"Select Nodes to Filter by",-1)),ge(l("select",{"onUpdate:modelValue":s[27]||(s[27]=r=>a.flowSelectedGa=r),multiple:"",size:"5"},[(v(!0),b(H,null,ne(rl.value,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}`),9,Gv))),128))],512),[[Ta,a.flowSelectedGa]]),l("label",Fv,[ge(l("input",{"onUpdate:modelValue":s[28]||(s[28]=r=>a.flowShowUniversalNodes=r),type:"checkbox"},null,512),[[On,a.flowShowUniversalNodes]]),s[137]||(s[137]=l("span",null,"Show Universal Mode nodes",-1))])]),s[139]||(s[139]=wa('<div class="flow-legend" data-v-d23f4b5c><span data-v-d23f4b5c><i class="legend-line legend-write" data-v-d23f4b5c></i>Write</span><span data-v-d23f4b5c><i class="legend-line legend-response" data-v-d23f4b5c></i>Response</span><span data-v-d23f4b5c><i class="legend-line legend-read" data-v-d23f4b5c></i>Read</span><span data-v-d23f4b5c><i class="legend-line legend-repeat" data-v-d23f4b5c></i>Repeat</span><span data-v-d23f4b5c><i class="legend-dot legend-anomaly" data-v-d23f4b5c></i>Anomaly</span><span data-v-d23f4b5c><i class="legend-dot legend-external" data-v-d23f4b5c></i>External</span></div>',1))]),l("div",Lv,[ra.value.nodes.length?(v(),b("svg",{key:0,class:"flow-svg",viewBox:`0 0 ${ra.value.width} ${ra.value.height}`,preserveAspectRatio:"xMidYMid meet"},[l("defs",null,[(v(),b(H,null,ne(d,(r,c)=>l("marker",{id:`flow-arrow-${c}`,key:c,viewBox:"0 0 10 8",markerWidth:"10",markerHeight:"8",refX:"8.8",refY:"4",orient:"auto",markerUnits:"userSpaceOnUse"},[l("path",{d:"M0,0 L10,4 L0,8 z",fill:r},null,8,zv)],8,Ov)),64))]),(v(!0),b(H,null,ne(ra.value.edges,r=>(v(),b("path",{key:r.key,class:ce(["flow-edge",{"flow-edge-active":r.active,"flow-edge-idle":!r.active}]),d:r.d,stroke:r.color,"stroke-width":r.width,opacity:r.opacity,"marker-end":`url(#${r.markerId})`},[l("title",null,S(r.tooltip),1)],10,$v))),128)),(v(!0),b(H,null,ne(ra.value.nodes,r=>(v(),b("g",{key:r.id,class:ce(["flow-node",{"is-anomaly":r.anomalyCount>0,"is-external":!r.inFlow,"is-idle":r.isIdle}])},[l("circle",{cx:r.x,cy:r.y,r:"24"},null,8,Bv),l("text",{class:"node-label",x:r.x,y:r.y+1},S(r.shortLabel),9,Vv),r.shortSubtitle?(v(),b("text",{key:0,class:"node-subtitle",x:r.x,y:r.y+38},S(r.shortSubtitle),9,Kv)):G("",!0),r.shortPayload?(v(),b("text",{key:1,class:"node-payload",x:r.x,y:r.y+52},S(r.shortPayload),9,Wv)):G("",!0),r.anomalyCount>0?(v(),b("text",{key:2,class:"node-badge",x:r.x,y:r.y-30},"anomaly x"+S(r.anomalyCount),9,Uv)):G("",!0),l("title",null,S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}${r.payload?` | payload: ${r.payload}`:""}`),1)],2))),128))],8,Mv)):(v(),b("p",jv,"No topology data available yet."))]),l("p",Hv,"Window "+S(ra.value.telemetryWindowSec||0)+"s.",1)],2)):G("",!0),a.activeTab==="overview"?(v(),b("section",Xv,[l("div",qv,[s[140]||(s[140]=l("h2",null,"Anomalies",-1)),l("span",Jv,S(cn.value.length)+" recent",1)]),cn.value.length?(v(),b("div",Zv,[(v(!0),b(H,null,ne(cn.value.slice(0,20),r=>(v(),b("article",{key:`${r.at}-${va(r).ga||""}`,class:"anomaly-card"},[l("div",Yv,[l("strong",null,S(va(r).type||"anomaly"),1),l("span",null,S(va(r).ga||"no GA"),1)]),l("p",Qv,S(r.at||""),1),l("pre",null,S(JSON.stringify(va(r),null,2)),1)]))),128))])):(v(),b("p",eb,"No anomalies detected right now."))])):G("",!0),a.activeTab==="assistant"?(v(),b("section",tb,[l("div",ab,[s[141]||(s[141]=l("h2",null,"Ask",-1)),l("span",sb,S(aa.value.llmEnabled?"AI enabled":"AI disabled"),1)]),l("div",nb,[(v(!0),b(H,null,ne(ll.value,r=>(v(),b("article",{key:r.key,class:ce(["chat-message",`chat-${r.kind}`])},[r.kind==="assistant"?(v(),b("div",{key:0,innerHTML:r.html},null,8,rb)):(v(),b("pre",ib,S(r.rawText),1))],2))),128)),a.asking?(v(),b("article",ob,[...s[142]||(s[142]=[l("span",{class:"chat-pending-spinner","aria-hidden":"true"},null,-1),l("span",null,"Thinking...",-1)])])):G("",!0)]),l("div",lb,[(v(),b(H,null,ne(t,r=>l("button",{key:r,class:"preset-button",type:"button",disabled:a.asking||!aa.value.llmEnabled,onClick:c=>Pn(r)},S(r),9,db)),64))]),l("div",ub,[ge(l("input",{"onUpdate:modelValue":s[29]||(s[29]=r=>a.chatDraft=r),class:"ask-input",type:"text",disabled:a.asking||!aa.value.llmEnabled,placeholder:"Ask a question about KNX traffic...",onKeydown:s[30]||(s[30]=Kc(Wt(r=>Pn(),["prevent"]),["enter"]))},null,40,cb),[[ke,a.chatDraft]]),l("button",{class:"primary-button",type:"button",disabled:a.asking||!aa.value.llmEnabled,onClick:s[31]||(s[31]=r=>Pn())}," Send ",8,fb)])])):G("",!0),a.activeTab==="settings"?(v(),b("section",pb,[s[149]||(s[149]=l("div",{class:"card-head"},[l("div",null,[l("h2",null,"Settings"),l("p",{class:"area-detail-subhead"},"Manage node options and full configuration import/export.")])],-1)),l("div",gb,[l("button",{class:ce(["settings-tab-button",{active:a.settingsTab==="node"}]),type:"button",onClick:s[32]||(s[32]=r=>Cr("node"))}," KNX AI Node ",2),l("button",{class:ce(["settings-tab-button",{active:a.settingsTab==="config"}]),type:"button",onClick:s[33]||(s[33]=r=>Cr("config"))}," Import / Export ",2)]),a.settingsTab==="node"?(v(),b("article",hb,[s[145]||(s[145]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"KNX AI Node"),l("span",{class:"meta-chip"},"Runtime preferences")],-1)),s[146]||(s[146]=l("p",{class:"area-detail-subhead"},"Select the node used by this UI and control refresh behavior.",-1)),l("div",mb,[l("label",vb,[s[143]||(s[143]=l("span",null,"Node",-1)),ge(l("select",{"onUpdate:modelValue":s[34]||(s[34]=r=>a.selectedNodeId=r),class:"node-select",onChange:Al},[(v(!0),b(H,null,ne(a.nodes,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.name||"KNX AI"}${r.gatewayName?` | ${r.gatewayName}`:""}`),9,bb))),128))],544),[[Ta,a.selectedNodeId]])]),l("label",yb,[ge(l("input",{"onUpdate:modelValue":s[35]||(s[35]=r=>a.autoRefresh=r),type:"checkbox"},null,512),[[On,a.autoRefresh]]),s[144]||(s[144]=l("span",null,"Auto refresh",-1))])])])):(v(),b("article",Ab,[s[147]||(s[147]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"Import / Export"),l("span",{class:"meta-chip"},"Full configuration")],-1)),s[148]||(s[148]=l("p",{class:"area-detail-subhead"},"Export or import the full KNX AI configuration for the selected node.",-1)),l("div",Sb,[l("button",{class:"secondary-button",type:"button",disabled:!a.selectedNodeId,onClick:vd}," Export Configuration ",8,Pb),l("button",{class:"secondary-button",type:"button",disabled:!a.selectedNodeId,onClick:bd}," Import Configuration ",8,wb)])])),l("input",{ref_key:"configImportRef",ref:Ct,type:"file",accept:"application/json,.json",class:"hidden-file-input",onChange:yd},null,544)])):G("",!0)])]),a.areaLlmRegenerating||a.areaLlmBulkDeleting?(v(),b("div",Tb,[l("div",_b,[s[150]||(s[150]=l("span",{class:"running-spinner global-wait-spinner","aria-hidden":"true"},null,-1)),l("strong",null,S(a.areaLlmBulkDeleting?"Deleting AI Areas":"Regenerating AI Areas"),1),l("span",null,S(a.areaLlmBulkDeleting?"Please wait while AI-generated areas are removed.":"Please wait, this can take a while with large ETS projects."),1)])])):G("",!0),a.testPlanRunConfirmOpen?(v(),b("div",{key:1,class:"modal-backdrop",onClick:zr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"run-test-title",onClick:s[37]||(s[37]=Wt(()=>{},["stop"]))},[s[151]||(s[151]=l("h3",{id:"run-test-title"},"Start test?",-1)),l("p",Db,S(a.testPlanRunMode==="repeat"?"This will send real telegrams on the KNX bus and repeat the selected test plan until you press Stop Repeat.":"This will send real telegrams on the KNX bus for the selected test plan."),1),l("div",Ib,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:zr}," Cancel "),l("button",{class:"primary-button",type:"button",disabled:a.testPlanRunning,onClick:s[36]||(s[36]=r=>md(a.testPlanRunMode))}," Start Test ",8,Rb)])])])):G("",!0),a.testPlanUnsavedConfirmOpen?(v(),b("div",{key:2,class:"modal-backdrop",onClick:Br},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-plan-title",onClick:s[39]||(s[39]=Wt(()=>{},["stop"]))},[s[152]||(s[152]=l("h3",{id:"unsaved-plan-title"},"Unsaved changes",-1)),l("p",Nb,"Save or discard the current plan changes before opening "+S(a.testPlanPendingActionLabel||"another plan")+".",1),l("div",Cb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Br}," Stay Here "),l("button",{class:"secondary-button",type:"button",onClick:s[38]||(s[38]=r=>{ud(),Vr()})}," Discard Changes "),l("button",{class:"primary-button",type:"button",disabled:a.testPlanSaving||!a.testPlanDraft,onClick:cd},S(a.testPlanSaving?"Saving...":"Save and Continue"),9,kb)])])])):G("",!0),a.areaUnsavedConfirmOpen?(v(),b("div",{key:3,class:"modal-backdrop",onClick:Nr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-area-title",onClick:s[40]||(s[40]=Wt(()=>{},["stop"]))},[s[153]||(s[153]=l("h3",{id:"unsaved-area-title"},"Unsaved changes",-1)),s[154]||(s[154]=l("p",{class:"area-detail-subhead"},"Discard the current area changes and close the editor?",-1)),l("div",{class:"modal-actions"},[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Nr}," Stay Here "),l("button",{class:"primary-button",type:"button",onClick:Dl}," Discard and Close ")])])])):G("",!0)],2)],64))}},Mb=Qc(Lb,[["__scopeId","data-v-d23f4b5c"]]);jc(Mb).mount("#app");export{Zc as _};
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))o(u);new MutationObserver(u=>{for(const d of u)if(d.type==="childList")for(const f of d.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&o(f)}).observe(document,{childList:!0,subtree:!0});function i(u){const d={};return u.integrity&&(d.integrity=u.integrity),u.referrerPolicy&&(d.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?d.credentials="include":u.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function o(u){if(u.ep)return;u.ep=!0;const d=i(u);fetch(u.href,d)}})();function Jn(e){const t=Object.create(null);for(const i of e.split(","))t[i]=1;return i=>i in t}const we={},Oa=[],Rt=()=>{},Li=()=>!1,js=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zn=e=>e.startsWith("onUpdate:"),Be=Object.assign,Yn=(e,t)=>{const i=e.indexOf(t);i>-1&&e.splice(i,1)},Tu=Object.prototype.hasOwnProperty,ye=(e,t)=>Tu.call(e,t),J=Array.isArray,za=e=>bs(e)==="[object Map]",Ua=e=>bs(e)==="[object Set]",Xr=e=>bs(e)==="[object Date]",Q=e=>typeof e=="function",Ge=e=>typeof e=="string",Ct=e=>typeof e=="symbol",Pe=e=>e!==null&&typeof e=="object",Mi=e=>(Pe(e)||Q(e))&&Q(e.then)&&Q(e.catch),Oi=Object.prototype.toString,bs=e=>Oi.call(e),_u=e=>bs(e).slice(8,-1),zi=e=>bs(e)==="[object Object]",Qn=e=>Ge(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ss=Jn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Hs=e=>{const t=Object.create(null);return(i=>t[i]||(t[i]=e(i)))},Du=/-\w/g,gt=Hs(e=>e.replace(Du,t=>t.slice(1).toUpperCase())),Iu=/\B([A-Z])/g,ma=Hs(e=>e.replace(Iu,"-$1").toLowerCase()),$i=Hs(e=>e.charAt(0).toUpperCase()+e.slice(1)),Nn=Hs(e=>e?`on${$i(e)}`:""),It=(e,t)=>!Object.is(e,t),Fs=(e,...t)=>{for(let i=0;i<e.length;i++)e[i](...t)},Bi=(e,t,i,o=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:o,value:i})},Xs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let qr;const qs=()=>qr||(qr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function cs(e){if(J(e)){const t={};for(let i=0;i<e.length;i++){const o=e[i],u=Ge(o)?ku(o):cs(o);if(u)for(const d in u)t[d]=u[d]}return t}else if(Ge(e)||Pe(e))return e}const Ru=/;(?![^(]*\))/g,Nu=/:([^]+)/,Cu=/\/\*[^]*?\*\//g;function ku(e){const t={};return e.replace(Cu,"").split(Ru).forEach(i=>{if(i){const o=i.split(Nu);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function fe(e){let t="";if(Ge(e))t=e;else if(J(e))for(let i=0;i<e.length;i++){const o=fe(e[i]);o&&(t+=o+" ")}else if(Pe(e))for(const i in e)e[i]&&(t+=i+" ");return t.trim()}const xu="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Eu=Jn(xu);function Vi(e){return!!e||e===""}function Gu(e,t){if(e.length!==t.length)return!1;let i=!0;for(let o=0;i&&o<e.length;o++)i=ja(e[o],t[o]);return i}function ja(e,t){if(e===t)return!0;let i=Xr(e),o=Xr(t);if(i||o)return i&&o?e.getTime()===t.getTime():!1;if(i=Ct(e),o=Ct(t),i||o)return e===t;if(i=J(e),o=J(t),i||o)return i&&o?Gu(e,t):!1;if(i=Pe(e),o=Pe(t),i||o){if(!i||!o)return!1;const u=Object.keys(e).length,d=Object.keys(t).length;if(u!==d)return!1;for(const f in e){const p=e.hasOwnProperty(f),m=t.hasOwnProperty(f);if(p&&!m||!p&&m||!ja(e[f],t[f]))return!1}}return String(e)===String(t)}function er(e,t){return e.findIndex(i=>ja(i,t))}const Ki=e=>!!(e&&e.__v_isRef===!0),S=e=>Ge(e)?e:e==null?"":J(e)||Pe(e)&&(e.toString===Oi||!Q(e.toString))?Ki(e)?S(e.value):JSON.stringify(e,Wi,2):String(e),Wi=(e,t)=>Ki(t)?Wi(e,t.value):za(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((i,[o,u],d)=>(i[Cn(o,d)+" =>"]=u,i),{})}:Ua(t)?{[`Set(${t.size})`]:[...t.values()].map(i=>Cn(i))}:Ct(t)?Cn(t):Pe(t)&&!J(t)&&!zi(t)?String(t):t,Cn=(e,t="")=>{var i;return Ct(e)?`Symbol(${(i=e.description)!=null?i:t})`:e};let Ze;class Fu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Ze,!t&&Ze&&(this.index=(Ze.scopes||(Ze.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].pause();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,i;if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].resume();for(t=0,i=this.effects.length;t<i;t++)this.effects[t].resume()}}run(t){if(this._active){const i=Ze;try{return Ze=this,t()}finally{Ze=i}}}on(){++this._on===1&&(this.prevScope=Ze,Ze=this)}off(){this._on>0&&--this._on===0&&(Ze=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let i,o;for(i=0,o=this.effects.length;i<o;i++)this.effects[i].stop();for(this.effects.length=0,i=0,o=this.cleanups.length;i<o;i++)this.cleanups[i]();if(this.cleanups.length=0,this.scopes){for(i=0,o=this.scopes.length;i<o;i++)this.scopes[i].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const u=this.parent.scopes.pop();u&&u!==this&&(this.parent.scopes[this.index]=u,u.index=this.index)}this.parent=void 0}}}function Lu(){return Ze}let Te;const kn=new WeakSet;class Ui{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Ze&&Ze.active&&Ze.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,kn.has(this)&&(kn.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Hi(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Jr(this),Xi(this);const t=Te,i=ht;Te=this,ht=!0;try{return this.fn()}finally{qi(this),Te=t,ht=i,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)sr(t);this.deps=this.depsTail=void 0,Jr(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?kn.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){zn(this)&&this.run()}get dirty(){return zn(this)}}let ji=0,ns,rs;function Hi(e,t=!1){if(e.flags|=8,t){e.next=rs,rs=e;return}e.next=ns,ns=e}function tr(){ji++}function ar(){if(--ji>0)return;if(rs){let t=rs;for(rs=void 0;t;){const i=t.next;t.next=void 0,t.flags&=-9,t=i}}let e;for(;ns;){let t=ns;for(ns=void 0;t;){const i=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(o){e||(e=o)}t=i}}if(e)throw e}function Xi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function qi(e){let t,i=e.depsTail,o=i;for(;o;){const u=o.prevDep;o.version===-1?(o===i&&(i=u),sr(o),Mu(o)):t=o,o.dep.activeLink=o.prevActiveLink,o.prevActiveLink=void 0,o=u}e.deps=t,e.depsTail=i}function zn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ji(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ji(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===fs)||(e.globalVersion=fs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!zn(e))))return;e.flags|=2;const t=e.dep,i=Te,o=ht;Te=e,ht=!0;try{Xi(e);const u=e.fn(e._value);(t.version===0||It(u,e._value))&&(e.flags|=128,e._value=u,t.version++)}catch(u){throw t.version++,u}finally{Te=i,ht=o,qi(e),e.flags&=-3}}function sr(e,t=!1){const{dep:i,prevSub:o,nextSub:u}=e;if(o&&(o.nextSub=u,e.prevSub=void 0),u&&(u.prevSub=o,e.nextSub=void 0),i.subs===e&&(i.subs=o,!o&&i.computed)){i.computed.flags&=-5;for(let d=i.computed.deps;d;d=d.nextDep)sr(d,!0)}!t&&!--i.sc&&i.map&&i.map.delete(i.key)}function Mu(e){const{prevDep:t,nextDep:i}=e;t&&(t.nextDep=i,e.prevDep=void 0),i&&(i.prevDep=t,e.nextDep=void 0)}let ht=!0;const Zi=[];function qt(){Zi.push(ht),ht=!1}function Jt(){const e=Zi.pop();ht=e===void 0?!0:e}function Jr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const i=Te;Te=void 0;try{t()}finally{Te=i}}}let fs=0;class Ou{constructor(t,i){this.sub=t,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class nr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Te||!ht||Te===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==Te)i=this.activeLink=new Ou(Te,this),Te.deps?(i.prevDep=Te.depsTail,Te.depsTail.nextDep=i,Te.depsTail=i):Te.deps=Te.depsTail=i,Yi(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const o=i.nextDep;o.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=o),i.prevDep=Te.depsTail,i.nextDep=void 0,Te.depsTail.nextDep=i,Te.depsTail=i,Te.deps===i&&(Te.deps=o)}return i}trigger(t){this.version++,fs++,this.notify(t)}notify(t){tr();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{ar()}}}function Yi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let o=t.deps;o;o=o.nextDep)Yi(o)}const i=e.dep.subs;i!==e&&(e.prevSub=i,i&&(i.nextSub=e)),e.dep.subs=e}}const $n=new WeakMap,Da=Symbol(""),Bn=Symbol(""),ps=Symbol("");function ze(e,t,i){if(ht&&Te){let o=$n.get(e);o||$n.set(e,o=new Map);let u=o.get(i);u||(o.set(i,u=new nr),u.map=o,u.key=i),u.track()}}function jt(e,t,i,o,u,d){const f=$n.get(e);if(!f){fs++;return}const p=m=>{m&&m.trigger()};if(tr(),t==="clear")f.forEach(p);else{const m=J(e),T=m&&Qn(i);if(m&&i==="length"){const A=Number(o);f.forEach((I,L)=>{(L==="length"||L===ps||!Ct(L)&&L>=A)&&p(I)})}else switch((i!==void 0||f.has(void 0))&&p(f.get(i)),T&&p(f.get(ps)),t){case"add":m?T&&p(f.get("length")):(p(f.get(Da)),za(e)&&p(f.get(Bn)));break;case"delete":m||(p(f.get(Da)),za(e)&&p(f.get(Bn)));break;case"set":za(e)&&p(f.get(Da));break}}ar()}function La(e){const t=be(e);return t===e?t:(ze(t,"iterate",ps),lt(e)?t:t.map(mt))}function Js(e){return ze(e=be(e),"iterate",ps),e}function _t(e,t){return Zt(e)?Va(Ia(e)?mt(t):t):mt(t)}const zu={__proto__:null,[Symbol.iterator](){return xn(this,Symbol.iterator,e=>_t(this,e))},concat(...e){return La(this).concat(...e.map(t=>J(t)?La(t):t))},entries(){return xn(this,"entries",e=>(e[1]=_t(this,e[1]),e))},every(e,t){return Vt(this,"every",e,t,void 0,arguments)},filter(e,t){return Vt(this,"filter",e,t,i=>i.map(o=>_t(this,o)),arguments)},find(e,t){return Vt(this,"find",e,t,i=>_t(this,i),arguments)},findIndex(e,t){return Vt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Vt(this,"findLast",e,t,i=>_t(this,i),arguments)},findLastIndex(e,t){return Vt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Vt(this,"forEach",e,t,void 0,arguments)},includes(...e){return En(this,"includes",e)},indexOf(...e){return En(this,"indexOf",e)},join(e){return La(this).join(e)},lastIndexOf(...e){return En(this,"lastIndexOf",e)},map(e,t){return Vt(this,"map",e,t,void 0,arguments)},pop(){return es(this,"pop")},push(...e){return es(this,"push",e)},reduce(e,...t){return Zr(this,"reduce",e,t)},reduceRight(e,...t){return Zr(this,"reduceRight",e,t)},shift(){return es(this,"shift")},some(e,t){return Vt(this,"some",e,t,void 0,arguments)},splice(...e){return es(this,"splice",e)},toReversed(){return La(this).toReversed()},toSorted(e){return La(this).toSorted(e)},toSpliced(...e){return La(this).toSpliced(...e)},unshift(...e){return es(this,"unshift",e)},values(){return xn(this,"values",e=>_t(this,e))}};function xn(e,t,i){const o=Js(e),u=o[t]();return o!==e&&!lt(e)&&(u._next=u.next,u.next=()=>{const d=u._next();return d.done||(d.value=i(d.value)),d}),u}const $u=Array.prototype;function Vt(e,t,i,o,u,d){const f=Js(e),p=f!==e&&!lt(e),m=f[t];if(m!==$u[t]){const I=m.apply(e,d);return p?mt(I):I}let T=i;f!==e&&(p?T=function(I,L){return i.call(this,_t(e,I),L,e)}:i.length>2&&(T=function(I,L){return i.call(this,I,L,e)}));const A=m.call(f,T,o);return p&&u?u(A):A}function Zr(e,t,i,o){const u=Js(e),d=u!==e&&!lt(e);let f=i,p=!1;u!==e&&(d?(p=o.length===0,f=function(T,A,I){return p&&(p=!1,T=_t(e,T)),i.call(this,T,_t(e,A),I,e)}):i.length>3&&(f=function(T,A,I){return i.call(this,T,A,I,e)}));const m=u[t](f,...o);return p?_t(e,m):m}function En(e,t,i){const o=be(e);ze(o,"iterate",ps);const u=o[t](...i);return(u===-1||u===!1)&&or(i[0])?(i[0]=be(i[0]),o[t](...i)):u}function es(e,t,i=[]){qt(),tr();const o=be(e)[t].apply(e,i);return ar(),Jt(),o}const Bu=Jn("__proto__,__v_isRef,__isVue"),Qi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ct));function Vu(e){Ct(e)||(e=String(e));const t=be(this);return ze(t,"has",e),t.hasOwnProperty(e)}class eo{constructor(t=!1,i=!1){this._isReadonly=t,this._isShallow=i}get(t,i,o){if(i==="__v_skip")return t.__v_skip;const u=this._isReadonly,d=this._isShallow;if(i==="__v_isReactive")return!u;if(i==="__v_isReadonly")return u;if(i==="__v_isShallow")return d;if(i==="__v_raw")return o===(u?d?Yu:no:d?so:ao).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(o)?t:void 0;const f=J(t);if(!u){let m;if(f&&(m=zu[i]))return m;if(i==="hasOwnProperty")return Vu}const p=Reflect.get(t,i,$e(t)?t:o);if((Ct(i)?Qi.has(i):Bu(i))||(u||ze(t,"get",i),d))return p;if($e(p)){const m=f&&Qn(i)?p:p.value;return u&&Pe(m)?Kn(m):m}return Pe(p)?u?Kn(p):Zs(p):p}}class to extends eo{constructor(t=!1){super(!1,t)}set(t,i,o,u){let d=t[i];const f=J(t)&&Qn(i);if(!this._isShallow){const T=Zt(d);if(!lt(o)&&!Zt(o)&&(d=be(d),o=be(o)),!f&&$e(d)&&!$e(o))return T||(d.value=o),!0}const p=f?Number(i)<t.length:ye(t,i),m=Reflect.set(t,i,o,$e(t)?t:u);return t===be(u)&&(p?It(o,d)&&jt(t,"set",i,o):jt(t,"add",i,o)),m}deleteProperty(t,i){const o=ye(t,i);t[i];const u=Reflect.deleteProperty(t,i);return u&&o&&jt(t,"delete",i,void 0),u}has(t,i){const o=Reflect.has(t,i);return(!Ct(i)||!Qi.has(i))&&ze(t,"has",i),o}ownKeys(t){return ze(t,"iterate",J(t)?"length":Da),Reflect.ownKeys(t)}}class Ku extends eo{constructor(t=!1){super(!0,t)}set(t,i){return!0}deleteProperty(t,i){return!0}}const Wu=new to,Uu=new Ku,ju=new to(!0);const Vn=e=>e,xs=e=>Reflect.getPrototypeOf(e);function Hu(e,t,i){return function(...o){const u=this.__v_raw,d=be(u),f=za(d),p=e==="entries"||e===Symbol.iterator&&f,m=e==="keys"&&f,T=u[e](...o),A=i?Vn:t?Va:mt;return!t&&ze(d,"iterate",m?Bn:Da),Be(Object.create(T),{next(){const{value:I,done:L}=T.next();return L?{value:I,done:L}:{value:p?[A(I[0]),A(I[1])]:A(I),done:L}}})}}function Es(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Xu(e,t){const i={get(u){const d=this.__v_raw,f=be(d),p=be(u);e||(It(u,p)&&ze(f,"get",u),ze(f,"get",p));const{has:m}=xs(f),T=t?Vn:e?Va:mt;if(m.call(f,u))return T(d.get(u));if(m.call(f,p))return T(d.get(p));d!==f&&d.get(u)},get size(){const u=this.__v_raw;return!e&&ze(be(u),"iterate",Da),u.size},has(u){const d=this.__v_raw,f=be(d),p=be(u);return e||(It(u,p)&&ze(f,"has",u),ze(f,"has",p)),u===p?d.has(u):d.has(u)||d.has(p)},forEach(u,d){const f=this,p=f.__v_raw,m=be(p),T=t?Vn:e?Va:mt;return!e&&ze(m,"iterate",Da),p.forEach((A,I)=>u.call(d,T(A),T(I),f))}};return Be(i,e?{add:Es("add"),set:Es("set"),delete:Es("delete"),clear:Es("clear")}:{add(u){const d=be(this),f=xs(d),p=be(u),m=!t&&!lt(u)&&!Zt(u)?p:u;return f.has.call(d,m)||It(u,m)&&f.has.call(d,u)||It(p,m)&&f.has.call(d,p)||(d.add(m),jt(d,"add",m,m)),this},set(u,d){!t&&!lt(d)&&!Zt(d)&&(d=be(d));const f=be(this),{has:p,get:m}=xs(f);let T=p.call(f,u);T||(u=be(u),T=p.call(f,u));const A=m.call(f,u);return f.set(u,d),T?It(d,A)&&jt(f,"set",u,d):jt(f,"add",u,d),this},delete(u){const d=be(this),{has:f,get:p}=xs(d);let m=f.call(d,u);m||(u=be(u),m=f.call(d,u)),p&&p.call(d,u);const T=d.delete(u);return m&&jt(d,"delete",u,void 0),T},clear(){const u=be(this),d=u.size!==0,f=u.clear();return d&&jt(u,"clear",void 0,void 0),f}}),["keys","values","entries",Symbol.iterator].forEach(u=>{i[u]=Hu(u,e,t)}),i}function rr(e,t){const i=Xu(e,t);return(o,u,d)=>u==="__v_isReactive"?!e:u==="__v_isReadonly"?e:u==="__v_raw"?o:Reflect.get(ye(i,u)&&u in o?i:o,u,d)}const qu={get:rr(!1,!1)},Ju={get:rr(!1,!0)},Zu={get:rr(!0,!1)};const ao=new WeakMap,so=new WeakMap,no=new WeakMap,Yu=new WeakMap;function Qu(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ed(e){return e.__v_skip||!Object.isExtensible(e)?0:Qu(_u(e))}function Zs(e){return Zt(e)?e:ir(e,!1,Wu,qu,ao)}function td(e){return ir(e,!1,ju,Ju,so)}function Kn(e){return ir(e,!0,Uu,Zu,no)}function ir(e,t,i,o,u){if(!Pe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const d=ed(e);if(d===0)return e;const f=u.get(e);if(f)return f;const p=new Proxy(e,d===2?o:i);return u.set(e,p),p}function Ia(e){return Zt(e)?Ia(e.__v_raw):!!(e&&e.__v_isReactive)}function Zt(e){return!!(e&&e.__v_isReadonly)}function lt(e){return!!(e&&e.__v_isShallow)}function or(e){return e?!!e.__v_raw:!1}function be(e){const t=e&&e.__v_raw;return t?be(t):e}function ad(e){return!ye(e,"__v_skip")&&Object.isExtensible(e)&&Bi(e,"__v_skip",!0),e}const mt=e=>Pe(e)?Zs(e):e,Va=e=>Pe(e)?Kn(e):e;function $e(e){return e?e.__v_isRef===!0:!1}function fa(e){return sd(e,!1)}function sd(e,t){return $e(e)?e:new nd(e,t)}class nd{constructor(t,i){this.dep=new nr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?t:be(t),this._value=i?t:mt(t),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(t){const i=this._rawValue,o=this.__v_isShallow||lt(t)||Zt(t);t=o?t:be(t),It(t,i)&&(this._rawValue=t,this._value=o?t:mt(t),this.dep.trigger())}}function rd(e){return $e(e)?e.value:e}const id={get:(e,t,i)=>t==="__v_raw"?e:rd(Reflect.get(e,t,i)),set:(e,t,i,o)=>{const u=e[t];return $e(u)&&!$e(i)?(u.value=i,!0):Reflect.set(e,t,i,o)}};function ro(e){return Ia(e)?e:new Proxy(e,id)}class od{constructor(t,i,o){this.fn=t,this.setter=i,this._value=void 0,this.dep=new nr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=fs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=o}notify(){if(this.flags|=16,!(this.flags&8)&&Te!==this)return Hi(this,!0),!0}get value(){const t=this.dep.track();return Ji(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ld(e,t,i=!1){let o,u;return Q(e)?o=e:(o=e.get,u=e.set),new od(o,u,i)}const Gs={},$s=new WeakMap;let _a;function ud(e,t=!1,i=_a){if(i){let o=$s.get(i);o||$s.set(i,o=[]),o.push(e)}}function dd(e,t,i=we){const{immediate:o,deep:u,once:d,scheduler:f,augmentJob:p,call:m}=i,T=Z=>u?Z:lt(Z)||u===!1||u===0?Ht(Z,1):Ht(Z);let A,I,L,z,re=!1,U=!1;if($e(e)?(I=()=>e.value,re=lt(e)):Ia(e)?(I=()=>T(e),re=!0):J(e)?(U=!0,re=e.some(Z=>Ia(Z)||lt(Z)),I=()=>e.map(Z=>{if($e(Z))return Z.value;if(Ia(Z))return T(Z);if(Q(Z))return m?m(Z,2):Z()})):Q(e)?t?I=m?()=>m(e,2):e:I=()=>{if(L){qt();try{L()}finally{Jt()}}const Z=_a;_a=A;try{return m?m(e,3,[z]):e(z)}finally{_a=Z}}:I=Rt,t&&u){const Z=I,Ce=u===!0?1/0:u;I=()=>Ht(Z(),Ce)}const Re=Lu(),te=()=>{A.stop(),Re&&Re.active&&Yn(Re.effects,A)};if(d&&t){const Z=t;t=(...Ce)=>{Z(...Ce),te()}}let oe=U?new Array(e.length).fill(Gs):Gs;const ge=Z=>{if(!(!(A.flags&1)||!A.dirty&&!Z))if(t){const Ce=A.run();if(u||re||(U?Ce.some((ut,Ye)=>It(ut,oe[Ye])):It(Ce,oe))){L&&L();const ut=_a;_a=A;try{const Ye=[Ce,oe===Gs?void 0:U&&oe[0]===Gs?[]:oe,z];oe=Ce,m?m(t,3,Ye):t(...Ye)}finally{_a=ut}}}else A.run()};return p&&p(ge),A=new Ui(I),A.scheduler=f?()=>f(ge,!1):ge,z=Z=>ud(Z,!1,A),L=A.onStop=()=>{const Z=$s.get(A);if(Z){if(m)m(Z,4);else for(const Ce of Z)Ce();$s.delete(A)}},t?o?ge(!0):oe=A.run():f?f(ge.bind(null,!0),!0):A.run(),te.pause=A.pause.bind(A),te.resume=A.resume.bind(A),te.stop=te,te}function Ht(e,t=1/0,i){if(t<=0||!Pe(e)||e.__v_skip||(i=i||new Map,(i.get(e)||0)>=t))return e;if(i.set(e,t),t--,$e(e))Ht(e.value,t,i);else if(J(e))for(let o=0;o<e.length;o++)Ht(e[o],t,i);else if(Ua(e)||za(e))e.forEach(o=>{Ht(o,t,i)});else if(zi(e)){for(const o in e)Ht(e[o],t,i);for(const o of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,o)&&Ht(e[o],t,i)}return e}function ys(e,t,i,o){try{return o?e(...o):e()}catch(u){Ys(u,t,i)}}function kt(e,t,i,o){if(Q(e)){const u=ys(e,t,i,o);return u&&Mi(u)&&u.catch(d=>{Ys(d,t,i)}),u}if(J(e)){const u=[];for(let d=0;d<e.length;d++)u.push(kt(e[d],t,i,o));return u}}function Ys(e,t,i,o=!0){const u=t?t.vnode:null,{errorHandler:d,throwUnhandledErrorInProduction:f}=t&&t.appContext.config||we;if(t){let p=t.parent;const m=t.proxy,T=`https://vuejs.org/error-reference/#runtime-${i}`;for(;p;){const A=p.ec;if(A){for(let I=0;I<A.length;I++)if(A[I](e,m,T)===!1)return}p=p.parent}if(d){qt(),ys(d,null,10,[e,m,T]),Jt();return}}cd(e,i,u,o,f)}function cd(e,t,i,o=!0,u=!1){if(u)throw e;console.error(e)}const je=[];let Tt=-1;const $a=[];let pa=null,Ma=0;const io=Promise.resolve();let Bs=null;function is(e){const t=Bs||io;return e?t.then(this?e.bind(this):e):t}function fd(e){let t=Tt+1,i=je.length;for(;t<i;){const o=t+i>>>1,u=je[o],d=gs(u);d<e||d===e&&u.flags&2?t=o+1:i=o}return t}function lr(e){if(!(e.flags&1)){const t=gs(e),i=je[je.length-1];!i||!(e.flags&2)&&t>=gs(i)?je.push(e):je.splice(fd(t),0,e),e.flags|=1,oo()}}function oo(){Bs||(Bs=io.then(uo))}function pd(e){J(e)?$a.push(...e):pa&&e.id===-1?pa.splice(Ma+1,0,e):e.flags&1||($a.push(e),e.flags|=1),oo()}function Yr(e,t,i=Tt+1){for(;i<je.length;i++){const o=je[i];if(o&&o.flags&2){if(e&&o.id!==e.uid)continue;je.splice(i,1),i--,o.flags&4&&(o.flags&=-2),o(),o.flags&4||(o.flags&=-2)}}}function lo(e){if($a.length){const t=[...new Set($a)].sort((i,o)=>gs(i)-gs(o));if($a.length=0,pa){pa.push(...t);return}for(pa=t,Ma=0;Ma<pa.length;Ma++){const i=pa[Ma];i.flags&4&&(i.flags&=-2),i.flags&8||i(),i.flags&=-2}pa=null,Ma=0}}const gs=e=>e.id==null?e.flags&2?-1:1/0:e.id;function uo(e){try{for(Tt=0;Tt<je.length;Tt++){const t=je[Tt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),ys(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Tt<je.length;Tt++){const t=je[Tt];t&&(t.flags&=-2)}Tt=-1,je.length=0,lo(),Bs=null,(je.length||$a.length)&&uo()}}let ot=null,co=null;function Vs(e){const t=ot;return ot=e,co=e&&e.type.__scopeId||null,t}function gd(e,t=ot,i){if(!t||e._n)return e;const o=(...u)=>{o._d&&ui(-1);const d=Vs(t);let f;try{f=e(...u)}finally{Vs(d),o._d&&ui(1)}return f};return o._n=!0,o._c=!0,o._d=!0,o}function me(e,t){if(ot===null)return e;const i=an(ot),o=e.dirs||(e.dirs=[]);for(let u=0;u<t.length;u++){let[d,f,p,m=we]=t[u];d&&(Q(d)&&(d={mounted:d,updated:d}),d.deep&&Ht(f),o.push({dir:d,instance:i,value:f,oldValue:void 0,arg:p,modifiers:m}))}return e}function Sa(e,t,i,o){const u=e.dirs,d=t&&t.dirs;for(let f=0;f<u.length;f++){const p=u[f];d&&(p.oldValue=d[f].value);let m=p.dir[o];m&&(qt(),kt(m,i,8,[e.el,p,e,t]),Jt())}}function hd(e,t){if(He){let i=He.provides;const o=He.parent&&He.parent.provides;o===i&&(i=He.provides=Object.create(o)),i[e]=t}}function Ls(e,t,i=!1){const o=pc();if(o||Ba){let u=Ba?Ba._context.provides:o?o.parent==null||o.ce?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides:void 0;if(u&&e in u)return u[e];if(arguments.length>1)return i&&Q(t)?t.call(o&&o.proxy):t}}const md=Symbol.for("v-scx"),vd=()=>Ls(md);function Ie(e,t,i){return fo(e,t,i)}function fo(e,t,i=we){const{immediate:o,deep:u,flush:d,once:f}=i,p=Be({},i),m=t&&o||!t&&d!=="post";let T;if(ms){if(d==="sync"){const z=vd();T=z.__watcherHandles||(z.__watcherHandles=[])}else if(!m){const z=()=>{};return z.stop=Rt,z.resume=Rt,z.pause=Rt,z}}const A=He;p.call=(z,re,U)=>kt(z,A,re,U);let I=!1;d==="post"?p.scheduler=z=>{Je(z,A&&A.suspense)}:d!=="sync"&&(I=!0,p.scheduler=(z,re)=>{re?z():lr(z)}),p.augmentJob=z=>{t&&(z.flags|=4),I&&(z.flags|=2,A&&(z.id=A.uid,z.i=A))};const L=dd(e,t,p);return ms&&(T?T.push(L):m&&L()),L}function bd(e,t,i){const o=this.proxy,u=Ge(e)?e.includes(".")?po(o,e):()=>o[e]:e.bind(o,o);let d;Q(t)?d=t:(d=t.handler,i=t);const f=As(this),p=fo(u,d.bind(o),i);return f(),p}function po(e,t){const i=t.split(".");return()=>{let o=e;for(let u=0;u<i.length&&o;u++)o=o[i[u]];return o}}const yd=Symbol("_vte"),Ad=e=>e.__isTeleport,Sd=Symbol("_leaveCb");function ur(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ur(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function go(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Qr(e,t){let i;return!!((i=Object.getOwnPropertyDescriptor(e,t))&&!i.configurable)}const Ks=new WeakMap;function os(e,t,i,o,u=!1){if(J(e)){e.forEach((U,Re)=>os(U,t&&(J(t)?t[Re]:t),i,o,u));return}if(ls(o)&&!u){o.shapeFlag&512&&o.type.__asyncResolved&&o.component.subTree.component&&os(e,t,i,o.component.subTree);return}const d=o.shapeFlag&4?an(o.component):o.el,f=u?null:d,{i:p,r:m}=e,T=t&&t.r,A=p.refs===we?p.refs={}:p.refs,I=p.setupState,L=be(I),z=I===we?Li:U=>Qr(A,U)?!1:ye(L,U),re=(U,Re)=>!(Re&&Qr(A,Re));if(T!=null&&T!==m){if(ei(t),Ge(T))A[T]=null,z(T)&&(I[T]=null);else if($e(T)){const U=t;re(T,U.k)&&(T.value=null),U.k&&(A[U.k]=null)}}if(Q(m))ys(m,p,12,[f,A]);else{const U=Ge(m),Re=$e(m);if(U||Re){const te=()=>{if(e.f){const oe=U?z(m)?I[m]:A[m]:re()||!e.k?m.value:A[e.k];if(u)J(oe)&&Yn(oe,d);else if(J(oe))oe.includes(d)||oe.push(d);else if(U)A[m]=[d],z(m)&&(I[m]=A[m]);else{const ge=[d];re(m,e.k)&&(m.value=ge),e.k&&(A[e.k]=ge)}}else U?(A[m]=f,z(m)&&(I[m]=f)):Re&&(re(m,e.k)&&(m.value=f),e.k&&(A[e.k]=f))};if(f){const oe=()=>{te(),Ks.delete(e)};oe.id=-1,Ks.set(e,oe),Je(oe,i)}else ei(e),te()}}}function ei(e){const t=Ks.get(e);t&&(t.flags|=8,Ks.delete(e))}qs().requestIdleCallback;qs().cancelIdleCallback;const ls=e=>!!e.type.__asyncLoader,ho=e=>e.type.__isKeepAlive;function Pd(e,t){mo(e,"a",t)}function wd(e,t){mo(e,"da",t)}function mo(e,t,i=He){const o=e.__wdc||(e.__wdc=()=>{let u=i;for(;u;){if(u.isDeactivated)return;u=u.parent}return e()});if(Qs(t,o,i),i){let u=i.parent;for(;u&&u.parent;)ho(u.parent.vnode)&&Td(o,t,i,u),u=u.parent}}function Td(e,t,i,o){const u=Qs(t,e,o,!0);yo(()=>{Yn(o[t],u)},i)}function Qs(e,t,i=He,o=!1){if(i){const u=i[e]||(i[e]=[]),d=t.__weh||(t.__weh=(...f)=>{qt();const p=As(i),m=kt(t,i,e,f);return p(),Jt(),m});return o?u.unshift(d):u.push(d),d}}const Yt=e=>(t,i=He)=>{(!ms||e==="sp")&&Qs(e,(...o)=>t(...o),i)},_d=Yt("bm"),vo=Yt("m"),Dd=Yt("bu"),Id=Yt("u"),bo=Yt("bum"),yo=Yt("um"),Rd=Yt("sp"),Nd=Yt("rtg"),Cd=Yt("rtc");function kd(e,t=He){Qs("ec",e,t)}const xd=Symbol.for("v-ndc");function ne(e,t,i,o){let u;const d=i,f=J(e);if(f||Ge(e)){const p=f&&Ia(e);let m=!1,T=!1;p&&(m=!lt(e),T=Zt(e),e=Js(e)),u=new Array(e.length);for(let A=0,I=e.length;A<I;A++)u[A]=t(m?T?Va(mt(e[A])):mt(e[A]):e[A],A,void 0,d)}else if(typeof e=="number"){u=new Array(e);for(let p=0;p<e;p++)u[p]=t(p+1,p,void 0,d)}else if(Pe(e))if(e[Symbol.iterator])u=Array.from(e,(p,m)=>t(p,m,void 0,d));else{const p=Object.keys(e);u=new Array(p.length);for(let m=0,T=p.length;m<T;m++){const A=p[m];u[m]=t(e[A],A,m,d)}}else u=[];return u}const Wn=e=>e?$o(e)?an(e):Wn(e.parent):null,us=Be(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Wn(e.parent),$root:e=>Wn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>So(e),$forceUpdate:e=>e.f||(e.f=()=>{lr(e.update)}),$nextTick:e=>e.n||(e.n=is.bind(e.proxy)),$watch:e=>bd.bind(e)}),Gn=(e,t)=>e!==we&&!e.__isScriptSetup&&ye(e,t),Ed={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:i,setupState:o,data:u,props:d,accessCache:f,type:p,appContext:m}=e;if(t[0]!=="$"){const L=f[t];if(L!==void 0)switch(L){case 1:return o[t];case 2:return u[t];case 4:return i[t];case 3:return d[t]}else{if(Gn(o,t))return f[t]=1,o[t];if(u!==we&&ye(u,t))return f[t]=2,u[t];if(ye(d,t))return f[t]=3,d[t];if(i!==we&&ye(i,t))return f[t]=4,i[t];Un&&(f[t]=0)}}const T=us[t];let A,I;if(T)return t==="$attrs"&&ze(e.attrs,"get",""),T(e);if((A=p.__cssModules)&&(A=A[t]))return A;if(i!==we&&ye(i,t))return f[t]=4,i[t];if(I=m.config.globalProperties,ye(I,t))return I[t]},set({_:e},t,i){const{data:o,setupState:u,ctx:d}=e;return Gn(u,t)?(u[t]=i,!0):o!==we&&ye(o,t)?(o[t]=i,!0):ye(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(d[t]=i,!0)},has({_:{data:e,setupState:t,accessCache:i,ctx:o,appContext:u,props:d,type:f}},p){let m;return!!(i[p]||e!==we&&p[0]!=="$"&&ye(e,p)||Gn(t,p)||ye(d,p)||ye(o,p)||ye(us,p)||ye(u.config.globalProperties,p)||(m=f.__cssModules)&&m[p])},defineProperty(e,t,i){return i.get!=null?e._.accessCache[t]=0:ye(i,"value")&&this.set(e,t,i.value,null),Reflect.defineProperty(e,t,i)}};function ti(e){return J(e)?e.reduce((t,i)=>(t[i]=null,t),{}):e}let Un=!0;function Gd(e){const t=So(e),i=e.proxy,o=e.ctx;Un=!1,t.beforeCreate&&ai(t.beforeCreate,e,"bc");const{data:u,computed:d,methods:f,watch:p,provide:m,inject:T,created:A,beforeMount:I,mounted:L,beforeUpdate:z,updated:re,activated:U,deactivated:Re,beforeDestroy:te,beforeUnmount:oe,destroyed:ge,unmounted:Z,render:Ce,renderTracked:ut,renderTriggered:Ye,errorCaptured:vt,serverPrefetch:a,expose:dt,inheritAttrs:xt,components:Qt,directives:bt,filters:ea}=t;if(T&&Fd(T,o,null),f)for(const ue in f){const le=f[ue];Q(le)&&(o[ue]=le.bind(i))}if(u){const ue=u.call(i,i);Pe(ue)&&(e.data=Zs(ue))}if(Un=!0,d)for(const ue in d){const le=d[ue],ct=Q(le)?le.bind(i,i):Q(le.get)?le.get.bind(i,i):Rt,aa=!Q(le)&&Q(le.set)?le.set.bind(i):Rt,at=H({get:ct,set:aa});Object.defineProperty(o,ue,{enumerable:!0,configurable:!0,get:()=>at.value,set:Ve=>at.value=Ve})}if(p)for(const ue in p)Ao(p[ue],o,i,ue);if(m){const ue=Q(m)?m.call(i):m;Reflect.ownKeys(ue).forEach(le=>{hd(le,ue[le])})}A&&ai(A,e,"c");function _e(ue,le){J(le)?le.forEach(ct=>ue(ct.bind(i))):le&&ue(le.bind(i))}if(_e(_d,I),_e(vo,L),_e(Dd,z),_e(Id,re),_e(Pd,U),_e(wd,Re),_e(kd,vt),_e(Cd,ut),_e(Nd,Ye),_e(bo,oe),_e(yo,Z),_e(Rd,a),J(dt))if(dt.length){const ue=e.exposed||(e.exposed={});dt.forEach(le=>{Object.defineProperty(ue,le,{get:()=>i[le],set:ct=>i[le]=ct,enumerable:!0})})}else e.exposed||(e.exposed={});Ce&&e.render===Rt&&(e.render=Ce),xt!=null&&(e.inheritAttrs=xt),Qt&&(e.components=Qt),bt&&(e.directives=bt),a&&go(e)}function Fd(e,t,i=Rt){J(e)&&(e=jn(e));for(const o in e){const u=e[o];let d;Pe(u)?"default"in u?d=Ls(u.from||o,u.default,!0):d=Ls(u.from||o):d=Ls(u),$e(d)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>d.value,set:f=>d.value=f}):t[o]=d}}function ai(e,t,i){kt(J(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,i)}function Ao(e,t,i,o){let u=o.includes(".")?po(i,o):()=>i[o];if(Ge(e)){const d=t[e];Q(d)&&Ie(u,d)}else if(Q(e))Ie(u,e.bind(i));else if(Pe(e))if(J(e))e.forEach(d=>Ao(d,t,i,o));else{const d=Q(e.handler)?e.handler.bind(i):t[e.handler];Q(d)&&Ie(u,d,e)}}function So(e){const t=e.type,{mixins:i,extends:o}=t,{mixins:u,optionsCache:d,config:{optionMergeStrategies:f}}=e.appContext,p=d.get(t);let m;return p?m=p:!u.length&&!i&&!o?m=t:(m={},u.length&&u.forEach(T=>Ws(m,T,f,!0)),Ws(m,t,f)),Pe(t)&&d.set(t,m),m}function Ws(e,t,i,o=!1){const{mixins:u,extends:d}=t;d&&Ws(e,d,i,!0),u&&u.forEach(f=>Ws(e,f,i,!0));for(const f in t)if(!(o&&f==="expose")){const p=Ld[f]||i&&i[f];e[f]=p?p(e[f],t[f]):t[f]}return e}const Ld={data:si,props:ni,emits:ni,methods:as,computed:as,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:as,directives:as,watch:Od,provide:si,inject:Md};function si(e,t){return t?e?function(){return Be(Q(e)?e.call(this,this):e,Q(t)?t.call(this,this):t)}:t:e}function Md(e,t){return as(jn(e),jn(t))}function jn(e){if(J(e)){const t={};for(let i=0;i<e.length;i++)t[e[i]]=e[i];return t}return e}function Ue(e,t){return e?[...new Set([].concat(e,t))]:t}function as(e,t){return e?Be(Object.create(null),e,t):t}function ni(e,t){return e?J(e)&&J(t)?[...new Set([...e,...t])]:Be(Object.create(null),ti(e),ti(t??{})):t}function Od(e,t){if(!e)return t;if(!t)return e;const i=Be(Object.create(null),e);for(const o in t)i[o]=Ue(e[o],t[o]);return i}function Po(){return{app:null,config:{isNativeTag:Li,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let zd=0;function $d(e,t){return function(o,u=null){Q(o)||(o=Be({},o)),u!=null&&!Pe(u)&&(u=null);const d=Po(),f=new WeakSet,p=[];let m=!1;const T=d.app={_uid:zd++,_component:o,_props:u,_container:null,_context:d,_instance:null,version:yc,get config(){return d.config},set config(A){},use(A,...I){return f.has(A)||(A&&Q(A.install)?(f.add(A),A.install(T,...I)):Q(A)&&(f.add(A),A(T,...I))),T},mixin(A){return d.mixins.includes(A)||d.mixins.push(A),T},component(A,I){return I?(d.components[A]=I,T):d.components[A]},directive(A,I){return I?(d.directives[A]=I,T):d.directives[A]},mount(A,I,L){if(!m){const z=T._ceVNode||Nt(o,u);return z.appContext=d,L===!0?L="svg":L===!1&&(L=void 0),e(z,A,L),m=!0,T._container=A,A.__vue_app__=T,an(z.component)}},onUnmount(A){p.push(A)},unmount(){m&&(kt(p,T._instance,16),e(null,T._container),delete T._container.__vue_app__)},provide(A,I){return d.provides[A]=I,T},runWithContext(A){const I=Ba;Ba=T;try{return A()}finally{Ba=I}}};return T}}let Ba=null;const Bd=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${gt(t)}Modifiers`]||e[`${ma(t)}Modifiers`];function Vd(e,t,...i){if(e.isUnmounted)return;const o=e.vnode.props||we;let u=i;const d=t.startsWith("update:"),f=d&&Bd(o,t.slice(7));f&&(f.trim&&(u=i.map(A=>Ge(A)?A.trim():A)),f.number&&(u=i.map(Xs)));let p,m=o[p=Nn(t)]||o[p=Nn(gt(t))];!m&&d&&(m=o[p=Nn(ma(t))]),m&&kt(m,e,6,u);const T=o[p+"Once"];if(T){if(!e.emitted)e.emitted={};else if(e.emitted[p])return;e.emitted[p]=!0,kt(T,e,6,u)}}const Kd=new WeakMap;function wo(e,t,i=!1){const o=i?Kd:t.emitsCache,u=o.get(e);if(u!==void 0)return u;const d=e.emits;let f={},p=!1;if(!Q(e)){const m=T=>{const A=wo(T,t,!0);A&&(p=!0,Be(f,A))};!i&&t.mixins.length&&t.mixins.forEach(m),e.extends&&m(e.extends),e.mixins&&e.mixins.forEach(m)}return!d&&!p?(Pe(e)&&o.set(e,null),null):(J(d)?d.forEach(m=>f[m]=null):Be(f,d),Pe(e)&&o.set(e,f),f)}function en(e,t){return!e||!js(t)?!1:(t=t.slice(2).replace(/Once$/,""),ye(e,t[0].toLowerCase()+t.slice(1))||ye(e,ma(t))||ye(e,t))}function ri(e){const{type:t,vnode:i,proxy:o,withProxy:u,propsOptions:[d],slots:f,attrs:p,emit:m,render:T,renderCache:A,props:I,data:L,setupState:z,ctx:re,inheritAttrs:U}=e,Re=Vs(e);let te,oe;try{if(i.shapeFlag&4){const Z=u||o,Ce=Z;te=Dt(T.call(Ce,Z,A,I,z,L,re)),oe=p}else{const Z=t;te=Dt(Z.length>1?Z(I,{attrs:p,slots:f,emit:m}):Z(I,null)),oe=t.props?p:Wd(p)}}catch(Z){ds.length=0,Ys(Z,e,1),te=Nt(ha)}let ge=te;if(oe&&U!==!1){const Z=Object.keys(oe),{shapeFlag:Ce}=ge;Z.length&&Ce&7&&(d&&Z.some(Zn)&&(oe=Ud(oe,d)),ge=Ka(ge,oe,!1,!0))}return i.dirs&&(ge=Ka(ge,null,!1,!0),ge.dirs=ge.dirs?ge.dirs.concat(i.dirs):i.dirs),i.transition&&ur(ge,i.transition),te=ge,Vs(Re),te}const Wd=e=>{let t;for(const i in e)(i==="class"||i==="style"||js(i))&&((t||(t={}))[i]=e[i]);return t},Ud=(e,t)=>{const i={};for(const o in e)(!Zn(o)||!(o.slice(9)in t))&&(i[o]=e[o]);return i};function jd(e,t,i){const{props:o,children:u,component:d}=e,{props:f,children:p,patchFlag:m}=t,T=d.emitsOptions;if(t.dirs||t.transition)return!0;if(i&&m>=0){if(m&1024)return!0;if(m&16)return o?ii(o,f,T):!!f;if(m&8){const A=t.dynamicProps;for(let I=0;I<A.length;I++){const L=A[I];if(To(f,o,L)&&!en(T,L))return!0}}}else return(u||p)&&(!p||!p.$stable)?!0:o===f?!1:o?f?ii(o,f,T):!0:!!f;return!1}function ii(e,t,i){const o=Object.keys(t);if(o.length!==Object.keys(e).length)return!0;for(let u=0;u<o.length;u++){const d=o[u];if(To(t,e,d)&&!en(i,d))return!0}return!1}function To(e,t,i){const o=e[i],u=t[i];return i==="style"&&Pe(o)&&Pe(u)?!ja(o,u):o!==u}function Hd({vnode:e,parent:t},i){for(;t;){const o=t.subTree;if(o.suspense&&o.suspense.activeBranch===e&&(o.el=e.el),o===e)(e=t.vnode).el=i,t=t.parent;else break}}const _o={},Do=()=>Object.create(_o),Io=e=>Object.getPrototypeOf(e)===_o;function Xd(e,t,i,o=!1){const u={},d=Do();e.propsDefaults=Object.create(null),Ro(e,t,u,d);for(const f in e.propsOptions[0])f in u||(u[f]=void 0);i?e.props=o?u:td(u):e.type.props?e.props=u:e.props=d,e.attrs=d}function qd(e,t,i,o){const{props:u,attrs:d,vnode:{patchFlag:f}}=e,p=be(u),[m]=e.propsOptions;let T=!1;if((o||f>0)&&!(f&16)){if(f&8){const A=e.vnode.dynamicProps;for(let I=0;I<A.length;I++){let L=A[I];if(en(e.emitsOptions,L))continue;const z=t[L];if(m)if(ye(d,L))z!==d[L]&&(d[L]=z,T=!0);else{const re=gt(L);u[re]=Hn(m,p,re,z,e,!1)}else z!==d[L]&&(d[L]=z,T=!0)}}}else{Ro(e,t,u,d)&&(T=!0);let A;for(const I in p)(!t||!ye(t,I)&&((A=ma(I))===I||!ye(t,A)))&&(m?i&&(i[I]!==void 0||i[A]!==void 0)&&(u[I]=Hn(m,p,I,void 0,e,!0)):delete u[I]);if(d!==p)for(const I in d)(!t||!ye(t,I))&&(delete d[I],T=!0)}T&&jt(e.attrs,"set","")}function Ro(e,t,i,o){const[u,d]=e.propsOptions;let f=!1,p;if(t)for(let m in t){if(ss(m))continue;const T=t[m];let A;u&&ye(u,A=gt(m))?!d||!d.includes(A)?i[A]=T:(p||(p={}))[A]=T:en(e.emitsOptions,m)||(!(m in o)||T!==o[m])&&(o[m]=T,f=!0)}if(d){const m=be(i),T=p||we;for(let A=0;A<d.length;A++){const I=d[A];i[I]=Hn(u,m,I,T[I],e,!ye(T,I))}}return f}function Hn(e,t,i,o,u,d){const f=e[i];if(f!=null){const p=ye(f,"default");if(p&&o===void 0){const m=f.default;if(f.type!==Function&&!f.skipFactory&&Q(m)){const{propsDefaults:T}=u;if(i in T)o=T[i];else{const A=As(u);o=T[i]=m.call(null,t),A()}}else o=m;u.ce&&u.ce._setProp(i,o)}f[0]&&(d&&!p?o=!1:f[1]&&(o===""||o===ma(i))&&(o=!0))}return o}const Jd=new WeakMap;function No(e,t,i=!1){const o=i?Jd:t.propsCache,u=o.get(e);if(u)return u;const d=e.props,f={},p=[];let m=!1;if(!Q(e)){const A=I=>{m=!0;const[L,z]=No(I,t,!0);Be(f,L),z&&p.push(...z)};!i&&t.mixins.length&&t.mixins.forEach(A),e.extends&&A(e.extends),e.mixins&&e.mixins.forEach(A)}if(!d&&!m)return Pe(e)&&o.set(e,Oa),Oa;if(J(d))for(let A=0;A<d.length;A++){const I=gt(d[A]);oi(I)&&(f[I]=we)}else if(d)for(const A in d){const I=gt(A);if(oi(I)){const L=d[A],z=f[I]=J(L)||Q(L)?{type:L}:Be({},L),re=z.type;let U=!1,Re=!0;if(J(re))for(let te=0;te<re.length;++te){const oe=re[te],ge=Q(oe)&&oe.name;if(ge==="Boolean"){U=!0;break}else ge==="String"&&(Re=!1)}else U=Q(re)&&re.name==="Boolean";z[0]=U,z[1]=Re,(U||ye(z,"default"))&&p.push(I)}}const T=[f,p];return Pe(e)&&o.set(e,T),T}function oi(e){return e[0]!=="$"&&!ss(e)}const dr=e=>e==="_"||e==="_ctx"||e==="$stable",cr=e=>J(e)?e.map(Dt):[Dt(e)],Zd=(e,t,i)=>{if(t._n)return t;const o=gd((...u)=>cr(t(...u)),i);return o._c=!1,o},Co=(e,t,i)=>{const o=e._ctx;for(const u in e){if(dr(u))continue;const d=e[u];if(Q(d))t[u]=Zd(u,d,o);else if(d!=null){const f=cr(d);t[u]=()=>f}}},ko=(e,t)=>{const i=cr(t);e.slots.default=()=>i},xo=(e,t,i)=>{for(const o in t)(i||!dr(o))&&(e[o]=t[o])},Yd=(e,t,i)=>{const o=e.slots=Do();if(e.vnode.shapeFlag&32){const u=t._;u?(xo(o,t,i),i&&Bi(o,"_",u,!0)):Co(t,o)}else t&&ko(e,t)},Qd=(e,t,i)=>{const{vnode:o,slots:u}=e;let d=!0,f=we;if(o.shapeFlag&32){const p=t._;p?i&&p===1?d=!1:xo(u,t,i):(d=!t.$stable,Co(t,u)),f=t}else t&&(ko(e,t),f={default:1});if(d)for(const p in u)!dr(p)&&f[p]==null&&delete u[p]},Je=nc;function ec(e){return tc(e)}function tc(e,t){const i=qs();i.__VUE__=!0;const{insert:o,remove:u,patchProp:d,createElement:f,createText:p,createComment:m,setText:T,setElementText:A,parentNode:I,nextSibling:L,setScopeId:z=Rt,insertStaticContent:re}=e,U=(g,y,_,x=null,R=null,C=null,E=void 0,P=null,N=!!y.dynamicChildren)=>{if(g===y)return;g&&!ts(g,y)&&(x=sa(g),Ve(g,R,C,!0),g=null),y.patchFlag===-2&&(N=!1,y.dynamicChildren=null);const{type:k,ref:j,shapeFlag:M}=y;switch(k){case tn:Re(g,y,_,x);break;case ha:te(g,y,_,x);break;case Ms:g==null&&oe(y,_,x,E);break;case q:Qt(g,y,_,x,R,C,E,P,N);break;default:M&1?Ce(g,y,_,x,R,C,E,P,N):M&6?bt(g,y,_,x,R,C,E,P,N):(M&64||M&128)&&k.process(g,y,_,x,R,C,E,P,N,na)}j!=null&&R?os(j,g&&g.ref,C,y||g,!y):j==null&&g&&g.ref!=null&&os(g.ref,null,C,g,!0)},Re=(g,y,_,x)=>{if(g==null)o(y.el=p(y.children),_,x);else{const R=y.el=g.el;y.children!==g.children&&T(R,y.children)}},te=(g,y,_,x)=>{g==null?o(y.el=m(y.children||""),_,x):y.el=g.el},oe=(g,y,_,x)=>{[g.el,g.anchor]=re(g.children,y,_,x,g.el,g.anchor)},ge=({el:g,anchor:y},_,x)=>{let R;for(;g&&g!==y;)R=L(g),o(g,_,x),g=R;o(y,_,x)},Z=({el:g,anchor:y})=>{let _;for(;g&&g!==y;)_=L(g),u(g),g=_;u(y)},Ce=(g,y,_,x,R,C,E,P,N)=>{if(y.type==="svg"?E="svg":y.type==="math"&&(E="mathml"),g==null)ut(y,_,x,R,C,E,P,N);else{const k=g.el&&g.el._isVueCE?g.el:null;try{k&&k._beginPatch(),a(g,y,R,C,E,P,N)}finally{k&&k._endPatch()}}},ut=(g,y,_,x,R,C,E,P)=>{let N,k;const{props:j,shapeFlag:M,transition:K,dirs:X}=g;if(N=g.el=f(g.type,C,j&&j.is,j),M&8?A(N,g.children):M&16&&vt(g.children,N,null,x,R,Fn(g,C),E,P),X&&Sa(g,null,x,"created"),Ye(N,g,g.scopeId,E,x),j){for(const Ae in j)Ae!=="value"&&!ss(Ae)&&d(N,Ae,null,j[Ae],C,x);"value"in j&&d(N,"value",null,j.value,C),(k=j.onVnodeBeforeMount)&&wt(k,x,g)}X&&Sa(g,null,x,"beforeMount");const ie=ac(R,K);ie&&K.beforeEnter(N),o(N,y,_),((k=j&&j.onVnodeMounted)||ie||X)&&Je(()=>{k&&wt(k,x,g),ie&&K.enter(N),X&&Sa(g,null,x,"mounted")},R)},Ye=(g,y,_,x,R)=>{if(_&&z(g,_),x)for(let C=0;C<x.length;C++)z(g,x[C]);if(R){let C=R.subTree;if(y===C||Lo(C.type)&&(C.ssContent===y||C.ssFallback===y)){const E=R.vnode;Ye(g,E,E.scopeId,E.slotScopeIds,R.parent)}}},vt=(g,y,_,x,R,C,E,P,N=0)=>{for(let k=N;k<g.length;k++){const j=g[k]=P?Ut(g[k]):Dt(g[k]);U(null,j,y,_,x,R,C,E,P)}},a=(g,y,_,x,R,C,E)=>{const P=y.el=g.el;let{patchFlag:N,dynamicChildren:k,dirs:j}=y;N|=g.patchFlag&16;const M=g.props||we,K=y.props||we;let X;if(_&&Pa(_,!1),(X=K.onVnodeBeforeUpdate)&&wt(X,_,y,g),j&&Sa(y,g,_,"beforeUpdate"),_&&Pa(_,!0),(M.innerHTML&&K.innerHTML==null||M.textContent&&K.textContent==null)&&A(P,""),k?dt(g.dynamicChildren,k,P,_,x,Fn(y,R),C):E||le(g,y,P,null,_,x,Fn(y,R),C,!1),N>0){if(N&16)xt(P,M,K,_,R);else if(N&2&&M.class!==K.class&&d(P,"class",null,K.class,R),N&4&&d(P,"style",M.style,K.style,R),N&8){const ie=y.dynamicProps;for(let Ae=0;Ae<ie.length;Ae++){const pe=ie[Ae],Le=M[pe],Oe=K[pe];(Oe!==Le||pe==="value")&&d(P,pe,Le,Oe,R,_)}}N&1&&g.children!==y.children&&A(P,y.children)}else!E&&k==null&&xt(P,M,K,_,R);((X=K.onVnodeUpdated)||j)&&Je(()=>{X&&wt(X,_,y,g),j&&Sa(y,g,_,"updated")},x)},dt=(g,y,_,x,R,C,E)=>{for(let P=0;P<y.length;P++){const N=g[P],k=y[P],j=N.el&&(N.type===q||!ts(N,k)||N.shapeFlag&198)?I(N.el):_;U(N,k,j,null,x,R,C,E,!0)}},xt=(g,y,_,x,R)=>{if(y!==_){if(y!==we)for(const C in y)!ss(C)&&!(C in _)&&d(g,C,y[C],null,R,x);for(const C in _){if(ss(C))continue;const E=_[C],P=y[C];E!==P&&C!=="value"&&d(g,C,P,E,R,x)}"value"in _&&d(g,"value",y.value,_.value,R)}},Qt=(g,y,_,x,R,C,E,P,N)=>{const k=y.el=g?g.el:p(""),j=y.anchor=g?g.anchor:p("");let{patchFlag:M,dynamicChildren:K,slotScopeIds:X}=y;X&&(P=P?P.concat(X):X),g==null?(o(k,_,x),o(j,_,x),vt(y.children||[],_,j,R,C,E,P,N)):M>0&&M&64&&K&&g.dynamicChildren&&g.dynamicChildren.length===K.length?(dt(g.dynamicChildren,K,_,R,C,E,P),(y.key!=null||R&&y===R.subTree)&&Eo(g,y,!0)):le(g,y,_,j,R,C,E,P,N)},bt=(g,y,_,x,R,C,E,P,N)=>{y.slotScopeIds=P,g==null?y.shapeFlag&512?R.ctx.activate(y,_,x,E,N):ea(y,_,x,R,C,E,N):ta(g,y,N)},ea=(g,y,_,x,R,C,E)=>{const P=g.component=fc(g,x,R);if(ho(g)&&(P.ctx.renderer=na),gc(P,!1,E),P.asyncDep){if(R&&R.registerDep(P,_e,E),!g.el){const N=P.subTree=Nt(ha);te(null,N,y,_),g.placeholder=N.el}}else _e(P,g,y,_,R,C,E)},ta=(g,y,_)=>{const x=y.component=g.component;if(jd(g,y,_))if(x.asyncDep&&!x.asyncResolved){ue(x,y,_);return}else x.next=y,x.update();else y.el=g.el,x.vnode=y},_e=(g,y,_,x,R,C,E)=>{const P=()=>{if(g.isMounted){let{next:M,bu:K,u:X,parent:ie,vnode:Ae}=g;{const Xe=Go(g);if(Xe){M&&(M.el=Ae.el,ue(g,M,E)),Xe.asyncDep.then(()=>{Je(()=>{g.isUnmounted||k()},R)});return}}let pe=M,Le;Pa(g,!1),M?(M.el=Ae.el,ue(g,M,E)):M=Ae,K&&Fs(K),(Le=M.props&&M.props.onVnodeBeforeUpdate)&&wt(Le,ie,M,Ae),Pa(g,!0);const Oe=ri(g),st=g.subTree;g.subTree=Oe,U(st,Oe,I(st.el),sa(st),g,R,C),M.el=Oe.el,pe===null&&Hd(g,Oe.el),X&&Je(X,R),(Le=M.props&&M.props.onVnodeUpdated)&&Je(()=>wt(Le,ie,M,Ae),R)}else{let M;const{el:K,props:X}=y,{bm:ie,m:Ae,parent:pe,root:Le,type:Oe}=g,st=ls(y);Pa(g,!1),ie&&Fs(ie),!st&&(M=X&&X.onVnodeBeforeMount)&&wt(M,pe,y),Pa(g,!0);{Le.ce&&Le.ce._hasShadowRoot()&&Le.ce._injectChildStyle(Oe,g.parent?g.parent.type:void 0);const Xe=g.subTree=ri(g);U(null,Xe,_,x,g,R,C),y.el=Xe.el}if(Ae&&Je(Ae,R),!st&&(M=X&&X.onVnodeMounted)){const Xe=y;Je(()=>wt(M,pe,Xe),R)}(y.shapeFlag&256||pe&&ls(pe.vnode)&&pe.vnode.shapeFlag&256)&&g.a&&Je(g.a,R),g.isMounted=!0,y=_=x=null}};g.scope.on();const N=g.effect=new Ui(P);g.scope.off();const k=g.update=N.run.bind(N),j=g.job=N.runIfDirty.bind(N);j.i=g,j.id=g.uid,N.scheduler=()=>lr(j),Pa(g,!0),k()},ue=(g,y,_)=>{y.component=g;const x=g.vnode.props;g.vnode=y,g.next=null,qd(g,y.props,x,_),Qd(g,y.children,_),qt(),Yr(g),Jt()},le=(g,y,_,x,R,C,E,P,N=!1)=>{const k=g&&g.children,j=g?g.shapeFlag:0,M=y.children,{patchFlag:K,shapeFlag:X}=y;if(K>0){if(K&128){aa(k,M,_,x,R,C,E,P,N);return}else if(K&256){ct(k,M,_,x,R,C,E,P,N);return}}X&8?(j&16&&Et(k,R,C),M!==k&&A(_,M)):j&16?X&16?aa(k,M,_,x,R,C,E,P,N):Et(k,R,C,!0):(j&8&&A(_,""),X&16&&vt(M,_,x,R,C,E,P,N))},ct=(g,y,_,x,R,C,E,P,N)=>{g=g||Oa,y=y||Oa;const k=g.length,j=y.length,M=Math.min(k,j);let K;for(K=0;K<M;K++){const X=y[K]=N?Ut(y[K]):Dt(y[K]);U(g[K],X,_,null,R,C,E,P,N)}k>j?Et(g,R,C,!0,!1,M):vt(y,_,x,R,C,E,P,N,M)},aa=(g,y,_,x,R,C,E,P,N)=>{let k=0;const j=y.length;let M=g.length-1,K=j-1;for(;k<=M&&k<=K;){const X=g[k],ie=y[k]=N?Ut(y[k]):Dt(y[k]);if(ts(X,ie))U(X,ie,_,null,R,C,E,P,N);else break;k++}for(;k<=M&&k<=K;){const X=g[M],ie=y[K]=N?Ut(y[K]):Dt(y[K]);if(ts(X,ie))U(X,ie,_,null,R,C,E,P,N);else break;M--,K--}if(k>M){if(k<=K){const X=K+1,ie=X<j?y[X].el:x;for(;k<=K;)U(null,y[k]=N?Ut(y[k]):Dt(y[k]),_,ie,R,C,E,P,N),k++}}else if(k>K)for(;k<=M;)Ve(g[k],R,C,!0),k++;else{const X=k,ie=k,Ae=new Map;for(k=ie;k<=K;k++){const Me=y[k]=N?Ut(y[k]):Dt(y[k]);Me.key!=null&&Ae.set(Me.key,k)}let pe,Le=0;const Oe=K-ie+1;let st=!1,Xe=0;const ft=new Array(Oe);for(k=0;k<Oe;k++)ft[k]=0;for(k=X;k<=M;k++){const Me=g[k];if(Le>=Oe){Ve(Me,R,C,!0);continue}let Ke;if(Me.key!=null)Ke=Ae.get(Me.key);else for(pe=ie;pe<=K;pe++)if(ft[pe-ie]===0&&ts(Me,y[pe])){Ke=pe;break}Ke===void 0?Ve(Me,R,C,!0):(ft[Ke-ie]=k+1,Ke>=Xe?Xe=Ke:st=!0,U(Me,y[Ke],_,null,R,C,E,P,N),Le++)}const Ss=st?sc(ft):Oa;for(pe=Ss.length-1,k=Oe-1;k>=0;k--){const Me=ie+k,Ke=y[Me],nt=y[Me+1],va=Me+1<j?nt.el||Fo(nt):x;ft[k]===0?U(null,Ke,_,va,R,C,E,P,N):st&&(pe<0||k!==Ss[pe]?at(Ke,_,va,2):pe--)}}},at=(g,y,_,x,R=null)=>{const{el:C,type:E,transition:P,children:N,shapeFlag:k}=g;if(k&6){at(g.component.subTree,y,_,x);return}if(k&128){g.suspense.move(y,_,x);return}if(k&64){E.move(g,y,_,na);return}if(E===q){o(C,y,_);for(let M=0;M<N.length;M++)at(N[M],y,_,x);o(g.anchor,y,_);return}if(E===Ms){ge(g,y,_);return}if(x!==2&&k&1&&P)if(x===0)P.beforeEnter(C),o(C,y,_),Je(()=>P.enter(C),R);else{const{leave:M,delayLeave:K,afterLeave:X}=P,ie=()=>{g.ctx.isUnmounted?u(C):o(C,y,_)},Ae=()=>{C._isLeaving&&C[Sd](!0),M(C,()=>{ie(),X&&X()})};K?K(C,ie,Ae):Ae()}else o(C,y,_)},Ve=(g,y,_,x=!1,R=!1)=>{const{type:C,props:E,ref:P,children:N,dynamicChildren:k,shapeFlag:j,patchFlag:M,dirs:K,cacheIndex:X}=g;if(M===-2&&(R=!1),P!=null&&(qt(),os(P,null,_,g,!0),Jt()),X!=null&&(y.renderCache[X]=void 0),j&256){y.ctx.deactivate(g);return}const ie=j&1&&K,Ae=!ls(g);let pe;if(Ae&&(pe=E&&E.onVnodeBeforeUnmount)&&wt(pe,y,g),j&6)Na(g.component,_,x);else{if(j&128){g.suspense.unmount(_,x);return}ie&&Sa(g,null,y,"beforeUnmount"),j&64?g.type.remove(g,y,_,na,x):k&&!k.hasOnce&&(C!==q||M>0&&M&64)?Et(k,y,_,!1,!0):(C===q&&M&384||!R&&j&16)&&Et(N,y,_),x&&Ra(g)}(Ae&&(pe=E&&E.onVnodeUnmounted)||ie)&&Je(()=>{pe&&wt(pe,y,g),ie&&Sa(g,null,y,"unmounted")},_)},Ra=g=>{const{type:y,el:_,anchor:x,transition:R}=g;if(y===q){Ha(_,x);return}if(y===Ms){Z(g);return}const C=()=>{u(_),R&&!R.persisted&&R.afterLeave&&R.afterLeave()};if(g.shapeFlag&1&&R&&!R.persisted){const{leave:E,delayLeave:P}=R,N=()=>E(_,C);P?P(g.el,C,N):N()}else C()},Ha=(g,y)=>{let _;for(;g!==y;)_=L(g),u(g),g=_;u(y)},Na=(g,y,_)=>{const{bum:x,scope:R,job:C,subTree:E,um:P,m:N,a:k}=g;li(N),li(k),x&&Fs(x),R.stop(),C&&(C.flags|=8,Ve(E,g,y,_)),P&&Je(P,y),Je(()=>{g.isUnmounted=!0},y)},Et=(g,y,_,x=!1,R=!1,C=0)=>{for(let E=C;E<g.length;E++)Ve(g[E],y,_,x,R)},sa=g=>{if(g.shapeFlag&6)return sa(g.component.subTree);if(g.shapeFlag&128)return g.suspense.next();const y=L(g.anchor||g.el),_=y&&y[yd];return _?L(_):y};let Ca=!1;const ka=(g,y,_)=>{let x;g==null?y._vnode&&(Ve(y._vnode,null,null,!0),x=y._vnode.component):U(y._vnode||null,g,y,null,null,null,_),y._vnode=g,Ca||(Ca=!0,Yr(x),lo(),Ca=!1)},na={p:U,um:Ve,m:at,r:Ra,mt:ea,mc:vt,pc:le,pbc:dt,n:sa,o:e};return{render:ka,hydrate:void 0,createApp:$d(ka)}}function Fn({type:e,props:t},i){return i==="svg"&&e==="foreignObject"||i==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:i}function Pa({effect:e,job:t},i){i?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ac(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Eo(e,t,i=!1){const o=e.children,u=t.children;if(J(o)&&J(u))for(let d=0;d<o.length;d++){const f=o[d];let p=u[d];p.shapeFlag&1&&!p.dynamicChildren&&((p.patchFlag<=0||p.patchFlag===32)&&(p=u[d]=Ut(u[d]),p.el=f.el),!i&&p.patchFlag!==-2&&Eo(f,p)),p.type===tn&&(p.patchFlag===-1&&(p=u[d]=Ut(p)),p.el=f.el),p.type===ha&&!p.el&&(p.el=f.el)}}function sc(e){const t=e.slice(),i=[0];let o,u,d,f,p;const m=e.length;for(o=0;o<m;o++){const T=e[o];if(T!==0){if(u=i[i.length-1],e[u]<T){t[o]=u,i.push(o);continue}for(d=0,f=i.length-1;d<f;)p=d+f>>1,e[i[p]]<T?d=p+1:f=p;T<e[i[d]]&&(d>0&&(t[o]=i[d-1]),i[d]=o)}}for(d=i.length,f=i[d-1];d-- >0;)i[d]=f,f=t[f];return i}function Go(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Go(t)}function li(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Fo(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Fo(t.subTree):null}const Lo=e=>e.__isSuspense;function nc(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):pd(e)}const q=Symbol.for("v-fgt"),tn=Symbol.for("v-txt"),ha=Symbol.for("v-cmt"),Ms=Symbol.for("v-stc"),ds=[];let tt=null;function v(e=!1){ds.push(tt=e?null:[])}function rc(){ds.pop(),tt=ds[ds.length-1]||null}let hs=1;function ui(e,t=!1){hs+=e,e<0&&tt&&t&&(tt.hasOnce=!0)}function Mo(e){return e.dynamicChildren=hs>0?tt||Oa:null,rc(),hs>0&&tt&&tt.push(e),e}function b(e,t,i,o,u,d){return Mo(l(e,t,i,o,u,d,!0))}function ic(e,t,i,o,u){return Mo(Nt(e,t,i,o,u,!0))}function Oo(e){return e?e.__v_isVNode===!0:!1}function ts(e,t){return e.type===t.type&&e.key===t.key}const zo=({key:e})=>e??null,Os=({ref:e,ref_key:t,ref_for:i})=>(typeof e=="number"&&(e=""+e),e!=null?Ge(e)||$e(e)||Q(e)?{i:ot,r:e,k:t,f:!!i}:e:null);function l(e,t=null,i=null,o=0,u=null,d=e===q?0:1,f=!1,p=!1){const m={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&zo(t),ref:t&&Os(t),scopeId:co,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:d,patchFlag:o,dynamicProps:u,dynamicChildren:null,appContext:null,ctx:ot};return p?(fr(m,i),d&128&&e.normalize(m)):i&&(m.shapeFlag|=Ge(i)?8:16),hs>0&&!f&&tt&&(m.patchFlag>0||d&6)&&m.patchFlag!==32&&tt.push(m),m}const Nt=oc;function oc(e,t=null,i=null,o=0,u=null,d=!1){if((!e||e===xd)&&(e=ha),Oo(e)){const p=Ka(e,t,!0);return i&&fr(p,i),hs>0&&!d&&tt&&(p.shapeFlag&6?tt[tt.indexOf(e)]=p:tt.push(p)),p.patchFlag=-2,p}if(bc(e)&&(e=e.__vccOpts),t){t=lc(t);let{class:p,style:m}=t;p&&!Ge(p)&&(t.class=fe(p)),Pe(m)&&(or(m)&&!J(m)&&(m=Be({},m)),t.style=cs(m))}const f=Ge(e)?1:Lo(e)?128:Ad(e)?64:Pe(e)?4:Q(e)?2:0;return l(e,t,i,o,u,f,d,!0)}function lc(e){return e?or(e)||Io(e)?Be({},e):e:null}function Ka(e,t,i=!1,o=!1){const{props:u,ref:d,patchFlag:f,children:p,transition:m}=e,T=t?uc(u||{},t):u,A={__v_isVNode:!0,__v_skip:!0,type:e.type,props:T,key:T&&zo(T),ref:t&&t.ref?i&&d?J(d)?d.concat(Os(t)):[d,Os(t)]:Os(t):d,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:p,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?f===-1?16:f|16:f,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:m,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ka(e.ssContent),ssFallback:e.ssFallback&&Ka(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return m&&o&&ur(A,m.clone(A)),A}function ce(e=" ",t=0){return Nt(tn,null,e,t)}function wa(e,t){const i=Nt(Ms,null,e);return i.staticCount=t,i}function F(e="",t=!1){return t?(v(),ic(ha,null,e)):Nt(ha,null,e)}function Dt(e){return e==null||typeof e=="boolean"?Nt(ha):J(e)?Nt(q,null,e.slice()):Oo(e)?Ut(e):Nt(tn,null,String(e))}function Ut(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ka(e)}function fr(e,t){let i=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(J(t))i=16;else if(typeof t=="object")if(o&65){const u=t.default;u&&(u._c&&(u._d=!1),fr(e,u()),u._c&&(u._d=!0));return}else{i=32;const u=t._;!u&&!Io(t)?t._ctx=ot:u===3&&ot&&(ot.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Q(t)?(t={default:t,_ctx:ot},i=32):(t=String(t),o&64?(i=16,t=[ce(t)]):i=8);e.children=t,e.shapeFlag|=i}function uc(...e){const t={};for(let i=0;i<e.length;i++){const o=e[i];for(const u in o)if(u==="class")t.class!==o.class&&(t.class=fe([t.class,o.class]));else if(u==="style")t.style=cs([t.style,o.style]);else if(js(u)){const d=t[u],f=o[u];f&&d!==f&&!(J(d)&&d.includes(f))&&(t[u]=d?[].concat(d,f):f)}else u!==""&&(t[u]=o[u])}return t}function wt(e,t,i,o=null){kt(e,t,7,[i,o])}const dc=Po();let cc=0;function fc(e,t,i){const o=e.type,u=(t?t.appContext:e.appContext)||dc,d={uid:cc++,vnode:e,type:o,parent:t,appContext:u,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Fu(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(u.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:No(o,u),emitsOptions:wo(o,u),emit:null,emitted:null,propsDefaults:we,inheritAttrs:o.inheritAttrs,ctx:we,data:we,props:we,attrs:we,slots:we,refs:we,setupState:we,setupContext:null,suspense:i,suspenseId:i?i.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return d.ctx={_:d},d.root=t?t.root:d,d.emit=Vd.bind(null,d),e.ce&&e.ce(d),d}let He=null;const pc=()=>He||ot;let Us,Xn;{const e=qs(),t=(i,o)=>{let u;return(u=e[i])||(u=e[i]=[]),u.push(o),d=>{u.length>1?u.forEach(f=>f(d)):u[0](d)}};Us=t("__VUE_INSTANCE_SETTERS__",i=>He=i),Xn=t("__VUE_SSR_SETTERS__",i=>ms=i)}const As=e=>{const t=He;return Us(e),e.scope.on(),()=>{e.scope.off(),Us(t)}},di=()=>{He&&He.scope.off(),Us(null)};function $o(e){return e.vnode.shapeFlag&4}let ms=!1;function gc(e,t=!1,i=!1){t&&Xn(t);const{props:o,children:u}=e.vnode,d=$o(e);Xd(e,o,d,t),Yd(e,u,i||t);const f=d?hc(e,t):void 0;return t&&Xn(!1),f}function hc(e,t){const i=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ed);const{setup:o}=i;if(o){qt();const u=e.setupContext=o.length>1?vc(e):null,d=As(e),f=ys(o,e,0,[e.props,u]),p=Mi(f);if(Jt(),d(),(p||e.sp)&&!ls(e)&&go(e),p){if(f.then(di,di),t)return f.then(m=>{ci(e,m)}).catch(m=>{Ys(m,e,0)});e.asyncDep=f}else ci(e,f)}else Bo(e)}function ci(e,t,i){Q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Pe(t)&&(e.setupState=ro(t)),Bo(e)}function Bo(e,t,i){const o=e.type;e.render||(e.render=o.render||Rt);{const u=As(e);qt();try{Gd(e)}finally{Jt(),u()}}}const mc={get(e,t){return ze(e,"get",""),e[t]}};function vc(e){const t=i=>{e.exposed=i||{}};return{attrs:new Proxy(e.attrs,mc),slots:e.slots,emit:e.emit,expose:t}}function an(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ro(ad(e.exposed)),{get(t,i){if(i in t)return t[i];if(i in us)return us[i](e)},has(t,i){return i in t||i in us}})):e.proxy}function bc(e){return Q(e)&&"__vccOpts"in e}const H=(e,t)=>ld(e,t,ms),yc="3.5.30";let qn;const fi=typeof window<"u"&&window.trustedTypes;if(fi)try{qn=fi.createPolicy("vue",{createHTML:e=>e})}catch{}const Vo=qn?e=>qn.createHTML(e):e=>e,Ac="http://www.w3.org/2000/svg",Sc="http://www.w3.org/1998/Math/MathML",Wt=typeof document<"u"?document:null,pi=Wt&&Wt.createElement("template"),Pc={insert:(e,t,i)=>{t.insertBefore(e,i||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,i,o)=>{const u=t==="svg"?Wt.createElementNS(Ac,e):t==="mathml"?Wt.createElementNS(Sc,e):i?Wt.createElement(e,{is:i}):Wt.createElement(e);return e==="select"&&o&&o.multiple!=null&&u.setAttribute("multiple",o.multiple),u},createText:e=>Wt.createTextNode(e),createComment:e=>Wt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Wt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,i,o,u,d){const f=i?i.previousSibling:t.lastChild;if(u&&(u===d||u.nextSibling))for(;t.insertBefore(u.cloneNode(!0),i),!(u===d||!(u=u.nextSibling)););else{pi.innerHTML=Vo(o==="svg"?`<svg>${e}</svg>`:o==="mathml"?`<math>${e}</math>`:e);const p=pi.content;if(o==="svg"||o==="mathml"){const m=p.firstChild;for(;m.firstChild;)p.appendChild(m.firstChild);p.removeChild(m)}t.insertBefore(p,i)}return[f?f.nextSibling:t.firstChild,i?i.previousSibling:t.lastChild]}},wc=Symbol("_vtc");function Tc(e,t,i){const o=e[wc];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):i?e.setAttribute("class",t):e.className=t}const gi=Symbol("_vod"),_c=Symbol("_vsh"),Dc=Symbol(""),Ic=/(?:^|;)\s*display\s*:/;function Rc(e,t,i){const o=e.style,u=Ge(i);let d=!1;if(i&&!u){if(t)if(Ge(t))for(const f of t.split(";")){const p=f.slice(0,f.indexOf(":")).trim();i[p]==null&&zs(o,p,"")}else for(const f in t)i[f]==null&&zs(o,f,"");for(const f in i)f==="display"&&(d=!0),zs(o,f,i[f])}else if(u){if(t!==i){const f=o[Dc];f&&(i+=";"+f),o.cssText=i,d=Ic.test(i)}}else t&&e.removeAttribute("style");gi in e&&(e[gi]=d?o.display:"",e[_c]&&(o.display="none"))}const hi=/\s*!important$/;function zs(e,t,i){if(J(i))i.forEach(o=>zs(e,t,o));else if(i==null&&(i=""),t.startsWith("--"))e.setProperty(t,i);else{const o=Nc(e,t);hi.test(i)?e.setProperty(ma(o),i.replace(hi,""),"important"):e[o]=i}}const mi=["Webkit","Moz","ms"],Ln={};function Nc(e,t){const i=Ln[t];if(i)return i;let o=gt(t);if(o!=="filter"&&o in e)return Ln[t]=o;o=$i(o);for(let u=0;u<mi.length;u++){const d=mi[u]+o;if(d in e)return Ln[t]=d}return t}const vi="http://www.w3.org/1999/xlink";function bi(e,t,i,o,u,d=Eu(t)){o&&t.startsWith("xlink:")?i==null?e.removeAttributeNS(vi,t.slice(6,t.length)):e.setAttributeNS(vi,t,i):i==null||d&&!Vi(i)?e.removeAttribute(t):e.setAttribute(t,d?"":Ct(i)?String(i):i)}function yi(e,t,i,o,u){if(t==="innerHTML"||t==="textContent"){i!=null&&(e[t]=t==="innerHTML"?Vo(i):i);return}const d=e.tagName;if(t==="value"&&d!=="PROGRESS"&&!d.includes("-")){const p=d==="OPTION"?e.getAttribute("value")||"":e.value,m=i==null?e.type==="checkbox"?"on":"":String(i);(p!==m||!("_value"in e))&&(e.value=m),i==null&&e.removeAttribute(t),e._value=i;return}let f=!1;if(i===""||i==null){const p=typeof e[t];p==="boolean"?i=Vi(i):i==null&&p==="string"?(i="",f=!0):p==="number"&&(i=0,f=!0)}try{e[t]=i}catch{}f&&e.removeAttribute(u||t)}function ga(e,t,i,o){e.addEventListener(t,i,o)}function Cc(e,t,i,o){e.removeEventListener(t,i,o)}const Ai=Symbol("_vei");function kc(e,t,i,o,u=null){const d=e[Ai]||(e[Ai]={}),f=d[t];if(o&&f)f.value=o;else{const[p,m]=xc(t);if(o){const T=d[t]=Fc(o,u);ga(e,p,T,m)}else f&&(Cc(e,p,f,m),d[t]=void 0)}}const Si=/(?:Once|Passive|Capture)$/;function xc(e){let t;if(Si.test(e)){t={};let o;for(;o=e.match(Si);)e=e.slice(0,e.length-o[0].length),t[o[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):ma(e.slice(2)),t]}let Mn=0;const Ec=Promise.resolve(),Gc=()=>Mn||(Ec.then(()=>Mn=0),Mn=Date.now());function Fc(e,t){const i=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=i.attached)return;kt(Lc(o,i.value),t,5,[o])};return i.value=e,i.attached=Gc(),i}function Lc(e,t){if(J(t)){const i=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{i.call(e),e._stopped=!0},t.map(o=>u=>!u._stopped&&o&&o(u))}else return t}const Pi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Mc=(e,t,i,o,u,d)=>{const f=u==="svg";t==="class"?Tc(e,o,f):t==="style"?Rc(e,i,o):js(t)?Zn(t)||kc(e,t,i,o,d):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Oc(e,t,o,f))?(yi(e,t,o),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&bi(e,t,o,f,d,t!=="value")):e._isVueCE&&(zc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ge(o)))?yi(e,gt(t),o,d,t):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),bi(e,t,o,f))};function Oc(e,t,i,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&Pi(t)&&Q(i));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const u=e.tagName;if(u==="IMG"||u==="VIDEO"||u==="CANVAS"||u==="SOURCE")return!1}return Pi(t)&&Ge(i)?!1:t in e}function zc(e,t){const i=e._def.props;if(!i)return!1;const o=gt(t);return Array.isArray(i)?i.some(u=>gt(u)===o):Object.keys(i).some(u=>gt(u)===o)}const Wa=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?i=>Fs(t,i):t};function $c(e){e.target.composing=!0}function wi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Xt=Symbol("_assign");function Ti(e,t,i){return t&&(e=e.trim()),i&&(e=Xs(e)),e}const ke={created(e,{modifiers:{lazy:t,trim:i,number:o}},u){e[Xt]=Wa(u);const d=o||u.props&&u.props.type==="number";ga(e,t?"change":"input",f=>{f.target.composing||e[Xt](Ti(e.value,i,d))}),(i||d)&&ga(e,"change",()=>{e.value=Ti(e.value,i,d)}),t||(ga(e,"compositionstart",$c),ga(e,"compositionend",wi),ga(e,"change",wi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:i,modifiers:{lazy:o,trim:u,number:d}},f){if(e[Xt]=Wa(f),e.composing)return;const p=(d||e.type==="number")&&!/^0\d/.test(e.value)?Xs(e.value):e.value,m=t??"";p!==m&&(document.activeElement===e&&e.type!=="range"&&(o&&t===i||u&&e.value.trim()===m)||(e.value=m))}},On={deep:!0,created(e,t,i){e[Xt]=Wa(i),ga(e,"change",()=>{const o=e._modelValue,u=vs(e),d=e.checked,f=e[Xt];if(J(o)){const p=er(o,u),m=p!==-1;if(d&&!m)f(o.concat(u));else if(!d&&m){const T=[...o];T.splice(p,1),f(T)}}else if(Ua(o)){const p=new Set(o);d?p.add(u):p.delete(u),f(p)}else f(Ko(e,d))})},mounted:_i,beforeUpdate(e,t,i){e[Xt]=Wa(i),_i(e,t,i)}};function _i(e,{value:t,oldValue:i},o){e._modelValue=t;let u;if(J(t))u=er(t,o.props.value)>-1;else if(Ua(t))u=t.has(o.props.value);else{if(t===i)return;u=ja(t,Ko(e,!0))}e.checked!==u&&(e.checked=u)}const Ta={deep:!0,created(e,{value:t,modifiers:{number:i}},o){const u=Ua(t);ga(e,"change",()=>{const d=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>i?Xs(vs(f)):vs(f));e[Xt](e.multiple?u?new Set(d):d:d[0]),e._assigning=!0,is(()=>{e._assigning=!1})}),e[Xt]=Wa(o)},mounted(e,{value:t}){Di(e,t)},beforeUpdate(e,t,i){e[Xt]=Wa(i)},updated(e,{value:t}){e._assigning||Di(e,t)}};function Di(e,t){const i=e.multiple,o=J(t);if(!(i&&!o&&!Ua(t))){for(let u=0,d=e.options.length;u<d;u++){const f=e.options[u],p=vs(f);if(i)if(o){const m=typeof p;m==="string"||m==="number"?f.selected=t.some(T=>String(T)===String(p)):f.selected=er(t,p)>-1}else f.selected=t.has(p);else if(ja(vs(f),t)){e.selectedIndex!==u&&(e.selectedIndex=u);return}}!i&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function vs(e){return"_value"in e?e._value:e.value}function Ko(e,t){const i=t?"_trueValue":"_falseValue";return i in e?e[i]:t}const Bc=["ctrl","shift","alt","meta"],Vc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Bc.some(i=>e[`${i}Key`]&&!t.includes(i))},Kt=(e,t)=>{if(!e)return e;const i=e._withMods||(e._withMods={}),o=t.join(".");return i[o]||(i[o]=((u,...d)=>{for(let f=0;f<t.length;f++){const p=Vc[t[f]];if(p&&p(u,t))return}return e(u,...d)}))},Kc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Wc=(e,t)=>{const i=e._withKeys||(e._withKeys={}),o=t.join(".");return i[o]||(i[o]=(u=>{if(!("key"in u))return;const d=ma(u.key);if(t.some(f=>f===d||Kc[f]===d))return e(u)}))},Uc=Be({patchProp:Mc},Pc);let Ii;function jc(){return Ii||(Ii=ec(Uc))}const Hc=((...e)=>{const t=jc().createApp(...e),{mount:i}=t;return t.mount=o=>{const u=qc(o);if(!u)return;const d=t._component;!Q(d)&&!d.render&&!d.template&&(d.template=u.innerHTML),u.nodeType===1&&(u.textContent="");const f=i(u,!1,Xc(u));return u instanceof Element&&(u.removeAttribute("v-cloak"),u.setAttribute("data-v-app","")),f},t});function Xc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function qc(e){return Ge(e)?document.querySelector(e):e}const Jc="modulepreload",Zc=function(e,t){return new URL(e,t).href},Ri={},Yc=function(t,i,o){let u=Promise.resolve();if(i&&i.length>0){let T=function(A){return Promise.all(A.map(I=>Promise.resolve(I).then(L=>({status:"fulfilled",value:L}),L=>({status:"rejected",reason:L}))))};const f=document.getElementsByTagName("link"),p=document.querySelector("meta[property=csp-nonce]"),m=p?.nonce||p?.getAttribute("nonce");u=T(i.map(A=>{if(A=Zc(A,o),A in Ri)return;Ri[A]=!0;const I=A.endsWith(".css"),L=I?'[rel="stylesheet"]':"";if(o)for(let re=f.length-1;re>=0;re--){const U=f[re];if(U.href===A&&(!I||U.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${A}"]${L}`))return;const z=document.createElement("link");if(z.rel=I?"stylesheet":Jc,I||(z.as="script"),z.crossOrigin="",z.href=A,m&&z.setAttribute("nonce",m),document.head.appendChild(z),I)return new Promise((re,U)=>{z.addEventListener("load",re),z.addEventListener("error",()=>U(new Error(`Unable to preload CSS for ${A}`)))})}))}function d(f){const p=new Event("vite:preloadError",{cancelable:!0});if(p.payload=f,window.dispatchEvent(p),!p.defaultPrevented)throw f}return u.then(f=>{for(const p of f||[])p.status==="rejected"&&d(p.reason);return t().catch(d)})},Qc={en:{},it:{"{{count}} areas":"{{count}} aree","{{count}} available":"{{count}} disponibile","{{count}} event types":"{{count}} tipi di eventi","{{count}} recent":"{{count}} recente","{{count}} saved plans":"{{count}} piani salvati","{{count}} visible":"{{count}} visibile","Activate main actuators":"Attiva gli attuatori principali","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Attivare i principali attuatori presenti nell'area e verificare il feedback di stato per confermare che segua i comandi.","Active Read Request To Status GA":"Richiesta di lettura attiva allo stato GA","Actuator preset deleted":"Preimpostazione dell'attuatore cancellata","Actuator preset saved":"Preimpostazione dell'attuatore salvata","Actuator test complete":"Test dell'attuatore completato","Add group addresses to this area":"Aggiungi indirizzi di gruppo a quest'area","Add Step":"Aggiungi passaggio","Add Wait":"Aggiungi Aspetta","AI Area Builder":"Costruttore di aree AI","AI is selecting area GA...":"L'IA sta selezionando l'area GA...","anomaly x{{value}}":"anomalia x{{value}}","Applies to all matching lighting command GA in the selected area.":"Si applica a tutti i comandi di illuminazione corrispondenti GA nell'area selezionata.",Area:"Zona","Area {{value}}":"Area {{value}}","Area deleted":"Area eliminata","Area editor closed":"Redazione di area chiusa","Area GA membership":"Iscrizione all'area GA","Area name":"Nome dell'area","Area reset":"Reimpostazione dell'area","Area to test":"Zona da testare",Areas:"Aree","Ask failed":"Domanda fallita","Asking...":"Asking...",Assistant:"Assistente","Assistant prompt":"Richiesta dell'assistente","Available GA":"Disponibile GA","Building test plan...":"Piano di prova della costruzione...","Builds a deterministic active test using the supported command GA in the selected area.":"Costruisce un test attivo deterministico utilizzando il comando supportato GA nell'area selezionata.","Bus Connection Persistence":"Persistenza della connessione bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Scegli un report per esaminare metriche, controlli dettagliati e suggerimenti.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Scegli un modello di test standard per l'area selezionata, quindi crea il piano in modo deterministico dal catalogo ETS.",Close:"Chiudi","Close menu":"Chiudi menù",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carico utile del comando",Completed:"Completato","Config exported":"Configurazione esportata","Config imported":"Configurazione importata","Connected {{value}}":"Connesso {{value}}","Coverage {{value}}%":"Copertura {{value}}%","Define at least one area before creating a test plan":"Definire almeno un'area prima di creare un piano di test","Define at least one area before using Tests":"Definire almeno un'area prima di utilizzare i test","Delete Area":"Elimina area","Deleting actuator preset...":"Eliminazione della preimpostazione dell'attuatore...","Deleting area...":"Eliminazione area...","Deleting profile...":"Eliminazione profilo...","Deleting test plan...":"Eliminazione del piano di test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Descrivi la stanza, la zona o la funzione che desideri.L'intelligenza artificiale suggerirà gli indirizzi dei gruppi più rilevanti per questa bozza.",Description:"Descrizione","Disconnected {{value}}":"Disconnesso {{value}}","Documentation: KNX AI Vue":"Documentazione: KNX AI Vue","Donate via PayPal":"Dona tramite PayPal","Drag step":"Trascina il passaggio",Duplicate:"Duplicato","Duplicate Plan":"Piano duplicato","Edit Area":"Modifica area","Edit Plan":"Modifica piano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Abilita l'IA nel nodo KNX AI per rigenerare aree o suggerire GA per una nuova bozza.","Event distribution will appear after the first samples.":"La distribuzione degli eventi apparirà dopo i primi campioni.","Event Mix":"Mix di eventi","Example: Add all technical room lighting command and status GA.":"Esempio: aggiungere tutti i comandi e lo stato dell'illuminazione del locale tecnico GA.",Expected:"Previsto","Expected feedback value":"Valore di feedback previsto","Expected payload":"Carico utile previsto","Explain any anomalies you see and suggest what to check first.":"Spiega eventuali anomalie riscontrate e suggerisci cosa controllare prima.","Export PDF":"Esporta PDF","Exporting config...":"Esportazione della configurazione...",Fail:"Fallire","Failed to build the test plan":"Impossibile creare il piano di test","Failed to delete actuator preset":"Impossibile eliminare la preimpostazione dell'attuatore","Failed to delete area":"Impossibile eliminare l'area","Failed to delete profile":"Impossibile eliminare il profilo","Failed to delete test plan":"Impossibile eliminare il piano di test","Failed to delete test result":"Impossibile eliminare il risultato del test","Failed to export config":"Impossibile esportare la configurazione","Failed to import config":"Impossibile importare la configurazione","Failed to load area command/status catalog":"Impossibile caricare il catalogo comandi/stati dell'area","Failed to load GA catalog":"Impossibile caricare il catalogo GA","Failed to load nodes":"Impossibile caricare i nodi","Failed to load state":"Impossibile caricare lo stato","Failed to regenerate AI areas":"Impossibile rigenerare le aree AI","Failed to reset area":"Impossibile reimpostare l'area","Failed to run actuator test":"Impossibile eseguire il test dell'attuatore","Failed to run profile":"Impossibile eseguire il profilo","Failed to run test plan":"Impossibile eseguire il piano di test","Failed to save actuator preset":"Impossibile salvare la preimpostazione dell'attuatore","Failed to save area":"Impossibile salvare l'area","Failed to save GA role":"Impossibile salvare il ruolo GA","Failed to save profile":"Impossibile salvare il profilo","Failed to save test plan":"Impossibile salvare il piano di test","Failed to save test result":"Impossibile salvare il risultato del test","Failed to suggest area GA":"Impossibile suggerire l'area GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genera un grafico a barre SVG dei principali indirizzi del gruppo con conteggi e titolo.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Il verde mostra l'ora collegata al bus KNX.Il rosso mostra i tempi di inattività all'interno della finestra della cronologia selezionata.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC controllo attivo","Importing config...":"Importazione configurazione...","in progress":"in corso","Installer alias":"Alias dell'installatore","KNX active test name":"KNX nome del test attivo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luci accese, poi spente","Live and saved reports generated by KNX active and read-only tests.":"Report in tempo reale e salvati generati da test attivi e di sola lettura di KNX.","Loading nodes...":"Caricamento nodi...","Loading...":"Loading...","n/a":"n/a","New Area":"Nuova zona","New Plan":"Nuovo piano","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Nessuna area corrisponde alla ricerca corrente oppure il file ETS non espone ancora una gerarchia utilizzabile.","No detailed entries stored for this report yet.":"Nessuna voce dettagliata ancora memorizzata per questo rapporto.","No feedback":"Nessun feedback","No GA selected for this area yet.":"Nessun GA ancora selezionato per quest'area.","No KNX AI nodes found.":"Nessun nodo KNX AI trovato.","No saved plans yet.":"Nessun piano ancora salvato.","No saved test results yet.":"Nessun risultato del test ancora salvato.","No test result selected to export":"Nessun risultato del test selezionato per l'esportazione","No test result selected.":"Nessun risultato del test selezionato.","No top group address data available yet.":"Nessun dato sugli indirizzi dei gruppi principali ancora disponibile.","Nodes {{nodes}} | Links {{links}}":"Nodi {{nodes}} |Collegamenti {{links}}",Now:"Adesso","Open and close shading":"Apri e chiudi l'ombreggiatura","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Aprire e chiudere gli attuatori ombreggianti presenti nell'area, quindi verificare che lo stato corrisponda ai comandi inviati.","Open Source Test":"Prova dell'open source","Optional note for diagnostics and reports":"Nota facoltativa per diagnostica e report","Original ETS path:":"Percorso ETS originale:",Overview:"Panoramica",Pass:"Passa",Payload:"Carico utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Scegli dal catalogo ETS.Gli GA già selezionati sono nascosti da questo elenco.","Plan changes discarded":"Modifiche al piano annullate","Plan duplicated":"Piano duplicato","Plan name":"Nome del piano",Plans:"Piani","Profile deleted":"Profilo eliminato","Profile report ready":"Rapporto sul profilo pronto","Profile saved":"Profilo salvato","Provider: {{provider}} | Model: {{model}}":"Fornitore: {{provider}} |Modello: {{model}}",Rate:"Vota","Read response timeout ms":"Leggi il timeout della risposta ms",Ready:"Pronto",Reason:"Motivo",Refresh:"Aggiorna","Regenerating AI areas...":"Rigenerazione delle aree AI...",Remove:"Rimuovi",Repeat:"Ripeti",Reset:"Ripristina","Resetting area...":"Reimpostazione dell'area...","Response timeout":"Timeout della risposta","Returned to the Tests page for the source actuator test.":"Ritornato alla pagina Test per il test dell'attuatore sorgente.","Returned to the Tests page for the source read-only profile.":"Ritornato alla pagina Test per il profilo di sola lettura di origine.","Returned to the Tests page.":"Ritornato alla pagina dei test.","Reusable deterministic active tests saved by the installer.":"Test attivi deterministici riutilizzabili salvati dall'installatore.",Role:"Ruolo","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Eseguire un test completo dei comandi HVAC nell'area e verificare che i setpoint e gli stati siano coerenti.",Running:"Correre","Running actuator test...":"Esecuzione del test dell'attuatore in corso...","Running profile...":"Profilo in esecuzione...","Running...":"Running...","Saving actuator preset...":"Salvataggio della preimpostazione dell'attuatore...","Saving profile...":"Salvataggio profilo...","Saving test plan...":"Salvataggio del piano di test...","Search GA, label or ETS path":"Cerca GA, etichetta o percorso ETS","Select an Area":"Seleziona un'area","Select area":"Seleziona zona","Select command GA":"Seleziona il comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleziona uno dei modelli standard.Il piano viene costruito solo dal comando GA disponibile nell'area selezionata.","Select test plan":"Seleziona il piano di prova","Select Test Result":"Seleziona Risultato del test","Selected template":"Modello selezionato","Send a":"Invia un",Settings:"Impostazioni","Short operator-facing description":"Breve descrizione rivolta all'operatore","Show AI Area Builder":"Mostra AI Area Builder","Show Template Builder":"Mostra generatore di modelli","Spontaneous Write From Status GA":"Scrittura spontanea dallo stato GA",Status:"Stato","Status DPT":"Stato DPT","Status GA":"Stato GA","Status write timeout ms":"Timeout scrittura stato ms","Step title":"Titolo del passaggio","Stopping repeat mode after the current cycle...":"Interruzione della modalità di ripetizione dopo il ciclo corrente...",Subscribe:"Iscriviti",Suggestions:"Suggerimenti","Summarize the current KNX traffic and highlight the busiest group addresses.":"Riepiloga il traffico corrente KNX ed evidenzia gli indirizzi dei gruppi più trafficati.",Summary:"Sommario","Targets supported HVAC command GA in the selected area.":"Bersagli supportati HVAC comando GA nell'area selezionata.","Targets supported shading command GA in the selected area.":"Gli obiettivi supportano il comando di ombreggiatura GA nell'area selezionata.","telegram from the status GA.":"telegramma dallo stato GA.","telegram to the status GA and wait for a":"telegramma allo stato GA e attendere un",Telegrams:"Telegrammi","Template Builder":"Generatore di modelli","Test editor closed":"Editor del test chiuso","Test plan deleted":"Piano di test eliminato","Test plan ready":"Piano di prova pronto","Test plan saved":"Piano di test salvato","Test result deleted":"Risultato del test cancellato","Test Results":"Risultati dei test","Test Running":"Prova in esecuzione",Tests:"Test","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installatore può rinominare l'area e decidere esattamente a quali indirizzi di gruppo appartenere.Tutto è persistente per nodo KNX AI.",Timeout:"Timeout",Title:"Titolo","Toggle menu":"Cambia menu","Toggle sidebar":"Attiva/disattiva la barra laterale","Top Group Addresses":"Indirizzi di gruppo principali","true, false, 50":"vero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Accendi le luci, poi spegnile e verifica che i relativi valori di stato siano coerenti.","Unknown DPT":"Sconosciuto DPT","Unsaved changes":"Modifiche non salvate",Voice:"Voce",Wait:"Aspetta","Wait for a spontaneous":"Aspetta uno spontaneo","Wait ms":"Aspetta, signorina",Warn:"Avvertire","What this step checks":"Cosa controlla questo passaggio","Why this step exists":"Perché esiste questo passaggio","Window {{value}}s.":"Finestra {{value}}s.","Write timeout":"Scrivi timeout"},de:{"{{count}} areas":"{{count}} Bereiche","{{count}} available":"{{count}} verfügbar","{{count}} event types":"{{count}} Ereignistypen","{{count}} recent":"{{count}} aktuell","{{count}} saved plans":"{{count}} gespeicherte Pläne","{{count}} visible":"{{count}} sichtbar","Activate main actuators":"Hauptaktoren aktivieren","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Aktivieren Sie die Hauptaktoren im Bereich und überprüfen Sie die Statusrückmeldung, um zu bestätigen, dass die Befehle befolgt werden.","Active Read Request To Status GA":"Aktive Leseanforderung an Status GA","Actuator preset deleted":"Aktorvoreinstellung gelöscht","Actuator preset saved":"Aktorvoreinstellung gespeichert","Actuator test complete":"Aktuatortest abgeschlossen","Add group addresses to this area":"Fügen Sie diesem Bereich Gruppenadressen hinzu","Add Step":"Schritt hinzufügen","Add Wait":"Warten hinzufügen","AI Area Builder":"AI Area Builder","AI is selecting area GA...":"KI wählt Bereich GA aus...","anomaly x{{value}}":"Anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"Gilt für alle passenden Beleuchtungsbefehle GA im ausgewählten Bereich.",Area:"Bereich","Area {{value}}":"Bereich {{value}}","Area deleted":"Bereich gelöscht","Area editor closed":"Bereichseditor geschlossen","Area GA membership":"Bereich GA Mitgliedschaft","Area name":"Gebietsname","Area reset":"Bereich zurückgesetzt","Area to test":"Bereich zum Testen",Areas:"Bereiche","Ask failed":"Die Anfrage ist fehlgeschlagen","Asking...":"Asking...",Assistant:"Assistent","Assistant prompt":"Eingabeaufforderung des Assistenten","Available GA":"Verfügbar GA","Building test plan...":"Bautestplan...","Builds a deterministic active test using the supported command GA in the selected area.":"Erstellt einen deterministischen aktiven Test mit dem unterstützten Befehl GA im ausgewählten Bereich.","Bus Connection Persistence":"Persistenz der Busverbindung","Choose a report to inspect metrics, detailed checks, and suggestions.":"Wählen Sie einen Bericht aus, um Metriken, detaillierte Prüfungen und Vorschläge zu prüfen.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Wählen Sie eine Standardtestvorlage für den ausgewählten Bereich und erstellen Sie dann den Plan deterministisch aus dem Katalog ETS.",Close:"Schließen","Close menu":"Menü schließen",Command:"Befehl","Command DPT":"Befehl DPT","Command GA":"Befehl GA","Command payload":"Befehlsnutzlast",Completed:"Abgeschlossen","Config exported":"Konfiguration exportiert","Config imported":"Konfiguration importiert","Connected {{value}}":"Verbunden {{value}}","Coverage {{value}}%":"Abdeckung {{value}}%","Define at least one area before creating a test plan":"Definieren Sie mindestens einen Bereich, bevor Sie einen Testplan erstellen","Define at least one area before using Tests":"Definieren Sie mindestens einen Bereich, bevor Sie Tests verwenden","Delete Area":"Bereich löschen","Deleting actuator preset...":"Aktor-Preset wird gelöscht...","Deleting area...":"Bereich wird gelöscht...","Deleting profile...":"Profil wird gelöscht...","Deleting test plan...":"Testplan wird gelöscht...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Beschreiben Sie den Raum, die Zone oder die Funktion, die Sie wünschen.Die KI schlägt für diesen Entwurf die relevantesten Gruppenadressen vor.",Description:"Beschreibung","Disconnected {{value}}":"Getrennt {{value}}","Documentation: KNX AI Vue":"Dokumentation: KNX AI Vue","Donate via PayPal":"Spenden Sie über PayPal","Drag step":"Schritt ziehen",Duplicate:"Duplizieren","Duplicate Plan":"Doppelter Plan","Edit Area":"Bereich bearbeiten","Edit Plan":"Plan bearbeiten","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Aktivieren Sie die KI im Knoten KNX AI, um Bereiche neu zu generieren, oder schlagen Sie GA für einen neuen Entwurf vor.","Event distribution will appear after the first samples.":"Die Ereignisverteilung erscheint nach den ersten Proben.","Event Mix":"Event-Mix","Example: Add all technical room lighting command and status GA.":"Beispiel: Alle technischen Raumbeleuchtungsbefehle und den Status GA hinzufügen.",Expected:"Erwartet","Expected feedback value":"Erwarteter Feedbackwert","Expected payload":"Erwartete Nutzlast","Explain any anomalies you see and suggest what to check first.":"Erklären Sie alle Anomalien, die Sie sehen, und schlagen Sie vor, was Sie zuerst überprüfen sollten.","Export PDF":"PDF exportieren","Exporting config...":"Konfiguration wird exportiert...",Fail:"Scheitern","Failed to build the test plan":"Der Testplan konnte nicht erstellt werden","Failed to delete actuator preset":"Aktorvoreinstellung konnte nicht gelöscht werden","Failed to delete area":"Bereich konnte nicht gelöscht werden","Failed to delete profile":"Profil konnte nicht gelöscht werden","Failed to delete test plan":"Testplan konnte nicht gelöscht werden","Failed to delete test result":"Testergebnis konnte nicht gelöscht werden","Failed to export config":"Konfiguration konnte nicht exportiert werden","Failed to import config":"Konfiguration konnte nicht importiert werden","Failed to load area command/status catalog":"Der Befehls-/Statuskatalog für den Bereich konnte nicht geladen werden","Failed to load GA catalog":"Der Katalog GA konnte nicht geladen werden","Failed to load nodes":"Knoten konnten nicht geladen werden","Failed to load state":"Status konnte nicht geladen werden","Failed to regenerate AI areas":"KI-Bereiche konnten nicht regeneriert werden","Failed to reset area":"Bereich konnte nicht zurückgesetzt werden","Failed to run actuator test":"Aktuatortest konnte nicht ausgeführt werden","Failed to run profile":"Profil konnte nicht ausgeführt werden","Failed to run test plan":"Testplan konnte nicht ausgeführt werden","Failed to save actuator preset":"Aktorvoreinstellung konnte nicht gespeichert werden","Failed to save area":"Bereich konnte nicht gespeichert werden","Failed to save GA role":"Die Rolle GA konnte nicht gespeichert werden","Failed to save profile":"Profil konnte nicht gespeichert werden","Failed to save test plan":"Der Testplan konnte nicht gespeichert werden","Failed to save test result":"Testergebnis konnte nicht gespeichert werden","Failed to suggest area GA":"Bereich GA konnte nicht vorgeschlagen werden","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Erstellen Sie ein SVG-Balkendiagramm der Top-Gruppenadressen mit Anzahl und Titel.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Grün zeigt die mit dem Bus KNX verbundene Zeit an.Rot zeigt Ausfallzeiten im ausgewählten Verlaufsfenster an.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC aktive Prüfung","Importing config...":"Konfiguration wird importiert...","in progress":"in Bearbeitung","Installer alias":"Installer-Alias","KNX active test name":"KNX aktiver Testname","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Licht an, dann aus","Live and saved reports generated by KNX active and read-only tests.":"Live- und gespeicherte Berichte, die von KNX aktiven und schreibgeschützten Tests generiert wurden.","Loading nodes...":"Knoten werden geladen...","Loading...":"Loading...","n/a":"n/a","New Area":"Neuer Bereich","New Plan":"Neuer Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Keine Bereiche stimmten mit der aktuellen Suche überein oder die Datei ETS stellt noch keine verwendbare Hierarchie bereit.","No detailed entries stored for this report yet.":"Für diesen Bericht sind noch keine detaillierten Einträge hinterlegt.","No feedback":"Keine Rückmeldung","No GA selected for this area yet.":"Für diesen Bereich wurde noch kein GA ausgewählt.","No KNX AI nodes found.":"Keine KNX AI Knoten gefunden.","No saved plans yet.":"Noch keine gespeicherten Pläne.","No saved test results yet.":"Noch keine gespeicherten Testergebnisse.","No test result selected to export":"Kein Testergebnis zum Exportieren ausgewählt","No test result selected.":"Kein Testergebnis ausgewählt.","No top group address data available yet.":"Es sind noch keine Daten zur Top-Gruppenadresse verfügbar.","Nodes {{nodes}} | Links {{links}}":"Knoten {{nodes}} |Links {{links}}",Now:"Jetzt","Open and close shading":"Beschattung öffnen und schließen","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Öffnen und schließen Sie die Beschattungsaktoren im Bereich und überprüfen Sie dann, ob der Status mit den gesendeten Befehlen übereinstimmt.","Open Source Test":"Open-Source-Test","Optional note for diagnostics and reports":"Optionaler Hinweis für Diagnosen und Berichte","Original ETS path:":"Ursprünglicher ETS Pfad:",Overview:"Übersicht",Pass:"Pass",Payload:"Nutzlast","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Wählen Sie aus dem Katalog ETS.Bereits ausgewählte GA werden aus dieser Liste ausgeblendet.","Plan changes discarded":"Planänderungen verworfen","Plan duplicated":"Plan dupliziert","Plan name":"Planname",Plans:"Pläne","Profile deleted":"Profil gelöscht","Profile report ready":"Profilbericht bereit","Profile saved":"Profil gespeichert","Provider: {{provider}} | Model: {{model}}":"Anbieter: {{provider}} |Modell: {{model}}",Rate:"Bewerten","Read response timeout ms":"Leseantwort-Timeout ms",Ready:"Bereit",Reason:"Grund",Refresh:"Aktualisieren","Regenerating AI areas...":"KI-Bereiche werden regeneriert...",Remove:"Entfernen",Repeat:"Wiederholen",Reset:"Zurücksetzen","Resetting area...":"Bereich wird zurückgesetzt...","Response timeout":"Antwortzeitüberschreitung","Returned to the Tests page for the source actuator test.":"Zurück zur Seite „Tests“ für den Quellaktuatortest.","Returned to the Tests page for the source read-only profile.":"Kehrt zur Seite „Tests“ für das schreibgeschützte Quellprofil zurück.","Returned to the Tests page.":"Zurück zur Seite „Tests“.","Reusable deterministic active tests saved by the installer.":"Wiederverwendbare deterministische aktive Tests, die vom Installationsprogramm gespeichert werden.",Role:"Rolle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Führen Sie einen vollständigen Test der HVAC-Befehle im Bereich durch und stellen Sie sicher, dass Sollwerte und Status kohärent sind.",Running:"Laufen","Running actuator test...":"Aktuatortest wird ausgeführt...","Running profile...":"Laufprofil...","Running...":"Running...","Saving actuator preset...":"Aktorvoreinstellung speichern...","Saving profile...":"Profil wird gespeichert...","Saving test plan...":"Testplan wird gespeichert...","Search GA, label or ETS path":"Suchen Sie nach GA, Label oder ETS Pfad","Select an Area":"Wählen Sie einen Bereich aus","Select area":"Bereich auswählen","Select command GA":"Wählen Sie den Befehl GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Wählen Sie eine der Standardvorlagen aus.Der Plan wird nur mit dem Befehl GA erstellt, der im ausgewählten Bereich verfügbar ist.","Select test plan":"Testplan auswählen","Select Test Result":"Wählen Sie Testergebnis","Selected template":"Ausgewählte Vorlage","Send a":"Senden Sie eine",Settings:"Einstellungen","Short operator-facing description":"Kurze Beschreibung für den Bediener","Show AI Area Builder":"AI Area Builder anzeigen","Show Template Builder":"Template Builder anzeigen","Spontaneous Write From Status GA":"Spontanes Schreiben aus Status GA",Status:"Status","Status DPT":"Status DPT","Status GA":"Status GA","Status write timeout ms":"Statusschreib-Timeout ms","Step title":"Schritttitel","Stopping repeat mode after the current cycle...":"Stoppen des Wiederholungsmodus nach dem aktuellen Zyklus...",Subscribe:"Abonnieren",Suggestions:"Vorschläge","Summarize the current KNX traffic and highlight the busiest group addresses.":"Fassen Sie den aktuellen KNX-Verkehr zusammen und markieren Sie die am stärksten ausgelasteten Gruppenadressen.",Summary:"Zusammenfassung","Targets supported HVAC command GA in the selected area.":"Unterstützte Ziele: HVAC Befehl GA im ausgewählten Bereich.","Targets supported shading command GA in the selected area.":"Zielt auf den unterstützten Schattierungsbefehl GA im ausgewählten Bereich.","telegram from the status GA.":"Telegramm vom Status GA.","telegram to the status GA and wait for a":"Telegramm auf den Status GA und warten Sie auf a",Telegrams:"Telegramme","Template Builder":"Vorlagenersteller","Test editor closed":"Testeditor geschlossen","Test plan deleted":"Testplan gelöscht","Test plan ready":"Testplan fertig","Test plan saved":"Testplan gespeichert","Test result deleted":"Testergebnis gelöscht","Test Results":"Testergebnisse","Test Running":"Testlauf",Tests:"Tests","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"Der Installateur kann den Bereich umbenennen und genau entscheiden, welche Gruppenadressen dazu gehören.Alles wird pro KNX AI-Knoten beibehalten.",Timeout:"Auszeit",Title:"Titel","Toggle menu":"Menü umschalten","Toggle sidebar":"Seitenleiste umschalten","Top Group Addresses":"Top-Gruppenadressen","true, false, 50":"wahr, falsch, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Schalten Sie die Lichter ein und wieder aus und überprüfen Sie, ob die zugehörigen Statuswerte kohärent sind.","Unknown DPT":"Unbekannt DPT","Unsaved changes":"Nicht gespeicherte Änderungen",Voice:"Stimme",Wait:"Warte","Wait for a spontaneous":"Warten Sie auf eine spontane","Wait ms":"Warten Sie, Frau",Warn:"Warnen","What this step checks":"Was dieser Schritt prüft","Why this step exists":"Warum es diesen Schritt gibt","Window {{value}}s.":"Fenster {{value}}s.","Write timeout":"Timeout schreiben"},fr:{"{{count}} areas":"Zones {{count}}","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} types d'événements","{{count}} recent":"{{count}} récent","{{count}} saved plans":"{{count}} plans enregistrés","{{count}} visible":"{{count}} visible","Activate main actuators":"Activer les actionneurs principaux","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Activez les principaux actionneurs de la zone et vérifiez le retour d'état pour confirmer qu'il suit les commandes.","Active Read Request To Status GA":"Demande de lecture active vers l'état GA","Actuator preset deleted":"Préréglage de l'actionneur supprimé","Actuator preset saved":"Préréglage de l'actionneur enregistré","Actuator test complete":"Test de l'actionneur terminé","Add group addresses to this area":"Ajouter des adresses de groupe à cette zone","Add Step":"Ajouter une étape","Add Wait":"Ajouter une attente","AI Area Builder":"Générateur de zones IA","AI is selecting area GA...":"L'IA sélectionne la zone GA...","anomaly x{{value}}":"anomalie x{{value}}","Applies to all matching lighting command GA in the selected area.":"S'applique à toutes les commandes d'éclairage correspondantes GA dans la zone sélectionnée.",Area:"Zone","Area {{value}}":"Zone {{value}}","Area deleted":"Zone supprimée","Area editor closed":"Éditeur de zone fermé","Area GA membership":"Adhésion à la zone GA","Area name":"Nom de la zone","Area reset":"Réinitialisation de la zone","Area to test":"Zone à tester",Areas:"Domaines","Ask failed":"La demande a échoué","Asking...":"Asking...",Assistant:"Assistante","Assistant prompt":"Invite de l'assistant","Available GA":"Disponible GA","Building test plan...":"Plan de test de construction...","Builds a deterministic active test using the supported command GA in the selected area.":"Construit un test actif déterministe à l'aide de la commande prise en charge GA dans la zone sélectionnée.","Bus Connection Persistence":"Persistance de la connexion de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Choisissez un rapport pour inspecter les métriques, les contrôles détaillés et les suggestions.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Choisissez un modèle de test standard pour la zone sélectionnée, puis construisez le plan de manière déterministe à partir du catalogue ETS.",Close:"Fermer","Close menu":"Fermer le menu",Command:"Commande","Command DPT":"Commande DPT","Command GA":"Commande GA","Command payload":"Charge utile de commande",Completed:"Terminé","Config exported":"Configuration exportée","Config imported":"Configuration importée","Connected {{value}}":"Connecté {{value}}","Coverage {{value}}%":"Couverture {{value}}%","Define at least one area before creating a test plan":"Définir au moins un domaine avant de créer un plan de test","Define at least one area before using Tests":"Définir au moins une zone avant d'utiliser les tests","Delete Area":"Supprimer la zone","Deleting actuator preset...":"Suppression du préréglage de l'actionneur...","Deleting area...":"Suppression de la zone...","Deleting profile...":"Suppression du profil...","Deleting test plan...":"Suppression du plan de test...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Décrivez la pièce, la zone ou la fonction souhaitée.L'IA proposera les adresses de groupes les plus pertinentes pour ce projet.",Description:"Descriptif","Disconnected {{value}}":"Déconnecté {{value}}","Documentation: KNX AI Vue":"Documentation : KNX AI Vue","Donate via PayPal":"Faites un don via PayPal","Drag step":"Glisser l'étape",Duplicate:"Dupliquer","Duplicate Plan":"Plan en double","Edit Area":"Modifier la zone","Edit Plan":"Modifier le forfait","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Activez l'IA dans le nœud KNX AI pour régénérer les zones ou suggérez GA pour un nouveau brouillon.","Event distribution will appear after the first samples.":"La distribution des événements apparaîtra après les premiers échantillons.","Event Mix":"Mélange d'événements","Example: Add all technical room lighting command and status GA.":"Exemple : Ajouter toutes les commandes et statuts d'éclairage du local technique GA.",Expected:"Attendu","Expected feedback value":"Valeur attendue des commentaires","Expected payload":"Charge utile attendue","Explain any anomalies you see and suggest what to check first.":"Expliquez toutes les anomalies que vous voyez et suggérez quoi vérifier en premier.","Export PDF":"Exporter un PDF","Exporting config...":"Exportation de la configuration...",Fail:"Échec","Failed to build the test plan":"Échec de la création du plan de test","Failed to delete actuator preset":"Échec de la suppression du préréglage de l'actionneur","Failed to delete area":"Échec de la suppression de la zone","Failed to delete profile":"Échec de la suppression du profil","Failed to delete test plan":"Échec de la suppression du plan de test","Failed to delete test result":"Échec de la suppression du résultat du test","Failed to export config":"Échec de l'exportation de la configuration","Failed to import config":"Échec de l'importation de la configuration","Failed to load area command/status catalog":"Échec du chargement du catalogue de commandes/statuts de zone","Failed to load GA catalog":"Échec du chargement du catalogue GA","Failed to load nodes":"Échec du chargement des nœuds","Failed to load state":"Échec du chargement de l'état","Failed to regenerate AI areas":"Échec de la régénération des zones IA","Failed to reset area":"Échec de la réinitialisation de la zone","Failed to run actuator test":"Échec de l'exécution du test de l'actionneur","Failed to run profile":"Échec de l'exécution du profil","Failed to run test plan":"Échec de l'exécution du plan de test","Failed to save actuator preset":"Échec de l'enregistrement du préréglage de l'actionneur","Failed to save area":"Échec de l'enregistrement de la zone","Failed to save GA role":"Échec de l'enregistrement du rôle GA","Failed to save profile":"Échec de l'enregistrement du profil","Failed to save test plan":"Échec de l'enregistrement du plan de test","Failed to save test result":"Échec de l'enregistrement du résultat du test","Failed to suggest area GA":"Échec de la suggestion de la zone GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Générez un graphique à barres SVG des principales adresses des groupes avec le nombre et le titre.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"Le vert indique l'heure connectée au bus KNX.Le rouge affiche les temps d'arrêt dans la fenêtre d'historique sélectionnée.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC chèque actif","Importing config...":"Importation de la configuration...","in progress":"en cours","Installer alias":"Alias de l'installateur","KNX active test name":"KNX nom du test actif","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Les lumières s'allument, puis s'éteignent","Live and saved reports generated by KNX active and read-only tests.":"Rapports en direct et enregistrés générés par KNX tests actifs et en lecture seule.","Loading nodes...":"Chargement des nœuds...","Loading...":"Loading...","n/a":"n/a","New Area":"Nouvelle zone","New Plan":"Nouveau forfait","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Aucune zone ne correspond à la recherche actuelle ou le fichier ETS n'expose pas encore de hiérarchie utilisable.","No detailed entries stored for this report yet.":"Aucune entrée détaillée n'est encore stockée pour ce rapport.","No feedback":"Aucun retour","No GA selected for this area yet.":"Aucun GA n'est encore sélectionné pour cette zone.","No KNX AI nodes found.":"Aucun nœud KNX AI trouvé.","No saved plans yet.":"Aucun plan enregistré pour l'instant.","No saved test results yet.":"Aucun résultat de test enregistré pour l'instant.","No test result selected to export":"Aucun résultat de test sélectionné pour exporter","No test result selected.":"Aucun résultat de test sélectionné.","No top group address data available yet.":"Aucune donnée d'adresse du groupe principal n'est encore disponible.","Nodes {{nodes}} | Links {{links}}":"Nœuds {{nodes}} |Liens {{links}}",Now:"Maintenant","Open and close shading":"Ombrage ouvert et fermé","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Ouvrez et fermez les actionneurs d'ombrage de la zone, puis vérifiez que l'état correspond aux commandes envoyées.","Open Source Test":"Test Open Source","Optional note for diagnostics and reports":"Remarque facultative pour les diagnostics et les rapports","Original ETS path:":"Chemin ETS d'origine :",Overview:"Aperçu",Pass:"Passer",Payload:"Charge utile","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Choisissez dans le catalogue ETS.Les GA déjà sélectionnés sont masqués de cette liste.","Plan changes discarded":"Modifications du plan rejetées","Plan duplicated":"Plan dupliqué","Plan name":"Nom du forfait",Plans:"Forfaits","Profile deleted":"Profil supprimé","Profile report ready":"Rapport de profil prêt","Profile saved":"Profil enregistré","Provider: {{provider}} | Model: {{model}}":"Fournisseur : {{provider}} |Modèle : {{model}}",Rate:"Tarif","Read response timeout ms":"Lire le délai de réponse ms",Ready:"Prêt",Reason:"Raison",Refresh:"Actualiser","Regenerating AI areas...":"Régénérer les zones d'IA...",Remove:"Supprimer",Repeat:"Répéter",Reset:"Réinitialiser","Resetting area...":"Zone de réinitialisation...","Response timeout":"Délai de réponse","Returned to the Tests page for the source actuator test.":"Retour à la page Tests pour le test de l'actionneur source.","Returned to the Tests page for the source read-only profile.":"Renvoyé à la page Tests pour le profil source en lecture seule.","Returned to the Tests page.":"Retour à la page Tests.","Reusable deterministic active tests saved by the installer.":"Tests actifs déterministes réutilisables enregistrés par l'installateur.",Role:"Rôle","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Exécutez un test complet des commandes HVAC dans la zone et vérifiez que les consignes et les états sont cohérents.",Running:"Courir","Running actuator test...":"Test de l'actionneur en cours...","Running profile...":"Profil de course...","Running...":"Running...","Saving actuator preset...":"Enregistrement du préréglage de l'actionneur...","Saving profile...":"Enregistrement du profil...","Saving test plan...":"Sauvegarde du plan de test...","Search GA, label or ETS path":"Recherchez GA, l'étiquette ou le chemin ETS","Select an Area":"Sélectionnez une zone","Select area":"Sélectionnez une zone","Select command GA":"Sélectionnez la commande GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Sélectionnez l'un des modèles standard.Le plan est construit uniquement à partir de la commande GA disponible dans la zone sélectionnée.","Select test plan":"Sélectionnez le plan de test","Select Test Result":"Sélectionnez le résultat du test","Selected template":"Modèle sélectionné","Send a":"Envoyez un",Settings:"Paramètres","Short operator-facing description":"Brève description destinée à l'opérateur","Show AI Area Builder":"Afficher le générateur de zone AI","Show Template Builder":"Afficher le générateur de modèles","Spontaneous Write From Status GA":"Écriture spontanée à partir du statut GA",Status:"Statut","Status DPT":"Statut DPT","Status GA":"Statut GA","Status write timeout ms":"Délai d'expiration de l'état en ms","Step title":"Titre de l'étape","Stopping repeat mode after the current cycle...":"Arrêt du mode répétition après le cycle en cours...",Subscribe:"Abonnez-vous",Suggestions:"Suggestions","Summarize the current KNX traffic and highlight the busiest group addresses.":"Résumez le trafic KNX actuel et mettez en surbrillance les adresses de groupe les plus fréquentées.",Summary:"Résumé","Targets supported HVAC command GA in the selected area.":"Cibles prises en charge par la commande HVAC GA dans la zone sélectionnée.","Targets supported shading command GA in the selected area.":"Cibles prenant en charge la commande d'ombrage GA dans la zone sélectionnée.","telegram from the status GA.":"télégramme du statut GA.","telegram to the status GA and wait for a":"télégramme au statut GA et attendez un",Telegrams:"Télégrammes","Template Builder":"Générateur de modèles","Test editor closed":"Éditeur de tests fermé","Test plan deleted":"Plan de test supprimé","Test plan ready":"Plan de test prêt","Test plan saved":"Plan de test enregistré","Test result deleted":"Résultat du test supprimé","Test Results":"Résultats des tests","Test Running":"Test en cours",Tests:"Essais","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"L'installateur peut renommer la zone et décider exactement quelles adresses de groupe lui appartiennent.Tout est conservé par nœud KNX AI.",Timeout:"Délai d'attente",Title:"Titre","Toggle menu":"Changer de menu","Toggle sidebar":"Basculer la barre latérale","Top Group Addresses":"Principales adresses des groupes","true, false, 50":"vrai, faux, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Allumez puis éteignez les lumières et vérifiez que les valeurs d'état associées sont cohérentes.","Unknown DPT":"Inconnu DPT","Unsaved changes":"Modifications non enregistrées",Voice:"Voix",Wait:"Attends","Wait for a spontaneous":"Attendez un spontané","Wait ms":"Attends madame",Warn:"Avertir","What this step checks":"Ce que cette étape vérifie","Why this step exists":"Pourquoi cette étape existe","Window {{value}}s.":"Fenêtre {{value}}s.","Write timeout":"Délai d'écriture"},es:{"{{count}} areas":"{{count}} áreas","{{count}} available":"{{count}} disponible","{{count}} event types":"{{count}} tipos de eventos","{{count}} recent":"{{count}} reciente","{{count}} saved plans":"{{count}} planes guardados","{{count}} visible":"{{count}} visible","Activate main actuators":"Activar actuadores principales","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"Active los principales actuadores del área y verifique la retroalimentación de estado para confirmar que sigue los comandos.","Active Read Request To Status GA":"Solicitud de lectura activa al estado GA","Actuator preset deleted":"Preajuste del actuador eliminado","Actuator preset saved":"Preajuste del actuador guardado","Actuator test complete":"Prueba del actuador completa","Add group addresses to this area":"Agregar direcciones de grupo a esta área","Add Step":"Agregar paso","Add Wait":"Agregar esperar","AI Area Builder":"Generador de áreas de IA","AI is selecting area GA...":"La IA está seleccionando el área GA...","anomaly x{{value}}":"anomalía x{{value}}","Applies to all matching lighting command GA in the selected area.":"Se aplica a todos los comandos de iluminación coincidentes GA en el área seleccionada.",Area:"Área","Area {{value}}":"Área {{value}}","Area deleted":"Área eliminada","Area editor closed":"Editor de área cerrado","Area GA membership":"Membresía del área GA","Area name":"Nombre del área","Area reset":"Restablecer área","Area to test":"Área para probar",Areas:"Áreas","Ask failed":"Pregunta fallida","Asking...":"Asking...",Assistant:"Asistente","Assistant prompt":"Aviso del asistente","Available GA":"Disponible GA","Building test plan...":"Plano de pruebas del edificio...","Builds a deterministic active test using the supported command GA in the selected area.":"Crea una prueba activa determinista utilizando el comando admitido GA en el área seleccionada.","Bus Connection Persistence":"Persistencia de la conexión de bus","Choose a report to inspect metrics, detailed checks, and suggestions.":"Elija un informe para inspeccionar métricas, comprobaciones detalladas y sugerencias.","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"Elija una plantilla de prueba estándar para el área seleccionada y luego cree el plan de manera determinista a partir del catálogo ETS.",Close:"Cerrar","Close menu":"Cerrar menú",Command:"Comando","Command DPT":"Comando DPT","Command GA":"Comando GA","Command payload":"Carga útil de comando",Completed:"Completado","Config exported":"Configuración exportada","Config imported":"Configuración importada","Connected {{value}}":"Conectado {{value}}","Coverage {{value}}%":"Cobertura {{value}}%","Define at least one area before creating a test plan":"Defina al menos un área antes de crear un plan de prueba","Define at least one area before using Tests":"Defina al menos un área antes de usar Pruebas","Delete Area":"Eliminar área","Deleting actuator preset...":"Eliminando preajuste del actuador...","Deleting area...":"Eliminando área...","Deleting profile...":"Eliminando perfil...","Deleting test plan...":"Eliminando plan de prueba...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"Describe la habitación, zona o función que deseas.La AI sugerirá las direcciones de grupo más relevantes para este borrador.",Description:"Descripción","Disconnected {{value}}":"Desconectado {{value}}","Documentation: KNX AI Vue":"Documentación: KNX AI Vue","Donate via PayPal":"Donar a través de PayPal","Drag step":"Paso de arrastre",Duplicate:"Duplicar","Duplicate Plan":"Plan duplicado","Edit Area":"Editar área","Edit Plan":"Editar plano","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"Habilite la IA en el nodo KNX AI para regenerar áreas o sugiera GA para un nuevo borrador.","Event distribution will appear after the first samples.":"La distribución de eventos aparecerá después de las primeras muestras.","Event Mix":"Mezcla de eventos","Example: Add all technical room lighting command and status GA.":"Ejemplo: agregue todos los comandos y estados de iluminación de la sala técnica GA.",Expected:"esperado","Expected feedback value":"Valor de retroalimentación esperado","Expected payload":"Carga útil esperada","Explain any anomalies you see and suggest what to check first.":"Explique cualquier anomalía que observe y sugiera qué comprobar primero.","Export PDF":"Exportar PDF","Exporting config...":"Exportando configuración...",Fail:"fallar","Failed to build the test plan":"No se pudo construir el plan de prueba","Failed to delete actuator preset":"No se pudo eliminar el ajuste preestablecido del actuador","Failed to delete area":"No se pudo eliminar el área","Failed to delete profile":"No se pudo eliminar el perfil","Failed to delete test plan":"No se pudo eliminar el plan de prueba","Failed to delete test result":"No se pudo eliminar el resultado de la prueba","Failed to export config":"No se pudo exportar la configuración","Failed to import config":"No se pudo importar la configuración","Failed to load area command/status catalog":"No se pudo cargar el catálogo de comando/estado del área","Failed to load GA catalog":"No se pudo cargar el catálogo GA","Failed to load nodes":"No se pudieron cargar los nodos","Failed to load state":"No se pudo cargar el estado","Failed to regenerate AI areas":"No se pudieron regenerar las áreas de IA","Failed to reset area":"No se pudo restablecer el área","Failed to run actuator test":"No se pudo ejecutar la prueba del actuador","Failed to run profile":"No se pudo ejecutar el perfil","Failed to run test plan":"No se pudo ejecutar el plan de prueba","Failed to save actuator preset":"No se pudo guardar el ajuste preestablecido del actuador","Failed to save area":"No se pudo guardar el área","Failed to save GA role":"No se pudo guardar el rol GA","Failed to save profile":"No se pudo guardar el perfil","Failed to save test plan":"No se pudo guardar el plan de prueba","Failed to save test result":"No se pudo guardar el resultado de la prueba","Failed to suggest area GA":"No se pudo sugerir el área GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"Genere un gráfico de barras SVG de direcciones de grupos principales con recuentos y título.","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"El verde muestra el tiempo conectado al bus KNX.El rojo muestra el tiempo de inactividad dentro de la ventana del historial seleccionado.",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC verificación activa","Importing config...":"Importando configuración...","in progress":"en progreso","Installer alias":"Alias del instalador","KNX active test name":"KNX nombre de prueba activo","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"Luces encendidas y luego apagadas","Live and saved reports generated by KNX active and read-only tests.":"Informes en vivo y guardados generados por KNX pruebas activas y de solo lectura.","Loading nodes...":"Cargando nodos...","Loading...":"Loading...","n/a":"n/a","New Area":"Nueva Área","New Plan":"Nuevo Plan","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"Ninguna área coincidió con la búsqueda actual o el archivo ETS aún no expone una jerarquía utilizable.","No detailed entries stored for this report yet.":"Aún no se han almacenado entradas detalladas para este informe.","No feedback":"Sin comentarios","No GA selected for this area yet.":"Aún no se ha seleccionado ningún GA para esta área.","No KNX AI nodes found.":"No se encontraron nodos KNX AI.","No saved plans yet.":"Aún no hay planes guardados.","No saved test results yet.":"Aún no hay resultados de pruebas guardados.","No test result selected to export":"No se seleccionó ningún resultado de prueba para exportar","No test result selected.":"No se seleccionó ningún resultado de prueba.","No top group address data available yet.":"Aún no hay datos de direcciones de grupos principales disponibles.","Nodes {{nodes}} | Links {{links}}":"Nodos {{nodes}} |Enlaces {{links}}",Now:"Ahora","Open and close shading":"Abrir y cerrar sombreado","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"Abra y cierre los actuadores de sombreado del área, luego verifique que el estado coincida con los comandos enviados.","Open Source Test":"Prueba de código abierto","Optional note for diagnostics and reports":"Nota opcional para diagnósticos e informes.","Original ETS path:":"Ruta original ETS:",Overview:"Descripción general",Pass:"Pase",Payload:"Carga útil","Pick from the ETS catalog. Already selected GA are hidden from this list.":"Elija del catálogo ETS.Los GA ya seleccionados están ocultos de esta lista.","Plan changes discarded":"Cambios de plan descartados","Plan duplicated":"Plano duplicado","Plan name":"Nombre del plan",Plans:"Planes","Profile deleted":"Perfil eliminado","Profile report ready":"Informe de perfil listo","Profile saved":"Perfil guardado","Provider: {{provider}} | Model: {{model}}":"Proveedor: {{provider}} |Modelo: {{model}}",Rate:"Tarifa","Read response timeout ms":"Tiempo de espera de respuesta de lectura ms",Ready:"Listo",Reason:"Razón",Refresh:"Actualizar","Regenerating AI areas...":"Regenerando áreas de IA...",Remove:"Quitar",Repeat:"repetir",Reset:"Reiniciar","Resetting area...":"Restableciendo área...","Response timeout":"Tiempo de espera de respuesta","Returned to the Tests page for the source actuator test.":"Regresó a la página Pruebas para la prueba del actuador fuente.","Returned to the Tests page for the source read-only profile.":"Regresó a la página Pruebas para el perfil de solo lectura de origen.","Returned to the Tests page.":"Regresó a la página de Pruebas.","Reusable deterministic active tests saved by the installer.":"Pruebas activas deterministas reutilizables guardadas por el instalador.",Role:"Rol","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"Ejecute una prueba completa de los comandos HVAC en el área y verifique que los puntos de ajuste y los estados sean coherentes.",Running:"corriendo","Running actuator test...":"Ejecutando la prueba del actuador...","Running profile...":"Perfil de carrera...","Running...":"Running...","Saving actuator preset...":"Guardando preajuste del actuador...","Saving profile...":"Guardando perfil...","Saving test plan...":"Guardando plan de prueba...","Search GA, label or ETS path":"Buscar GA, etiqueta o ruta ETS","Select an Area":"Seleccione un área","Select area":"Seleccionar área","Select command GA":"Seleccione el comando GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"Seleccione una de las plantillas estándar.El plan se construye únicamente a partir del comando GA disponible en el área seleccionada.","Select test plan":"Seleccionar plan de prueba","Select Test Result":"Seleccionar resultado de la prueba","Selected template":"Plantilla seleccionada","Send a":"Enviar un",Settings:"Configuración","Short operator-facing description":"Breve descripción orientada al operador","Show AI Area Builder":"Mostrar generador de áreas de IA","Show Template Builder":"Mostrar generador de plantillas","Spontaneous Write From Status GA":"Escritura espontánea desde el estado GA",Status:"Estado","Status DPT":"Estado DPT","Status GA":"Estado GA","Status write timeout ms":"Tiempo de espera de escritura de estado ms","Step title":"Título del paso","Stopping repeat mode after the current cycle...":"Deteniendo el modo de repetición después del ciclo actual...",Subscribe:"Suscríbete",Suggestions:"Sugerencias","Summarize the current KNX traffic and highlight the busiest group addresses.":"Resuma el tráfico KNX actual y resalte las direcciones de grupo más ocupadas.",Summary:"Resumen","Targets supported HVAC command GA in the selected area.":"Los objetivos admitieron el comando HVAC GA en el área seleccionada.","Targets supported shading command GA in the selected area.":"Los objetivos admiten el comando de sombreado GA en el área seleccionada.","telegram from the status GA.":"telegrama del estado GA.","telegram to the status GA and wait for a":"telegrama al estado GA y espere un",Telegrams:"telegramas","Template Builder":"Generador de plantillas","Test editor closed":"Editor de pruebas cerrado","Test plan deleted":"Plan de prueba eliminado","Test plan ready":"Plan de prueba listo","Test plan saved":"Plan de prueba guardado","Test result deleted":"Resultado de la prueba eliminado","Test Results":"Resultados de la prueba","Test Running":"Ejecución de prueba",Tests:"Pruebas","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"El instalador puede cambiar el nombre del área y decidir exactamente qué direcciones de grupo pertenecen a ella.Todo persiste por nodo KNX AI.",Timeout:"Tiempo de espera",Title:"Título","Toggle menu":"Alternar menú","Toggle sidebar":"Alternar barra lateral","Top Group Addresses":"Direcciones de grupos principales","true, false, 50":"verdadero, falso, 50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"Encienda las luces, luego apáguelas y verifique que los valores de estado relacionados sean coherentes.","Unknown DPT":"Desconocido DPT","Unsaved changes":"Cambios no guardados",Voice:"Voz",Wait:"espera","Wait for a spontaneous":"Espere un espontaneo","Wait ms":"Espere señora",Warn:"Advertir","What this step checks":"Lo que verifica este paso","Why this step exists":"Por qué existe este paso","Window {{value}}s.":"Ventana {{value}}s.","Write timeout":"Escribir tiempo de espera"},"zh-CN":{"{{count}} areas":"{{count}} 区域","{{count}} available":"{{count}} 可用","{{count}} event types":"{{count}} 事件类型","{{count}} recent":"{{count}} 最近","{{count}} saved plans":"{{count}} 已保存计划","{{count}} visible":"{{count}} 可见","Activate main actuators":"激活主执行器","Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.":"激活该区域的主执行器并验证状态反馈以确认其遵循命令。","Active Read Request To Status GA":"对状态 GA 的主动读取请求","Actuator preset deleted":"执行器预设已删除","Actuator preset saved":"执行器预设已保存","Actuator test complete":"执行器测试完成","Add group addresses to this area":"将组地址添加到该区域","Add Step":"添加步骤","Add Wait":"添加等待","AI Area Builder":"人工智能区域生成器","AI is selecting area GA...":"AI 正在选择区域 GA...","anomaly x{{value}}":"异常 x{{value}}","Applies to all matching lighting command GA in the selected area.":"适用于所选区域中所有匹配的照明命令 GA。",Area:"面积","Area {{value}}":"区域 {{value}}","Area deleted":"区域已删除","Area editor closed":"区域编辑器已关闭","Area GA membership":"区域 GA 会员资格","Area name":"地区名称","Area reset":"区域重置","Area to test":"测试区域",Areas:"领域","Ask failed":"询问失败","Asking...":"Asking...",Assistant:"助理","Assistant prompt":"助手提示","Available GA":"可用 GA","Building test plan...":"构建测试计划...","Builds a deterministic active test using the supported command GA in the selected area.":"在选定区域中使用支持的命令 GA 构建确定性主动测试。","Bus Connection Persistence":"总线连接持久性","Choose a report to inspect metrics, detailed checks, and suggestions.":"选择报告来检查指标、详细检查和建议。","Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.":"为所选区域选择一个标准测试模板,然后从 ETS 目录中确定性地构建计划。",Close:"关闭","Close menu":"关闭菜单",Command:"命令","Command DPT":"命令 DPT","Command GA":"命令 GA","Command payload":"命令负载",Completed:"已完成","Config exported":"配置导出","Config imported":"配置已导入","Connected {{value}}":"已连接 {{value}}","Coverage {{value}}%":"覆盖率 {{value}}%","Define at least one area before creating a test plan":"在创建测试计划之前至少定义一个区域","Define at least one area before using Tests":"使用测试之前至少定义一个区域","Delete Area":"删除区域","Deleting actuator preset...":"正在删除执行器预设...","Deleting area...":"正在删除区域...","Deleting profile...":"正在删除个人资料...","Deleting test plan...":"正在删除测试计划...","Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.":"描述您想要的房间、区域或功能。AI 将为该草案建议最相关的群组地址。",Description:"描述","Disconnected {{value}}":"已断开连接 {{value}}","Documentation: KNX AI Vue":"文档:KNX AI Vue","Donate via PayPal":"通过 PayPal 捐赠","Drag step":"拖步",Duplicate:"重复","Duplicate Plan":"重复计划","Edit Area":"编辑区","Edit Plan":"编辑计划","Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft.":"启用 KNX AI 节点中的 AI 来重新生成区域或建议 GA 进行新草稿。","Event distribution will appear after the first samples.":"事件分布将出现在第一个样本之后。","Event Mix":"活动组合","Example: Add all technical room lighting command and status GA.":"示例:添加所有技术室照明命令和状态 GA。",Expected:"预计","Expected feedback value":"期望反馈值","Expected payload":"预期有效负载","Explain any anomalies you see and suggest what to check first.":"解释您看到的任何异常情况并建议首先检查哪些内容。","Export PDF":"导出PDF","Exporting config...":"正在导出配置...",Fail:"失败","Failed to build the test plan":"无法构建测试计划","Failed to delete actuator preset":"删除执行器预设失败","Failed to delete area":"删除区域失败","Failed to delete profile":"删除个人资料失败","Failed to delete test plan":"删除测试计划失败","Failed to delete test result":"删除测试结果失败","Failed to export config":"导出配置失败","Failed to import config":"导入配置失败","Failed to load area command/status catalog":"无法加载区域命令/状态目录","Failed to load GA catalog":"无法加载 GA 目录","Failed to load nodes":"加载节点失败","Failed to load state":"加载状态失败","Failed to regenerate AI areas":"无法重新生成AI区域","Failed to reset area":"重置区域失败","Failed to run actuator test":"无法运行执行器测试","Failed to run profile":"运行配置文件失败","Failed to run test plan":"无法运行测试计划","Failed to save actuator preset":"无法保存执行器预设","Failed to save area":"保存区域失败","Failed to save GA role":"无法保存 GA 角色","Failed to save profile":"保存个人资料失败","Failed to save test plan":"保存测试计划失败","Failed to save test result":"无法保存测试结果","Failed to suggest area GA":"无法建议区域 GA","Generate an SVG bar chart of Top Group Addresses with counts and title.":"生成包含计数和标题的顶级组地址的 SVG 条形图。","Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.":"绿色显示连接到 KNX 总线的时间。红色显示所选历史窗口内的停机时间。",GroupValue_Response:"GroupValue_Response",GroupValue_Write:"GroupValue_Write","HVAC active check":"HVAC 主动检查","Importing config...":"正在导入配置...","in progress":"进行中","Installer alias":"安装人员别名","KNX active test name":"KNX 活动测试名称","KNX AI":"KNX AI","KNX Ultimate":"KNX Ultimate","Lights on, then off":"灯亮,然后灭","Live and saved reports generated by KNX active and read-only tests.":"由 KNX 活动和只读测试生成的实时和保存的报告。","Loading nodes...":"正在加载节点...","Loading...":"Loading...","n/a":"n/a","New Area":"新区","New Plan":"新计划","No areas matched the current search or the ETS file does not expose a usable hierarchy yet.":"没有区域与当前搜索匹配,或者 ETS 文件尚未公开可用的层次结构。","No detailed entries stored for this report yet.":"尚未存储此报告的详细条目。","No feedback":"无反馈","No GA selected for this area yet.":"尚未为此区域选择 GA。","No KNX AI nodes found.":"未找到 KNX AI 节点。","No saved plans yet.":"尚未保存计划。","No saved test results yet.":"尚未保存测试结果。","No test result selected to export":"未选择导出测试结果","No test result selected.":"未选择测试结果。","No top group address data available yet.":"尚无可用的顶级组地址数据。","Nodes {{nodes}} | Links {{links}}":"节点 {{nodes}} |链接 {{links}}",Now:"现在","Open and close shading":"打开和关闭阴影","Open and close the shading actuators in the area, then verify that the status matches the commands sent.":"打开和关闭该区域中的遮阳执行器,然后验证状态是否与发送的命令匹配。","Open Source Test":"开源测试","Optional note for diagnostics and reports":"诊断和报告的可选注释","Original ETS path:":"原始 ETS 路径:",Overview:"概述",Pass:"通行证",Payload:"有效载荷","Pick from the ETS catalog. Already selected GA are hidden from this list.":"从 ETS 目录中选择。已选择的 GA 从此列表中隐藏。","Plan changes discarded":"计划变更被放弃","Plan duplicated":"计划重复","Plan name":"计划名称",Plans:"计划","Profile deleted":"个人资料已删除","Profile report ready":"概况报告已准备就绪","Profile saved":"个人资料已保存","Provider: {{provider}} | Model: {{model}}":"提供商:{{provider}} |型号:{{model}}",Rate:"率","Read response timeout ms":"读取响应超时毫秒",Ready:"准备好",Reason:"原因",Refresh:"刷新","Regenerating AI areas...":"再生人工智能领域...",Remove:"删除",Repeat:"重复",Reset:"重置","Resetting area...":"重置区域...","Response timeout":"响应超时","Returned to the Tests page for the source actuator test.":"返回到源执行器测试的测试页面。","Returned to the Tests page for the source read-only profile.":"返回源只读配置文件的测试页面。","Returned to the Tests page.":"返回测试页面。","Reusable deterministic active tests saved by the installer.":"安装程序保存的可重复使用的确定性主动测试。",Role:"角色","Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.":"在该区域中运行 HVAC 命令的完整测试,并验证设定点和状态是否一致。",Running:"跑步","Running actuator test...":"运行执行器测试...","Running profile...":"运行配置文件...","Running...":"Running...","Saving actuator preset...":"正在保存执行器预设...","Saving profile...":"正在保存个人资料...","Saving test plan...":"正在保存测试计划...","Search GA, label or ETS path":"搜索 GA、标签或 ETS 路径","Select an Area":"选择一个区域","Select area":"选择区域","Select command GA":"选择命令 GA","Select one of the standard templates. The plan is built only from the command GA available in the selected area.":"选择标准模板之一。该计划仅根据所选区域中可用的命令 GA 构建。","Select test plan":"选择测试计划","Select Test Result":"选择测试结果","Selected template":"选定的模板","Send a":"发送一个",Settings:"设置","Short operator-facing description":"面向操作员的简短描述","Show AI Area Builder":"显示 AI 区域生成器","Show Template Builder":"显示模板生成器","Spontaneous Write From Status GA":"从状态 GA 自发写入",Status:"状态","Status DPT":"状态 DPT","Status GA":"状态 GA","Status write timeout ms":"状态写入超时毫秒","Step title":"步骤标题","Stopping repeat mode after the current cycle...":"在当前周期后停止重复模式...",Subscribe:"订阅",Suggestions:"建议","Summarize the current KNX traffic and highlight the busiest group addresses.":"总结当前 KNX 流量并突出显示最繁忙的组地址。",Summary:"总结","Targets supported HVAC command GA in the selected area.":"所选区域中支持 HVAC 命令 GA 的目标。","Targets supported shading command GA in the selected area.":"目标在选定区域中支持着色命令 GA。","telegram from the status GA.":"来自状态 GA 的电报。","telegram to the status GA and wait for a":"电报到状态 GA 并等待",Telegrams:"电报","Template Builder":"模板生成器","Test editor closed":"测试编辑器已关闭","Test plan deleted":"测试计划已删除","Test plan ready":"测试计划准备就绪","Test plan saved":"测试计划已保存","Test result deleted":"测试结果已删除","Test Results":"测试结果","Test Running":"试运行",Tests:"测试","The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.":"安装程序可以重命名该区域并准确决定哪些组地址属于该区域。一切都保存在每个 KNX AI 节点上。",Timeout:"超时",Title:"标题","Toggle menu":"切换菜单","Toggle sidebar":"切换侧边栏","Top Group Addresses":"顶级组地址","true, false, 50":"真、假、50","Turn the lights on, then turn them off, and verify that the related status values are coherent.":"打开灯,然后关闭它们,并验证相关状态值是否一致。","Unknown DPT":"未知 DPT","Unsaved changes":"未保存的更改",Voice:"语音",Wait:"等等","Wait for a spontaneous":"等待自发的","Wait ms":"等待毫秒",Warn:"警告","What this step checks":"此步骤检查什么","Why this step exists":"为什么存在这一步","Window {{value}}s.":"窗口 {{value}}s。","Write timeout":"写入超时"}},ef=(e,t)=>{const i=e.__vccOpts||e;for(const[o,u]of t)i[o]=u;return i},tf={class:"m-header"},af=["aria-expanded"],sf={class:"app-sidebar"},nf={id:"knx-ai-sidebar",class:"sidebar-brand-wrap"},rf=["aria-expanded"],of={class:"sidebar-collapse-icon"},lf={class:"sidebar-nav"},uf=["disabled"],df={key:0,class:"sidebar-panel sidebar-actions"},cf=["disabled"],ff={key:1,class:"sidebar-footer"},pf={key:0,class:"running-spinner status-pill-spinner","aria-hidden":"true"},gf={key:0,class:"status-detail"},hf={class:"workspace-shell"},mf={class:"content-grid workspace-main"},vf={key:0,class:"card card-summary"},bf={class:"card-head"},yf={key:0,class:"meta-chip"},Af={class:"summary-pre"},Sf={class:"metric-grid"},Pf={class:"metric"},wf={class:"metric"},Tf={class:"metric"},_f={class:"metric"},Df={key:1,class:"card card-areas"},If={class:"card-head"},Rf={class:"card-head-actions"},Nf={class:"meta-chip"},Cf=["disabled"],kf={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},xf=["disabled"],Ef={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},Gf={key:0,class:"planner-error-banner area-regenerate-error"},Ff={class:"areas-toolbar"},Lf={class:"pill-row"},Mf={class:"pill neutral"},Of={class:"pill neutral"},zf={class:"pill neutral"},$f={class:"pill neutral"},Bf={key:1,class:"areas-layout"},Vf={key:0,class:"area-listbox-shell"},Kf={class:"flow-field"},Wf={class:"area-search-select"},Uf=["placeholder"],jf={key:0,class:"area-search-select-menu"},Hf=["onMousedown"],Xf={class:"area-editor"},qf={key:0,class:"card-head"},Jf={class:"card-head-actions action-cluster"},Zf=["disabled"],Yf=["disabled"],Qf=["disabled"],ep=["disabled"],tp={key:1,class:"area-editor-grid"},ap={class:"flow-field"},sp={class:"flow-field area-editor-span"},np={class:"flow-field area-editor-span"},rp={key:2,class:"ai-planner-shell area-llm-shell"},ip={key:0,class:"card-head-actions action-cluster"},op={class:"area-editor-grid"},lp={class:"flow-field area-editor-span"},up={class:"profile-runbar"},dp=["disabled"],cp={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},fp={key:0,class:"planner-error-banner"},pp={key:1,class:"area-detail-subhead"},gp={key:3,class:"area-ga-editor"},hp={key:0,class:"simple-list simple-list-mono area-ga-list"},mp={class:"area-ga-main"},vp={key:0},bp={key:0},yp={class:"area-ga-actions"},Ap={class:"flow-field area-ga-role-field"},Sp=["value","disabled","onChange"],Pp=["value"],wp=["onClick"],Tp={key:1,class:"empty-state"},_p={class:"card-head"},Dp={class:"meta-chip"},Ip={class:"area-ga-catalog"},Rp=["onClick"],Np={class:"area-list-title"},Cp={class:"area-list-meta"},kp={class:"area-list-tags"},xp={key:0},Ep={key:4,class:"area-editor-note"},Gp={key:2,class:"empty-state"},Fp={class:"card-head"},Lp={class:"area-detail-subhead"},Mp={key:0,class:"card-head-actions"},Op={class:"meta-chip"},zp={class:"meta-chip"},$p=["disabled"],Bp={key:1,class:"card-head-actions"},Vp={class:"meta-chip"},Kp=["disabled"],Wp={class:"profile-editor-stack"},Up={key:0,class:"area-detail planner-sidecard"},jp={class:"area-listbox-shell"},Hp={class:"flow-field"},Xp={class:"area-search-select"},qp=["placeholder"],Jp={key:0,class:"area-search-select-menu"},Zp=["onMousedown"],Yp={key:0,class:"empty-state"},Qp={key:1,class:"area-detail"},eg={key:0,class:"card-head"},tg={key:0,class:"area-detail-subhead"},ag={class:"card-head-actions action-cluster"},sg={key:0,class:"meta-chip"},ng={class:"checkbox flow-toggle compact-toggle"},rg=["disabled"],ig=["disabled"],og=["disabled"],lg={key:2,class:"plan-run-actions"},ug=["disabled"],dg=["disabled"],cg={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},fg={key:1,class:"ai-planner-shell"},pg={key:0,class:"card-head-actions action-cluster"},gg={class:"area-editor-grid"},hg={class:"flow-field"},mg=["value"],vg={class:"flow-field area-editor-span"},bg=["value"],yg={class:"preset-row compact-preset-row"},Ag=["onClick"],Sg={class:"area-detail-subhead"},Pg={class:"profile-runbar"},wg=["disabled"],Tg={key:0,class:"running-spinner run-button-spinner","aria-hidden":"true"},_g={key:0,class:"planner-error-banner"},Dg={key:1,class:"planner-generation"},Ig={key:0,class:"area-detail-subhead"},Rg={key:1,class:"area-detail-subhead"},Ng={key:2,class:"area-detail planner-run-focus"},Cg={class:"card-head"},kg={class:"area-detail-subhead"},xg={class:"meta-chip"},Eg={class:"metric-grid area-metrics"},Gg={class:"metric"},Fg={class:"metric"},Lg={class:"metric"},Mg={class:"metric"},Og={key:0,class:"report-check report-pass planner-step-card planner-step-running"},zg={class:"anomaly-head"},$g={class:"area-detail-subhead"},Bg={key:0,class:"planner-step-grid"},Vg={key:1,class:"planner-step-grid"},Kg={key:2,class:"planner-check-sections"},Wg={class:"planner-check-section"},Ug={class:"planner-step-grid compact-grid"},jg={class:"planner-check-section"},Hg={class:"planner-step-grid compact-grid"},Xg={class:"card-head"},qg={class:"area-detail-subhead"},Jg={class:"card-head-actions action-cluster"},Zg={class:"meta-chip"},Yg={key:0,class:"meta-chip"},Qg={class:"meta-chip"},eh={class:"metric-grid area-metrics"},th={class:"report-checks"},ah={class:"anomaly-head"},sh={class:"area-detail-subhead"},nh={key:0,class:"planner-check-sections result-check-sections"},rh={class:"planner-step-grid compact-grid"},ih={key:1,class:"planner-step-grid"},oh={key:0,class:"empty-state"},lh={key:1},uh={class:"simple-list"},dh={key:4,class:"area-detail plan-draft-shell"},ch={class:"card-head"},fh={class:"running-headline"},ph={key:0,class:"running-spinner","aria-hidden":"true"},gh={class:"card-head-actions action-cluster"},hh={class:"meta-chip"},mh={class:"area-editor-grid"},vh={class:"flow-field"},bh=["value","disabled"],yh=["value"],Ah={class:"flow-field"},Sh={class:"flow-field area-editor-span"},Ph={class:"report-checks plan-steps-stack"},wh=["onDragenter","onDrop"],Th={class:"anomaly-head"},_h={class:"planner-step-title"},Dh=["onDragstart"],Ih=["aria-expanded","title","onClick"],Rh={class:"card-head-actions action-cluster compact-actions"},Nh=["onClick"],Ch=["onClick"],kh={key:0,class:"planner-step-summary"},xh={key:0},Eh={key:1},Gh={key:2},Fh={key:3},Lh={key:4},Mh={key:5},Oh={key:1,class:"planner-step-editor"},zh={class:"flow-field"},$h=["onUpdate:modelValue"],Bh={class:"flow-field area-editor-span"},Vh=["onUpdate:modelValue"],Kh={key:0,class:"flow-field"},Wh=["onUpdate:modelValue"],Uh={key:1,class:"planner-field-group area-editor-span"},jh={class:"planner-field-group-grid"},Hh={class:"flow-field"},Xh=["onUpdate:modelValue","onChange"],qh=["value"],Jh={class:"flow-field"},Zh=["onUpdate:modelValue","onChange"],Yh={class:"flow-field group-span"},Qh=["onUpdate:modelValue"],em=["value"],tm=["onUpdate:modelValue"],am={key:2,class:"planner-field-group area-editor-span"},sm={class:"planner-field-group-grid"},nm={class:"flow-field group-span"},rm=["onUpdate:modelValue","onChange"],im=["value"],om={class:"flow-field"},lm=["onUpdate:modelValue","onChange"],um={class:"flow-field"},dm=["onUpdate:modelValue"],cm=["value"],fm=["onUpdate:modelValue"],pm={key:3,class:"planner-check-sections editor-check-sections area-editor-span"},gm={class:"planner-check-section"},hm={class:"flow-field"},mm=["onUpdate:modelValue"],vm={class:"planner-check-section"},bm={class:"flow-field"},ym=["onUpdate:modelValue"],Am={class:"flow-field area-editor-span"},Sm=["onUpdate:modelValue"],Pm={key:3,class:"card card-profiles"},wm={class:"card-head"},Tm={class:"card-head-actions"},_m={class:"meta-chip"},Dm={class:"profiles-layout results-page-layout"},Im={class:"area-detail planner-sidecard"},Rm={class:"sidebar-results-list results-page-list"},Nm=["onClick"],Cm={class:"sidebar-result-head"},km={class:"sidebar-result-title"},xm={key:0,class:"running-spinner","aria-hidden":"true"},Em={class:"area-list-meta"},Gm={key:0},Fm={class:"area-list-tags"},Lm={class:"area-list-tags"},Mm=["disabled","onClick"],Om={key:0,class:"empty-state sidebar-empty-state"},zm={class:"card-head"},$m={class:"area-detail-subhead"},Bm={class:"card-head-actions action-cluster"},Vm={class:"meta-chip"},Km={key:0,class:"meta-chip"},Wm={class:"meta-chip"},Um=["disabled"],jm={class:"metric-grid area-metrics"},Hm={class:"report-checks"},Xm={class:"anomaly-head"},qm={class:"area-detail-subhead"},Jm={key:0,class:"planner-check-sections result-check-sections"},Zm={class:"planner-step-grid compact-grid"},Ym={key:1,class:"planner-step-grid"},Qm={key:0,class:"empty-state"},ev={key:1},tv={class:"simple-list"},av={key:1,class:"area-detail"},sv={key:4,class:"card"},nv={class:"card-head"},rv={class:"meta-chip"},iv={key:0,class:"rank-list"},ov={class:"rank-title"},lv={class:"rank-label"},uv={key:1,class:"empty-state"},dv={key:5,class:"card"},cv={class:"card-head"},fv={class:"meta-chip"},pv={key:0,class:"event-list"},gv={class:"event-name"},hv={class:"event-bar"},mv={key:1,class:"empty-state"},vv={key:6,class:"card card-bus"},bv={class:"card-head"},yv={key:0,class:"meta-chip"},Av={class:"pill-row"},Sv={class:"pill success"},Pv={class:"pill danger"},wv={class:"pill neutral"},Tv={class:"bus-track"},_v=["title"],Dv={class:"bus-scale"},Iv={key:1,class:"empty-state"},Rv={class:"card-head"},Nv={class:"card-head-actions"},Cv={class:"meta-chip"},kv={class:"flow-toolbar"},xv={class:"flow-field"},Ev={class:"flow-field flow-field-search"},Gv={class:"flow-field flow-field-select"},Fv=["value"],Lv={class:"checkbox flow-toggle flow-toggle-inline"},Mv={class:"flow-frame"},Ov=["viewBox"],zv=["id"],$v=["fill"],Bv=["d","stroke","stroke-width","opacity","marker-end"],Vv=["cx","cy"],Kv=["x","y"],Wv=["x","y"],Uv=["x","y"],jv=["x","y"],Hv={key:1,class:"empty-state flow-empty"},Xv={class:"flow-note"},qv={key:8,class:"card card-anomalies"},Jv={class:"card-head"},Zv={class:"meta-chip"},Yv={key:0,class:"anomaly-list"},Qv={class:"anomaly-head"},eb={class:"anomaly-time"},tb={key:1,class:"empty-state"},ab={key:9,class:"card card-chat"},sb={class:"card-head"},nb={class:"meta-chip"},rb={class:"chat-log"},ib=["innerHTML"],ob={key:1},lb={key:0,class:"chat-message chat-pending"},ub={class:"preset-row"},db=["disabled","onClick"],cb={class:"ask-row"},fb=["disabled"],pb=["disabled"],gb={key:10,class:"card card-settings"},hb={class:"settings-tab-strip"},mb={key:0,class:"area-detail settings-panel"},vb={class:"settings-node-grid"},bb={class:"flow-field"},yb=["value"],Ab={class:"checkbox settings-node-checkbox"},Sb={key:1,class:"area-detail settings-panel"},Pb={class:"card-head-actions action-cluster settings-config-actions"},wb=["disabled"],Tb=["disabled"],_b={key:0,class:"global-wait-overlay",role:"status","aria-live":"polite","aria-busy":"true"},Db={class:"global-wait-card"},Ib={class:"area-detail-subhead"},Rb={class:"modal-actions"},Nb=["disabled"],Cb={class:"area-detail-subhead"},kb={class:"modal-actions"},xb=["disabled"],Ni="knxUltimateAI:selectedNodeId",Ci="knxUltimateAI:autoRefresh",ki="knxUltimateAI:activeTab",xi="knxUltimateAI:settingsTab",Ei="knxUltimateAI:flowPreview",Gi="knxUltimateAI:voiceEnabled",Fi="knxUltimateAI:sidebarExpanded",Eb="knxUltimateAI:selectedTestAreaId:",Gb="https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/knxUltimateAI-vue",Fb="https://www.paypal.com/donate/?hosted_button_id=S8SKPUBSPK758",Lb="https://www.youtube.com/@maxsupervibe",Mb={__name:"App",setup(e){const t=["Summarize the current KNX traffic and highlight the busiest group addresses.","Explain any anomalies you see and suggest what to check first.","Generate an SVG bar chart of Top Group Addresses with counts and title."],i=[{id:"lights_on_off",title:"Lights on, then off",prompt:"Turn the lights on, then turn them off, and verify that the related status values are coherent.",description:"Applies to all matching lighting command GA in the selected area."},{id:"area_activate",title:"Activate main actuators",prompt:"Activate the main actuators in the area and verify the status feedback to confirm that it follows the commands.",description:"Builds a deterministic active test using the supported command GA in the selected area."},{id:"shading_open_close",title:"Open and close shading",prompt:"Open and close the shading actuators in the area, then verify that the status matches the commands sent.",description:"Targets supported shading command GA in the selected area."},{id:"hvac_check",title:"HVAC active check",prompt:"Run a full test of the HVAC commands in the area and verify that setpoints and statuses are coherent.",description:"Targets supported HVAC command GA in the selected area."}],o=[{value:"command",label:"Command"},{value:"status",label:"Status"},{value:"neutral",label:"Don't use in tests"}],u={write:"#ff9800",response:"#46b86d",read:"#d99a34",repeat:"#c34747",other:"#8d8578"},d=(()=>{try{return new URLSearchParams(window.location.search).get("nodeId")||""}catch{return""}})(),f=(()=>{try{return new URLSearchParams(window.location.search).get("access_token")||""}catch{return""}})(),p=fa("en");let m=null,T=0,A=!1;const I={it:{countAreas:"{{count}} aree",countSavedPlans:"{{count}} piani salvati",countAvailable:"{{count}} disponibili",countVisible:"{{count}} visibili",countEventTypes:"{{count}} tipi di eventi",countRecent:"{{count}} recenti",nodesLinks:"Nodi {{nodes}} | Link {{links}}",connected:"Connesso {{value}}",disconnected:"Disconnesso {{value}}",coverage:"Copertura {{value}}%",windowSec:"Finestra {{value}}s.",anomalyCount:"anomalia x{{value}}",areaLabel:"Area {{value}}",providerModel:"Provider: {{provider}} | Modello: {{model}}"},de:{countAreas:"{{count}} Bereiche",countSavedPlans:"{{count}} gespeicherte Pläne",countAvailable:"{{count}} verfügbar",countVisible:"{{count}} sichtbar",countEventTypes:"{{count}} Ereignistypen",countRecent:"{{count}} aktuell",nodesLinks:"Knoten {{nodes}} | Verbindungen {{links}}",connected:"Verbunden {{value}}",disconnected:"Getrennt {{value}}",coverage:"Abdeckung {{value}}%",windowSec:"Fenster {{value}}s.",anomalyCount:"Anomalie x{{value}}",areaLabel:"Bereich {{value}}",providerModel:"Anbieter: {{provider}} | Modell: {{model}}"},fr:{countAreas:"{{count}} zones",countSavedPlans:"{{count}} plans enregistrés",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} types d'événements",countRecent:"{{count}} récents",nodesLinks:"Nœuds {{nodes}} | Liens {{links}}",connected:"Connecté {{value}}",disconnected:"Déconnecté {{value}}",coverage:"Couverture {{value}}%",windowSec:"Fenêtre {{value}}s.",anomalyCount:"anomalie x{{value}}",areaLabel:"Zone {{value}}",providerModel:"Fournisseur : {{provider}} | Modèle : {{model}}"},es:{countAreas:"{{count}} áreas",countSavedPlans:"{{count}} planes guardados",countAvailable:"{{count}} disponibles",countVisible:"{{count}} visibles",countEventTypes:"{{count}} tipos de eventos",countRecent:"{{count}} recientes",nodesLinks:"Nodos {{nodes}} | Enlaces {{links}}",connected:"Conectado {{value}}",disconnected:"Desconectado {{value}}",coverage:"Cobertura {{value}}%",windowSec:"Ventana {{value}}s.",anomalyCount:"anomalía x{{value}}",areaLabel:"Área {{value}}",providerModel:"Proveedor: {{provider}} | Modelo: {{model}}"},"zh-CN":{countAreas:"{{count}} 个区域",countSavedPlans:"{{count}} 个已保存计划",countAvailable:"{{count}} 可用",countVisible:"{{count}} 可见",countEventTypes:"{{count}} 种事件类型",countRecent:"{{count}} 条最近记录",nodesLinks:"节点 {{nodes}} | 连线 {{links}}",connected:"已连接 {{value}}",disconnected:"已断开 {{value}}",coverage:"覆盖率 {{value}}%",windowSec:"窗口 {{value}} 秒。",anomalyCount:"异常 x{{value}}",areaLabel:"区域 {{value}}",providerModel:"提供方: {{provider}} | 模型: {{model}}"}},L={en:"en","en-us":"en","en-gb":"en",it:"it","it-it":"it",de:"de","de-de":"de",fr:"fr","fr-fr":"fr",es:"es","es-es":"es",zh:"zh-CN","zh-cn":"zh-CN","zh-hans":"zh-CN","zh-hans-cn":"zh-CN"},z=new Set(["KNX AI","KNX Ultimate","GroupValue_Write","GroupValue_Response","GA","DPT","ETS","SVG"]),re={it:{"Open Source Test":"Apri Test Sorgente","Asking...":"Sto chiedendo...","Loading...":"Caricamento...","Running...":"In esecuzione...",Running:"In esecuzione","Flow Map":"Mappa Flussi",Anomalies:"Anomalie",Rate:"Frequenza",Pass:"OK",Fail:"Errore",Warn:"Attenzione",Wait:"Attesa","Wait ms":"Attesa (ms)","Response timeout":"Timeout risposta","Read response timeout ms":"Timeout risposta lettura (ms)","Status write timeout ms":"Timeout scrittura stato (ms)","Regenerating...":"Rigenerazione...","Regenerate AI Areas":"Rigenera Aree AI","Deleting...":"Eliminazione...","Delete AI Areas":"Elimina Aree AI","Test Results":"Risultati Test","Select Test Result":"Seleziona risultato test","No test result selected.":"Nessun risultato test selezionato.","Open and close shading":"Apri e chiudi schermature"},de:{"Open Source Test":"Quelltest öffnen","Asking...":"Anfrage läuft...","Loading...":"Wird geladen...","Running...":"Läuft...",Running:"Läuft","Flow Map":"Flusskarte",Anomalies:"Anomalien",Rate:"Rate",Pass:"OK",Fail:"Fehler",Warn:"Warnung",Wait:"Warten","Wait ms":"Warten (ms)","Regenerating...":"Wird neu erstellt...","Regenerate AI Areas":"KI-Bereiche neu erstellen","Deleting...":"Wird gelöscht...","Delete AI Areas":"KI-Bereiche löschen"},fr:{"Open Source Test":"Ouvrir le test source","Asking...":"Interrogation en cours...","Loading...":"Chargement...","Running...":"En cours...",Running:"En cours","Flow Map":"Carte des flux",Anomalies:"Anomalies",Rate:"Débit",Pass:"OK",Fail:"Échec",Warn:"Alerte",Wait:"Attente","Wait ms":"Attente (ms)","Regenerating...":"Régénération...","Regenerate AI Areas":"Régénérer les zones IA","Deleting...":"Suppression...","Delete AI Areas":"Supprimer les zones IA"},es:{"Open Source Test":"Abrir prueba de origen","Asking...":"Consultando...","Loading...":"Cargando...","Running...":"En ejecución...",Running:"En ejecución","Flow Map":"Mapa de flujo",Anomalies:"Anomalías",Rate:"Tasa",Pass:"OK",Fail:"Fallo",Warn:"Aviso",Wait:"Espera","Wait ms":"Espera (ms)","Regenerating...":"Regenerando...","Regenerate AI Areas":"Regenerar áreas de IA","Deleting...":"Eliminando...","Delete AI Areas":"Eliminar áreas de IA"},"zh-CN":{"Open Source Test":"打开源测试","Asking...":"正在提问...","Loading...":"加载中...","Running...":"运行中...",Running:"运行中","Flow Map":"流量拓扑图",Anomalies:"异常",Rate:"速率",Pass:"通过",Fail:"失败",Warn:"警告",Wait:"等待","Wait ms":"等待(毫秒)","Regenerating...":"正在重新生成...","Regenerate AI Areas":"重新生成 AI 区域","Deleting...":"正在删除...","Delete AI Areas":"删除 AI 区域"}};function U(n,s="en"){const r=String(n||"").trim().toLowerCase();if(!r)return s;if(L[r])return L[r];if(r.includes("-")){const c=r.split("-")[0];if(L[c])return L[c]}return s}function Re(){try{const r=new URLSearchParams(window.location.search).get("lang");if(r)return U(r,"en")}catch{}const n=U(String(navigator.language||""),"");if(n)return n;const s=String(document&&document.documentElement&&document.documentElement.lang?document.documentElement.lang:"").trim();return s?U(s,"en"):"en"}function te(n,s={}){return String(n||"").replace(/\{\{\s*([^}\s]+)\s*\}\}/g,(r,c)=>Object.prototype.hasOwnProperty.call(s,c)?String(s[c]):r)}function oe(n){const s=I[p.value];if(!s)return"";let r=n.match(/^(\d+)\sareas$/i);return r?te(s.countAreas,{count:r[1]}):(r=n.match(/^(\d+)\ssaved plans$/i),r?te(s.countSavedPlans,{count:r[1]}):(r=n.match(/^(\d+)\savailable$/i),r?te(s.countAvailable,{count:r[1]}):(r=n.match(/^(\d+)\svisible$/i),r?te(s.countVisible,{count:r[1]}):(r=n.match(/^(\d+)\sevent types$/i),r?te(s.countEventTypes,{count:r[1]}):(r=n.match(/^(\d+)\srecent$/i),r?te(s.countRecent,{count:r[1]}):(r=n.match(/^Nodes\s+(.+?)\s+\|\s+Links\s+(.+)$/),r?te(s.nodesLinks,{nodes:r[1],links:r[2]}):(r=n.match(/^Connected\s+(.+)$/),r?te(s.connected,{value:r[1]}):(r=n.match(/^Disconnected\s+(.+)$/),r?te(s.disconnected,{value:r[1]}):(r=n.match(/^Coverage\s+(.+?)%$/),r?te(s.coverage,{value:r[1]}):(r=n.match(/^Window\s+(.+?)s\.$/),r?te(s.windowSec,{value:r[1]}):(r=n.match(/^anomaly x(.+)$/i),r?te(s.anomalyCount,{value:r[1]}):(r=n.match(/^Area\s+(.+)$/),r?te(s.areaLabel,{value:r[1]}):(r=n.match(/^Provider:\s+(.+?)\s+\|\s+Model:\s+(.+)$/),r?te(s.providerModel,{provider:r[1],model:r[2]}):"")))))))))))))}function ge(n){const s=String(n||""),r=s.trim();if(!r||p.value==="en"||z.has(r))return s;const c=re[p.value]||{},h=Qc[p.value]||{},D=c[r]||h[r]||oe(r);return!D||D===r?s:s.replace(r,D)}function Z(n){const s=n&&n.parentElement;if(!s)return!0;const r=String(s.tagName||"").toUpperCase();return!!(r==="SCRIPT"||r==="STYLE"||r==="CODE"||r==="PRE"||s.closest(".chat-log"))}function Ce(n){const s=n||document.body;if(!(!s||p.value==="en")&&!A){A=!0;try{const r=document.createTreeWalker(s,NodeFilter.SHOW_TEXT);let c=r.nextNode();for(;c;){if(!Z(c)){const D=ge(c.nodeValue);D!==c.nodeValue&&(c.nodeValue=D)}c=r.nextNode()}const h=s.querySelectorAll("[placeholder], [title], [aria-label]");for(const D of h){const G=D.getAttribute("placeholder");if(G){const Y=ge(G);Y!==G&&D.setAttribute("placeholder",Y)}const $=D.getAttribute("title");if($){const Y=ge($);Y!==$&&D.setAttribute("title",Y)}const O=D.getAttribute("aria-label");if(O){const Y=ge(O);Y!==O&&D.setAttribute("aria-label",Y)}}}finally{A=!1}}}function ut(){p.value!=="en"&&(T||(T=window.requestAnimationFrame(()=>{T=0,Ce(document.body)})))}function Ye(){m&&(m.disconnect(),m=null),T&&(window.cancelAnimationFrame(T),T=0)}function vt(){p.value!=="en"&&(Ye(),m=new MutationObserver(()=>{A||ut()}),m.observe(document.body,{childList:!0,subtree:!0,characterData:!0}),ut())}const a=Zs({nodes:[],selectedNodeId:"",activeTab:Ve(ki,"overview"),settingsTab:Ve(xi,"config"),autoRefresh:Ra(Ci,!0),voiceEnabled:Ra(Gi,!0),flowMaxNodes:Ha().maxNodes,flowSelectedGa:Ha().selectedGa,flowShowUniversalNodes:Ha().showUniversalNodes,flowSearch:"",areaSearch:"",areaSearchOpen:!1,areaSelectedId:"",testAreaSelectedId:"",areaDraftName:"",areaDraftDescription:"",areaDraftTags:"",areaDraftGaList:[],areaDraftId:"",areaDraftIsNew:!1,areaLlmPrompt:"",areaLlmBusy:!1,areaLlmError:"",areaLlmRegenerating:!1,areaLlmBulkDeleting:!1,gaCatalog:[],gaCatalogSearch:"",gaCatalogLoading:!1,areaGaRoleSavingGa:"",areaSaving:!1,profileSelectedId:"",profileDraftMode:!1,profileDraftId:"",profileDraftName:"",profileDraftDescription:"",profileDraftTargetTags:"",profileDraftMinActivityPct:20,profileDraftMaxSilentPct:60,profileDraftMaxAnomalies:2,profileSaving:!1,profileRunning:!1,actuatorPresetSelectedId:"",actuatorDraftMode:!1,actuatorDraftId:"",actuatorDraftName:"",actuatorDraftDescription:"",actuatorDraftCommandGA:"",actuatorDraftCommandDPT:"",actuatorDraftCommandPayload:"",actuatorDraftStatusGA:"",actuatorDraftStatusDPT:"",actuatorDraftStatusWriteTimeoutMs:5e3,actuatorDraftStatusResponseTimeoutMs:5e3,actuatorSaving:!1,actuatorRunning:!1,testPlanSelectedId:"",testPlanSearch:"",testPlanSearchOpen:!1,selectedTestResultId:"",liveTestResultId:"",testResultsMenuOpen:!0,testResultFocusMode:!1,deletingTestResultId:"",testPlanPrompt:"",testPlanDraft:null,testPlanCatalog:null,testPlanCatalogLoading:!1,testPlanCatalogError:"",testPlanGenerating:!1,testPlanSaving:!1,testPlanDeleting:!1,testPlanRunning:!1,testPlanGeneration:null,testPlanGenerationError:"",testPlanRunConfirmOpen:!1,testPlanRunMode:"single",testPlanRunningStepId:"",testPlanRepeatForever:!1,testPlanRepeatStopRequested:!1,testPlanDraftBaseline:"",testPlanUnsavedConfirmOpen:!1,areaUnsavedConfirmOpen:!1,testPlanPendingActionLabel:"",draggedTestPlanStepId:"",dragOverTestPlanStepId:"",showAiPlanner:!0,testTemplateBuilderFocus:!1,showAiAreaBuilder:!1,areaBuilderFocus:!1,status:"Ready",loadingNodes:!1,loadingState:!1,asking:!1,stateData:null,lastError:"",chatMessages:[],chatDraft:"",pollStateHandle:null,pollNodesHandle:null}),dt=fa(null),xt=fa(!1),Qt=fa(null),bt=fa(null),ea=fa(Ra(Fi,!0)),ta=fa(!1),_e=fa(!1),ue=H(()=>_e.value?ta.value:ea.value);let le=null,ct=null,aa=null;function at(){if(le){try{le.pause(),le.src=""}catch{}le=null}}function Ve(n,s=""){try{return window.localStorage&&window.localStorage.getItem(n)||s}catch{return s}}function Ra(n,s){try{if(!window.localStorage)return s;const r=window.localStorage.getItem(n);return r==null||r===""?s:r==="true"}catch{return s}}function Ha(){try{if(!window.localStorage)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const n=window.localStorage.getItem(Ei);if(!n)return{maxNodes:14,selectedGa:[],showUniversalNodes:!1};const s=JSON.parse(n),r=Math.max(4,Math.min(32,Number(s&&s.maxNodes)||14)),c=Array.isArray(s&&s.selectedGa)?Array.from(new Set(s.selectedGa.map(D=>String(D||"").trim()).filter(Boolean))).slice(0,80):[],h=s&&s.showUniversalNodes===!0;return{maxNodes:r,selectedGa:c,showUniversalNodes:h}}catch{return{maxNodes:14,selectedGa:[],showUniversalNodes:!1}}}function Na(n,s){try{window.localStorage&&window.localStorage.setItem(n,String(s??""))}catch{}}function Et(n,s){try{window.localStorage&&window.localStorage.setItem(n,s?"true":"false")}catch{}}function sa(){try{_e.value=window.matchMedia("(max-width: 1100px)").matches}catch{_e.value=window.innerWidth<=1100}_e.value||(ta.value=!1)}function Ca(){if(_e.value){ta.value=ta.value!==!0;return}ea.value=ea.value!==!0}function ka(){_e.value&&(ta.value=!1)}function na(n){!n||n.key!=="Escape"||ka()}function sn(n){const s=String(n||"").trim();return s?`${Eb}${s}`:""}function g(n){const s=sn(n);return s?Ve(s,""):""}function y(n,s){const r=sn(n);if(!r)return;const c=String(s||"").trim();c&&Na(r,c)}function _(){const n=g(a.selectedNodeId);return!n||!Se.value.find(s=>s.id===n)?!1:(a.testAreaSelectedId===n||(a.testAreaSelectedId=n),!0)}function x(){try{if(!window.localStorage)return;window.localStorage.setItem(Ei,JSON.stringify({maxNodes:Math.max(4,Math.min(32,Number(a.flowMaxNodes)||14)),selectedGa:Array.from(new Set((a.flowSelectedGa||[]).map(n=>String(n||"").trim()).filter(Boolean))).slice(0,80),showUniversalNodes:a.flowShowUniversalNodes===!0}))}catch{}}async function R(){const n=dt.value;if(!(!n||typeof n.requestFullscreen!="function"))try{document.fullscreenElement===n?await document.exitFullscreen():document.fullscreenElement||await n.requestFullscreen()}catch{}}function C(){xt.value=document.fullscreenElement===dt.value}function E(n){const s=new URL(n,window.location.href);return f&&s.searchParams.set("access_token",f),s.toString()}function P(n){a.status=ge(String(n||""))}async function N(n,s){const r=await fetch(n,Object.assign({credentials:"same-origin"},s||{})),c=await r.text();let h={};try{h=c?JSON.parse(c):{}}catch{h={error:c||`HTTP ${r.status}`}}if(!r.ok){const D=h&&h.error?h.error:`HTTP ${r.status}`;throw r.status===401||r.status===403?new Error(`Authentication required or insufficient permissions (${r.status}).`):new Error(D)}return h}async function k(n,s){const r=await fetch(n,Object.assign({credentials:"same-origin",cache:"no-store"},s||{}));if(!r.ok){const c=await r.text();let h=c||`HTTP ${r.status}`;try{const D=c?JSON.parse(c):{};h=D&&D.error?D.error:h}catch{}throw r.status===401||r.status===403?new Error(`Authentication required or insufficient permissions (${r.status}).`):new Error(h)}return await r.blob()}function j(n){if(n==null)return"";if(typeof n=="string")return n;try{return JSON.stringify(n,null,2)}catch{return String(n)}}function M(n){return String(n||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function K(n){const s=String(n||"").trim();return s.includes("-")&&/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(s)}function X(n){let s=String(n||"").trim();return s.startsWith("|")&&(s=s.slice(1)),s.endsWith("|")&&(s=s.slice(0,-1)),s.split("|").map(r=>String(r||"").trim())}function ie(n){return X(n).map(s=>{const r=String(s||"").trim(),c=r.startsWith(":"),h=r.endsWith(":");return c&&h?"center":h?"right":"left"})}function Ae(n){const s=String(n||"").split(/\r?\n/);let r="",c=!1;const h=D=>{let G=String(D||"");return G=G.replace(/`([^`]+)`/g,"<code>$1</code>"),G=G.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),G=G.replace(/\*([^*]+)\*/g,"<em>$1</em>"),G=G.replace(/\[([^\]]+)\]\(([^)]+)\)/g,($,O,Y)=>`<a href="${/^javascript:/i.test(String(Y||"").trim())?"#":Y}" target="_blank" rel="noopener noreferrer">${O}</a>`),G};for(let D=0;D<s.length;D++){const G=s[D];if(/^```/.test(G.trim())){c=!c,r+=c?"<pre><code>":"</code></pre>";continue}if(c){r+=`${G}
2
+ `;continue}if(/^###\s+/.test(G)){r+=`<h3>${G.replace(/^###\s+/,"")}</h3>`;continue}if(/^##\s+/.test(G)){r+=`<h2>${G.replace(/^##\s+/,"")}</h2>`;continue}if(/^#\s+/.test(G)){r+=`<h1>${G.replace(/^#\s+/,"")}</h1>`;continue}if(G.includes("|")&&D+1<s.length&&K(s[D+1])){const Y=X(G),V=ie(s[D+1]),he=[];for(D+=2;D<s.length&&s[D]&&s[D].includes("|")&&!/^```/.test(s[D].trim());)he.push(X(s[D])),D++;D-=1;const se=Math.max(Y.length,V.length,...he.map(W=>W.length),0);r+='<div class="chat-table-wrap"><table><thead><tr>';for(let W=0;W<se;W++)r+=`<th style="text-align:${V[W]||"left"};">${h(Y[W]||"")}</th>`;r+="</tr></thead><tbody>",he.forEach(W=>{r+="<tr>";for(let de=0;de<se;de++)r+=`<td style="text-align:${V[de]||"left"};">${h(W[de]||"")}</td>`;r+="</tr>"}),r+="</tbody></table></div>";continue}const $=/^\s*[-*]\s+/.test(G),O=/^\s*\d+\.\s+/.test(G);if($||O){const Y=O?"ol":"ul",V=O?/^\s*\d+\.\s+/:/^\s*[-*]\s+/;for(r+=`<${Y}>`;D<s.length&&V.test(s[D]);)r+=`<li>${h(s[D].replace(V,""))}</li>`,D++;D-=1,r+=`</${Y}>`;continue}if(G.trim()===""){r+="<br>";continue}r+=`<p>${h(G)}</p>`}return c&&(r+="</code></pre>"),r}function pe(n){return String(n||"").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/&amp;/gi,"&")}function Le(n){const s=[],r=/<svg[\s\S]*?<\/svg>/gi;let c;for(;(c=r.exec(String(n||"")))!==null;)c&&c[0]&&s.push(String(c[0]));return s}const Oe=new Set(["svg","g","path","line","polyline","polygon","circle","ellipse","rect","text","tspan","title","desc","defs","marker","lineargradient","radialgradient","stop","clippath"]),st=new Set(["xmlns","xmlns:xlink","viewbox","preserveaspectratio","width","height","role","aria-label","id","class","x","y","x1","y1","x2","y2","cx","cy","r","rx","ry","d","points","transform","fill","fill-opacity","stroke","stroke-width","stroke-opacity","stroke-dasharray","stroke-linecap","stroke-linejoin","opacity","font-size","font-family","font-weight","text-anchor","dominant-baseline","offset","stop-color","stop-opacity","gradientunits","gradienttransform","fx","fy","marker-start","marker-mid","marker-end","markerwidth","markerheight","refx","refy","orient","markerunits","href","xlink:href","clip-path","clippathunits"]);function Xe(n){try{const r=new window.DOMParser().parseFromString(String(n||""),"image/svg+xml");if(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)return"";const c=r.documentElement;if(String(c.tagName||"").toLowerCase()!=="svg")return"";const h=G=>{const $=String(G.tagName||"").toLowerCase();if(!Oe.has($)){G.remove();return}Array.from(G.attributes||[]).forEach(O=>{const Y=String(O.name||"").toLowerCase(),V=String(O.value||"");if(Y.startsWith("on")||!st.has(Y)){G.removeAttribute(O.name);return}(Y==="href"||Y==="xlink:href")&&V&&!String(V).trim().startsWith("#")&&G.removeAttribute(O.name)}),Array.from(G.childNodes||[]).forEach(O=>{O.nodeType===1?h(O):O.nodeType!==3&&O.remove()})};h(c),!c.getAttribute("viewBox")&&!c.getAttribute("viewbox")&&c.setAttribute("viewBox","0 0 920 360"),c.setAttribute("role",c.getAttribute("role")||"img");const D=new window.XMLSerializer().serializeToString(c);return D.length>12e4?"":D}catch{return""}}function ft(n){return Ae(M(n||""))}function Ss(n){const s=j(n),r=s.trim();if(!r)return ft("(empty answer)");const c=/```(?:svg|xml|html)?\s*([\s\S]*?)```/gi;let h="",D=0,G=!1,$;for(;($=c.exec(s))!==null;){const Y=s.slice(D,$.index);Y.trim()&&(h+=ft(Y));const V=String($[1]||""),he=pe(V),se=Le(he);if(se.length){let W=0;se.forEach(de=>{const ve=Xe(de);ve&&(W++,G=!0,h+=`<div class="chat-svg-wrap">${ve}</div>`)}),W||(h+=`<pre><code>${M(V)}</code></pre>`)}else{const W=Xe(he);W?(G=!0,h+=`<div class="chat-svg-wrap">${W}</div>`):h+=`<pre><code>${M(V)}</code></pre>`}D=$.index+$[0].length}const O=s.slice(D);if(O.trim()&&(h+=ft(O)),!G){const Y=pe(s),V=Array.from(new Set([...Le(s),...Le(Y)])).map(he=>Xe(he)).filter(Boolean);if(V.length){const he=s.replace(/<svg[\s\S]*?<\/svg>/gi,"").replace(/&lt;svg[\s\S]*?&lt;\/svg&gt;/gi,"").trim();h=he?ft(he):"",V.forEach(se=>{h+=`<div class="chat-svg-wrap">${se}</div>`})}}return h||ft(r)}function Me(n){const s=Math.max(0,Math.round(Number(n)||0)),r=Math.floor(s/3600),c=Math.floor(s%3600/60),h=s%60;return r?`${r}h ${c}m`:c?`${c}m ${h}s`:`${h}s`}function Ke(n){if(!n)return"n/a";try{return new Date(n).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return"n/a"}}function nt(n){if(!n)return"";try{return new Date(n).toLocaleString()}catch{return String(n)}}function va(n){return n&&n.payload&&typeof n.payload=="object"?n.payload:{}}function pr(n){return n==null?"":String(n).trim()}function Gt(n,s=null){try{return JSON.parse(JSON.stringify(n))}catch{return s}}function nn(n=[]){return Array.from(new Set((Array.isArray(n)?n:[]).map(s=>String(s||"").trim()).filter(Boolean))).sort()}function Wo(n=""){return nn(String(n||"").split(","))}function rn(n={}){return JSON.stringify({isNew:n.isNew===!0,areaId:String(n.areaId||"").trim(),name:String(n.name||"").trim(),description:String(n.description||"").trim(),tags:nn(n.tags||[]),gaList:nn(n.gaList||[]),llmPrompt:String(n.llmPrompt||"").trim()})}function gr(n={}){return JSON.stringify({prompt:String(n.prompt||""),draft:Gt(n.draft,null)})}function Uo(){return{selectedId:String(a.testPlanSelectedId||""),prompt:String(a.testPlanPrompt||""),draft:Gt(a.testPlanDraft,null),generation:Gt(a.testPlanGeneration,null),showAiPlanner:a.showAiPlanner===!0}}function xa(){ct=Uo(),a.testPlanDraftBaseline=gr(ct)}function jo(){const n=Gt(ct,null);if(!n){a.testPlanSelectedId="",a.testPlanPrompt="",a.testPlanDraft=null,a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!0;return}a.testPlanSelectedId=String(n.selectedId||""),a.testPlanPrompt=String(n.prompt||""),a.testPlanDraft=Gt(n.draft,null),a.testPlanGeneration=Gt(n.generation,null),a.testPlanRunConfirmOpen=!1,a.showAiPlanner=n.showAiPlanner!==!1,n.draft&&n.draft.areaId&&Se.value.find(s=>s.id===n.draft.areaId)&&(a.areaSelectedId=n.draft.areaId)}function Ho(n){const s=String(n||"").trim();return s.length>14?`${s.slice(0,12)}..`:s}function Xo(n){const s=String(n||"").trim();return s?s.length>28?`${s.slice(0,26)}..`:s:""}function qo(n){const s=pr(n).replace(/\s+/g," ");return s?s.length>30?`${s.slice(0,28)}..`:s:""}function Jo(n){const s=String(n||"").toLowerCase();return s.includes("repeat")?"repeat":s.includes("write")?"write":s.includes("response")?"response":s.includes("read")?"read":"other"}function Zo(n){const s={write:0,response:0,read:0,repeat:0,other:0};return Object.keys(n||{}).forEach(r=>{const c=Number(n[r]||0);c<=0||(s[Jo(r)]+=c)}),Object.keys(s).sort((r,c)=>s[c]-s[r])[0]||"other"}function on(n){return!!(n&&n.kind==="node"&&n.listenAllGA)}function Yo(n){const s=n&&n.summary?n.summary:{},r=Array.isArray(n&&n.anomalies)?n.anomalies:[],c=Array.isArray(s.patternTransitions)?s.patternTransitions:[],h=Array.isArray(s.patterns)?s.patterns:[],D=s&&typeof s.gaLabels=="object"?s.gaLabels:{},G=s&&typeof s.gaLastPayload=="object"?s.gaLastPayload:{},$=s&&typeof s.gaLastSeenAt=="object"?s.gaLastSeenAt:{},O=new Set((Array.isArray(s.flowKnownGAs)?s.flowKnownGAs:[]).map(w=>String(w||"").trim()).filter(Boolean)),Y={};r.forEach(w=>{const B=String(w&&w.payload&&w.payload.ga?w.payload.ga:"BUS").trim()||"BUS";Y[B]=(Y[B]||0)+1});const V=s&&s.flowMapTopology&&typeof s.flowMapTopology=="object"?s.flowMapTopology:null,he=Array.isArray(V&&V.nodes)?V.nodes:[],se=Array.isArray(V&&V.edges)?V.edges:[],W=new Map,de=w=>{const B=String(w&&w.from?w.from:"").trim(),ee=String(w&&w.to?w.to:"").trim();if(!B||!ee||B===ee)return;const Fe=`${B}->${ee}`,We={key:Fe,from:B,to:ee,weight:Math.max(1,Number(w&&(w.weight??w.currentWindowCount??w.totalCount??w.count)||1)),delta:Number(w&&w.delta?w.delta:0),edgeByEvent:w&&typeof w.edgeByEvent=="object"?w.edgeByEvent:{},lastAtMs:(()=>{const et=Number(w&&w.lastAtMs?w.lastAtMs:0);if(Number.isFinite(et)&&et>0)return et;const ca=new Date(String(w&&w.lastAt?w.lastAt:"")).getTime();return Number.isFinite(ca)?ca:0})(),linkType:String(w&&w.linkType?w.linkType:"").trim()};if(!W.has(Fe)){W.set(Fe,We);return}const qe=W.get(Fe);qe.weight+=We.weight,qe.delta+=We.delta,qe.lastAtMs=Math.max(Number(qe.lastAtMs||0),Number(We.lastAtMs||0)),Object.keys(We.edgeByEvent||{}).forEach(et=>{qe.edgeByEvent[et]=Number(qe.edgeByEvent[et]||0)+Number(We.edgeByEvent[et]||0)})};se.length?se.forEach(de):c.length?c.forEach(de):h.forEach(w=>de({from:w&&w.from,to:w&&w.to,count:w&&w.count,edgeByEvent:{}}));const ve=new Map,da=(w,B={})=>{const ee=String(w||"").trim();return ee?(ve.has(ee)||ve.set(ee,{id:ee,displayId:String(B.displayId||ee).trim()||ee,kind:String(B.kind||(ee.startsWith("N:")?"node":"ga")).trim()||"ga",subtitle:String(B.subtitle||"").trim(),payload:pr(B.payload),anomalyCount:Number(B.anomalyCount||Y[ee]||0),inFlow:B.inFlow!==void 0?!!B.inFlow:O.size?O.has(ee)||ee==="BUS"||ee.startsWith("N:"):!0,lastSeenAtMs:Number(B.lastSeenAtMs||0),score:Number(B.score||0),listenAllGA:B.listenAllGA===!0}),ve.get(ee)):null};return he.forEach(w=>{const B=String(w&&w.id?w.id:"").trim();B&&da(B,{displayId:w&&w.displayId,kind:w&&w.kind,subtitle:w&&w.subtitle?w.subtitle:D[B],payload:w&&w.payload!==void 0?w.payload:G[B],anomalyCount:Number(w&&w.anomalyCount?w.anomalyCount:Y[B]||0),inFlow:w&&w.inFlow!==void 0?!!w.inFlow:void 0,lastSeenAtMs:Number(w&&w.lastSeenAtMs?w.lastSeenAtMs:new Date(String(w&&w.lastAt?w.lastAt:$[B]||"")).getTime()||0),score:Number(w&&w.score?w.score:0),listenAllGA:w&&w.listenAllGA===!0})}),Array.from(W.values()).forEach(w=>{da(w.from,{subtitle:D[w.from],payload:G[w.from],lastSeenAtMs:new Date(String($[w.from]||"")).getTime()||w.lastAtMs||0}),da(w.to,{subtitle:D[w.to],payload:G[w.to],lastSeenAtMs:new Date(String($[w.to]||"")).getTime()||w.lastAtMs||0});const B=ve.get(w.from),ee=ve.get(w.to);B&&(B.score+=Number(w.weight||0)),ee&&(ee.score+=Number(w.weight||0))}),(Array.isArray(s.topGAs)?s.topGAs:[]).slice(0,12).forEach(w=>{const B=String(w&&w.ga?w.ga:"").trim();if(!B)return;const ee=da(B,{subtitle:w&&w.label?w.label:D[B],payload:G[B],lastSeenAtMs:new Date(String($[B]||"")).getTime()||0});ee&&(ee.score+=Number(w&&w.count?w.count:0))}),{nodes:Array.from(ve.values()),edges:Array.from(W.values()).sort((w,B)=>Number(B.weight||0)-Number(w.weight||0)).slice(0,48),telemetryWindowSec:Number(s&&s.graph&&s.graph.windowSec?s.graph.windowSec:s?.meta?.analysisWindowSec||0)}}function Qo(n){let s=Array.isArray(n&&n.nodes)?n.nodes.slice():[];const r=Array.isArray(n&&n.edges)?n.edges.slice():[];a.flowShowUniversalNodes!==!0&&(s=s.filter(w=>!on(w)));const c=new Set(s.map(w=>w.id)),h=new Set((a.flowSelectedGa||[]).map(w=>String(w||"").trim()).filter(w=>w&&c.has(w))),D=Math.max(4,Math.min(32,Number(a.flowMaxNodes)||14));let G=s.slice().sort((w,B)=>{const ee=Number(w.anomalyCount||0)*10+Number(w.score||0),Fe=Number(B.anomalyCount||0)*10+Number(B.score||0);return Fe!==ee?Fe-ee:String(w.id||"").localeCompare(String(B.id||""))});if(h.size){const w=new Set(h);r.forEach(B=>{h.has(B.from)&&w.add(B.to),h.has(B.to)&&w.add(B.from)}),G=G.filter(B=>w.has(B.id))}else G=G.slice(0,D);const $=new Set(G.map(w=>w.id)),O=r.filter(w=>$.has(w.from)&&$.has(w.to)),Y=Math.max(...O.map(w=>Number(w.weight||0)),1),V=Math.max(2,Math.min(6,Math.ceil(Math.sqrt(Math.max(G.length,4)*1.5)))),he=Math.max(1,Math.ceil(G.length/V)),se=1080,W=Math.max(420,140+(he-1)*150),de=new Map;G.forEach((w,B)=>{const ee=Math.floor(B/V),Fe=B%V,We=V===1?se/2:90+Fe*((se-180)/Math.max(V-1,1)),qe=92+ee*148;de.set(w.id,{x:We,y:qe,row:ee,col:Fe})});const ve=Date.now(),da=O.map((w,B)=>{const ee=de.get(w.from),Fe=de.get(w.to);if(!ee||!Fe)return null;const We=Fe.x-ee.x,qe=Fe.y-ee.y,et=Math.max(Math.hypot(We,qe),1),ca=We/et,Fa=qe/et,De=24,Pt=ee.x+ca*(De+2),zt=ee.y+Fa*(De+2),$t=Fe.x-ca*(De+8),Bt=Fe.y-Fa*(De+8),Ns=-Fa,Cs=ca,Qa=28+B%3*14,ks=B%2===0?1:-1,Rn=(Pt+$t)/2+Ns*Qa*ks,wu=(zt+Bt)/2+Cs*Qa*ks,jr=Zo(w.edgeByEvent),Hr=Number(w.lastAtMs||0)>0&&ve-Number(w.lastAtMs||0)<=5e3;return{key:w.key,from:w.from,to:w.to,d:`M ${Pt} ${zt} Q ${Rn} ${wu} ${$t} ${Bt}`,width:(.9+Number(w.weight||0)/Y*1.7).toFixed(2),color:u[jr]||u.other,opacity:Hr?.82:.24,markerId:`flow-arrow-${jr}`,tooltip:`${w.from} -> ${w.to} | traffic: ${Number(w.weight||0)}${w.delta?` | delta: ${w.delta>0?"+":""}${w.delta}`:""}`,active:Hr}}).filter(Boolean);return{width:se,height:W,telemetryWindowSec:Number(n&&n.telemetryWindowSec?n.telemetryWindowSec:0),nodes:G.map(w=>{const B=de.get(w.id),ee=Number(w.lastSeenAtMs||0);return Object.assign({},w,B,{shortLabel:Ho(w.displayId||w.id),shortSubtitle:Xo(w.subtitle),shortPayload:qo(w.payload),isIdle:ee>0&&ve-ee>45e3})}),edges:da,maxNodes:D,selectedCount:h.size}}const Ps=H(()=>a.nodes.find(n=>n.id===a.selectedNodeId)||null),xe=H(()=>a.stateData&&a.stateData.summary?a.stateData.summary:{}),ra=H(()=>a.stateData&&a.stateData.node?a.stateData.node:{}),ba=H(()=>a.stateData&&a.stateData.areas?a.stateData.areas:{suggested:[],totals:{}}),Se=H(()=>Array.isArray(ba.value&&ba.value.suggested)?ba.value.suggested:[]),el=H(()=>Se.value.filter(n=>String(n&&n.id?n.id:"").startsWith("llm:"))),hr=H(()=>Number(el.value.length||0)),Xa=H(()=>ba.value&&ba.value.totals?ba.value.totals:{}),ya=H(()=>Array.isArray(a.stateData&&a.stateData.profiles)?a.stateData.profiles:[]),tl=H(()=>a.stateData&&a.stateData.profileReport?a.stateData.profileReport:null),Aa=H(()=>Array.isArray(a.stateData&&a.stateData.actuatorTests)?a.stateData.actuatorTests:[]),al=H(()=>a.stateData&&a.stateData.actuatorTestReport?a.stateData.actuatorTestReport:null),yt=H(()=>Array.isArray(a.stateData&&a.stateData.testPlans)?a.stateData.testPlans:[]),mr=H(()=>{const n=String(a.testPlanSearch||"").trim().toLowerCase();return yt.value.filter(s=>n?[s.name,s.description,s.areaName,s.areaId].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),pt=H(()=>a.stateData&&a.stateData.testPlanReport?a.stateData.testPlanReport:null),qa=H(()=>Array.isArray(a.stateData&&a.stateData.testResults)?a.stateData.testResults:[]),vr=H(()=>!a.liveTestResultId||!pt.value||pt.value.id!==a.liveTestResultId?null:Object.assign({},pt.value,{live:a.testPlanRunning===!0})),ia=H(()=>{const n=[],s=new Set,r=(c,h=!1)=>{if(!c||typeof c!="object"||!c.id)return;const D=String(c.id);s.has(D)||(s.add(D),n.push(Object.assign({},c,{live:h})))};return r(vr.value,!0),qa.value.forEach(c=>r(c,!1)),n}),ae=H(()=>{if(a.selectedTestResultId){const n=ia.value.find(s=>s&&s.id===a.selectedTestResultId);if(n)return n}return vr.value||qa.value[0]||null}),At=H(()=>a.activeTab==="tests"&&a.testResultFocusMode===!0&&!!ae.value),ln=H(()=>{const n=String(a.areaSearch||"").trim().toLowerCase();return Se.value.filter(s=>n?[s.path,s.name,s.parentName,...Array.isArray(s.tags)?s.tags:[],...Array.isArray(s.sampleLabels)?s.sampleLabels:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0)}),Ee=H(()=>{if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim())return null;if(a.areaSelectedId){const n=Se.value.find(s=>s.id===a.areaSelectedId);if(n)return n}return null}),rt=H(()=>{if(a.testAreaSelectedId){const n=Se.value.find(s=>s.id===a.testAreaSelectedId);if(n)return n}return Se.value[0]||null}),Ft=H(()=>{const n=String(a.testPlanDraft&&a.testPlanDraft.areaId?a.testPlanDraft.areaId:"").trim();if(n){const s=Se.value.find(r=>r.id===n);if(s)return s}return rt.value}),br=H(()=>{const n=String(a.gaCatalogSearch||"").trim().toLowerCase(),s=new Set((a.areaDraftGaList||[]).map(r=>String(r||"").trim()).filter(Boolean));return(Array.isArray(a.gaCatalog)?a.gaCatalog:[]).filter(r=>!r||!r.ga||s.has(r.ga)?!1:n?[r.ga,r.label,r.hierarchyPath,...Array.isArray(r.tags)?r.tags:[]].filter(Boolean).join(" ").toLowerCase().includes(n):!0).slice(0,80)}),yr=H(()=>{const n=new Map((Array.isArray(a.gaCatalog)?a.gaCatalog:[]).map(s=>[String(s&&s.ga?s.ga:"").trim(),s]));return(a.areaDraftGaList||[]).map(s=>n.get(String(s||"").trim())||{ga:String(s||"").trim(),label:"",dpt:"",hierarchyPath:"",tags:[]})}),un=H(()=>Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.commandSignals)?a.testPlanCatalog.commandSignals:[]),Ar=H(()=>Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.statusSignals)?a.testPlanCatalog.statusSignals:[]),St=H(()=>{if(a.profileDraftMode===!0)return null;if(a.profileSelectedId){const n=ya.value.find(s=>s.id===a.profileSelectedId);if(n)return n}return ya.value[0]||null}),it=H(()=>{if(a.actuatorDraftMode===!0)return null;if(a.actuatorPresetSelectedId){const n=Aa.value.find(s=>s.id===a.actuatorPresetSelectedId);if(n)return n}return Aa.value[0]||null}),oa=H(()=>a.testPlanSelectedId&&yt.value.find(n=>n.id===a.testPlanSelectedId)||null),Ne=H(()=>!a.testPlanRunningStepId||!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)?null:a.testPlanDraft.steps.find(n=>String(n&&n.id?n.id:"")===a.testPlanRunningStepId)||null),sl=H(()=>!!(a.testPlanDraft&&Array.isArray(a.testPlanDraft.steps)&&a.testPlanDraft.steps.length>0)),dn=H(()=>a.showAiPlanner===!0),Sr=H(()=>a.showAiAreaBuilder===!0),Pr=H(()=>a.testPlanDraft?gr({prompt:a.testPlanPrompt,draft:a.testPlanDraft})!==a.testPlanDraftBaseline:!1),nl=H(()=>{if(!(a.areaDraftIsNew===!0||!!Ee.value))return!1;const s=rn({isNew:a.areaDraftIsNew===!0,areaId:String(a.areaDraftId||a.areaSelectedId||"").trim(),name:a.areaDraftName,description:a.areaDraftDescription,tags:Wo(a.areaDraftTags),gaList:a.areaDraftGaList||[],llmPrompt:a.areaLlmPrompt});if(a.areaDraftIsNew===!0){const h=rn({isNew:!0,areaId:"",name:"New Area",description:"",tags:[],gaList:[],llmPrompt:""});return s!==h}const r=Ee.value;if(!r)return!1;const c=rn({isNew:!1,areaId:String(r.id||"").trim(),name:String(r.name||""),description:String(r.customDescription||""),tags:Array.isArray(r.tags)?r.tags:[],gaList:Array.isArray(r.gaList)?r.gaList:[],llmPrompt:""});return s!==c}),cn=H(()=>Array.isArray(a.stateData&&a.stateData.anomalies)?a.stateData.anomalies.slice().reverse():[]),fn=H(()=>{const n=Array.isArray(xe.value.topGAs)?xe.value.topGAs:[],s=xe.value&&typeof xe.value.gaLabels=="object"?xe.value.gaLabels:{};return n.slice(0,10).map(r=>{const c=r&&typeof r=="object"?r:{},h=String(c.ga||"").trim(),D=String(c.label||"").trim(),G=h?String(s[h]||"").trim():"";return Object.assign({},c,{ga:h,label:D||G})})}),ws=H(()=>{const n=xe.value&&xe.value.byEvent&&typeof xe.value.byEvent=="object"?xe.value.byEvent:{};return Object.keys(n).map(s=>({name:s,count:Number(n[s]||0)})).filter(s=>s.count>0).sort((s,r)=>r.count-s.count)}),rl=H(()=>Math.max(...ws.value.map(n=>n.count),1)),pn=H(()=>Yo(a.stateData)),la=H(()=>Qo(pn.value)),il=H(()=>{const n=String(a.flowSearch||"").trim().toLowerCase();return pn.value.nodes.slice().filter(s=>a.flowShowUniversalNodes===!0||!on(s)).sort((s,r)=>String(s.id||"").localeCompare(String(r.id||""))).filter(s=>n?`${s.id} ${s.subtitle||""}`.toLowerCase().includes(n):!0).slice(0,120)}),Qe=H(()=>xe.value&&xe.value.busConnection&&typeof xe.value.busConnection=="object"?xe.value.busConnection:null),ol=H(()=>{const n=xe.value||{};if(!Object.keys(n).length)return"No data available.";const s=n.counters||{},r=[];return r.push(ra.value.name||Ps.value?.name||"KNX AI"),r.push(`Analysis window: ${Number(n.meta?.analysisWindowSec||0)}s`),r.push(`Telegrams: ${Number(s.telegrams||0)} | Rate: ${Number(s.overallRatePerSec||0)}/s`),r.push(`Echoed: ${Number(s.echoed||0)} | Repeat: ${Number(s.repeated||0)} | Unknown DPT: ${Number(s.unknownDpt||0)}`),Qe.value&&r.push(`Bus: ${String(Qe.value.currentState||"unknown")} | Connected: ${Number(Qe.value.connectedPct||0)}% | Disconnected: ${Number(Qe.value.disconnectedPct||0)}%`),r.join(`
3
+ `)}),ll=H(()=>{const n=Qe.value;return!n||!Array.isArray(n.segments)?[]:n.segments.map((s,r)=>{const c=Math.max(0,Math.min(1,Number(s&&s.ratioStart)||0)),h=Math.max(0,Math.min(1,Number(s&&s.ratioWidth)||0));return{key:`${r}-${s?.startedAt||""}`,left:`${(c*100).toFixed(3)}%`,width:`${Math.max(h*100,.4).toFixed(3)}%`,title:`${s?.state==="connected"?"Connected":"Disconnected"} | ${Ke(s?.startedAt)} -> ${Ke(s?.endedAt)} | ${Me(s?.durationSec||0)}`,className:s?.state==="connected"?"segment-connected":"segment-disconnected"}}).filter(s=>Number.parseFloat(s.width)>0)}),ul=H(()=>a.chatMessages.map((n,s)=>({key:`${s}-${n.kind}`,kind:n.kind,rawText:j(n.text),html:n.kind==="assistant"?Ss(n.text):""})));Ie(()=>a.selectedNodeId,n=>{Na(Ni,n||""),a.areaSelectedId="",a.testAreaSelectedId=g(n||"")}),Ie(()=>a.autoRefresh,n=>{Et(Ci,n)}),Ie(()=>a.voiceEnabled,n=>{Et(Gi,n),n!==!0&&at()}),Ie(ea,n=>{Et(Fi,n)}),Ie(()=>a.activeTab,n=>{Na(ki,n||"overview")}),Ie(()=>a.settingsTab,n=>{Na(xi,n||"config")}),Ie(()=>a.flowMaxNodes,n=>{a.flowMaxNodes=Math.max(4,Math.min(32,Number(n)||14)),x()}),Ie(()=>(a.flowSelectedGa||[]).join("|"),()=>{x()}),Ie(()=>a.flowShowUniversalNodes,n=>{n!==!0&&(a.flowSelectedGa=(a.flowSelectedGa||[]).filter(s=>{const r=pn.value.nodes.find(c=>c.id===s);return!on(r)})),x()}),Ie(()=>Se.value.map(n=>n.id).join("|"),()=>{if(!Se.value.length){a.areaSelectedId="",a.testAreaSelectedId="",a.activeTab==="tests"&&(a.activeTab="areas");return}if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim()){const r=String(a.testAreaSelectedId||"").trim();if(_())return;(!r||!Se.value.find(c=>c.id===r))&&(a.testAreaSelectedId=Se.value[0].id);return}const n=String(a.areaSelectedId||"").trim();n&&!Se.value.find(r=>r.id===n)&&(a.areaSelectedId="");const s=String(a.testAreaSelectedId||"").trim();_()||(!s||!Se.value.find(r=>r.id===s))&&(a.testAreaSelectedId=Se.value[0].id)}),Ie(()=>a.testAreaSelectedId,n=>{a.selectedNodeId&&y(a.selectedNodeId,n||"")}),Ie(()=>Ee.value?JSON.stringify({id:Ee.value.id,name:Ee.value.name,customDescription:Ee.value.customDescription||"",tags:Ee.value.tags||[]}):"",()=>{if(a.areaDraftIsNew===!0&&!String(a.areaSelectedId||"").trim())return;const n=Ee.value;if(!n){a.areaDraftId="",a.areaDraftName="",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1;return}a.areaDraftId=String(n.id||""),a.areaDraftName=String(n.name||""),a.areaDraftDescription=String(n.customDescription||""),a.areaDraftTags=Array.isArray(n.tags)?n.tags.join(", "):"",a.areaDraftGaList=Array.isArray(n.gaList)?n.gaList.slice():[],a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1}),Ie(()=>Ft.value?Ft.value.id:"",async(n,s)=>{if(!n||!a.selectedNodeId){a.testPlanCatalog=null,a.testPlanCatalogError="";return}s&&n!==s&&(a.testPlanRunConfirmOpen=!1,a.testPlanDraft&&!a.testPlanSelectedId&&(a.testPlanDraft.areaId=String(n||""),a.testPlanDraft.areaName=Ft.value?String(Ft.value.path||Ft.value.name||""):"")),await Er()}),Ie(()=>ya.value.map(n=>n.id).join("|"),()=>{if(!ya.value.length){a.profileSelectedId="";return}a.profileDraftMode!==!0&&(!a.profileSelectedId||!ya.value.find(n=>n.id===a.profileSelectedId))&&(a.profileSelectedId=ya.value[0].id)}),Ie(()=>St.value?JSON.stringify({id:St.value.id,name:St.value.name,description:St.value.description,targetTags:St.value.targetTags||[],minActivityPct:St.value.minActivityPct,maxSilentPct:St.value.maxSilentPct,maxAnomalies:St.value.maxAnomalies,builtIn:St.value.builtIn===!0}):"",()=>{const n=St.value;if(!n){a.profileDraftId="",a.profileDraftName="",a.profileDraftDescription="",a.profileDraftTargetTags="",a.profileDraftMinActivityPct=20,a.profileDraftMaxSilentPct=60,a.profileDraftMaxAnomalies=2;return}a.profileDraftId=String(n.id||""),a.profileDraftName=String(n.name||""),a.profileDraftDescription=String(n.description||""),a.profileDraftTargetTags=Array.isArray(n.targetTags)?n.targetTags.join(", "):"",a.profileDraftMinActivityPct=Number(n.minActivityPct||20),a.profileDraftMaxSilentPct=Number(n.maxSilentPct||60),a.profileDraftMaxAnomalies=Number(n.maxAnomalies||2)}),Ie(()=>Aa.value.map(n=>n.id).join("|"),()=>{if(!Aa.value.length){a.actuatorPresetSelectedId="";return}a.actuatorDraftMode!==!0&&(!a.actuatorPresetSelectedId||!Aa.value.find(n=>n.id===a.actuatorPresetSelectedId))&&(a.actuatorPresetSelectedId=Aa.value[0].id)}),Ie(()=>it.value?JSON.stringify({id:it.value.id,name:it.value.name,description:it.value.description,commandGA:it.value.commandGA,commandDPT:it.value.commandDPT,commandPayload:it.value.commandPayload,statusGA:it.value.statusGA,statusDPT:it.value.statusDPT,statusWriteTimeoutMs:it.value.statusWriteTimeoutMs,statusResponseTimeoutMs:it.value.statusResponseTimeoutMs}):"",()=>{const n=it.value;if(!n){a.actuatorDraftId="",a.actuatorDraftName="",a.actuatorDraftDescription="",a.actuatorDraftCommandGA="",a.actuatorDraftCommandDPT="",a.actuatorDraftCommandPayload="",a.actuatorDraftStatusGA="",a.actuatorDraftStatusDPT="",a.actuatorDraftStatusWriteTimeoutMs=5e3,a.actuatorDraftStatusResponseTimeoutMs=5e3;return}a.actuatorDraftId=String(n.id||""),a.actuatorDraftName=String(n.name||""),a.actuatorDraftDescription=String(n.description||""),a.actuatorDraftCommandGA=String(n.commandGA||""),a.actuatorDraftCommandDPT=String(n.commandDPT||""),a.actuatorDraftCommandPayload=String(n.commandPayload||""),a.actuatorDraftStatusGA=String(n.statusGA||""),a.actuatorDraftStatusDPT=String(n.statusDPT||""),a.actuatorDraftStatusWriteTimeoutMs=Number(n.statusWriteTimeoutMs||5e3),a.actuatorDraftStatusResponseTimeoutMs=Number(n.statusResponseTimeoutMs||5e3)}),Ie(()=>yt.value.map(n=>n.id).join("|"),()=>{if(!yt.value.length){a.testPlanSelectedId="";return}a.testPlanSelectedId&&!yt.value.find(n=>n.id===a.testPlanSelectedId)&&(a.testPlanSelectedId="")}),Ie(()=>ia.value.map(n=>n.id).join("|"),()=>{if(!ia.value.length){a.selectedTestResultId="";return}(!a.selectedTestResultId||!ia.value.find(n=>n.id===a.selectedTestResultId))&&(a.selectedTestResultId=String(ia.value[0].id||"")),a.liveTestResultId&&qa.value.some(n=>String(n&&n.id?n.id:"")===a.liveTestResultId)&&a.testPlanRunning!==!0&&(a.liveTestResultId="")}),Ie(()=>`${a.selectedTestResultId}|${a.activeTab}`,()=>{a.activeTab!=="results"||!a.selectedTestResultId||requestAnimationFrame(()=>{const n=document.querySelector(".results-page-list .area-list-item.active");n&&typeof n.scrollIntoView=="function"&&n.scrollIntoView({block:"nearest",behavior:"smooth"})})});function gn(n,s){a.chatMessages.push({kind:n,text:s})}function dl(){a.chatMessages=[]}function cl(n,s=null){const r=Array.isArray(n)?n:[];return{totalSteps:Math.max(r.length,Number(s||0)),pass:r.filter(h=>h&&h.status==="pass").length,warn:r.filter(h=>h&&h.status==="warn").length,fail:r.filter(h=>h&&h.status==="fail").length}}function fl(n){const s=[];return Number(n&&n.fail)>0&&s.push("At least one feedback object returned an incoherent value. Check the actuator/status pairing in ETS first."),Number(n&&n.warn)>0&&s.push("Some steps did not receive feedback in time. Verify the status group address and the actuator programming."),s.length||s.push("The selected active test completed with coherent feedback on all verified steps."),s}function hn({plan:n,area:s,stepResults:r,reportId:c=""}){const h=cl(r,Array.isArray(n&&n.steps)?n.steps.length:0),D=h.fail>0?"fail":h.warn>0?"warn":"pass";return{id:String(c||`${n.id||"plan"}:${Date.now()}`),generatedAt:new Date().toISOString(),mode:"ai_test_plan",overallStatus:D,name:n.name,description:n.description,prompt:n.prompt,area:s,metrics:h,steps:r,suggestions:fl(h)}}function Ts(n){return!n||typeof n!="object"?"Test result":String(n.name||n.profile?.name||"Test result")}function _s(n){return!n||typeof n!="object"?"":String(n.area?.path||n.area?.name||n.area?.id||"")}function Ja(n){const s=String(n&&n.mode?n.mode:"").trim().toLowerCase();return s==="ai_test_plan"?"Test Plan":s==="active_test"?"Actuator":s==="read_only"?"Read-only":s||"Test"}function mn(n){const s=n&&n.metrics&&typeof n.metrics=="object"?n.metrics:{};return String(n&&n.mode?n.mode:"")==="read_only"?[{label:"Total GA",value:Number(s.totalGAs||0)},{label:"Active GA",value:Number(s.activeGaCount||0)},{label:"Silent GA",value:Number(s.silentGaCount||0)},{label:"Anomalies",value:Number(s.anomalyCount||0)}]:String(n&&n.mode?n.mode:"")==="active_test"?[{label:"Command GA",value:n&&n.command&&n.command.ga?n.command.ga:"n/a"},{label:"Status GA",value:n&&(n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga)?n.statusResponse?.ga||n.statusWrite?.ga||n.statusRead?.ga:"n/a"},{label:"Status",value:n&&n.overallStatus?n.overallStatus:"n/a"},{label:"Generated",value:nt(n&&n.generatedAt?n.generatedAt:"")||"n/a"}]:[{label:"Total Steps",value:Number(s.totalSteps||0)},{label:"Pass",value:Number(s.pass||0)},{label:"Warn",value:Number(s.warn||0)},{label:"Fail",value:Number(s.fail||0)}]}function Lt(n){if(n==null||n==="")return"n/a";if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function vn(n,s,r="n/a"){const c=String(s||"").trim(),h=n==null?"":String(n);if(!c)return h||r;const D=wn(h,c),G=ua(c).find($=>String($.value)===String(D));return G&&G.label?G.label:h||r}function wr(n){if(!n||typeof n!="object")return"n/a";const s=n.ga||"n/a";if(n.ok===!0){const r=n.payloadLabel||Lt(n.payload),c=n.coherent===!1?"mismatch":"ok";return`${s} / ${r} / ${c}`}return`${s} / ${n.error||"timeout"}`}function bn(n){return nt(n||"")||"n/a"}function pl(n,s="report"){return String(n||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||s}function Tr({command:n,statusWrite:s,statusResponse:r,statusRead:c,expectedPayloadLabel:h,expectedPayload:D}){const G=r||c;return[{title:"Command",items:[{label:"Command",value:`${n?.ga||"n/a"} / ${n?.payloadLabel||Lt(n?.payload)}`},{label:"Command Sent",value:bn(n?.sentAt)}]},{title:"Spontaneous Write From Status GA",items:[{label:"Result",value:wr(s)},{label:"Expected",value:s?.expectedPayloadLabel||h||Lt(D)},{label:"Received At",value:bn(s?.at)},{label:"Event",value:s?.event||"n/a"}]},{title:"Active Read Request To Status GA",items:[{label:"Result",value:wr(G)},{label:"Expected",value:G?.expectedPayloadLabel||h||Lt(D)},{label:"Received At",value:bn(G?.at)},{label:"Event",value:G?.event||"n/a"}]}]}function Za(n){return!n||typeof n!="object"?[]:Array.isArray(n.steps)&&n.steps.length?n.steps.map(s=>{const r=s.kind==="wait"?[{label:"Wait",value:`${Number(s.delayMs||0)} ms`},{label:"Reason",value:s.reason||"Pause before next action"}]:[];return{id:String(s.id||`${n.id}-step`),title:s.title||s.id||"Step",status:s.status||"pass",message:s.message||s.description||"",details:r,detailGroups:s.kind==="wait"?[]:Tr({command:s.command,statusWrite:s.statusWrite,statusResponse:s.statusResponse,statusRead:s.statusRead,expectedPayloadLabel:s.expectedPayloadLabel,expectedPayload:s.expectedPayload})}}):Array.isArray(n.checks)&&n.checks.length?n.checks.map(s=>({id:String(s.id||`${n.id}-check`),title:s.title||s.id||"Check",status:s.status||"pass",message:s.message||"",details:[{label:"Metrics",value:Lt(s.metrics||{})},{label:"Sample",value:Lt(s.sample||[])}]})):String(n.mode||"")==="active_test"?[{id:String(n.id||"active-test"),title:n.name||"Actuator Test",status:n.overallStatus||"pass",message:n.overallStatus==="pass"?"Both feedback checks passed.":n.overallStatus==="warn"?"One feedback check passed and one failed.":"Both feedback checks failed.",details:[],detailGroups:Tr({command:n.command,statusWrite:n.statusWrite,statusResponse:n.statusResponse,statusRead:n.statusRead,expectedPayloadLabel:n.statusResponse?.expectedPayloadLabel||n.statusWrite?.expectedPayloadLabel||n.statusRead?.expectedPayloadLabel,expectedPayload:n.statusRead?.expectedPayload})}]:[]}function Ya(n){return Array.isArray(n&&n.suggestions)?n.suggestions:[]}function gl(n){const s=n&&n.source&&typeof n.source=="object"?n.source:{},r=String(n&&n.mode?n.mode:"").trim().toLowerCase(),c=String(s.areaId||n?.area?.id||"").trim();return r==="ai_test_plan"?{type:"ai_test_plan",planId:String(s.planId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:r==="read_only"?{type:"profile",profileId:String(s.profileId||n?.profile?.id||"").trim(),areaId:c}:r==="active_test"?{type:"actuator_test",presetId:String(s.presetId||String(n.id||"").split(":")[0]||"").trim(),areaId:c}:{type:"",areaId:c}}async function _r(){const n=ae.value;if(!n||typeof n!="object"){P("No test result selected to export");return}try{const{jsPDF:s}=await Yc(async()=>{const{jsPDF:De}=await import("./chunk-jspdf.es.min.js").then(Pt=>Pt.j);return{jsPDF:De}},[],import.meta.url),r=new s({orientation:"portrait",unit:"pt",format:"a4"}),c=r.internal.pageSize.getWidth(),h=r.internal.pageSize.getHeight(),D=42,G=42,$=44,O=42,Y=c-D-G;let V=$;const he=(De=14)=>{V+De<=h-O||(r.addPage(),V=$)},se=(De,{size:Pt=11,bold:zt=!1,indent:$t=0,color:Bt=[35,41,52],lineHeight:Ns=14,gapAfter:Cs=0}={})=>{const Qa=String(De||"").trim();if(!Qa)return;r.setFont("helvetica",zt?"bold":"normal"),r.setFontSize(Pt),r.setTextColor(Bt[0],Bt[1],Bt[2]);const ks=r.splitTextToSize(Qa,Math.max(80,Y-$t));for(const Rn of ks)he(Ns),r.text(String(Rn),D+$t,V),V+=Ns;Cs>0&&(V+=Cs)},W=()=>{he(12),r.setDrawColor(210,214,222),r.line(D,V,c-G,V),V+=12},de=Ts(n),ve=nt(new Date().toISOString())||new Date().toISOString(),da=nt(n.generatedAt||"")||String(n.generatedAt||"n/a"),w=_s(n)||"n/a",B=Ja(n),ee=String(n.overallStatus||"n/a"),Fe=mn(n),We=Za(n),qe=Ya(n);se("KNX AI Test Result",{size:17,bold:!0,color:[20,28,39],lineHeight:20}),se(de,{size:14,bold:!0,color:[20,28,39],lineHeight:17,gapAfter:4}),se(`Exported: ${ve}`,{size:10,color:[88,96,113]}),se(`Generated: ${da}`,{size:10,color:[88,96,113]}),se(`Mode: ${B}`,{size:10,color:[88,96,113]}),se(`Status: ${ee}`,{size:10,color:[88,96,113]}),se(`Area: ${w}`,{size:10,color:[88,96,113]}),se(`Report ID: ${String(n.id||"n/a")}`,{size:10,color:[88,96,113],gapAfter:2}),W(),Fe.length&&(se("Metrics",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),Fe.forEach(De=>{se(`${De.label}: ${Lt(De.value)}`,{size:10,color:[35,41,52]})}),V+=4,W()),se(`Checks (${We.length})`,{size:12,bold:!0,color:[20,28,39],gapAfter:2}),We.length?We.forEach((De,Pt)=>{se(`${Pt+1}. ${De.title||"Check"} [${String(De.status||"n/a").toUpperCase()}]`,{size:11,bold:!0,color:[31,41,55]}),se(De.message||"No additional details available.",{size:10,color:[70,78,94]}),Array.isArray(De.detailGroups)&&De.detailGroups.length?De.detailGroups.forEach(zt=>{se(zt.title||"Details",{size:10,bold:!0,indent:12,color:[35,41,52]}),(Array.isArray(zt.items)?zt.items:[]).forEach(Bt=>{se(`${Bt.label}: ${Lt(Bt.value)}`,{size:10,indent:24,color:[70,78,94]})})}):(Array.isArray(De.details)?De.details:[]).forEach($t=>{se(`${$t.label}: ${Lt($t.value)}`,{size:10,indent:12,color:[70,78,94]})}),V+=2}):se("No detailed entries stored for this report yet.",{size:10,color:[88,96,113]}),qe.length&&(V+=4,W(),se("Suggestions",{size:12,bold:!0,color:[20,28,39],gapAfter:2}),qe.forEach((De,Pt)=>{se(`${Pt+1}. ${String(De||"")}`,{size:10,color:[35,41,52]})}));const et=new Date(n.generatedAt||Date.now()),ca=Number.isFinite(et.getTime())?et.toISOString().replace(/[:.]/g,"-"):String(Date.now()),Fa=`knx-ai-test-result-${pl(de,"report")}-${ca}.pdf`;r.save(Fa),P(`PDF exported (${Fa})`)}catch(s){a.lastError=s&&s.message?s.message:"Failed to export PDF",P(a.lastError)}}function Dr(n,s,r=new Date().toISOString()){const c=n&&n.kind==="wait";return{id:n&&n.id?n.id:`step-${Date.now()}`,title:n&&n.title?n.title:"Test Step",description:n&&n.description?n.description:"",reason:n&&n.reason?n.reason:"",kind:n&&n.kind?n.kind:"write_and_verify",status:"warn",command:c?null:{ga:n&&n.commandGA?n.commandGA:"",dpt:n&&n.commandDPT?n.commandDPT:"",payload:n?n.commandPayload:void 0,sentAt:r},statusWrite:null,statusResponse:null,statusRead:null,expectedPayload:c?void 0:n?n.expectedPayload:void 0,delayMs:Number(n&&n.delayMs?n.delayMs:0),statusWriteTimeoutMs:c?0:Number(n&&n.statusWriteTimeoutMs?n.statusWriteTimeoutMs:0),statusResponseTimeoutMs:c?0:Number(n&&n.statusResponseTimeoutMs?n.statusResponseTimeoutMs:0),message:s&&s.message?s.message:"Failed to run step"}}async function Ir(n){return at(),await new Promise((s,r)=>{const c=URL.createObjectURL(n),h=new Audio(c);le=h;const D=()=>{le===h&&(le=null),h.onended=null,h.onerror=null,URL.revokeObjectURL(c)};h.onended=()=>{D(),s()},h.onerror=()=>{D(),r(new Error("Audio playback failed"))};const G=h.play();G&&typeof G.then=="function"&&G.catch($=>{D(),r($ instanceof Error?$:new Error(String($)))})})}function hl(n,s=null){const r=String(n||"").trim();return!r||!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)?s:a.testPlanDraft.steps.find(c=>String(c&&c.id?c.id:"")===r)||s}function Rr(n,s=""){const r=`${String(n||"")} ${String(s||"")}`.trim().toLowerCase(),c=` ${r} `;if(!r)return String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it";const h=$=>$.some(O=>c.includes(O)),D=[{voice:"it",score:[h([" accendi "," spegni "," stato "," verifica "," coerente "," leggi "," apri "," chiudi "," attiva "," controlla "," area "," luce "," luci "," tapparella "," tapparelle "," clima "])?3:0,/[àèéìíîòóù]/.test(r)?2:0].reduce(($,O)=>$+O,0)},{voice:"en",score:[h([" turn on "," turn off "," verify "," feedback "," status "," check "," read "," open "," close "," command "," area "," light "," lights "])?3:0].reduce(($,O)=>$+O,0)},{voice:"fr",score:[h([" allume "," éteins "," etat "," état "," vérifier "," ouvre "," ferme "," lumière "," lumières "," zone "])?3:0,/[àâçéèêëîïôûùüÿœ]/.test(r)?2:0].reduce(($,O)=>$+O,0)},{voice:"de",score:[h([" einschalten "," ausschalten "," status "," prüfen "," öffne "," schließe "," licht "," bereich "])?3:0,/[äöüß]/.test(r)?2:0].reduce(($,O)=>$+O,0)},{voice:"es",score:[h([" enciende "," apaga "," estado "," verifica "," abre "," cierra "," luz "," luces "," zona "])?3:0,/[áéíóúñü]/.test(r)?2:0].reduce(($,O)=>$+O,0)},{voice:"pt",score:[h([" liga "," desliga "," estado "," verificar "," abre "," fecha "," luz "," luzes "," área "])?3:0,/[ãõâêôçáéíóú]/.test(r)?2:0].reduce(($,O)=>$+O,0)}];return D.sort(($,O)=>O.score-$.score),D[0]&&D[0].score>0?D[0].voice:String((navigator.language||"it").split("-")[0]||"it").trim().toLowerCase()||"it"}function ml(n={},s=null){const r=hl(n&&n.id?n.id:"",n),c=String(r&&r.title?r.title:"").trim(),h=String(r&&r.description?r.description:"").trim();return{text:`${Number.isInteger(s)&&s>0?`${s}. `:""}${c}`.trim(),voice:Rr(c,h)}}async function vl(n={},s=null){if(a.voiceEnabled!==!0)return;const r=ml(n,s),c=String(r.text||"").trim();if(!c||!a.selectedNodeId)return;const h=await k(`${E("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,text:c,voice:r.voice,slow:!1})});await Ir(h)}async function bl(n,s=""){if(a.voiceEnabled!==!0||!a.selectedNodeId)return;const r=String(n).trim();if(!r)return;const c=Rr(r,s),h=await k(`${E("tts/googletranslate")}?ts=${Date.now()}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,text:r,voice:c,slow:!1})});await Ir(h)}function yl(n){const s=d&&n.find(h=>h.id===d)?d:"",r=Ve(Ni,""),c=r&&n.find(h=>h.id===r)?r:"";return s||c||(n[0]?n[0].id:"")}async function yn({preserveSelection:n=!0}={}){a.loadingNodes=!0,P("Loading nodes...");try{const s=await N(E("nodes")),r=Array.isArray(s&&s.nodes)?s.nodes:[];if(a.nodes=r,!r.length){a.selectedNodeId="",a.stateData=null,a.lastError="No KNX AI nodes found.",P(a.lastError);return}const c=n&&a.selectedNodeId&&r.find(h=>h.id===a.selectedNodeId)?a.selectedNodeId:yl(r);a.selectedNodeId=c,a.lastError="",P("Ready")}catch(s){a.lastError=s.message||"Failed to load nodes",P(a.lastError)}finally{a.loadingNodes=!1}}async function Mt({fresh:n=!1}={}){if(!(!a.selectedNodeId||a.loadingState)){a.loadingState=!0,n&&P("Loading...");try{const s=a.testPlanRunning===!0&&a.liveTestResultId?Gt(a.stateData&&a.stateData.testPlanReport?a.stateData.testPlanReport:null,null):null,r=await N(E(`state?nodeId=${encodeURIComponent(a.selectedNodeId)}&fresh=${n?1:0}`));s&&s.id===a.liveTestResultId&&(r.testPlanReport=s),a.stateData=r,is(()=>{a.areaDraftIsNew!==!0&&a.areaSelectedId&&!Se.value.find(c=>c.id===a.areaSelectedId)&&(a.areaSelectedId=""),!_()&&!a.testAreaSelectedId&&Se.value[0]&&(a.testAreaSelectedId=Se.value[0].id)}),a.lastError="",P("Ready")}catch(s){a.lastError=s.message||"Failed to load state",P(a.lastError)}finally{a.loadingState=!1}}}async function Al(){await yn({preserveSelection:!0}),await Mt({fresh:!0}),await Ga()}async function Sl(){dl(),a.selectedTestResultId="",a.liveTestResultId="",a.testResultFocusMode=!1,a.testAreaSelectedId=g(a.selectedNodeId),await Mt({fresh:!0}),await Ga()}function Nr(){a.selectedTestResultId="",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanDraft=null,a.testPlanPrompt="",a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.testPlanUnsavedConfirmOpen=!1,a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,!_()&&!a.testAreaSelectedId&&Se.value[0]&&(a.testAreaSelectedId=Se.value[0].id),Dn(),_n()}function Pl(){a.showAiPlanner=!0,a.testTemplateBuilderFocus=!0}function wl(){a.testTemplateBuilderFocus=!1,a.showAiPlanner=!1}function Tl(){a.showAiAreaBuilder=!0,a.areaBuilderFocus=!0}function _l(){a.areaBuilderFocus=!1,a.showAiAreaBuilder=!1}function An(){a.areaSelectedId="",a.areaDraftIsNew=!1,a.areaDraftId="",a.areaDraftName="",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.areaSearch="",a.areaSearchOpen=!1,a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,a.areaUnsavedConfirmOpen=!1}function Dl(){if(nl.value){a.areaUnsavedConfirmOpen=!0;return}An(),P("Area editor closed")}function Cr(){a.areaUnsavedConfirmOpen=!1}function Il(){a.areaUnsavedConfirmOpen=!1,An(),P("Area editor closed")}function Rl(){a.testPlanRunning||In(()=>{Nr(),a.testPlanSearchOpen=!1,P("Test editor closed")},"close the current test editor")}function kr(n){const s=String(n||"").trim();s!=="node"&&s!=="config"||(a.settingsTab=s)}function Ea(n){const s=String(n||"").trim();if(s){if(s==="tests"&&Se.value.length===0){P("Define at least one area before using Tests");return}if(s==="areas"){const r=!!String(a.areaSelectedId||"").trim(),c=a.areaDraftIsNew===!0;!r&&!c&&An()}if(s==="tests"){const r=!!String(a.testPlanSelectedId||"").trim(),c=!!String(a.selectedTestResultId||"").trim(),h=!!a.testPlanDraft;!r&&!c&&!h&&Nr()}a.activeTab!==s?a.activeTab=s:(a.activeTab="",is(()=>{a.activeTab=s})),ka()}}async function Sn(n){const s=String(n||"").trim();if(!(!s||!a.selectedNodeId||a.deletingTestResultId)){a.deletingTestResultId=s;try{const r=await N(E("test-results/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,reportId:s})}),c=Array.isArray(r&&r.testResults)?r.testResults:[];a.stateData=Object.assign({},a.stateData||{},{testResults:c}),a.selectedTestResultId===s&&(a.selectedTestResultId=c[0]&&c[0].id?String(c[0].id):"",c.length||(a.testResultFocusMode=!1)),a.liveTestResultId===s&&(a.liveTestResultId=""),P("Test result deleted")}catch(r){a.lastError=r.message||"Failed to delete test result",P(a.lastError)}finally{a.deletingTestResultId=""}}}function Ds(n,{openMenu:s=!0,activateTestsTab:r=!1,activateResultsTab:c=!1,resultOnly:h=!0}={}){const D=String(n||"").trim();if(!D)return;s&&(a.testResultsMenuOpen=!0);const G=c?"results":r?"tests":"",$=()=>{G&&(a.activeTab=G),a.selectedTestResultId=D,a.testResultFocusMode=h===!0,is(()=>{const O=document.querySelector(".results-page-list .area-list-item.active");O&&typeof O.scrollIntoView=="function"&&O.scrollIntoView({block:"nearest",behavior:"smooth"})})};a.selectedTestResultId===D&&(!G||a.activeTab===G)||$()}function xr(){const n=ae.value;if(!n)return;if(!Se.value.length){P("Define at least one area before using Tests");return}const s=gl(n);if(a.activeTab="tests",a.testResultFocusMode=!1,s.type==="ai_test_plan"&&s.planId){const r=yt.value.find(c=>c&&c.id===s.planId);if(r){Br(r),P(`Opened source plan "${r.name||r.id}"`);return}}if(s.type==="profile"){P("Returned to the Tests page for the source read-only profile.");return}if(s.type==="actuator_test"){P("Returned to the Tests page for the source actuator test.");return}P("Returned to the Tests page.")}async function Nl(n){if(!a.selectedNodeId||!n||typeof n!="object")return null;const s=await N(E("test-results/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,report:n})});return a.stateData=Object.assign({},a.stateData||{},{testResults:s.testResults||qa.value,testPlanReport:s.report&&s.report.mode==="ai_test_plan"?s.report:pt.value,actuatorTestReport:s.report&&s.report.mode==="active_test"?s.report:al.value,profileReport:s.report&&s.report.mode==="read_only"?s.report:tl.value}),s&&s.report&&s.report.id&&(a.liveTestResultId="",Ds(s.report.id,{openMenu:!0,activateResultsTab:!0,resultOnly:!0})),s}async function Pn(n=""){const s=String(n||"").trim(),r=s||String(a.chatDraft||"").trim();if(!(!r||!a.selectedNodeId)){gn("user",r),s||(a.chatDraft=""),a.asking=!0,P("Asking...");try{const c=await N(E("ask"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,question:r})});gn("assistant",c&&c.answer!==void 0?c.answer:""),P("Ready")}catch(c){gn("error",c.message||"Ask failed"),P(c.message||"Ask failed")}finally{a.asking=!1}}}async function Cl(){const n=Ee.value;if(!a.selectedNodeId||a.areaSaving||!a.areaDraftIsNew&&!n)return;const s=a.areaDraftIsNew===!0;a.areaSaving=!0,P(s?"Creating area...":"Saving area...");try{const c=await N(E(s?"areas/create":"areas/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:a.areaDraftIsNew?void 0:n.id,name:a.areaDraftName,description:a.areaDraftDescription,tags:String(a.areaDraftTags||"").split(",").map(h=>String(h||"").trim()).filter(Boolean),gaList:a.areaDraftGaList||[]})});c&&c.areas?(a.stateData=Object.assign({},a.stateData||{},{areas:c.areas}),c.areaId&&(a.areaSelectedId=c.areaId),a.areaLlmPrompt="",a.areaLlmError="",a.areaDraftIsNew=!1):await Mt({fresh:!0}),P(s?"Area created":"Area saved")}catch(r){a.lastError=r.message||"Failed to save area",P(a.lastError)}finally{a.areaSaving=!1}}async function kl(){const n=Ee.value;if(!(!n||!a.selectedNodeId||a.areaSaving)){a.areaSaving=!0,P("Resetting area...");try{const s=await N(E("areas/reset"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});s&&s.areas?a.stateData=Object.assign({},a.stateData||{},{areas:s.areas}):await Mt({fresh:!0}),P("Area reset")}catch(s){a.lastError=s.message||"Failed to reset area",P(a.lastError)}finally{a.areaSaving=!1}}}async function xl(){const n=Ee.value;if(!(!n||!a.selectedNodeId||a.areaSaving)){a.areaSaving=!0,P("Deleting area...");try{const s=await N(E("areas/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});if(s&&s.areas){a.stateData=Object.assign({},a.stateData||{},{areas:s.areas});const r=Array.isArray(s.areas&&s.areas.suggested)?s.areas.suggested:[];a.areaDraftIsNew=!1,a.areaSelectedId=r[0]&&r[0].id?r[0].id:""}else await Mt({fresh:!0});P("Area deleted")}catch(s){a.lastError=s.message||"Failed to delete area",P(a.lastError)}finally{a.areaSaving=!1}}}async function Er(){const n=Ft.value;if(!n||!a.selectedNodeId){a.testPlanCatalog=null,a.testPlanCatalogError="";return}a.testPlanCatalogLoading=!0,a.testPlanCatalogError="";try{const s=await N(E("test-plans/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id})});a.testPlanCatalog=s&&s.catalog?s.catalog:null,s&&s.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:s.testPlans}))}catch(s){a.testPlanCatalog=null,a.testPlanCatalogError=s.message||"Failed to load area command/status catalog"}finally{a.testPlanCatalogLoading=!1}}async function Ga(){if(!(!a.selectedNodeId||a.gaCatalogLoading)){a.gaCatalogLoading=!0;try{const n=await N(E("areas/catalog"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId})});a.gaCatalog=Array.isArray(n&&n.gaCatalog)?n.gaCatalog:[]}catch(n){a.lastError=n.message||"Failed to load GA catalog",P(a.lastError)}finally{a.gaCatalogLoading=!1}}}function El(n){const s=String(n||"").trim();s&&((a.areaDraftGaList||[]).includes(s)||(a.areaDraftGaList=[...a.areaDraftGaList||[],s]))}function Gr(n){const s=String(n||"").trim().toLowerCase(),r=o.find(c=>c.value===s);return r?r.label:s==="auto"?"Auto":"Command"}function Fr(n){const s=n&&typeof n=="object"?n:{},r=String(s.path||s.name||"Area").trim(),c=String(s.kind||"").trim(),h=Number(s.gaCount||0),D=Number(s.activeGaCount||0),G=[c,`${h} GA`,`active ${D}`].filter(Boolean).join(" | ");return G?`${r} ${G}`:r}function Gl(n){const s=n&&typeof n=="object"?n:null;!s||!s.id||(a.areaDraftIsNew=!1,a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,a.areaSelectedId=s.id,a.areaSearch="",a.areaSearchOpen=!1)}function Fl(){setTimeout(()=>{a.areaSearchOpen=!1},150)}function Lr(n){const s=n&&typeof n=="object"?n:{},r=String(s.name||"Plan").trim(),c=String(s.areaName||s.areaId||"").trim(),h=Number(s.steps&&s.steps.length?s.steps.length:0),D=[c,`${h} steps`].filter(Boolean).join(" | ");return D?`${r} ${D}`:r}function Ll(n){const s=n&&typeof n=="object"?n:null;!s||!s.id||(du(s),a.testPlanSearch="",a.testPlanSearchOpen=!1)}function Ml(){setTimeout(()=>{a.testPlanSearchOpen=!1},150)}function Ol(){return U(p.value,"en")}function zl(n){const s=String(n||"").trim();s&&(a.areaDraftGaList=(a.areaDraftGaList||[]).filter(r=>r!==s))}async function $l(n,s){const r=String(n||"").trim();if(!(!a.selectedNodeId||!r||a.areaGaRoleSavingGa===r)){a.areaGaRoleSavingGa=r,P(`Saving role for ${r}...`);try{const c=await N(E("areas/ga-role/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,ga:r,role:s})});Array.isArray(c&&c.gaCatalog)&&(a.gaCatalog=c.gaCatalog),c&&c.areas&&(a.stateData=Object.assign({},a.stateData||{},{areas:c.areas})),Ft.value&&Array.isArray(Ft.value.gaList)&&Ft.value.gaList.includes(r)&&await Er(),P(`Role saved for ${r}`)}catch(c){a.lastError=c.message||"Failed to save GA role",P(a.lastError)}finally{a.areaGaRoleSavingGa=""}}}function Bl(){a.activeTab="areas",a.areaDraftIsNew=!0,a.areaSelectedId="",a.areaDraftId="",a.areaDraftName="New Area",a.areaDraftDescription="",a.areaDraftTags="",a.areaDraftGaList=[],a.areaLlmPrompt="",a.areaLlmError="",a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1}async function Vl(){const n=String(a.selectedNodeId||"").trim();if(!(a.areaLlmRegenerating||a.areaLlmBulkDeleting)){if(!n){a.areaLlmError="Select a KNX AI node first",P(a.areaLlmError);return}a.areaLlmRegenerating=!0,a.areaLlmError="",P("Regenerating AI areas...");try{const s=await N(E("areas/regenerate-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})}),r=Array.isArray(s&&s.gaCatalog);if(r&&(a.gaCatalog=s.gaCatalog),s&&(s.areas||s.profiles||s.actuatorTests||s.testPlans)){const c=Object.assign({},a.stateData||{});s.areas&&(c.areas=s.areas),s.profiles&&(c.profiles=s.profiles),s.actuatorTests&&(c.actuatorTests=s.actuatorTests),s.testPlans&&(c.testPlans=s.testPlans),a.stateData=c}else await Mt({fresh:!0});r||await Ga(),P(`AI areas regenerated (${Number(s&&s.generatedCount?s.generatedCount:0)})`)}catch(s){a.areaLlmError=s.message||"Failed to regenerate AI areas",P(a.areaLlmError)}finally{a.areaLlmRegenerating=!1}}}async function Kl(){const n=String(a.selectedNodeId||"").trim();if(a.areaLlmRegenerating||a.areaLlmBulkDeleting)return;if(!n){a.areaLlmError="Select a KNX AI node first",P(a.areaLlmError);return}const s=Number(hr.value||0);if(s<=0){P("No AI areas to delete");return}if(window.confirm(`Delete all AI-generated areas (${s})?`)){a.areaLlmBulkDeleting=!0,a.areaLlmError="",P("Deleting AI areas...");try{const c=await N(E("areas/delete-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:n})});if(Array.isArray(c&&c.gaCatalog)&&(a.gaCatalog=c.gaCatalog),c&&(c.areas||c.profiles||c.actuatorTests||c.testPlans)){const h=Object.assign({},a.stateData||{});c.areas&&(h.areas=c.areas),c.profiles&&(h.profiles=c.profiles),c.actuatorTests&&(h.actuatorTests=c.actuatorTests),c.testPlans&&(h.testPlans=c.testPlans),a.stateData=h}else await Mt({fresh:!0});Array.isArray(c&&c.gaCatalog)||await Ga(),P(`AI areas deleted (${Number(c&&c.deletedCount?c.deletedCount:s)})`)}catch(c){a.areaLlmError=c.message||"Failed to delete AI areas",P(a.areaLlmError)}finally{a.areaLlmBulkDeleting=!1}}}async function Wl(){if(!a.selectedNodeId||a.areaLlmBusy)return;const n=String(a.areaLlmPrompt||"").trim();if(n){a.areaLlmBusy=!0,a.areaLlmError="",P("AI is selecting area GA...");try{const s=await N(E("areas/suggest-llm"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,prompt:n,name:a.areaDraftName,description:a.areaDraftDescription,gaList:a.areaDraftGaList||[]})}),r=s&&s.suggestion?s.suggestion:null;if(Array.isArray(s&&s.gaCatalog)&&(a.gaCatalog=s.gaCatalog),!r||!Array.isArray(r.gaList)||!r.gaList.length)throw new Error("The AI did not return any group addresses");!String(a.areaDraftName||"").trim()&&r.name&&(a.areaDraftName=String(r.name)),!String(a.areaDraftDescription||"").trim()&&r.description&&(a.areaDraftDescription=String(r.description)),(!a.areaDraftTags||!String(a.areaDraftTags).trim())&&Array.isArray(r.tags)&&r.tags.length&&(a.areaDraftTags=r.tags.join(", ")),a.areaDraftGaList=Array.from(new Set([...a.areaDraftGaList||[],...r.gaList.map(c=>String(c||"").trim()).filter(Boolean)])),a.showAiAreaBuilder=!1,a.areaBuilderFocus=!1,P(`AI added ${Number(r.gaList.length||0)} GA to the draft`)}catch(s){a.areaLlmError=s.message||"Failed to suggest area GA",P(a.areaLlmError)}finally{a.areaLlmBusy=!1}}}function Ul(n){if(n&&typeof n=="object"){a.testPlanPrompt=String(n.prompt||"").trim();return}a.testPlanPrompt=String(n||"").trim()}function Mr(n){const s=String(n||"").trim();return s&&(Array.isArray(a.testPlanCatalog&&a.testPlanCatalog.pairs)?a.testPlanCatalog.pairs:[]).find(c=>c&&c.command&&c.command.ga===s)||null}function Or(n){const s=String(n||"").trim();return un.value.find(r=>r&&r.ga===s)||null}function jl(n){const s=String(n||"").trim();return Ar.value.find(r=>r&&r.ga===s)||null}function ua(n){const s=String(n||"").trim();if(!s)return[];const r=a.testPlanCatalog&&a.testPlanCatalog.dptOptionsById&&typeof a.testPlanCatalog.dptOptionsById=="object"?a.testPlanCatalog.dptOptionsById:{};return Array.isArray(r[s])?r[s]:[]}function Ot(n){return String(n||"").trim().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}const Hl=[{type:"on",patterns:[/\bturn on\b/g,/\bturn(?:\s+\w+){1,4}\s+on\b/g,/\bswitch on\b/g,/\bswitch(?:\s+\w+){1,4}\s+on\b/g,/\bpower on\b/g,/\bpower(?:\s+\w+){1,4}\s+on\b/g,/\bstart\b/g,/\benable\b/g,/\bactivate\b/g,/\baccendi\b/g,/\battiva\b/g,/\ballume\b/g,/\bactive\b/g,/\beinschalten\b/g,/\baktivieren\b/g,/\benciende\b/g,/\bactivar\b/g,/\bliga\b/g,/\bativa\b/g,/\baan\b/g,/\binschakelen\b/g]},{type:"off",patterns:[/\bturn off\b/g,/\bturn(?:\s+\w+){1,4}\s+off\b/g,/\bswitch off\b/g,/\bswitch(?:\s+\w+){1,4}\s+off\b/g,/\bpower off\b/g,/\bpower(?:\s+\w+){1,4}\s+off\b/g,/\bdisable\b/g,/\bdeactivate\b/g,/\bshutdown\b/g,/\bspegni\b/g,/\bdisattiva\b/g,/\beteins\b/g,/\bdesactive\b/g,/\bausschalten\b/g,/\bdeaktivieren\b/g,/\bapaga\b/g,/\bdesactiva\b/g,/\bdesliga\b/g,/\bdesativa\b/g,/\buit\b/g,/\buitschakelen\b/g]},{type:"open",patterns:[/\bopen\b/g,/\braise\b/g,/\blift\b/g,/\bmove up\b/g,/\bapri\b/g,/\balza\b/g,/\bsolleva\b/g,/\bouvre\b/g,/\bmonte\b/g,/\boffnen\b/g,/\bhoch\b/g,/\bauf\b/g,/\babre\b/g,/\bsube\b/g,/\babrir\b/g,/\bsobe\b/g,/\bopenen\b/g,/\bomhoog\b/g]},{type:"close",patterns:[/\bclose\b/g,/\blower\b/g,/\bmove down\b/g,/\bchiudi\b/g,/\babbassa\b/g,/\bferme\b/g,/\bdescends?\b/g,/\bschliessen\b/g,/\brunter\b/g,/\bzu\b/g,/\bcierra\b/g,/\bbaja\b/g,/\bfechar\b/g,/\bdesce\b/g,/\bsluiten\b/g,/\bomlaag\b/g]},{type:"stop",patterns:[/\bstop\b/g,/\bhalt\b/g,/\bpause\b/g,/\bferma\b/g,/\barresta\b/g,/\barrete\b/g,/\bstoppe\b/g,/\banhalten\b/g,/\bstopp\b/g,/\bdeten\b/g,/\bparar\b/g,/\bpare\b/g,/\bstoppen\b/g]}];function Xl(n){const s=Ot(n);if(!s)return"";const r=[];return Hl.forEach(c=>{c.patterns.forEach(h=>{h.lastIndex=0;let D;for(;(D=h.exec(s))!==null;)r.push({type:c.type,index:D.index})})}),r.sort((c,h)=>c.index-h.index),r[0]?r[0].type:""}function ql(n){return["on","open"].includes(String(n||"").trim().toLowerCase())}function Jl(n){return["off","close","stop"].includes(String(n||"").trim().toLowerCase())}function wn(n,s,r=""){const c=ua(s);if(!c.length)return String(n??"");const h=String(n??"").trim(),D=Ot(h),G=Ot(r),$=`${D} ${G}`.trim(),O=Xl(r||$);if(O){if(ql(O)){const W=c.find(ve=>["true","1","100"].includes(String(ve.value)));if(W)return String(W.value);const de=c.find(ve=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su|einschalten|allume|enciende|liga|aan)\b/.test(Ot(ve.label)));if(de)return String(de.value)}if(Jl(O)){const W=c.find(ve=>["false","0"].includes(String(ve.value)));if(W)return String(W.value);const de=c.find(ve=>/\b(off|close|down|stop|disable|disabled|inactive|chiuso|spento|giu|ausschalten|eteins|apaga|desliga|uit)\b/.test(Ot(ve.label)));if(de)return String(de.value)}}if(c.some(W=>String(W.value)===h))return h;const Y=c.find(W=>Ot(W.label)===D);if(Y)return String(Y.value);const V=c.find(W=>{const de=Ot(W.label);return D&&(de.includes(D)||D.includes(de))});if(V)return String(V.value);const he=/\b(on|open|up|true|1|accendi|attiva|apri|su|acceso|accesa|accesi|accese|aperto|aperta|enabled|enable|start|allume|einschalten|enciende|liga|aan)\b/,se=/\b(off|close|down|false|0|spegni|disattiva|chiudi|giu|spento|spenta|spenti|spente|chiuso|chiusa|disabled|disable|stop|ferma|eteins|ausschalten|apaga|desliga|uit)\b/;if(he.test($)){const W=c.find(ve=>["true","1","100"].includes(String(ve.value)));if(W)return String(W.value);const de=c.find(ve=>/\b(on|open|up|start|enable|enabled|active|acceso|accesa|aperto|aperta|su)\b/.test(Ot(ve.label)));if(de)return String(de.value)}if(se.test($)){const W=c.find(ve=>["false","0"].includes(String(ve.value)));if(W)return String(W.value);const de=c.find(ve=>/\b(off|close|down|stop|disable|disabled|inactive|spento|spenta|chiuso|chiusa|giu)\b/.test(Ot(ve.label)));if(de)return String(de.value)}return String(c[0].value)}function Is(n){if(!n)return;const s=ua(n.commandDPT),r=ua(n.statusDPT||n.commandDPT),c=String(n.action||"").trim().toLowerCase();s.length&&(n.commandPayload=wn(n.commandPayload,n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`)),r.length&&(n.expectedPayload=wn(n.expectedPayload,n.statusDPT||n.commandDPT,c||`${n.title||""} ${n.description||""} ${n.reason||""}`))}function Tn(n={}){if(String(n.kind||"").trim().toLowerCase()==="wait")return{id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:"wait",action:"",collapsed:n.collapsed!==!1,title:String(n.title||"Wait"),description:String(n.description||""),reason:String(n.reason||""),delayMs:Number(n.delayMs||n.readDelayMs||1200),commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:0,statusResponseTimeoutMs:0};const r=String(n.commandGA||"").trim()||String(un.value[0]?.ga||""),c=Mr(r),h=Or(r),D=c&&c.status?c.status:null,G={id:String(n.id||`step-${Date.now()}-${Math.round(Math.random()*1e3)}`),kind:String(n.kind||(D?"write_and_verify":"write_only")),action:String(n.action||"").trim().toLowerCase(),collapsed:n.collapsed!==!1,title:String(n.title||(h?`Step ${h.label}`:"Manual Step")),description:String(n.description||""),reason:String(n.reason||""),commandGA:r,commandDPT:String(n.commandDPT||h?.dpt||""),commandPayload:String(n.commandPayload??""),statusGA:String(n.statusGA||D?.ga||""),statusDPT:String(n.statusDPT||D?.dpt||""),expectedPayload:String(n.expectedPayload??n.commandPayload??""),statusWriteTimeoutMs:Number(n.statusWriteTimeoutMs||n.timeoutMs||5e3),statusResponseTimeoutMs:Number(n.statusResponseTimeoutMs||n.timeoutMs||5e3)};return Is(G),G}function Rs(n){const s=Gt(n,null);return s?(s.steps=(Array.isArray(s.steps)?s.steps:[]).map(r=>Tn(r)),s):null}function Zl(){return Rs({id:"",name:"",description:"",areaId:rt.value?String(rt.value.id||""):"",areaName:rt.value?String(rt.value.path||rt.value.name||""):"",prompt:"",source:"manual",generatedAt:new Date().toISOString(),steps:[]})}function zr(n){if(!n||n.kind==="wait")return;const s=Or(n.commandGA),r=jl(n.statusGA),c=Mr(n.commandGA);s&&(n.commandDPT=String(s.dpt||"")),r&&(n.statusDPT=String(r.dpt||"")),c&&c.status&&(!n.statusGA||n.statusGA==="")&&(n.statusGA=String(c.status.ga||""),n.statusDPT=String(c.status.dpt||""),n.kind="write_and_verify"),n.statusGA&&(n.kind="write_and_verify"),n.expectedPayload||(n.expectedPayload=String(n.commandPayload??"")),n.statusGA||(n.statusDPT="",n.kind="write_only"),Is(n)}function Yl(){if(!a.testPlanDraft)return;const n={id:`step-${Date.now()}-${Math.round(Math.random()*1e3)}`,kind:"write_only",action:"",collapsed:!0,title:"Manual Step",description:"",reason:"",commandGA:"",commandDPT:"",commandPayload:"",statusGA:"",statusDPT:"",expectedPayload:"",statusWriteTimeoutMs:5e3,statusResponseTimeoutMs:5e3};a.testPlanDraft.steps=[...a.testPlanDraft.steps||[],n]}function Ql(){if(!a.testPlanDraft)return;const n=Tn({id:`wait-${(a.testPlanDraft.steps?.length||0)+1}`,kind:"wait",title:"Wait",description:"Pause the test before the next action.",delayMs:1200});a.testPlanDraft.steps=[...a.testPlanDraft.steps||[],n]}function eu(n){if(!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps))return;const s=a.testPlanDraft.steps[n];if(!s)return;const r=Tn(Object.assign({},s,{id:`${s.id||"step"}-copy`}));a.testPlanDraft.steps.splice(n+1,0,r)}function tu(n){!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps)||a.testPlanDraft.steps.splice(n,1)}function au(n){n&&(n.collapsed=n.collapsed!==!0)}function _n(){a.draggedTestPlanStepId="",a.dragOverTestPlanStepId=""}function su(n,s){const r=String(n||"").trim();r&&(a.draggedTestPlanStepId=r,a.dragOverTestPlanStepId="",s&&s.dataTransfer&&(s.dataTransfer.effectAllowed="move",s.dataTransfer.setData("text/plain",r)))}function nu(n){const s=String(n||"").trim();!s||!a.draggedTestPlanStepId||s===a.draggedTestPlanStepId||(a.dragOverTestPlanStepId=s)}function ru(n,s){if(!a.testPlanDraft||!Array.isArray(a.testPlanDraft.steps))return;const r=String(n||"").trim(),c=String(s||"").trim();if(!r||!c||r===c)return;const h=a.testPlanDraft.steps.slice(),D=h.findIndex(O=>String(O&&O.id?O.id:"")===r),G=h.findIndex(O=>String(O&&O.id?O.id:"")===c);if(D===-1||G===-1)return;const[$]=h.splice(D,1);h.splice(G,0,$),a.testPlanDraft.steps=h}function iu(n,s){s&&s.preventDefault();const r=String(a.draggedTestPlanStepId||"").trim(),c=String(n||"").trim();r&&c&&r!==c&&ru(r,c),_n()}function ou(){!a.testPlanDraft||a.testPlanRunning||(a.testPlanRunMode="single",a.testPlanRepeatStopRequested=!1,a.testPlanRunConfirmOpen=!0)}function lu(){!a.testPlanDraft||a.testPlanRunning||(a.testPlanRunMode="repeat",a.testPlanRepeatStopRequested=!1,a.testPlanRunConfirmOpen=!0)}function $r(){a.testPlanRunConfirmOpen=!1,a.testPlanRunMode="single"}function uu(){a.testPlanRepeatForever===!0&&(a.testPlanRepeatStopRequested=!0,P("Stopping repeat mode after the current cycle..."))}function Br(n=null){const s=n||oa.value;s&&(a.testResultFocusMode=!1,a.testPlanSelectedId=String(s.id||""),a.testPlanDraft=Rs(s),a.testPlanPrompt=String(s.prompt||""),a.testPlanGeneration={provider:String(s.source||"saved"),model:"",fallback:!1,error:""},a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,xa())}function Dn(){aa=null,a.testPlanPendingActionLabel=""}function Vr(){a.testPlanUnsavedConfirmOpen=!1,Dn()}function Kr(){const n=aa;a.testPlanUnsavedConfirmOpen=!1,Dn(),typeof n=="function"&&n()}function In(n,s="another plan"){if(!Pr.value){n();return}aa=n,a.testPlanPendingActionLabel=String(s||"another plan"),a.testPlanUnsavedConfirmOpen=!0}function du(n){if(!n||!n.id)return;const s=String(n.id);a.testPlanSelectedId!==s&&In(()=>Br(n),`plan "${n.name||s}"`)}function cu(){jo(),P("Plan changes discarded")}async function fu(){await Ur()&&Kr()}function Wr(){if(!Se.value.length){P("Define at least one area before creating a test plan");return}In(()=>{a.activeTab="tests",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanDraft=Zl(),a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.testPlanPrompt="",a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,xa()},"a new plan")}function pu(n){const s=String(n||"").trim();if(!s)return;const r=Se.value.find(c=>c&&c.id===s);r&&(a.testAreaSelectedId=s,a.testPlanDraft&&(a.testPlanDraft.areaId=s,a.testPlanDraft.areaName=String(r.path||r.name||"")))}function gu(){const n=Gt(a.testPlanDraft||oa.value,null);n&&(a.activeTab="tests",a.testResultFocusMode=!1,a.testPlanSelectedId="",a.testPlanRunConfirmOpen=!1,a.testPlanGeneration={provider:"duplicated",model:"",fallback:!1,error:""},n.id="",n.name=String(n.name||"Plan Draft").trim()?`${String(n.name||"Plan Draft").trim()} Copy`:"Plan Copy",a.testPlanPrompt=String(n.prompt||a.testPlanPrompt||""),a.testPlanDraft=Rs(n),a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,xa(),P("Plan duplicated"))}async function hu(){const n=rt.value,s=String(a.testPlanPrompt||"").trim(),r=Ol();if(!(!a.selectedNodeId||!n||!s||a.testPlanGenerating)){a.testPlanGenerating=!0,a.testTemplateBuilderFocus=!1,a.showAiPlanner=!1,a.testResultFocusMode=!1,a.testPlanGenerationError="",P("Building test plan...");try{const c=await N(E("test-plans/generate"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:n.id,prompt:s,language:r})});a.testPlanDraft=c&&c.plan?Rs(c.plan):null,a.testPlanCatalog=c&&c.catalog?c.catalog:a.testPlanCatalog,a.testPlanGeneration=c&&c.generation?c.generation:null,a.testPlanGenerationError="",a.testPlanSelectedId="",a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!1,c&&c.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:c.testPlans})),xa(),P("Test plan ready")}catch(c){const h=c.message||"Failed to build the test plan";a.lastError=h,a.testPlanGenerationError=h,a.testPlanGeneration={provider:"",model:"",fallback:!1,error:h},P(h)}finally{a.testPlanGenerating=!1}}}async function Ur(){if(!a.selectedNodeId||!a.testPlanDraft||a.testPlanSaving)return!1;a.testPlanSaving=!0,P("Saving test plan...");try{const n=await N(E("test-plans/save"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,plan:Object.assign({},a.testPlanDraft,{prompt:a.testPlanPrompt})})});return n&&n.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:n.testPlans})),n&&n.planId&&(a.testPlanSelectedId=n.planId),n&&n.planId&&a.testPlanDraft&&(a.testPlanDraft.id=n.planId),a.testPlanRunConfirmOpen=!1,xa(),P("Test plan saved"),!0}catch(n){return a.lastError=n.message||"Failed to save test plan",P(a.lastError),!1}finally{a.testPlanSaving=!1}}async function mu(){const n=oa.value;if(!(!n||!a.selectedNodeId||a.testPlanDeleting)){a.testPlanDeleting=!0,P("Deleting test plan...");try{const s=await N(E("test-plans/delete"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,planId:n.id})});s&&s.testPlans&&(a.stateData=Object.assign({},a.stateData||{},{testPlans:s.testPlans})),a.testPlanDraft=null,a.testPlanGeneration=null,a.testPlanRunConfirmOpen=!1,a.showAiPlanner=!0,a.testTemplateBuilderFocus=!1,xa(),P("Test plan deleted")}catch(s){a.lastError=s.message||"Failed to delete test plan",P(a.lastError)}finally{a.testPlanDeleting=!1}}}async function vu(n="single"){if(!a.selectedNodeId||!a.testPlanDraft||a.testPlanRunning)return;const r=String(n||a.testPlanRunMode||"single").trim().toLowerCase()==="repeat";a.testPlanRunning=!0,a.showAiPlanner=!1,a.testTemplateBuilderFocus=!1,a.testPlanRepeatForever=r,a.testPlanRepeatStopRequested=!1,a.testPlanRunningStepId="",a.testPlanRunConfirmOpen=!1,a.lastError="",P(r?"Running test plan in repeat mode...":"Running test plan...");try{const c=JSON.parse(JSON.stringify(Object.assign({},a.testPlanDraft,{prompt:a.testPlanPrompt}))),h=Array.isArray(c.steps)?c.steps:[];if(!c.areaId)throw new Error("Missing areaId in test plan");if(!h.length)throw new Error("The test plan has no executable steps");let D=rt.value,G=0;do{G+=1;const $=`${c.id||"plan"}:${Date.now()}`,O=[];a.liveTestResultId=$,a.testResultsMenuOpen=!0,Ds($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0}),a.stateData=Object.assign({},a.stateData||{},{testPlanReport:hn({plan:c,area:D,stepResults:[],reportId:$})});try{await bl(c.name||"Test plan",c.description||"")}catch{}for(let V=0;V<h.length;V+=1){const he=h[V];a.testPlanRunningStepId=he&&he.id?he.id:"";const se=r?`Cycle ${G} · `:"";P(`${se}Step ${V+1}/${h.length}: ${he&&he.title?he.title:"Running..."}`);try{await vl(he||{title:`Step ${V+1}`},V+1)}catch{P(`Voice unavailable for step ${V+1}. Continuing test...`)}try{const W=await N(E("test-plans/run-step"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,areaId:c.areaId,step:he})});W&&W.area&&(D=W.area),O.push(W&&W.stepResult?W.stepResult:Dr(he,new Error("Step returned no result")))}catch(W){O.push(Dr(he,W))}a.stateData=Object.assign({},a.stateData||{},{testPlanReport:hn({plan:c,area:D,stepResults:O.slice(),reportId:$})})}const Y=hn({plan:c,area:D,stepResults:O,reportId:$});a.stateData=Object.assign({},a.stateData||{},{testPlans:yt.value,testPlanReport:Y}),Ds($,{openMenu:!0,activateResultsTab:!0,resultOnly:!0});try{await Nl(Y)}catch(V){a.lastError=V.message||"Failed to save test result",P(`Test completed, but the result was not saved: ${a.lastError}`)}r&&a.testPlanRepeatStopRequested!==!0&&(a.testResultFocusMode=!1,P(`Cycle ${G} completed. Starting the next cycle...`))}while(r&&a.testPlanRepeatStopRequested!==!0);a.testPlanRunConfirmOpen=!1,a.lastError||P(r?"Repeat mode stopped":"Test completed"),requestAnimationFrame(()=>{try{bt.value&&typeof bt.value.scrollIntoView=="function"&&bt.value.scrollIntoView({behavior:"smooth",block:"start"})}catch{}})}catch(c){a.lastError=c.message||"Failed to run test plan",P(a.lastError)}finally{a.testPlanRunningStepId="",at(),a.testPlanRunning=!1,a.testPlanRepeatForever=!1,a.testPlanRepeatStopRequested=!1,a.testPlanRunMode="single"}}async function bu(){if(a.selectedNodeId){P("Exporting config...");try{const n=await N(E("config/export"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId})}),s=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),r=window.URL.createObjectURL(s),c=document.createElement("a");c.href=r,c.download=`knx-ai-config-${a.selectedNodeId}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),window.URL.revokeObjectURL(r),P("Config exported")}catch(n){a.lastError=n.message||"Failed to export config",P(a.lastError)}}}function yu(){Qt.value&&Qt.value.click()}async function Au(n){const s=n&&n.target&&n.target.files&&n.target.files[0]?n.target.files[0]:null;if(!(!s||!a.selectedNodeId)){P("Importing config...");try{const r=await s.text(),c=JSON.parse(r),h=await N(E("config/import"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({nodeId:a.selectedNodeId,config:c})});a.stateData=Object.assign({},a.stateData||{},{areas:h.areas||ba.value,profiles:h.profiles||ya.value,actuatorTests:h.actuatorTests||Aa.value,testPlans:h.testPlans||yt.value,testResults:h.testResults||qa.value}),await Ga(),P("Config imported")}catch(r){a.lastError=r.message||"Failed to import config",P(a.lastError)}finally{n&&n.target&&(n.target.value="")}}}function Su(){a.pollStateHandle||(a.pollStateHandle=window.setInterval(()=>{a.autoRefresh&&Mt({fresh:!1})},1500)),a.pollNodesHandle||(a.pollNodesHandle=window.setInterval(()=>{yn({preserveSelection:!0})},15e3))}function Pu(){a.pollStateHandle&&(window.clearInterval(a.pollStateHandle),a.pollStateHandle=null),a.pollNodesHandle&&(window.clearInterval(a.pollNodesHandle),a.pollNodesHandle=null)}return vo(async()=>{p.value=Re(),sa(),window.addEventListener("resize",sa),document.addEventListener("keydown",na),document.addEventListener("fullscreenchange",C),await yn({preserveSelection:!1}),await Mt({fresh:!0}),await Ga(),Su(),vt()}),bo(()=>{window.removeEventListener("resize",sa),document.removeEventListener("keydown",na),document.removeEventListener("fullscreenchange",C),Ye(),Pu(),at()}),(n,s)=>(v(),b(q,null,[l("header",tf,[s[42]||(s[42]=l("div",{class:"m-header-brand"},[l("span",{class:"m-logo-mark"},"K"),l("span",{class:"hb-logo-text-mobile"},"KNX AI")],-1)),l("button",{class:fe(["hamburger-icon",{"hamburger-icon-cross":ue.value}]),type:"button","aria-expanded":ue.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle menu",onClick:Ca},[...s[41]||(s[41]=[l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1),l("span",null,null,-1)])],10,af)]),_e.value&&ue.value?(v(),b("button",{key:0,class:"sidebar-overlay",type:"button","aria-label":"Close menu",onClick:ka})):F("",!0),l("div",{class:fe(["page-shell",{"sidebar-collapsed":!ue.value,"sidebar-mobile-open":_e.value&&ue.value}])},[l("aside",sf,[l("div",nf,[s[43]||(s[43]=l("div",{class:"sidebar-brand-mark","aria-hidden":"true"},"K",-1)),s[44]||(s[44]=l("div",{class:"sidebar-brand"},[l("p",{class:"eyebrow"},"KNX Ultimate")],-1)),l("button",{class:"sidebar-collapse-toggle",type:"button","aria-expanded":ue.value?"true":"false","aria-controls":"knx-ai-sidebar","aria-label":"Toggle sidebar",onClick:Ca},[l("span",of,S(ue.value?_e.value?"×":"‹":"›"),1)],8,rf)]),l("nav",lf,[l("button",{class:fe(["tab-button",{active:a.activeTab==="overview"}]),type:"button",title:"Overview","aria-label":"Overview",onClick:s[0]||(s[0]=r=>Ea("overview"))},[...s[45]||(s[45]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M3 10.8 12 3l9 7.8v9.2a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Overview</span></span>',2)])],2),l("button",{class:fe(["tab-button",{active:a.activeTab==="areas"}]),type:"button",title:"Areas","aria-label":"Areas",onClick:s[1]||(s[1]=r=>Ea("areas"))},[...s[46]||(s[46]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M3 3h8v8H3zm10 0h8v8h-8zM3 13h8v8H3zm10 0h8v8h-8z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Areas</span></span>',2)])],2),l("button",{class:fe(["tab-button sidebar-nav-child",{active:a.activeTab==="tests"}]),type:"button",title:"Tests","aria-label":"Tests",disabled:!Se.value.length,onClick:s[2]||(s[2]=r=>Ea("tests"))},[...s[47]||(s[47]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M9 3h6v2h-1v4.3l5.5 8.8A2 2 0 0 1 17.8 21H6.2a2 2 0 0 1-1.7-2.9L10 9.3V5H9zm1.9 8.2L6.9 18h10.2l-4-6.8z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Tests</span></span>',2)])],10,uf),l("button",{class:fe(["tab-button sidebar-nav-child",{active:a.activeTab==="results"}]),type:"button",title:"Test Results","aria-label":"Test Results",onClick:s[3]||(s[3]=r=>Ea("results"))},[...s[48]||(s[48]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M4 4h16v4H4zm0 6h16v4H4zm0 6h16v4H4z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Test Results</span></span>',2)])],2),l("button",{class:fe(["tab-button",{active:a.activeTab==="assistant"}]),type:"button",title:"Assistant","aria-label":"Assistant",onClick:s[4]||(s[4]=r=>Ea("assistant"))},[...s[49]||(s[49]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M4 5h16a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-5 4v-4H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Assistant</span></span>',2)])],2),l("button",{class:fe(["tab-button",{active:a.activeTab==="settings"}]),type:"button",title:"Settings","aria-label":"Settings",onClick:s[5]||(s[5]=r=>Ea("settings"))},[...s[50]||(s[50]=[wa('<span class="sidebar-nav-icon" aria-hidden="true" data-v-47555665><svg viewBox="0 0 24 24" class="sidebar-nav-svg" data-v-47555665><path d="M19.14 12.94a7.43 7.43 0 0 0 .05-.94 7.43 7.43 0 0 0-.05-.94l2.03-1.58a.5.5 0 0 0 .12-.64l-1.92-3.32a.5.5 0 0 0-.6-.22l-2.39.96a7.18 7.18 0 0 0-1.63-.94l-.36-2.54A.5.5 0 0 0 13.9 2h-3.8a.5.5 0 0 0-.49.42l-.36 2.54a7.18 7.18 0 0 0-1.63.94l-2.39-.96a.5.5 0 0 0-.6.22L2.71 8.48a.5.5 0 0 0 .12.64l2.03 1.58a7.43 7.43 0 0 0-.05.94 7.43 7.43 0 0 0 .05.94l-2.03 1.58a.5.5 0 0 0-.12.64l1.92 3.32a.5.5 0 0 0 .6.22l2.39-.96c.5.39 1.04.71 1.63.94l.36 2.54a.5.5 0 0 0 .49.42h3.8a.5.5 0 0 0 .49-.42l.36-2.54c.59-.23 1.13-.55 1.63-.94l2.39.96a.5.5 0 0 0 .6-.22l1.92-3.32a.5.5 0 0 0-.12-.64zM12 15.2A3.2 3.2 0 1 1 12 8.8a3.2 3.2 0 0 1 0 6.4z" data-v-47555665></path></svg></span><span class="sidebar-nav-copy" data-v-47555665><span class="sidebar-nav-title" data-v-47555665>Settings</span></span>',2)])],2)]),ue.value?(v(),b("div",df,[l("button",{class:"primary-button sidebar-action-button",type:"button",disabled:a.loadingNodes||a.loadingState,onClick:Al}," Refresh ",8,cf),l("div",{class:"support-link-row"},[l("a",{class:"secondary-button support-link-button",href:Fb,target:"_blank",rel:"noopener noreferrer"}," Donate via PayPal "),l("a",{class:"secondary-button support-link-button support-link-button-youtube",href:Lb,target:"_blank",rel:"noopener noreferrer"}," Subscribe ")])])):F("",!0),ue.value?(v(),b("div",ff,[l("span",{class:fe(["status-pill",{error:!!a.lastError}])},[a.loadingNodes||a.loadingState||a.areaLlmRegenerating||a.areaLlmBulkDeleting||a.areaLlmBusy||a.testPlanGenerating||a.asking?(v(),b("span",pf)):F("",!0),l("span",null,S(a.status),1)],2),Ps.value?(v(),b("span",gf,"Provider: "+S(Ps.value.llmProvider||"n/a")+" | Model: "+S(Ps.value.llmModel||"n/a"),1)):F("",!0),l("a",{class:"sidebar-doc-link",href:Gb,target:"_blank",rel:"noopener noreferrer"}," Documentation: KNX AI Vue ")])):F("",!0)]),l("section",hf,[l("main",mf,[a.activeTab==="overview"?(v(),b("section",vf,[l("div",bf,[s[51]||(s[51]=l("h2",null,"Summary",-1)),xe.value.meta?.generatedAt?(v(),b("span",yf,S(nt(xe.value.meta.generatedAt)),1)):F("",!0)]),l("pre",Af,S(ol.value),1),l("div",Sf,[l("article",Pf,[s[52]||(s[52]=l("span",null,"Telegrams",-1)),l("strong",null,S(Number(xe.value.counters?.telegrams||0)),1)]),l("article",wf,[s[53]||(s[53]=l("span",null,"Rate",-1)),l("strong",null,S(Number(xe.value.counters?.overallRatePerSec||0))+"/s",1)]),l("article",Tf,[s[54]||(s[54]=l("span",null,"Repeat",-1)),l("strong",null,S(Number(xe.value.counters?.repeated||0)),1)]),l("article",_f,[s[55]||(s[55]=l("span",null,"Unknown DPT",-1)),l("strong",null,S(Number(xe.value.counters?.unknownDpt||0)),1)])])])):F("",!0),a.activeTab==="areas"?(v(),b("section",Df,[l("div",If,[s[56]||(s[56]=l("h2",null,"Select an Area",-1)),l("div",Rf,[l("span",Nf,S(Number(Xa.value.suggestedAreaCount||0))+" areas",1),l("button",{class:"secondary-button",type:"button",disabled:a.areaLlmRegenerating||a.areaLlmBulkDeleting||!ra.value.llmEnabled,onClick:Vl},[a.areaLlmRegenerating?(v(),b("span",kf)):F("",!0),l("span",null,S(a.areaLlmRegenerating?"Regenerating...":"Regenerate AI Areas"),1)],8,Cf),l("button",{class:"danger-button",type:"button",disabled:a.areaLlmRegenerating||a.areaLlmBulkDeleting||hr.value<=0,onClick:Kl},[a.areaLlmBulkDeleting?(v(),b("span",Ef)):F("",!0),l("span",null,S(a.areaLlmBulkDeleting?"Deleting...":"Delete AI Areas"),1)],8,xf),l("button",{class:"secondary-button new-button",type:"button",onClick:Bl}," New Area ")])]),a.areaLlmError?(v(),b("p",Gf,S(a.areaLlmError),1)):F("",!0),l("div",Ff,[l("div",Lf,[l("span",Mf,"GA "+S(Number(Xa.value.gaCount||0)),1),l("span",Of,"Hierarchical "+S(Number(Xa.value.hierarchicalGaCount||0)),1),l("span",zf,"Secondary "+S(Number(Xa.value.secondaryGroupCount||0)),1),l("span",$f,"Active "+S(Number(Xa.value.activeAreaCount||0)),1)])]),ln.value.length||a.areaDraftIsNew?(v(),b("div",Bf,[!Ee.value&&!a.areaDraftIsNew?(v(),b("div",Vf,[l("label",Kf,[s[57]||(s[57]=l("span",null,"Areas",-1)),l("div",Wf,[me(l("input",{"onUpdate:modelValue":s[6]||(s[6]=r=>a.areaSearch=r),class:"area-search-select-input",type:"text",placeholder:Ee.value?Fr(Ee.value):"Search area...",onFocus:s[7]||(s[7]=r=>a.areaSearchOpen=!0),onInput:s[8]||(s[8]=r=>a.areaSearchOpen=!0),onBlur:Fl},null,40,Uf),[[ke,a.areaSearch]]),a.areaSearchOpen&&ln.value.length?(v(),b("div",jf,[(v(!0),b(q,null,ne(ln.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:fe(["area-search-select-option",{active:Ee.value&&Ee.value.id===r.id}]),onMousedown:Kt(c=>Gl(r),["prevent"])},S(Fr(r)),43,Hf))),128))])):F("",!0)])])])):F("",!0),Ee.value||a.areaDraftIsNew?(v(),b("article",{key:1,class:fe(["area-detail",{"area-detail-wide":a.areaDraftIsNew}])},[l("div",Xf,[a.areaBuilderFocus!==!0?(v(),b("div",qf,[s[58]||(s[58]=l("div",null,[l("h4",null,"Edit Area"),l("p",{class:"area-detail-subhead"},"The installer can rename the area and decide exactly which group addresses belong to it. Everything is persisted per KNX AI node.")],-1)),l("div",Jf,[a.areaDraftIsNew&&!Sr.value?(v(),b("button",{key:0,class:"secondary-button",type:"button",onClick:Tl}," Show AI Area Builder ")):F("",!0),a.areaDraftIsNew?F("",!0):(v(),b("button",{key:1,class:"danger-button",type:"button",disabled:a.areaSaving,onClick:xl}," Delete Area ",8,Zf)),l("button",{class:"secondary-button",type:"button",disabled:a.areaSaving,onClick:kl}," Reset ",8,Yf),l("button",{class:"primary-button",type:"button",disabled:a.areaSaving,onClick:Cl},S(a.areaSaving?"Saving...":"Save Area"),9,Qf),l("button",{class:"secondary-button",type:"button",disabled:a.areaSaving,onClick:Dl}," Close ",8,ep)])])):F("",!0),a.areaBuilderFocus!==!0?(v(),b("div",tp,[l("label",ap,[s[59]||(s[59]=l("span",null,"Area name",-1)),me(l("input",{"onUpdate:modelValue":s[9]||(s[9]=r=>a.areaDraftName=r),type:"text",placeholder:"Installer alias"},null,512),[[ke,a.areaDraftName]])]),l("label",sp,[s[60]||(s[60]=l("span",null,"Description",-1)),me(l("textarea",{"onUpdate:modelValue":s[10]||(s[10]=r=>a.areaDraftDescription=r),rows:"3",placeholder:"Optional note for diagnostics and reports"},null,512),[[ke,a.areaDraftDescription]])]),l("label",np,[s[61]||(s[61]=l("span",null,"Add group addresses to this area",-1)),me(l("input",{"onUpdate:modelValue":s[11]||(s[11]=r=>a.gaCatalogSearch=r),type:"text",placeholder:"Search GA, label or ETS path"},null,512),[[ke,a.gaCatalogSearch]])])])):F("",!0),a.areaDraftIsNew&&Sr.value?(v(),b("div",rp,[l("div",{class:fe(["ai-planner-shell-head",{"template-builder-focus-head":a.areaBuilderFocus===!0}])},[s[62]||(s[62]=l("div",null,[l("h4",null,"AI Area Builder"),l("p",{class:"area-detail-subhead"},"Describe the room, zone or function you want. The AI will suggest the most relevant group addresses for this draft.")],-1)),a.areaBuilderFocus===!0?(v(),b("div",ip,[l("button",{class:"secondary-button",type:"button",onClick:_l}," Close ")])):F("",!0)],2),l("div",op,[l("label",lp,[s[63]||(s[63]=l("span",null,"Assistant prompt",-1)),me(l("textarea",{"onUpdate:modelValue":s[12]||(s[12]=r=>a.areaLlmPrompt=r),rows:"3",placeholder:"Example: Add all technical room lighting command and status GA."},null,512),[[ke,a.areaLlmPrompt]])])]),l("div",up,[l("button",{class:"primary-button",type:"button",disabled:a.areaLlmBusy||!a.areaLlmPrompt.trim()||!ra.value.llmEnabled,onClick:Wl},[a.areaLlmBusy?(v(),b("span",cp)):F("",!0),ce(" "+S(a.areaLlmBusy?"Suggesting...":"Suggest GA with AI"),1)],8,dp)]),a.areaLlmError?(v(),b("p",fp,S(a.areaLlmError),1)):F("",!0),ra.value.llmEnabled?F("",!0):(v(),b("p",pp," Enable the AI in the KNX AI node to regenerate areas or suggest GA for a new draft. "))])):F("",!0),a.areaBuilderFocus!==!0?(v(),b("div",gp,[l("div",null,[s[65]||(s[65]=l("h4",null,"Area GA membership",-1)),yr.value.length?(v(),b("ul",hp,[(v(!0),b(q,null,ne(yr.value,r=>(v(),b("li",{key:r.ga,class:"area-ga-item"},[l("div",mp,[l("strong",null,S(r.ga),1),l("span",null,[ce(S(r.label||"Unlabeled GA"),1),r.dpt?(v(),b("span",vp," | DPT "+S(r.dpt),1)):F("",!0)]),l("span",null,[ce("Role "+S(Gr(r.role)),1),r.roleSource?(v(),b("span",bp," | source "+S(r.roleSource),1)):F("",!0)])]),l("div",yp,[l("label",Ap,[s[64]||(s[64]=l("span",null,"Role",-1)),l("select",{value:r.roleOverride&&r.roleOverride!=="auto"?r.roleOverride:r.role||"neutral",disabled:a.areaGaRoleSavingGa===r.ga,onChange:c=>$l(r.ga,c.target.value)},[(v(),b(q,null,ne(o,c=>l("option",{key:c.value,value:c.value},S(c.label),9,Pp)),64))],40,Sp)]),l("button",{class:"secondary-button",type:"button",onClick:c=>zl(r.ga)}," Remove ",8,wp)])]))),128))])):(v(),b("p",Tp,"No GA selected for this area yet."))]),l("div",null,[l("div",_p,[s[66]||(s[66]=l("div",null,[l("h4",null,"Available GA"),l("p",{class:"area-detail-subhead"},"Pick from the ETS catalog. Already selected GA are hidden from this list.")],-1)),l("span",Dp,S(a.gaCatalogLoading?"Loading...":`${br.value.length} visible`),1)]),l("div",Ip,[(v(!0),b(q,null,ne(br.value,r=>(v(),b("button",{key:r.ga,type:"button",class:"area-list-item",onClick:c=>El(r.ga)},[l("span",Np,S(r.ga),1),l("span",Cp,S(r.label||"Unlabeled GA"),1),l("span",kp,[ce(S(r.hierarchyPath||r.dpt||""),1),r.role?(v(),b("span",xp," | "+S(Gr(r.role)),1)):F("",!0)])],8,Rp))),128))])])])):F("",!0),a.areaBuilderFocus!==!0?(v(),b("p",Ep,[s[67]||(s[67]=ce(" Original ETS path: ",-1)),l("strong",null,S(a.areaDraftIsNew?"Manual area":Ee.value.basePath||Ee.value.path||Ee.value.name),1)])):F("",!0)])],2)):F("",!0)])):(v(),b("p",Gp,"No areas matched the current search or the ETS file does not expose a usable hierarchy yet."))])):F("",!0),a.activeTab==="tests"?(v(),b("section",{key:2,class:fe(["card card-profiles",{"card-results-focus":At.value}])},[l("div",Fp,[l("div",null,[l("h2",null,S(At.value?"Test Result":"Test Planner"),1),l("p",Lp,S(At.value?"Showing only the selected test report.":"Select an area, choose a standard test template, review the generated plan, then save or run it."),1)]),At.value?(v(),b("div",Bp,[l("span",Vp,S(Ja(ae.value)),1),l("button",{class:"danger-button",type:"button",disabled:!ae.value||a.deletingTestResultId===ae.value.id,onClick:s[13]||(s[13]=r=>Sn(ae.value?.id))},S(a.deletingTestResultId===ae.value?.id?"Deleting...":"Delete"),9,Kp),l("button",{class:"secondary-button",type:"button",onClick:xr}," Open Source Test ")])):(v(),b("div",Mp,[l("span",Op,"Area "+S(rt.value?rt.value.path||rt.value.name:"n/a"),1),l("span",zp,S(yt.value.length)+" saved plans",1),l("button",{class:"secondary-button",type:"button",disabled:!a.testPlanDraft,onClick:gu}," Duplicate Plan ",8,$p),l("button",{class:"secondary-button new-button",type:"button",onClick:Wr}," New Plan ")]))]),l("div",{class:fe(["profiles-layout test-planner-layout",{"result-only-layout":At.value}])},[l("div",Wp,[!At.value&&!a.testPlanDraft&&!a.testPlanRunning?(v(),b("article",Up,[s[69]||(s[69]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select test plan"),l("p",{class:"area-detail-subhead"},"Reusable deterministic active tests saved by the installer.")])],-1)),l("div",jp,[l("label",Hp,[s[68]||(s[68]=l("span",null,"Plans",-1)),l("div",Xp,[me(l("input",{"onUpdate:modelValue":s[14]||(s[14]=r=>a.testPlanSearch=r),class:"area-search-select-input",type:"text",placeholder:oa.value?Lr(oa.value):"Search saved plan...",onFocus:s[15]||(s[15]=r=>a.testPlanSearchOpen=!0),onInput:s[16]||(s[16]=r=>a.testPlanSearchOpen=!0),onBlur:Ml},null,40,qp),[[ke,a.testPlanSearch]]),a.testPlanSearchOpen&&mr.value.length?(v(),b("div",Jp,[(v(!0),b(q,null,ne(mr.value.slice(0,80),r=>(v(),b("button",{key:r.id,type:"button",class:fe(["area-search-select-option",{active:oa.value&&oa.value.id===r.id}]),onMousedown:Kt(c=>Ll(r),["prevent"])},S(Lr(r)),43,Zp))),128))])):F("",!0)])])]),yt.value.length?F("",!0):(v(),b("p",Yp,"No saved plans yet."))])):F("",!0),!At.value&&a.testPlanDraft?(v(),b("article",Qp,[a.testTemplateBuilderFocus!==!0?(v(),b("div",eg,[l("div",null,[l("h3",null,S(a.testPlanDraft?.name||"Plan Draft"),1),dn.value?(v(),b("p",tg,"Choose a standard test template for the selected area, then build the plan deterministically from the ETS catalog.")):F("",!0)]),l("div",ag,[Pr.value?(v(),b("span",sg,"Unsaved changes")):F("",!0),l("button",{class:"secondary-button new-button",type:"button",onClick:Wr}," New Plan "),dn.value?F("",!0):(v(),b("button",{key:1,class:"secondary-button",type:"button",onClick:Pl}," Show Template Builder ")),l("label",ng,[me(l("input",{"onUpdate:modelValue":s[17]||(s[17]=r=>a.voiceEnabled=r),type:"checkbox"},null,512),[[On,a.voiceEnabled]]),s[70]||(s[70]=l("span",null,"Voice",-1))]),l("button",{class:"danger-button",type:"button",disabled:a.testPlanDeleting||!oa.value,onClick:mu},S(a.testPlanDeleting?"Deleting...":"Delete"),9,rg),l("button",{class:"secondary-button",type:"button",disabled:a.testPlanSaving||a.testPlanRunning,onClick:Rl}," Close ",8,ig),l("button",{class:"secondary-button",type:"button",disabled:a.testPlanSaving||!a.testPlanDraft,onClick:Ur},S(a.testPlanSaving?"Saving...":"Save Plan"),9,og),sl.value?(v(),b("div",lg,[l("button",{class:"secondary-button",type:"button",disabled:!a.testPlanDraft&&a.testPlanRepeatForever!==!0||a.testPlanRunning&&a.testPlanRepeatForever!==!0||a.testPlanRepeatStopRequested===!0,onClick:s[18]||(s[18]=r=>a.testPlanRepeatForever===!0?uu():lu())},S(a.testPlanRepeatForever===!0?a.testPlanRepeatStopRequested===!0?"Stopping...":"Stop Repeat":"Repeat Forever"),9,ug),l("button",{class:"primary-button",type:"button",disabled:a.testPlanRunning||!a.testPlanDraft,onClick:ou},[a.testPlanRunning?(v(),b("span",cg)):F("",!0),l("span",null,S(a.testPlanRunning?"Running...":"Run Plan"),1)],8,dg)])):F("",!0)])])):F("",!0),dn.value?(v(),b("div",fg,[l("div",{class:fe(["ai-planner-shell-head",{"template-builder-focus-head":a.testTemplateBuilderFocus===!0}])},[s[71]||(s[71]=l("div",null,[l("h4",null,"Template Builder"),l("p",{class:"area-detail-subhead"},"Select one of the standard templates. The plan is built only from the command GA available in the selected area.")],-1)),a.testTemplateBuilderFocus===!0?(v(),b("div",pg,[l("button",{class:"secondary-button",type:"button",onClick:wl}," Close ")])):F("",!0)],2),l("div",gg,[l("label",hg,[s[72]||(s[72]=l("span",null,"Area to test",-1)),me(l("select",{"onUpdate:modelValue":s[19]||(s[19]=r=>a.testAreaSelectedId=r)},[(v(!0),b(q,null,ne(Se.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,mg))),128))],512),[[Ta,a.testAreaSelectedId]])]),l("label",vg,[s[73]||(s[73]=l("span",null,"Selected template",-1)),l("textarea",{value:a.testPlanPrompt||"Select one of the templates below.",rows:"4",readonly:""},null,8,bg)])]),l("div",yg,[(v(),b(q,null,ne(i,r=>l("button",{key:r.id,class:fe(["preset-button",{active:a.testPlanPrompt===r.prompt}]),type:"button",onClick:c=>Ul(r)},S(r.title),11,Ag)),64))]),l("p",Sg,S((i.find(r=>r.prompt===a.testPlanPrompt)||{}).description||"Choose a template to see what the deterministic builder will do in the selected area."),1),l("div",Pg,[l("button",{class:"primary-button",type:"button",disabled:a.testPlanGenerating||!rt.value||!a.testPlanPrompt.trim(),onClick:hu},[a.testPlanGenerating?(v(),b("span",Tg)):F("",!0),ce(" "+S(a.testPlanGenerating?"Building...":"Build Test Plan"),1)],8,wg)]),a.testPlanGenerationError?(v(),b("p",_g,S(a.testPlanGenerationError),1)):F("",!0),a.testPlanGeneration?(v(),b("div",Dg,[a.testPlanGeneration.error?F("",!0):(v(),b("p",Ig," Built with "+S(a.testPlanGeneration.provider||"deterministic builder")+". ",1)),a.testPlanGeneration.error?(v(),b("p",Rg,S(a.testPlanGeneration.error),1)):F("",!0)])):F("",!0)])):F("",!0)])):F("",!0),a.testPlanRunning&&!At.value?(v(),b("article",Ng,[l("div",Cg,[l("div",null,[s[74]||(s[74]=l("h3",{class:"running-headline"},[l("span",{class:"running-spinner","aria-hidden":"true"}),l("span",null,"Test Running")],-1)),l("p",kg,S(Ne.value?.title||"Executing current step..."),1)]),l("span",xg,S(pt.value?.metrics?.totalSteps?`${Number(pt.value.steps?.length||0)}/${Number(pt.value.metrics.totalSteps||0)}`:"in progress"),1)]),l("div",Eg,[l("article",Gg,[s[75]||(s[75]=l("span",null,"Completed",-1)),l("strong",null,S(Number(pt.value?.steps?.length||0)),1)]),l("article",Fg,[s[76]||(s[76]=l("span",null,"Pass",-1)),l("strong",null,S(Number(pt.value?.metrics?.pass||0)),1)]),l("article",Lg,[s[77]||(s[77]=l("span",null,"Warn",-1)),l("strong",null,S(Number(pt.value?.metrics?.warn||0)),1)]),l("article",Mg,[s[78]||(s[78]=l("span",null,"Fail",-1)),l("strong",null,S(Number(pt.value?.metrics?.fail||0)),1)])]),Ne.value?(v(),b("div",Og,[l("div",zg,[l("strong",null,S(Ne.value.title||Ne.value.id),1),l("span",null,S(Ne.value.kind),1)]),l("p",$g,S(Ne.value.description||"Current step in execution."),1),Ne.value.kind==="wait"?(v(),b("div",Bg,[l("span",null,[s[79]||(s[79]=l("strong",null,"Wait",-1)),ce(" "+S(Number(Ne.value.delayMs||0))+" ms",1)]),l("span",null,[s[80]||(s[80]=l("strong",null,"Reason",-1)),ce(" "+S(Ne.value.reason||"Pause before next action"),1)])])):(v(),b("div",Vg,[l("span",null,[s[81]||(s[81]=l("strong",null,"Command",-1)),ce(" "+S(Ne.value.commandGA||"n/a"),1)]),l("span",null,[s[82]||(s[82]=l("strong",null,"Status GA",-1)),ce(" "+S(Ne.value.statusGA||"n/a"),1)]),l("span",null,[s[83]||(s[83]=l("strong",null,"Payload",-1)),ce(" "+S(vn(Ne.value.commandPayload,Ne.value.commandDPT)),1)]),l("span",null,[s[84]||(s[84]=l("strong",null,"Expected",-1)),ce(" "+S(vn(Ne.value.expectedPayload,Ne.value.statusDPT||Ne.value.commandDPT)),1)])])),Ne.value.kind!=="wait"&&Ne.value.statusGA?(v(),b("div",Kg,[l("section",Wg,[s[87]||(s[87]=l("h4",null,"Spontaneous Write From Status GA",-1)),l("div",Ug,[l("span",null,[s[85]||(s[85]=l("strong",null,"Status GA",-1)),ce(" "+S(Ne.value.statusGA||"n/a"),1)]),l("span",null,[s[86]||(s[86]=l("strong",null,"Timeout",-1)),ce(" "+S(Number(Ne.value.statusWriteTimeoutMs||0))+" ms",1)])])]),l("section",jg,[s[90]||(s[90]=l("h4",null,"Active Read Request To Status GA",-1)),l("div",Hg,[l("span",null,[s[88]||(s[88]=l("strong",null,"Status GA",-1)),ce(" "+S(Ne.value.statusGA||"n/a"),1)]),l("span",null,[s[89]||(s[89]=l("strong",null,"Timeout",-1)),ce(" "+S(Number(Ne.value.statusResponseTimeoutMs||0))+" ms",1)])])])])):F("",!0)])):F("",!0)])):F("",!0),ae.value&&At.value?(v(),b("article",{key:3,ref_key:"testPlanReportRef",ref:bt,class:"area-detail"},[l("div",Xg,[l("div",null,[l("h3",null,S(Ts(ae.value)),1),l("p",qg,S(_s(ae.value)||nt(ae.value.generatedAt)),1)]),l("div",Jg,[l("span",Zg,S(Ja(ae.value)),1),ae.value.live===!0?(v(),b("span",Yg,[...s[91]||(s[91]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):F("",!0),l("span",Qg,S(ae.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:_r}," Export PDF ")])]),l("div",eh,[(v(!0),b(q,null,ne(mn(ae.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",th,[(v(!0),b(q,null,ne(Za(ae.value),r=>(v(),b("article",{key:r.id,class:fe(["report-check",`report-${r.status}`])},[l("div",ah,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",sh,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",nh,[(v(!0),b(q,null,ne(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",rh,[(v(!0),b(q,null,ne(c.items,h=>(v(),b("span",{key:`${r.id}-${c.title}-${h.label}`},[l("strong",null,S(h.label),1),ce(" "+S(h.value),1)]))),128))])]))),128))])):(v(),b("div",ih,[(v(!0),b(q,null,ne(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),ce(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ae.value).length?F("",!0):(v(),b("p",oh,"No detailed entries stored for this report yet.")),Ya(ae.value).length?(v(),b("div",lh,[s[92]||(s[92]=l("h4",null,"Suggestions",-1)),l("ul",uh,[(v(!0),b(q,null,ne(Ya(ae.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):F("",!0)],512)):F("",!0),a.testPlanDraft&&!a.testPlanRunning&&!At.value&&a.testTemplateBuilderFocus!==!0?(v(),b("article",dh,[l("div",ch,[l("div",null,[l("h3",fh,[s[93]||(s[93]=l("span",null,"Edit Plan",-1)),a.testPlanGenerating?(v(),b("span",ph)):F("",!0)])]),l("div",gh,[l("span",hh,S(Number(a.testPlanDraft.steps?.length||0))+" steps",1),l("button",{class:"secondary-button",type:"button",onClick:Yl}," Add Step "),l("button",{class:"secondary-button",type:"button",onClick:Ql}," Add Wait ")])]),l("div",mh,[l("label",vh,[s[95]||(s[95]=l("span",null,"Area",-1)),l("select",{value:a.testPlanDraft.areaId||a.testAreaSelectedId||"",disabled:!Se.value.length,onChange:s[20]||(s[20]=r=>pu(r.target.value))},[s[94]||(s[94]=l("option",{value:"",disabled:""},"Select area",-1)),(v(!0),b(q,null,ne(Se.value,r=>(v(),b("option",{key:r.id,value:r.id},S(r.path||r.name),9,yh))),128))],40,bh)]),l("label",Ah,[s[96]||(s[96]=l("span",null,"Plan name",-1)),me(l("input",{"onUpdate:modelValue":s[21]||(s[21]=r=>a.testPlanDraft.name=r),type:"text",placeholder:"KNX active test name"},null,512),[[ke,a.testPlanDraft.name]])]),l("label",Sh,[s[97]||(s[97]=l("span",null,"Description",-1)),me(l("textarea",{"onUpdate:modelValue":s[22]||(s[22]=r=>a.testPlanDraft.description=r),rows:"2",placeholder:"Short operator-facing description"},null,512),[[ke,a.testPlanDraft.description]])])]),l("div",Ph,[(v(!0),b(q,null,ne(a.testPlanDraft.steps||[],(r,c)=>(v(),b("article",{key:r.id,class:fe(["report-check report-pass planner-step-card",{"planner-step-running":a.testPlanRunning&&a.testPlanRunningStepId===r.id,"planner-step-dragging":a.draggedTestPlanStepId===r.id,"planner-step-drop-target":a.dragOverTestPlanStepId===r.id}]),onDragenter:Kt(h=>nu(r.id),["prevent"]),onDragover:s[23]||(s[23]=Kt(()=>{},["prevent"])),onDrop:h=>iu(r.id,h)},[l("div",Th,[l("div",_h,[l("button",{class:"drag-handle",type:"button",draggable:"true",tabindex:"-1","aria-label":"Drag step",title:"Drag step",onDragstart:h=>su(r.id,h),onDragend:_n}," ⋮⋮ ",40,Dh),l("button",{class:"collapse-toggle",type:"button","aria-expanded":r.collapsed!==!0,title:r.collapsed===!0?"Expand step":"Collapse step",onClick:h=>au(r)},[l("span",{class:fe(["collapse-icon",{collapsed:r.collapsed===!0}])},"▾",2)],8,Ih),l("strong",null,S(r.title||r.id),1)]),l("div",Rh,[l("span",null,S(r.kind),1),l("button",{class:"secondary-button",type:"button",onClick:h=>eu(c)}," Duplicate ",8,Nh),l("button",{class:"secondary-button",type:"button",onClick:h=>tu(c)}," Remove ",8,Ch)])]),r.collapsed===!0?(v(),b("div",kh,[r.kind==="wait"?(v(),b("span",xh,[s[98]||(s[98]=l("strong",null,"Wait",-1)),ce(" "+S(Number(r.delayMs||0))+" ms",1)])):(v(),b("span",Eh,[s[99]||(s[99]=l("strong",null,"Command",-1)),ce(" "+S(r.commandGA||"n/a"),1)])),r.kind!=="wait"?(v(),b("span",Gh,[s[100]||(s[100]=l("strong",null,"Status GA",-1)),ce(" "+S(r.statusGA||"n/a"),1)])):F("",!0),r.kind!=="wait"?(v(),b("span",Fh,[s[101]||(s[101]=l("strong",null,"Payload",-1)),ce(" "+S(vn(r.commandPayload,r.commandDPT)),1)])):F("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",Lh,[s[102]||(s[102]=l("strong",null,"Write timeout",-1)),ce(" "+S(Number(r.statusWriteTimeoutMs||0))+" ms",1)])):F("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("span",Mh,[s[103]||(s[103]=l("strong",null,"Response timeout",-1)),ce(" "+S(Number(r.statusResponseTimeoutMs||0))+" ms",1)])):F("",!0)])):(v(),b("div",Oh,[l("label",zh,[s[104]||(s[104]=l("span",null,"Title",-1)),me(l("input",{"onUpdate:modelValue":h=>r.title=h,type:"text",placeholder:"Step title"},null,8,$h),[[ke,r.title]])]),l("label",Bh,[s[105]||(s[105]=l("span",null,"Description",-1)),me(l("textarea",{"onUpdate:modelValue":h=>r.description=h,rows:"2",placeholder:"What this step checks"},null,8,Vh),[[ke,r.description]])]),r.kind==="wait"?(v(),b("label",Kh,[s[106]||(s[106]=l("span",null,"Wait ms",-1)),me(l("input",{"onUpdate:modelValue":h=>r.delayMs=h,type:"number",min:"0",max:"30000",step:"100"},null,8,Wh),[[ke,r.delayMs,void 0,{number:!0}]])])):F("",!0),r.kind!=="wait"?(v(),b("section",Uh,[s[111]||(s[111]=l("h4",null,"Command",-1)),l("div",jh,[l("label",Hh,[s[108]||(s[108]=l("span",null,"Command GA",-1)),me(l("select",{"onUpdate:modelValue":h=>r.commandGA=h,onChange:h=>zr(r)},[s[107]||(s[107]=l("option",{value:""},"Select command GA",-1)),(v(!0),b(q,null,ne(un.value,h=>(v(),b("option",{key:h.ga,value:h.ga},S(`${h.ga} | ${h.label}`),9,qh))),128))],40,Xh),[[Ta,r.commandGA]])]),l("label",Jh,[s[109]||(s[109]=l("span",null,"Command DPT",-1)),me(l("input",{"onUpdate:modelValue":h=>r.commandDPT=h,type:"text",placeholder:"1.001",onChange:h=>Is(r)},null,40,Zh),[[ke,r.commandDPT]])]),l("label",Yh,[s[110]||(s[110]=l("span",null,"Command payload",-1)),ua(r.commandDPT).length?me((v(),b("select",{key:0,"onUpdate:modelValue":h=>r.commandPayload=h},[(v(!0),b(q,null,ne(ua(r.commandDPT),h=>(v(),b("option",{key:`${r.id}-command-${h.value}`,value:String(h.value)},S(h.label),9,em))),128))],8,Qh)),[[Ta,r.commandPayload]]):me((v(),b("input",{key:1,"onUpdate:modelValue":h=>r.commandPayload=h,type:"text",placeholder:"true, false, 50"},null,8,tm)),[[ke,r.commandPayload]])])])])):F("",!0),r.kind!=="wait"?(v(),b("section",am,[s[116]||(s[116]=l("h4",null,"Status",-1)),l("div",sm,[l("label",nm,[s[113]||(s[113]=l("span",null,"Status GA",-1)),me(l("select",{"onUpdate:modelValue":h=>r.statusGA=h,onChange:h=>zr(r)},[s[112]||(s[112]=l("option",{value:""},"No feedback",-1)),(v(!0),b(q,null,ne(Ar.value,h=>(v(),b("option",{key:h.ga,value:h.ga},S(`${h.ga} | ${h.label}`),9,im))),128))],40,rm),[[Ta,r.statusGA]])]),l("label",om,[s[114]||(s[114]=l("span",null,"Status DPT",-1)),me(l("input",{"onUpdate:modelValue":h=>r.statusDPT=h,type:"text",placeholder:"1.001",onChange:h=>Is(r)},null,40,lm),[[ke,r.statusDPT]])]),l("label",um,[s[115]||(s[115]=l("span",null,"Expected payload",-1)),ua(r.statusDPT||r.commandDPT).length?me((v(),b("select",{key:0,"onUpdate:modelValue":h=>r.expectedPayload=h},[(v(!0),b(q,null,ne(ua(r.statusDPT||r.commandDPT),h=>(v(),b("option",{key:`${r.id}-expected-${h.value}`,value:String(h.value)},S(h.label),9,cm))),128))],8,dm)),[[Ta,r.expectedPayload]]):me((v(),b("input",{key:1,"onUpdate:modelValue":h=>r.expectedPayload=h,type:"text",placeholder:"Expected feedback value"},null,8,fm)),[[ke,r.expectedPayload]])])])])):F("",!0),r.kind!=="wait"&&r.statusGA?(v(),b("div",pm,[l("section",gm,[s[118]||(s[118]=l("h4",null,"Spontaneous Write From Status GA",-1)),s[119]||(s[119]=l("p",{class:"area-detail-subhead"},[ce("Wait for a spontaneous "),l("code",null,"GroupValue_Write"),ce(" telegram from the status GA.")],-1)),l("label",hm,[s[117]||(s[117]=l("span",null,"Status write timeout ms",-1)),me(l("input",{"onUpdate:modelValue":h=>r.statusWriteTimeoutMs=h,type:"number",min:"500",max:"60000",step:"100"},null,8,mm),[[ke,r.statusWriteTimeoutMs,void 0,{number:!0}]])])]),l("section",vm,[s[121]||(s[121]=l("h4",null,"Active Read Request To Status GA",-1)),s[122]||(s[122]=l("p",{class:"area-detail-subhead"},[ce("Send a "),l("code",null,"read"),ce(" telegram to the status GA and wait for a "),l("code",null,"GroupValue_Response"),ce(".")],-1)),l("label",bm,[s[120]||(s[120]=l("span",null,"Read response timeout ms",-1)),me(l("input",{"onUpdate:modelValue":h=>r.statusResponseTimeoutMs=h,type:"number",min:"500",max:"60000",step:"100"},null,8,ym),[[ke,r.statusResponseTimeoutMs,void 0,{number:!0}]])])])])):F("",!0),l("label",Am,[s[123]||(s[123]=l("span",null,"Reason",-1)),me(l("input",{"onUpdate:modelValue":h=>r.reason=h,type:"text",placeholder:"Why this step exists"},null,8,Sm),[[ke,r.reason]])])]))],42,wh))),128))])])):F("",!0)])],2)],2)):F("",!0),a.activeTab==="results"?(v(),b("section",Pm,[l("div",wm,[s[124]||(s[124]=l("div",null,[l("h2",null,"Test Results"),l("p",{class:"area-detail-subhead"},"Live and saved reports generated by KNX active and read-only tests.")],-1)),l("div",Tm,[l("span",_m,S(ia.value.length)+" available",1)])]),l("div",Dm,[l("article",Im,[s[125]||(s[125]=l("div",{class:"card-head"},[l("div",null,[l("h3",null,"Select Test Result"),l("p",{class:"area-detail-subhead"},"Choose a report to inspect metrics, detailed checks, and suggestions.")])],-1)),l("div",Rm,[(v(!0),b(q,null,ne(ia.value,r=>(v(),b("div",{key:r.id,class:"sidebar-result-row"},[l("button",{type:"button",class:fe(["area-list-item sidebar-result-item",{active:ae.value&&ae.value.id===r.id,running:r.live===!0}]),onClick:c=>Ds(r.id,{openMenu:!1,activateResultsTab:!0,resultOnly:!0})},[l("span",Cm,[l("strong",km,[r.live===!0?(v(),b("span",xm)):F("",!0),l("span",null,S(Ts(r)),1)]),l("span",{class:fe(["sidebar-result-status",`status-${r.overallStatus||"pass"}`])},S(r.overallStatus||"n/a"),3)]),l("span",Em,[ce(S(Ja(r)),1),r.live===!0?(v(),b("span",Gm," | running")):F("",!0)]),l("span",Fm,S(_s(r)||nt(r.generatedAt)),1),l("span",Lm,S(nt(r.generatedAt)),1)],10,Nm),l("button",{class:"sidebar-result-delete-button",type:"button",disabled:a.deletingTestResultId===r.id,onClick:Kt(c=>Sn(r.id),["stop"])},S(a.deletingTestResultId===r.id?"Deleting...":"Delete"),9,Mm)]))),128)),ia.value.length?F("",!0):(v(),b("p",Om,"No saved test results yet."))])]),ae.value?(v(),b("article",{key:0,ref_key:"testPlanReportRef",ref:bt,class:"area-detail"},[l("div",zm,[l("div",null,[l("h3",null,S(Ts(ae.value)),1),l("p",$m,S(_s(ae.value)||nt(ae.value.generatedAt)),1)]),l("div",Bm,[l("span",Vm,S(Ja(ae.value)),1),ae.value.live===!0?(v(),b("span",Km,[...s[126]||(s[126]=[l("span",{class:"running-spinner run-chip-spinner","aria-hidden":"true"},null,-1),l("span",null,"Running",-1)])])):F("",!0),l("span",Wm,S(ae.value.overallStatus),1),l("button",{class:"secondary-button",type:"button",onClick:_r}," Export PDF "),l("button",{class:"danger-button",type:"button",disabled:!ae.value||a.deletingTestResultId===ae.value.id,onClick:s[24]||(s[24]=r=>Sn(ae.value?.id))},S(a.deletingTestResultId===ae.value?.id?"Deleting...":"Delete"),9,Um),l("button",{class:"secondary-button",type:"button",onClick:xr}," Open Source Test ")])]),l("div",jm,[(v(!0),b(q,null,ne(mn(ae.value),r=>(v(),b("article",{key:r.label,class:"metric"},[l("span",null,S(r.label),1),l("strong",null,S(r.value),1)]))),128))]),l("div",Hm,[(v(!0),b(q,null,ne(Za(ae.value),r=>(v(),b("article",{key:r.id,class:fe(["report-check",`report-${r.status}`])},[l("div",Xm,[l("strong",null,S(r.title),1),l("span",null,S(r.status),1)]),l("p",qm,S(r.message||"No additional details available."),1),r.detailGroups?.length?(v(),b("div",Jm,[(v(!0),b(q,null,ne(r.detailGroups,c=>(v(),b("section",{key:`${r.id}-${c.title}`,class:"planner-check-section"},[l("h4",null,S(c.title),1),l("div",Zm,[(v(!0),b(q,null,ne(c.items,h=>(v(),b("span",{key:`${r.id}-${c.title}-${h.label}`},[l("strong",null,S(h.label),1),ce(" "+S(h.value),1)]))),128))])]))),128))])):(v(),b("div",Ym,[(v(!0),b(q,null,ne(r.details,c=>(v(),b("span",{key:`${r.id}-${c.label}`},[l("strong",null,S(c.label),1),ce(" "+S(c.value),1)]))),128))]))],2))),128))]),Za(ae.value).length?F("",!0):(v(),b("p",Qm,"No detailed entries stored for this report yet.")),Ya(ae.value).length?(v(),b("div",ev,[s[127]||(s[127]=l("h4",null,"Suggestions",-1)),l("ul",tv,[(v(!0),b(q,null,ne(Ya(ae.value),r=>(v(),b("li",{key:r},S(r),1))),128))])])):F("",!0)],512)):(v(),b("article",av,[...s[128]||(s[128]=[l("p",{class:"empty-state"},"No test result selected.",-1)])]))])])):F("",!0),a.activeTab==="overview"?(v(),b("section",sv,[l("div",nv,[s[129]||(s[129]=l("h2",null,"Top Group Addresses",-1)),l("span",rv,S(fn.value.length)+" visible",1)]),fn.value.length?(v(),b("ul",iv,[(v(!0),b(q,null,ne(fn.value,r=>(v(),b("li",{key:r.ga,class:"rank-row"},[l("span",ov,S(r.ga),1),l("span",lv,S(r.label||"Unlabeled"),1),l("strong",null,S(Number(r.count||0)),1)]))),128))])):(v(),b("p",uv,"No top group address data available yet."))])):F("",!0),a.activeTab==="overview"?(v(),b("section",dv,[l("div",cv,[s[130]||(s[130]=l("h2",null,"Event Mix",-1)),l("span",fv,S(ws.value.length)+" event types",1)]),ws.value.length?(v(),b("ul",pv,[(v(!0),b(q,null,ne(ws.value,r=>(v(),b("li",{key:r.name,class:"event-row"},[l("span",gv,S(r.name),1),l("div",hv,[l("span",{class:"event-bar-fill",style:cs({width:`${Math.max(r.count/rl.value*100,6)}%`})},null,4)]),l("strong",null,S(r.count),1)]))),128))])):(v(),b("p",mv,"Event distribution will appear after the first samples."))])):F("",!0),a.activeTab==="overview"?(v(),b("section",vv,[l("div",bv,[s[131]||(s[131]=l("h2",null,"Bus Connection Persistence",-1)),Qe.value?(v(),b("span",yv,S(String(Qe.value.currentState||"unknown")),1)):F("",!0)]),Qe.value?(v(),b(q,{key:0},[l("div",Av,[l("span",Sv,"Connected "+S(Me(Qe.value.connectedSec||0)),1),l("span",Pv,"Disconnected "+S(Me(Qe.value.disconnectedSec||0)),1),l("span",wv,"Coverage "+S(Number(Qe.value.knownCoveragePct||0))+"%",1)]),l("div",Tv,[(v(!0),b(q,null,ne(ll.value,r=>(v(),b("span",{key:r.key,class:fe(["bus-segment",r.className]),style:cs({left:r.left,width:r.width}),title:r.title},null,14,_v))),128))]),l("div",Dv,[l("span",null,S(Ke(Qe.value.windowStartAt)),1),l("span",null,S(Ke(Qe.value.windowEndAt)),1),s[132]||(s[132]=l("span",null,"Now",-1))]),s[133]||(s[133]=l("p",{class:"bus-note"},"Green shows time connected to the KNX bus. Red shows downtime inside the selected history window.",-1))],64)):(v(),b("p",Iv,"Waiting for connection persistence data..."))])):F("",!0),a.activeTab==="overview"?(v(),b("section",{key:7,ref_key:"flowCardRef",ref:dt,class:fe(["card card-flow",{"is-fullscreen":xt.value}])},[l("div",Rv,[s[134]||(s[134]=l("h2",null,"Flow Map",-1)),l("div",Nv,[l("span",Cv," Nodes "+S(la.value.nodes.length)+" | Links "+S(la.value.edges.length),1),l("button",{class:"secondary-button",type:"button",onClick:R},S(xt.value?"Exit Fullscreen":"Fullscreen"),1)])]),l("div",kv,[l("label",xv,[s[135]||(s[135]=l("span",null,"Max nodes",-1)),me(l("input",{"onUpdate:modelValue":s[25]||(s[25]=r=>a.flowMaxNodes=r),type:"number",min:"4",max:"32",step:"1"},null,512),[[ke,a.flowMaxNodes,void 0,{number:!0}]])]),l("label",Ev,[s[136]||(s[136]=l("span",null,"Find GA",-1)),me(l("input",{"onUpdate:modelValue":s[26]||(s[26]=r=>a.flowSearch=r),type:"text",placeholder:"Search GA or label"},null,512),[[ke,a.flowSearch]])]),l("div",Gv,[s[138]||(s[138]=l("span",null,"Select Nodes to Filter by",-1)),me(l("select",{"onUpdate:modelValue":s[27]||(s[27]=r=>a.flowSelectedGa=r),multiple:"",size:"5"},[(v(!0),b(q,null,ne(il.value,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}`),9,Fv))),128))],512),[[Ta,a.flowSelectedGa]]),l("label",Lv,[me(l("input",{"onUpdate:modelValue":s[28]||(s[28]=r=>a.flowShowUniversalNodes=r),type:"checkbox"},null,512),[[On,a.flowShowUniversalNodes]]),s[137]||(s[137]=l("span",null,"Show Universal Mode nodes",-1))])]),s[139]||(s[139]=wa('<div class="flow-legend" data-v-47555665><span data-v-47555665><i class="legend-line legend-write" data-v-47555665></i>Write</span><span data-v-47555665><i class="legend-line legend-response" data-v-47555665></i>Response</span><span data-v-47555665><i class="legend-line legend-read" data-v-47555665></i>Read</span><span data-v-47555665><i class="legend-line legend-repeat" data-v-47555665></i>Repeat</span><span data-v-47555665><i class="legend-dot legend-anomaly" data-v-47555665></i>Anomaly</span><span data-v-47555665><i class="legend-dot legend-external" data-v-47555665></i>External</span></div>',1))]),l("div",Mv,[la.value.nodes.length?(v(),b("svg",{key:0,class:"flow-svg",viewBox:`0 0 ${la.value.width} ${la.value.height}`,preserveAspectRatio:"xMidYMid meet"},[l("defs",null,[(v(),b(q,null,ne(u,(r,c)=>l("marker",{id:`flow-arrow-${c}`,key:c,viewBox:"0 0 10 8",markerWidth:"10",markerHeight:"8",refX:"8.8",refY:"4",orient:"auto",markerUnits:"userSpaceOnUse"},[l("path",{d:"M0,0 L10,4 L0,8 z",fill:r},null,8,$v)],8,zv)),64))]),(v(!0),b(q,null,ne(la.value.edges,r=>(v(),b("path",{key:r.key,class:fe(["flow-edge",{"flow-edge-active":r.active,"flow-edge-idle":!r.active}]),d:r.d,stroke:r.color,"stroke-width":r.width,opacity:r.opacity,"marker-end":`url(#${r.markerId})`},[l("title",null,S(r.tooltip),1)],10,Bv))),128)),(v(!0),b(q,null,ne(la.value.nodes,r=>(v(),b("g",{key:r.id,class:fe(["flow-node",{"is-anomaly":r.anomalyCount>0,"is-external":!r.inFlow,"is-idle":r.isIdle}])},[l("circle",{cx:r.x,cy:r.y,r:"24"},null,8,Vv),l("text",{class:"node-label",x:r.x,y:r.y+1},S(r.shortLabel),9,Kv),r.shortSubtitle?(v(),b("text",{key:0,class:"node-subtitle",x:r.x,y:r.y+38},S(r.shortSubtitle),9,Wv)):F("",!0),r.shortPayload?(v(),b("text",{key:1,class:"node-payload",x:r.x,y:r.y+52},S(r.shortPayload),9,Uv)):F("",!0),r.anomalyCount>0?(v(),b("text",{key:2,class:"node-badge",x:r.x,y:r.y-30},"anomaly x"+S(r.anomalyCount),9,jv)):F("",!0),l("title",null,S(`${r.id}${r.subtitle?` | ${r.subtitle}`:""}${r.payload?` | payload: ${r.payload}`:""}`),1)],2))),128))],8,Ov)):(v(),b("p",Hv,"No topology data available yet."))]),l("p",Xv,"Window "+S(la.value.telemetryWindowSec||0)+"s.",1)],2)):F("",!0),a.activeTab==="overview"?(v(),b("section",qv,[l("div",Jv,[s[140]||(s[140]=l("h2",null,"Anomalies",-1)),l("span",Zv,S(cn.value.length)+" recent",1)]),cn.value.length?(v(),b("div",Yv,[(v(!0),b(q,null,ne(cn.value.slice(0,20),r=>(v(),b("article",{key:`${r.at}-${va(r).ga||""}`,class:"anomaly-card"},[l("div",Qv,[l("strong",null,S(va(r).type||"anomaly"),1),l("span",null,S(va(r).ga||"no GA"),1)]),l("p",eb,S(r.at||""),1),l("pre",null,S(JSON.stringify(va(r),null,2)),1)]))),128))])):(v(),b("p",tb,"No anomalies detected right now."))])):F("",!0),a.activeTab==="assistant"?(v(),b("section",ab,[l("div",sb,[s[141]||(s[141]=l("h2",null,"Ask",-1)),l("span",nb,S(ra.value.llmEnabled?"AI enabled":"AI disabled"),1)]),l("div",rb,[(v(!0),b(q,null,ne(ul.value,r=>(v(),b("article",{key:r.key,class:fe(["chat-message",`chat-${r.kind}`])},[r.kind==="assistant"?(v(),b("div",{key:0,innerHTML:r.html},null,8,ib)):(v(),b("pre",ob,S(r.rawText),1))],2))),128)),a.asking?(v(),b("article",lb,[...s[142]||(s[142]=[l("span",{class:"chat-pending-spinner","aria-hidden":"true"},null,-1),l("span",null,"Thinking...",-1)])])):F("",!0)]),l("div",ub,[(v(),b(q,null,ne(t,r=>l("button",{key:r,class:"preset-button",type:"button",disabled:a.asking||!ra.value.llmEnabled,onClick:c=>Pn(r)},S(r),9,db)),64))]),l("div",cb,[me(l("input",{"onUpdate:modelValue":s[29]||(s[29]=r=>a.chatDraft=r),class:"ask-input",type:"text",disabled:a.asking||!ra.value.llmEnabled,placeholder:"Ask a question about KNX traffic...",onKeydown:s[30]||(s[30]=Wc(Kt(r=>Pn(),["prevent"]),["enter"]))},null,40,fb),[[ke,a.chatDraft]]),l("button",{class:"primary-button",type:"button",disabled:a.asking||!ra.value.llmEnabled,onClick:s[31]||(s[31]=r=>Pn())}," Send ",8,pb)])])):F("",!0),a.activeTab==="settings"?(v(),b("section",gb,[s[149]||(s[149]=l("div",{class:"card-head"},[l("div",null,[l("h2",null,"Settings"),l("p",{class:"area-detail-subhead"},"Manage node options and full configuration import/export.")])],-1)),l("div",hb,[l("button",{class:fe(["settings-tab-button",{active:a.settingsTab==="node"}]),type:"button",onClick:s[32]||(s[32]=r=>kr("node"))}," KNX AI Node ",2),l("button",{class:fe(["settings-tab-button",{active:a.settingsTab==="config"}]),type:"button",onClick:s[33]||(s[33]=r=>kr("config"))}," Import / Export ",2)]),a.settingsTab==="node"?(v(),b("article",mb,[s[145]||(s[145]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"KNX AI Node"),l("span",{class:"meta-chip"},"Runtime preferences")],-1)),s[146]||(s[146]=l("p",{class:"area-detail-subhead"},"Select the node used by this UI and control refresh behavior.",-1)),l("div",vb,[l("label",bb,[s[143]||(s[143]=l("span",null,"Node",-1)),me(l("select",{"onUpdate:modelValue":s[34]||(s[34]=r=>a.selectedNodeId=r),class:"node-select",onChange:Sl},[(v(!0),b(q,null,ne(a.nodes,r=>(v(),b("option",{key:r.id,value:r.id},S(`${r.name||"KNX AI"}${r.gatewayName?` | ${r.gatewayName}`:""}`),9,yb))),128))],544),[[Ta,a.selectedNodeId]])]),l("label",Ab,[me(l("input",{"onUpdate:modelValue":s[35]||(s[35]=r=>a.autoRefresh=r),type:"checkbox"},null,512),[[On,a.autoRefresh]]),s[144]||(s[144]=l("span",null,"Auto refresh",-1))])])])):(v(),b("article",Sb,[s[147]||(s[147]=l("div",{class:"card-head settings-panel-head"},[l("h3",null,"Import / Export"),l("span",{class:"meta-chip"},"Full configuration")],-1)),s[148]||(s[148]=l("p",{class:"area-detail-subhead"},"Export or import the full KNX AI configuration for the selected node.",-1)),l("div",Pb,[l("button",{class:"secondary-button",type:"button",disabled:!a.selectedNodeId,onClick:bu}," Export Configuration ",8,wb),l("button",{class:"secondary-button",type:"button",disabled:!a.selectedNodeId,onClick:yu}," Import Configuration ",8,Tb)])])),l("input",{ref_key:"configImportRef",ref:Qt,type:"file",accept:"application/json,.json",class:"hidden-file-input",onChange:Au},null,544)])):F("",!0)])]),a.areaLlmRegenerating||a.areaLlmBulkDeleting?(v(),b("div",_b,[l("div",Db,[s[150]||(s[150]=l("span",{class:"running-spinner global-wait-spinner","aria-hidden":"true"},null,-1)),l("strong",null,S(a.areaLlmBulkDeleting?"Deleting AI Areas":"Regenerating AI Areas"),1),l("span",null,S(a.areaLlmBulkDeleting?"Please wait while AI-generated areas are removed.":"Please wait, this can take a while with large ETS projects."),1)])])):F("",!0),a.testPlanRunConfirmOpen?(v(),b("div",{key:1,class:"modal-backdrop",onClick:$r},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"run-test-title",onClick:s[37]||(s[37]=Kt(()=>{},["stop"]))},[s[151]||(s[151]=l("h3",{id:"run-test-title"},"Start test?",-1)),l("p",Ib,S(a.testPlanRunMode==="repeat"?"This will send real telegrams on the KNX bus and repeat the selected test plan until you press Stop Repeat.":"This will send real telegrams on the KNX bus for the selected test plan."),1),l("div",Rb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:$r}," Cancel "),l("button",{class:"primary-button",type:"button",disabled:a.testPlanRunning,onClick:s[36]||(s[36]=r=>vu(a.testPlanRunMode))}," Start Test ",8,Nb)])])])):F("",!0),a.testPlanUnsavedConfirmOpen?(v(),b("div",{key:2,class:"modal-backdrop",onClick:Vr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-plan-title",onClick:s[39]||(s[39]=Kt(()=>{},["stop"]))},[s[152]||(s[152]=l("h3",{id:"unsaved-plan-title"},"Unsaved changes",-1)),l("p",Cb,"Save or discard the current plan changes before opening "+S(a.testPlanPendingActionLabel||"another plan")+".",1),l("div",kb,[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Vr}," Stay Here "),l("button",{class:"secondary-button",type:"button",onClick:s[38]||(s[38]=r=>{cu(),Kr()})}," Discard Changes "),l("button",{class:"primary-button",type:"button",disabled:a.testPlanSaving||!a.testPlanDraft,onClick:fu},S(a.testPlanSaving?"Saving...":"Save and Continue"),9,xb)])])])):F("",!0),a.areaUnsavedConfirmOpen?(v(),b("div",{key:3,class:"modal-backdrop",onClick:Cr},[l("div",{class:"modal-card",role:"dialog","aria-modal":"true","aria-labelledby":"unsaved-area-title",onClick:s[40]||(s[40]=Kt(()=>{},["stop"]))},[s[153]||(s[153]=l("h3",{id:"unsaved-area-title"},"Unsaved changes",-1)),s[154]||(s[154]=l("p",{class:"area-detail-subhead"},"Discard the current area changes and close the editor?",-1)),l("div",{class:"modal-actions"},[l("button",{class:"secondary-button",type:"button",autofocus:"",onClick:Cr}," Stay Here "),l("button",{class:"primary-button",type:"button",onClick:Il}," Discard and Close ")])])])):F("",!0)],2)],64))}},Ob=ef(Mb,[["__scopeId","data-v-47555665"]]);Hc(Ob).mount("#app");export{Yc as _};