@microtronics/studio-cli 1.3.0-alpha.6 → 1.3.0-alpha.8

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.
package/dist/main.js CHANGED
@@ -2639,7 +2639,7 @@ ${S0}
2639
2639
  `).forEach(c=>{this.onConsole(c)}),x=""}for(let v=r.length-1;v>=0;v--)Date.now()>r[v].start+$d&&r.splice(v,1)}}isHex(x){return/^[a-fA-F0-9]*$/.test(x)}onConsole(x){if(!(x[0]===""&&x[1]==="#"&&x.length<10)){if(x[0]===""&&x[1]==="."&&x.length<10050){let[e,A]=x.substr(2).split("=");if(e.length>1&&e.length<50){["~~","~h","~g","~i","~r","~s"].includes(e)||(this.emit("#watch",{key:e,value:A,date:new Date}),this.logger.debug(`#watch ${e} = ${A}`));return}}this.formatConsoleLine(x)}}process_x01(x,e){if(x.length<11)return;let A=x.substr(1,4);if(!this.isHex(A))return;let r=x.substr(-5,4);if(!this.isHex(r))return;let t=parseInt(A,16),s=parseInt(r,16),i=65535&(e<0?0:t-e),v=65535&s-t-x.length;if(i&&this.onConsole(`?console - x01 ${i} characters lost`),e=s,v){this.onConsole(`?console - x01 ${v} characters lost (dropped "${x}")`);return}this.onConsole(x[0]+x.slice(5,-5))}dispose(){this.atHandler.off("data",this.dataHandler),this.removeAllListeners()}},Ud=require("events"),Hd=3e4,Kd=45e3,Wd=6e4,Jd=6e5,xv=class extends Error{constructor(x){super(`?liveMode.keepalive-timeout.${x}`),X(this,"timeoutMs",x),this.name="LiveModeHandshakeTimeoutError"}},Jr=class extends Error{constructor(){super("?liveMode.stopped"),this.name="LiveModeStoppedError"}},zd=class extends Ud.EventEmitter{constructor(x){super(),X(this,"utoMaster"),X(this,"resolveContainer"),X(this,"histdataRawTag"),X(this,"keepaliveTimeoutMs"),X(this,"stallMs"),X(this,"expiryMs"),X(this,"inactivityMs"),X(this,"syncHandshakeOnStart"),X(this,"logger"),X(this,"now"),X(this,"records",new Map),X(this,"currentState","idle"),X(this,"attached",!1),X(this,"keepaliveTimer",null),X(this,"stallTimer",null),X(this,"inactivityTimer",null),X(this,"keepaliveWaiter",null),X(this,"stopping",null),X(this,"starting",null),X(this,"generation",0),X(this,"onLiveData",e=>this.ingest(e,!0)),X(this,"onUnsolicited",e=>this.ingest(e,!1)),X(this,"onEsc",e=>this.handleEsc(e)),this.utoMaster=x.utoMaster,this.resolveContainer=x.resolveContainer,this.histdataRawTag=x.histdataRawTag??26623,this.keepaliveTimeoutMs=x.keepaliveTimeoutMs??Hd,this.stallMs=x.stallMs??Kd,this.expiryMs=x.expiryMs??Wd,this.inactivityMs=x.inactivityMs??Jd,this.syncHandshakeOnStart=x.syncHandshakeOnStart??!0,this.logger=x.logger??GA,this.now=x.now??(()=>Date.now())}get state(){return this.currentState}connected(){return this.currentState==="live"}async start(){if(this.currentState==="starting")return this.refresh(),this.starting??void 0;if(this.currentState==="live"||this.currentState==="stalled"){this.refresh();return}if(this.currentState==="stopping")throw new Jr;return this.attach(),this.starting=this.runStart(++this.generation),this.starting.catch(()=>{}),this.armInactivity(),this.setState("starting"),this.starting}async runStart(x){try{this.syncHandshakeOnStart&&await this.syncPrelude(x),await this.awaitKeepalive(),this.assertCurrent(x),await this.utoMaster.sendEsc(4),this.assertCurrent(x)}catch(e){let A=e instanceof Error?e:new Error(String(e));throw this.generation!==x?A instanceof Jr?A:new Jr:(this.starting=null,this.teardown(),this.currentState!=="idle"&&this.setState("idle"),A instanceof Jr||(this.logger.warn("LiveModeSession: handshake failed",A.message),this.emit("error",A)),A)}this.starting=null,this.setState("live"),this.currentState==="live"&&this.armStall()}assertCurrent(x){if(this.generation!==x)throw new Jr}refresh(){this.currentState!=="idle"&&this.armInactivity()}async stop(){if(this.currentState==="idle")return;if(this.stopping&&this.currentState==="stopping")return this.stopping;let x=++this.generation;this.starting=null,this.setState("stopping");let e=this.runStop(x).finally(()=>{this.stopping===e&&(this.stopping=null)});return this.stopping=e,this.stopping}latest(x){let e=this.records.get(x);if(e)return this.now()-e.receivedAt>this.expiryMs?void 0:e}dispose(){this.generation++,this.teardown(),this.currentState="idle",this.stopping=null,this.starting=null,this.removeAllListeners()}async runStop(x){try{await this.utoMaster.sendEsc(5)}catch(e){this.logger.warn("LiveModeSession: LIVE_OFF failed",e)}this.generation===x&&(this.teardown(),this.setState("idle"))}ingest(x,e){try{this.handleFrame(x,e)}catch(A){this.logger.warn("LiveModeSession: frame handling threw \u2014 dropping frame",A)}}handleFrame(x,e){if(this.currentState==="idle"||this.currentState==="stopping")return;if(x.wTagFull!==this.histdataRawTag){this.logger.info(`LiveModeSession: dropping frame with tag 0x${x.wTagFull.toString(16)} (not histdata raw)`);return}if(!x.data||x.data.byteLength===0){this.logger.info("LiveModeSession: dropping empty live frame");return}let A=new Uint8Array(x.data.buffer.slice(x.data.byteOffset,x.data.byteOffset+x.data.byteLength)),r=null;try{r=this.resolveContainer(A)}catch(i){this.logger.warn("LiveModeSession: resolveContainer threw \u2014 dropping frame",i);return}if(!r){this.logger.info(`LiveModeSession: no <split> matches live record key 0x${A[0].toString(16)}`);return}let t=this.records.get(r);if(t&&x.stamp<=t.stamp40){this.logger.debug(`LiveModeSession: ignoring stale/duplicate record for ${r}`);return}let s={container:r,tag:x.wTagFull,stamp40:x.stamp,stampMs:W0.stamp40ToMS(x.stamp),data:A,live:e,receivedAt:this.now()};this.records.set(r,s),this.currentState==="stalled"&&this.setState("live"),this.currentState==="live"&&this.armStall(),this.emit("record",s)}handleEsc(x){if(x!==1)return;let e=this.keepaliveWaiter;e&&(this.keepaliveWaiter=null,this.clear("keepaliveTimer"),e.resolve())}async syncPrelude(x){let e=await this.utoMaster.requestDeviceInfo();this.assertCurrent(x),e||this.logger.warn("LiveModeSession: requestDeviceInfo returned null \u2014 continuing");let A=await this.utoMaster.requestStamps();this.assertCurrent(x),A||this.logger.warn("LiveModeSession: requestStamps returned null \u2014 continuing");let r=await this.utoMaster.requestContext();if(this.assertCurrent(x),!r){this.logger.warn("LiveModeSession: requestContext returned null \u2014 skipping writeContext");return}await this.utoMaster.writeContext(r),this.assertCurrent(x)}awaitKeepalive(){return new Promise((x,e)=>{this.keepaliveWaiter={resolve:x,reject:e},this.keepaliveTimer=setTimeout(()=>{this.keepaliveTimer=null,this.keepaliveWaiter=null,e(new xv(this.keepaliveTimeoutMs))},this.keepaliveTimeoutMs)})}armStall(){this.clear("stallTimer"),this.stallTimer=setTimeout(()=>{this.stallTimer=null,this.currentState==="live"&&(this.logger.warn(`LiveModeSession: no live frame for ${this.stallMs} ms`),this.setState("stalled"))},this.stallMs)}armInactivity(){this.clear("inactivityTimer"),this.inactivityTimer=setTimeout(()=>{this.inactivityTimer=null,this.logger.info("LiveModeSession: inactivity timeout \u2014 stopping live mode"),this.stop()},this.inactivityMs)}attach(){this.attached||(this.attached=!0,this.utoMaster.on("liveData",this.onLiveData),this.utoMaster.on("unsolicitedFrame",this.onUnsolicited),this.utoMaster.on("esc",this.onEsc))}detach(){this.attached&&(this.attached=!1,this.utoMaster.removeListener("liveData",this.onLiveData),this.utoMaster.removeListener("unsolicitedFrame",this.onUnsolicited),this.utoMaster.removeListener("esc",this.onEsc))}teardown(){this.clear("keepaliveTimer"),this.clear("stallTimer"),this.clear("inactivityTimer");let x=this.keepaliveWaiter;this.keepaliveWaiter=null,x?.reject(new Jr),this.detach(),this.records.clear()}clear(x){let e=this[x];e!==null&&(clearTimeout(e),this[x]=null)}setState(x){this.currentState!==x&&(this.currentState=x,this.logger.debug(`LiveModeSession: state \u2192 ${x}`),this.emit("state",x))}};function Ie(x){return parseInt(x.slice(6),16)}function me(x){return"400000"+x.toString(16).toUpperCase().padStart(10,"0")}function ev(x){return x?new Uint8Array(x):null}function Ln(x){return{...x,data:ev(x.data)}}function ds(x){return{...x,data:ev(x.data)}}var Vd=/^400000[0-9A-F]{10}$/;function t8(x,e){if(!Vd.test(e))throw new Error(`MemoryStorage: uto_data row for tag ${x} has non-canonical stamp "${e}"; expected 16-char uppercase hex output of stamp40ToDbHex ("400000" + 10 hex digits)`)}var Xd=class Av{constructor(){X(this,"metadata",new Map),X(this,"utoData",new Map),X(this,"changeRequests",[]),X(this,"files",new Map)}async getMetadataValue(e){return this.metadata.get(e)??null}async setMetadataValue(e,A){this.metadata.set(e,A)}async deleteMetadataValue(e){this.metadata.delete(e)}async getUtoDataTags(){return[...this.utoData.keys()]}async getLatestStampForTag(e){let A=this.utoData.get(e);return!A||A.size===0?null:[...A.keys()].sort().at(-1)}async getRowForTag(e){let A=await this.getLatestStampForTag(e);return A===null?null:Ln(this.utoData.get(e).get(A))}async replaceUtoRow(e){t8(e.tag,e.stamp),this.utoData.set(e.tag,new Map([[e.stamp,Ln(e)]]))}async insertHistoricRows(e){for(let A of e){t8(A.tag,A.stamp);let r=this.utoData.get(A.tag);r||(r=new Map,this.utoData.set(A.tag,r)),r.has(A.stamp)||r.set(A.stamp,Ln(A))}}async getHistoricRows(e,A){let r=this.utoData.get(e);if(!r)return[];let t=[...r.values()];if(A.fromStamp!==void 0){let i=A.fromStamp;t=t.filter(v=>v.stamp>=i)}if(A.untilStamp!==void 0){let i=A.untilStamp;t=t.filter(v=>v.stamp<=i)}t.sort((i,v)=>A.order==="desc"?v.stamp.localeCompare(i.stamp):i.stamp.localeCompare(v.stamp));let s=A.offset??0;return t.slice(s,s+A.limit).map(Ln)}async getUtoChangeRequests(){return[...this.changeRequests].sort((e,A)=>e.tag-A.tag||e.stamp.localeCompare(A.stamp)).map(e=>({...e}))}async insertUtoChangeRequests(e){for(let A of e)this.changeRequests.push({tag:A.tag,stamp:me(A.stamp40),user:A.user??"",json:A.json})}async clearUtoChangeRequests(){this.changeRequests=[]}async getFiles(){return[...this.files.values()].map(ds)}async getFile(e){let A=this.files.get(e);return A?ds(A):null}async upsertFile(e){this.files.set(e.filename,ds(e))}async deleteFile(e){this.files.delete(e)}toJSON(){let e=[];for(let A of this.utoData.values())for(let r of A.values())e.push({tag:r.tag,stamp:r.stamp,flags:r.flags,site_related:r.site_related,data:r.data?Yn(r.data):null});return{metadata:Object.fromEntries(this.metadata),utoData:e,changeRequests:this.changeRequests.map(A=>({...A})),files:[...this.files.values()].map(A=>({filename:A.filename,stamp:A.stamp,crc:A.crc,size:A.size,flags:A.flags,flags_int:A.flags_int,data:A.data?Yn(A.data):null}))}}static fromJSON(e){let A=new Av;for(let[r,t]of Object.entries(e.metadata??{}))A.metadata.set(r,t);for(let r of e.utoData??[]){let t=A.utoData.get(r.tag);t||(t=new Map,A.utoData.set(r.tag,t)),t.set(r.stamp,{tag:r.tag,stamp:r.stamp,flags:r.flags,site_related:r.site_related,data:r.data?Rs(r.data,`uto_data.data of tag ${r.tag}`):null})}A.changeRequests=(e.changeRequests??[]).map(r=>({...r}));for(let r of e.files??[])A.files.set(r.filename,{filename:r.filename,stamp:r.stamp,crc:r.crc,size:r.size,flags:r.flags,flags_int:r.flags_int,data:r.data?Rs(r.data,`files.data of "${r.filename}"`):null});return A}},Yd=new Set(["link","unknown"]);function zt(x){return Yd.has(x)}var rv=-2;function UA(x){return x.index===rv}var Qd=65535,n8={configa:4294928218,configb:4294928219,configc:4294928220};function Aa(x){let e=x.toLowerCase();if(e==="histdata"||e==="histdata0")return"histdata0";let A=/^rm2mconfig([0-9a-c])$/.exec(e);return A?`config${A[1]}`:x}function Zn(x){let e=Aa(x.trim()).toLowerCase();return Object.prototype.hasOwnProperty.call(n8,e)?n8[e]:W0.containerIdToTag(e,!1)}function Ht(x){return Zn(x.name)}function Zd(x,e){let A=x.byNameOrAlias(e);return Zn(A?A.name:e)}function tv(x){return Number.isInteger(x)&&x>=0&&x<=Qd}var xu={u8:"u8",s8:"s8",u16:"u16",s16:"s16",u32:"u32",s32:"s32",s64:"s64",f32:"f32",f64:"f64",floatm16:"floatm16",stamp4:"stamp4",stamp:"stamp",stamp8:"stamp8",datetime:"datetime",ufm8:"ufm8",link:"link",string:"string",float:"f32",float32:"f32",float64:"f64",char:"string",bint:"s8",wint:"s16",dint:"s32",qint:"s64",byte:"u8",word:"u16",dword:"u32",time_span:"s64"};function eu(x){return x===void 0?"unknown":xu[x.toLowerCase()]??"unknown"}var Au={u8:1,s8:1,u16:2,s16:2,floatm16:2,u32:4,s32:4,f32:4,stamp4:4,stamp:5,stamp8:8,datetime:8,ufm8:1,link:0,unknown:0,s64:8,f64:8},ru=new Set(["name","alias","title","index","byteofs","type","max","decpl","vscale","vofs","units","editmask","view","edit","default","bitmask"]),ra="name",tu="type";function nu(x){let e=x.indexOf("=");return{key:x.slice(0,e).trim().toLowerCase(),value:x.slice(e+1).trim()}}function iu(x){return/^config[0-9]$/.test(x)||/^config[A-C]$/i.test(x)?"config":/^histdata[0-9]$/.test(x)?"histdata":"other"}function zr(x,e){let A=x.get(e);if(A===void 0)return;let r=parseInt(A,10);return Number.isNaN(r)?void 0:r}function su(x){let e=x.get("bitmask");if(e===void 0)return;let A=e.startsWith("$")?e.slice(1):e,r=parseInt(A,16);return Number.isNaN(r)?void 0:r}var au=/^(.*?)%(config[0-9a-fA-F])%(.+)$/;function nv(x){let e=au.exec(x);if(!e)return{};let A=e[1],r=A===""?NaN:Number(A);return{ref:{container:e[2],field:e[3]},prefixValue:Number.isFinite(r)?r:void 0}}function ou(x){let e=x.get("vscale");if(e===void 0)return{value:1};let A=nv(e);if(A.ref)return{value:A.prefixValue??1,ref:A.ref};let r=Number(e);return Number.isFinite(r)?{value:r}:{value:1}}function Fu(x){let e=x.get("vofs");if(e===void 0)return{value:0};let A=nv(e);if(A.ref)return{value:A.prefixValue??0,ref:A.ref};let r=Number(e);return Number.isFinite(r)?{value:r}:{value:0}}function vu(x,e){return x==="string"?e??0:Au[x]}function fu(x){let e={};for(let[A,r]of x)ru.has(A)||(e[A]=r);return e}function lu(x,e,A){let r=eu(x.get(tu)),t=zr(x,"max"),s=vu(r,t),i=e.fields[e.fields.length-1],c=zr(x,"byteofs")??(i?i.byteofs+i.size:e.kind==="histdata"?1:0),B=e.fields.length,p=x.get(ra)??(e.kind==="histdata"?`ch${B}`:`field${B}`),b=ou(x),h=Fu(x),w=zr(x,"index");return{name:p,alias:x.get("alias"),title:x.get("title"),index:w,sortIndex:w??A,byteofs:c,type:r,size:s,max:t,decpl:zr(x,"decpl"),vscale:b.value,vofs:h.value,vscaleRef:b.ref,vofsRef:h.ref,units:x.get("units"),editmask:x.get("editmask"),view:zr(x,"view"),edit:zr(x,"edit"),default:x.get("default"),bitmask:su(x),attrs:fu(x)}}function cu(){return{name:"",kind:"other",fields:[],recordSize:0}}function Eu(x,e,A){switch(e){case ra:{let r=Aa(A);x.name=r,x.kind=iu(r);break}case"alias":x.alias=A;break;case"title":x.title=A;break;case"upload":x.upload=parseInt(A,10);break;case"download":x.download=parseInt(A,10);break;case"edit":x.edit=parseInt(A,10);break;default:break}}function Cu(x){if(!x.name)throw new Error("?dde.table-without-name");x.recordSize=x.fields.filter(e=>!zt(e.type)).reduce((e,A)=>Math.max(e,A.byteofs+A.size),0),x.fields.sort((e,A)=>e.sortIndex-A.sortIndex)}function Bu(x){if(x==="*")return{keyBytes:[],matchAll:!0};let e=x.slice(0,2).toLowerCase()==="0x"?x.slice(2):x;e.length%2!==0&&(e=`0${e}`);let A=[];for(let r=0;r<e.length;r+=2){let t=parseInt(e.slice(r,r+2),16);A.push(Number.isNaN(t)?0:t)}return{keyBytes:A,matchAll:!1}}function du(x){return x.toLowerCase()==="histdata28"?"applog0":Aa(x)}function uu(x){let{keyBytes:e,matchAll:A}=Bu(x.get("key")??"00");return{source:x.get("source")??"",target:du(x.get("target")??""),key:e[0]??0,keyBytes:e,matchAll:A,keepraw:zr(x,"keepraw")}}function Du(x,e){return{containers:x,splits:e,byNameOrAlias(A){let r=A.toLowerCase();return x.find(t=>t.name.toLowerCase()===r||(t.alias??"").toLowerCase()===r)??null}}}function pu(x,e){switch(e){case"<table>":return x.container=cu(),x.expectName=!0,!0;case"</table>":return x.container&&(Cu(x.container),x.containers.push(x.container)),x.container=null,!0;case"<field>":return x.field=new Map,!0;case"</field>":return x.container&&x.field&&x.container.fields.push(lu(x.field,x.container,x.line)),x.field=null,!0;case"<split>":return x.split=new Map,!0;case"</split>":return x.split&&x.splits.push(uu(x.split)),x.split=null,!0;default:return!1}}function bu(x,e){let{key:A,value:r}=nu(e);if(x.split)x.split.set(A,r);else if(x.field)x.field.set(A,r);else if(x.container){if(x.expectName&&A!==ra)throw new Error(`?dde.first-table-attr-not-name."${A}"`);x.expectName=!1,Eu(x.container,A,r)}}function mu(x){let e={containers:[],splits:[],container:null,field:null,split:null,expectName:!1,line:0};for(let[A,r]of x.replace(/\r\n/g,`
2640
2640
  `).replace(/\r/g,`
2641
2641
  `).split(`
2642
- `).entries()){e.line=A;let t=r.trim();t===""||t.startsWith("//")||pu(e,t)||t.includes("=")&&bu(e,t)}return Du(e.containers,e.splits)}var iv=null,ju=4;function Yr(x){let e=new Date(x),A=(r,t)=>r.toString().padStart(t,"0");return A(e.getUTCFullYear(),4)+A(e.getUTCMonth()+1,2)+A(e.getUTCDate(),2)+A(e.getUTCHours(),2)+A(e.getUTCMinutes(),2)+A(e.getUTCSeconds(),2)+A(e.getUTCMilliseconds(),3)}function xt(x){let e=x.trim();if(e==="*")return iv;if(!/^\d{4,17}$/.test(e))throw new Error(`?apiStamp.invalid-input."${x}"`);let A=(p,b,h)=>{let w=e.slice(p,p+b);return parseInt(w.length?w.padEnd(b,"0"):h,10)},r=parseInt(e.slice(0,ju),10),t=e.length>=6?A(4,2,"01"):1,s=e.length>=8?A(6,2,"01"):1,i=A(8,2,"00"),v=A(10,2,"00"),c=A(12,2,"00"),B=A(14,3,"000");return Date.UTC(r,t-1,s,i,v,c,B)}var Vt="NAN",hu="%HEX%",gu=65535,ta=class extends Error{constructor(x){super(`?ddeCodec.unknown-alias."${x}"`),X(this,"alias",x),this.name="DdeUnknownAliasError"}};function ai(x){return(x.alias??x.name).toLowerCase()}function oi(x){return x==="string"}function na(x){return x==="stamp"||x==="stamp4"||x==="stamp8"||x==="datetime"}function sv(x){return(x.editmask??"").toUpperCase()===hu}function yu(x,e){return e===void 0||!Number.isFinite(x)?x:ia(x,e)}function ia(x,e){if(!Number.isFinite(x))return x;let A=10**e;return Math.sign(x)*Math.round(Math.abs(x)*A)/A}function ku(x,e){if(!Number.isFinite(x)||x===0)return x;let A=Math.abs(x),r=Math.floor(Math.log10(A));return 10**(r+1)<=A?r+=1:10**r>A&&(r-=1),ia(x,e-1-r)}function wu(x){return x==="floatm16"||x==="f32"||x==="f64"}function _u(x,e){if(!Number.isFinite(e))return e;let A=x.decpl??(wu(x.type)?9:0),r=ia(e,A),t=x.type==="floatm16"?3:x.type==="f32"?7:15;return ku(r,t)}function xi(x,e){let A=BigInt.asUintN(64,BigInt(Math.trunc(x))),r=BigInt.asUintN(64,BigInt(Math.trunc(e))),t=0n,s=1n;for(;r!==0n;)r&1n&&(A&1n&&(t|=s),s<<=1n),A>>=1n,r>>=1n;return Number(t)}function av(x,e,A){let r=BigInt.asUintN(64,BigInt(Math.trunc(x))),t=BigInt.asUintN(64,BigInt(Math.trunc(e))),s=BigInt.asUintN(64,BigInt(Math.trunc(A))),i=1n;for(;s!==0n;)s&1n&&(r=t&1n?r|i:r&~i,t>>=1n),s>>=1n,i<<=1n;return Number(r)}var Su=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function ei(x){return!!x.bitmask&&Su.has(x.type)}var ov=255,Fv=254,vv=253,fv=252,lv=251,Tu=207,sa=65535,Ai=65534,aa=65533,oa=65532,Fa=65531;function Ru(x){switch(x){case ov:return sa;case Fv:return Ai;case vv:return aa;case fv:return oa;case lv:return Fa;default:return x<=31?x:x>Tu?Ai:(x&15|16)<<(x>>4)-1}}function Pu(x){switch(x){case sa:return ov;case Ai:return Fv;case aa:return vv;case oa:return fv;case Fa:return lv;default:{if(x<=31)return x;let e=1,A=x;for(;(A&65504)>0;)A>>=1,e++;return e<<4|A&15}}}var ri=1023,qs=31,cv=127,us=8388607,Iu=255,Ms=15,Ou=-14,i8=15;function Ev(x){let e=(x&ri)<<13,A=(x&31744)>>10;if(A===qs)return Bv(1024-(x&ri));A!==0&&(A=A-Ms+4+cv);let r=(e|A<<23)>>>0;x&32768&&(r=(r|2147483648)>>>0);let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,r),t.getFloat32(0)}function Cv(x){if(typeof x=="string"||Number.isNaN(x))return gu;let e=new DataView(new ArrayBuffer(4));e.setFloat32(0,x);let A=e.getUint32(0),r=A>>>16&32768,t=(A&us)+4096,s=(t>us?1:0)+(A>>>23&Iu),i=(t&us)>>>13;return s!==0&&(s=s-cv-4,s<Ou?(i=0,s=0):s>i8?(i=ri,s=i8+Ms):s=s+Ms),r|s<<10|i}var Nu=["OF","UF","OL","SC"],$s={u8:{NAN:255,OF:254,UF:253,OL:252,SC:251},u16:{NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},u32:{NAN:4294967295,OF:4294967294,UF:4294967293,OL:4294967292,SC:4294967291},s8:{NAN:127,OF:126,UF:-126,OL:-127,SC:-128},s16:{NAN:32767,OF:32766,UF:-32766,OL:-32767,SC:-32768},s32:{NAN:2147483647,OF:2147483646,UF:-2147483646,OL:-2147483647,SC:-2147483648},s64:{NAN:0x7fffffffffffffffn,OF:0x7ffffffffffffffen,UF:-0x7ffffffffffffffen,OL:-0x7fffffffffffffffn,SC:-0x8000000000000000n},ufm8:{NAN:sa,OF:Ai,UF:aa,OL:oa,SC:Fa}},qu={NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},le={NAN:1,OF:2,UF:3,OL:4,SC:5},Mu=new Set(["u8","u16","u32","ufm8"]);function $u(x){let e=Math.floor(x),A=x-e;return A<.5?e:A>.5?e+1:e%2===0?e:e+1}function va(x){let e=x.replace(/,/g,"").trim();if(!/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(e))return null;let A=Number(e);return Number.isFinite(A)?A:null}function fa(x,e,A){switch(x){case"u8":return e.getUint8(A);case"s8":return e.getInt8(A);case"u16":return e.getUint16(A,!1);case"s16":return e.getInt16(A,!1);case"u32":return e.getUint32(A,!1);case"s32":return e.getInt32(A,!1);case"s64":return Number(e.getBigInt64(A,!1));case"f32":return e.getFloat32(A,!1);case"f64":return e.getFloat64(A,!1);case"floatm16":return Ev(e.getUint16(A,!1));case"ufm8":return Ru(e.getUint8(A));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function Bv(x){switch(x){case le.OF:return"OF";case le.UF:return"UF";case le.OL:return"OL";case le.SC:return"SC";default:return Vt}}var s8=[["NAN",le.NAN],["OF",le.OF],["UF",le.UF],["OL",le.OL],["SC",le.SC]];function Lu(x,e){let A=x.getUint32(e,!1);if((A&2139095040)!==2139095040)return 0;let r=A&8388607;return r===0?le.NAN:(r=r&4194304?8388608-r:r&255,r===0?le.NAN:r)}function Gu(x,e){let A=x.getBigUint64(e,!1);if((A&0x7ff0000000000000n)!==0x7ff0000000000000n)return 0;let r=Number(A&0xffn);return r===0?le.NAN:r}function Uu(x,e){if(x.type==="s64"){let t=e.getBigInt64(x.byteofs,!1);ei(x)&&(t=BigInt(xi(Number(t),x.bitmask)));let s=$s.s64;return s8.find(([i])=>t===BigInt(s[i]))?.[1]??0}let A=$s[x.type];if(!A)return 0;let r=fa(x.type,e,x.byteofs);return ei(x)&&(r=xi(r,x.bitmask)),s8.find(([t])=>r===A[t])?.[1]??0}function dv(x,e){switch(x.type){case"floatm16":{let A=e.getUint16(x.byteofs,!1);return(A>>10&qs)===qs?1024-(A&ri):0}case"f32":return Lu(e,x.byteofs);case"f64":return Gu(e,x.byteofs);default:return Uu(x,e)}}function uv(x,e){let A=fa(x.type,e,x.byteofs);return typeof A=="string"||Number.isNaN(A)?NaN:(ei(x)&&(A=xi(A,x.bitmask)),A*x.vscale+x.vofs)}function Hu(x,e){let A=dv(x,e);if(A!==0)return Bv(A);let r=uv(x,e);return Number.isNaN(r)?Vt:_u(x,r)}function Ku(x,e){if(x.byteofs+x.size>e.byteLength)return null;if(oi(x.type)||na(x.type))return NaN;let A=new DataView(e.buffer,e.byteOffset,e.byteLength);return dv(x,A)!==0?NaN:uv(x,A)}function Wu(x,e){if(sv(x)){let A="";for(let r=0;r<x.size;r++)A+=e.getUint8(x.byteofs+r).toString(16).padStart(2,"0");return A.toUpperCase()}return W0.cp1252Unpack(e,x.byteofs,x.size)}var Dv=25569,pv=864e5;function Ju(x){return(x-Dv)*pv}function zu(x){return x/pv+Dv}function Vu(x,e){if(x.type==="datetime")return Yr(Ju(e.getFloat64(x.byteofs,!1)));if(x.type==="stamp8"){let r=e.getBigUint64(x.byteofs,!1),t=Number(r&0xffffffffffn);return Yr(W0.stamp40ToMS(t))}let A=e.getUint32(x.byteofs,!1)*256;return x.size>=5&&(A+=e.getUint8(x.byteofs+4)),Yr(W0.stamp40ToMS(A))}var Xu=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Yu(x,e){return/^[+-]?\d+$/.test(x)?parseInt(x,10):/^\$[0-9a-fA-F]+$/.test(x)?parseInt(x.slice(1),16):e}function Qu(x){let e=x.default;if(e===void 0)return;if(oi(x.type))return e;let A=e.trim();if(A===""||A.toUpperCase()===Vt)return Vt;if(Xu.has(x.type))return Yu(A,0);let r=va(A);return r!==null?r:e}function Zu(x,e,A){return x.byteofs+x.size>A?Qu(x):oi(x.type)?Wu(x,e):na(x.type)?Vu(x,e):Hu(x,e)}function Ls(x,e){let A=new DataView(e.buffer,e.byteOffset,e.byteLength),r={};for(let t of x.fields)UA(t)||zt(t.type)||(r[ai(t)]=Zu(t,A,e.byteLength));return r}function xD(x,e){if(typeof e=="number")return Number.isFinite(e)?{kind:"value",physical:e}:{kind:"sentinel",state:"NAN"};if(typeof e=="string"){if(e.toUpperCase()===Vt||e==="")return{kind:"sentinel",state:"NAN"};let A=Nu.find(t=>t===e);if(A)return{kind:"sentinel",state:A};if("OUS".includes(e[0]))return{kind:"skip"};let r=va(e);return r!==null?{kind:"value",physical:r}:a8(x)}return a8(x)}function a8(x){let e=x.default;return e!==void 0&&e.startsWith("%")?{kind:"sentinel",state:"NAN"}:{kind:"value",physical:(e!==void 0?va(e):null)??0}}function Gs(x,e,A){switch(x.type){case"floatm16":return e.setUint16(x.byteofs,qu[A],!1);case"f32":return e.setUint32(x.byteofs,(2139095040|le[A])>>>0,!1);case"f64":return e.setBigUint64(x.byteofs,0x7ff0000000000000n|BigInt(le[A]),!1);default:break}let r=$s[x.type]?.[A];if(r===void 0)throw new Error(`?ddeCodec.non-numeric-type."${x.type}"`);if(x.type==="s64")return e.setBigInt64(x.byteofs,BigInt(r),!1);bv(x,e,Number(r))}function eD(x,e,A){if(x.vscale===0)return;let r=(A-x.vofs)/x.vscale;switch(x.type){case"f32":return e.setFloat32(x.byteofs,r,!1);case"f64":return e.setFloat64(x.byteofs,r,!1);case"floatm16":return e.setUint16(x.byteofs,Cv(r),!1);default:break}if(Number.isNaN(r))return Gs(x,e,"NAN");if(!Number.isFinite(r))return Gs(x,e,"OF");let t=r;Mu.has(x.type)&&t<0&&(t=0),bv(x,e,$u(t))}function bv(x,e,A){if(ei(x)){let r=fa(x.type,e,x.byteofs);A=av(r,A,x.bitmask)}AD(x.type,e,x.byteofs,A)}function AD(x,e,A,r){switch(x){case"u8":return e.setUint8(A,r);case"s8":return e.setInt8(A,r);case"u16":return e.setUint16(A,r,!1);case"s16":return e.setInt16(A,r,!1);case"u32":return e.setUint32(A,r,!1);case"s32":return e.setInt32(A,r,!1);case"s64":return e.setBigInt64(A,BigInt(r),!1);case"ufm8":return e.setUint8(A,Pu(r));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function rD(x,e,A){let r=String(A);if(sv(x)){let t=r.trim();if(t.length%2!==0||t.length>x.size*2)throw new Error(`?ddeCodec.invalid-hex."${ai(x)}"`);for(let s=0;s<x.size;s++){let i=s*2<t.length?parseInt(t.substr(s*2,2),16):0;e.setUint8(x.byteofs+s,i)}return}W0.cp1252Pack(e,x.byteofs,x.size,r)}function tD(x,e,A){let r=xt(String(A));if(r===null)throw new Error(`?ddeCodec.unbounded-stamp."${ai(x)}"`);if(x.type==="datetime"){e.setFloat64(x.byteofs,zu(r),!1);return}let t=W0.msToStamp40(r);if(x.type==="stamp8"){e.setBigUint64(x.byteofs,BigInt(t),!1);return}e.setUint32(x.byteofs,Math.trunc(t/256),!1),x.size>=5&&e.setUint8(x.byteofs+4,t&255)}function nD(x,e,A){if(oi(x.type))return rD(x,e,A);if(na(x.type))return tD(x,e,A);let r=xD(x,A);switch(r.kind){case"skip":return;case"sentinel":return Gs(x,e,r.state);case"value":return eD(x,e,r.physical)}}function Us(x,e,A){let r=A?new Uint8Array(A):new Uint8Array(x.recordSize),t=new DataView(r.buffer,r.byteOffset,r.byteLength),s=new Map(x.fields.filter(i=>!UA(i)&&!zt(i.type)).map(i=>[ai(i),i]));for(let[i,v]of Object.entries(e)){let c=s.get(i.toLowerCase());if(!c)throw new ta(i);nD(c,t,v)}return r}var o8=99,iD=256,LA=class extends Error{constructor(x){super(`?ddeMapper.unknown-container."${x}"`),X(this,"container",x),this.name="DdeUnknownContainerError"}},Xt=class extends Error{constructor(x,e){let A=e?`${x}.${e}`:x;super(`?ddeMapper.write-forbidden."${A}"`),X(this,"container",x),X(this,"field",e),this.name="DdeWriteForbiddenError"}},la=class extends Error{constructor(x){super(`?ddeMapper.unknown-field."${x}"`),X(this,"field",x),this.name="DdeUnknownFieldError"}};function Ds(x){return(x.alias??x.name).toLowerCase()}var sD=class{constructor(x,e,A=gt){X(this,"model",x),X(this,"storage",e),X(this,"timeSource",A)}async readContainer(x){let e=this.model.byNameOrAlias(x);if(!e)return null;let A=Ht(e);if(A===null)return null;let r=await this.storage.getRowForTag(A);if(!r||!r.data)return null;let t=Ls(await this.resolveScaleRefs(e),r.data);return delete t.stamp,{stamp:this.rowStamp(r),...t}}async writeContainer(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=Ht(A);if(r===null)throw new LA(x);if(A.edit===o8)throw new Xt(A.name);let{stamp:t,...s}=e;this.assertFieldsWritable(A,s);let i=await this.storage.getRowForTag(r),v=Us(await this.resolveScaleRefs(A),s,i?.data??null),c=W0.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs()),B=me(c);return await this.storage.replaceUtoRow({tag:r,stamp:B,flags:i?.flags??0,site_related:i?.site_related??0,data:v}),{tag:r,stampHex:B,stamp40:c,data:v,devicePushable:tv(r)&&A.download!==0,upload:A.upload,download:A.download}}async seedContainer(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=Ht(A);if(r===null)throw new LA(x);let{stamp:t,...s}=e,i=Us(await this.resolveScaleRefs(A),s,null),v=W0.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs());await this.storage.replaceUtoRow({tag:r,stamp:me(v),flags:0,site_related:0,data:i})}recordStampMs(x){if(typeof x!="string")return null;try{return xt(x)}catch{return null}}async readTimeseries(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=this.model.splits.find(B=>B.target.toLowerCase()===A.name.toLowerCase());if(!r)throw new LA(x);let t=Math.abs(e.count),s=e.offset??0,i=this.buildSelectSet(A,e.select),v=await this.resolveScaleRefs(A);return(await this.collectMatched(v,r,s+t,{fromStamp:this.boundHex(e.fromMs),untilStamp:this.boundHex(e.untilMs),order:e.count<0?"desc":"asc",selectSet:i})).slice(s,s+t)}resolveHistdataContainer(x){let e=this.model.splits.find(A=>!A.matchAll&&this.matchesSplit(x,A))??this.model.splits.find(A=>A.matchAll&&this.matchesSplit(x,A));return e?this.model.byNameOrAlias(e.target)?.name??e.target:null}async projectRecord(x,e,A){let r=this.model.byNameOrAlias(x);if(!r)throw new LA(x);let t=this.buildSelectSet(r,A?.select),s=await this.resolveScaleRefs(r);return this.projectResolved(s,e.stamp40,e.data,t)}matchesSplit(x,e){return x.length===0?!1:e.matchAll?!0:x.length<e.keyBytes.length?!1:e.keyBytes.every((A,r)=>x[r]===A)}async collectMatched(x,e,A,r){let t=[];if(A<=0)return t;let s=Math.max(A,iD);for(let i=0;;i+=s){let v=await this.storage.getHistoricRows(26623,{fromStamp:r.fromStamp,untilStamp:r.untilStamp,order:r.order,limit:s,offset:i});for(let c of v)if(c.data&&this.matchesSplit(c.data,e)&&(t.push(this.projectResolved(x,Ie(c.stamp),c.data,r.selectSet)),t.length>=A))return t;if(v.length<s)return t}}async readTimeseriesEdge(x,e,A){return(await this.readTimeseries(x,{count:e==="youngest"?-1:1,select:A}))[0]??null}projectResolved(x,e,A,r){let t=Ls(x,A),s={stamp:Yr(W0.stamp40ToMS(e))};for(let[i,v]of Object.entries(t))i!=="stamp"&&(!r||r.has(i))&&(s[i]=v);return s}rowStamp(x){return Yr(W0.stamp40ToMS(Ie(x.stamp)))}boundHex(x){if(x!=null)return me(W0.msToStamp40(x))}async resolveScaleRefs(x){if(!x.fields.some(r=>r.vscaleRef||r.vofsRef))return x;let e=new Map,A=[];for(let r of x.fields){if(!r.vscaleRef&&!r.vofsRef){A.push(r);continue}A.push({...r,vscale:r.vscaleRef?await this.resolveRef(r.vscaleRef,e,r.vscale):r.vscale,vofs:r.vofsRef?await this.resolveRef(r.vofsRef,e,r.vofs):r.vofs})}return{...x,fields:A}}async resolveRef(x,e,A){if(!/^config[0-9a-f]$/i.test(x.container))return A;let r=this.referencedField(x);if(!r)return A;let t=x.container.toLowerCase();e.has(t)||e.set(t,await this.referencedRecordData(x.container));let s=e.get(t);if(!s)return A;let i=Ku(r,s);return i===null?A:i}referencedField(x){let e=x.field.toLowerCase();return this.model.byNameOrAlias(x.container)?.fields.find(r=>Ds(r)===e||r.name.toLowerCase()===e)??null}async referencedRecordData(x){let e=this.model.byNameOrAlias(x);if(!e)return null;let A=Ht(e);return A===null?null:(await this.storage.getRowForTag(A))?.data??null}assertFieldsWritable(x,e){let A=new Map(x.fields.filter(r=>!UA(r)&&!zt(r.type)).map(r=>[Ds(r),r]));for(let r of Object.keys(e)){let t=A.get(r.toLowerCase());if(t&&t.edit===o8)throw new Xt(x.name,t.name)}}buildSelectSet(x,e){if(!e||e.length===0)return null;let A=new Set(x.fields.filter(t=>!UA(t)&&!zt(t.type)).map(t=>Ds(t))),r=new Set;for(let t of e){let s=t.toLowerCase();if(s!=="stamp"){if(!A.has(s))throw new la(t);r.add(s)}}return r}},aD=new Set(["$titles","$meta"]);function oD(x){let e=x;if(typeof x=="string")try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}function Hs(x,e){let A=e.toLowerCase();if(aD.has(A))return null;let r=x[A];if(typeof r!="object"||r===null)return null;let t=new Map;for(let[s,i]of Object.entries(r)){if(typeof i!="object"||i===null)continue;let v=i.alias;typeof v=="string"&&v.length>0&&t.set(s.toLowerCase(),v)}return t}function mv(x,e){let A={};for(let[r,t]of Object.entries(x)){if(r==="stamp"){A[r]=t;continue}let s=e?.get(r.toLowerCase());A[s??r]=t}return A}function Zt(x,e){if(!x)return null;let A=Hs(x,e.name);return A||(e.alias?Hs(x,e.alias):null)}var FD=require("events"),Y0="[OfflineSyncManager]",vD=500,fD="site_info",lD=new Set(["local-data-interface.json"]);function ne(x){if(x?.aborted)throw x.reason??new DOMException("The operation was aborted.","AbortError")}function cD(x){let e=Qn(x);return!!(x&2)||e!==0&&e!==65}function F8(x){return x.filter(e=>(e.filename===jt||e.filename===Zs)&&e.outcome==="download").map(e=>e.filename)}var Ur="skip-equal",mt="skip-device-readonly",ps="delete",Er="error",bs="upload",ms="uploading-utos",v8="downloading-utos",Gn="fetching-device-state",js="uploading-files",Un="downloading-files",f8="executing-change-requests",l8="executed",ED="error",hs="skip-old-stamp",CD=class extends FD.EventEmitter{constructor(x,e,A){super(),X(this,"utoMaster",x),X(this,"storage",e),X(this,"logger",A)}emitProgress(x,e,A,r,t){let s={phase:x,item:e,completed:A,total:r,...t};this.emit("progress",s)}async uploadHistoricTag(x,e,A,r,t){try{let s=await this.storage.getRowForTag(x),i=0,v=async c=>{let B=c.filter(p=>p.stamp40>A).map(p=>({tag:x,stamp:me(p.stamp40),flags:s?.flags??0,site_related:s?.site_related??0,data:p.data}));await this.storage.insertHistoricRows(B),i+=B.length};return await this.utoMaster.requestHistoricUtos(x,A,t,void 0,vD,v),this.logger?.info(`${Y0} historic upload tag=0x${x.toString(16)} +${i} records`),{tag:x,sTag:e.sTag,historic:!0,outcome:"upload",dbStamp40:A,deviceStamp40:r,recordsAppended:i}}catch(s){return this.logger?.error(`${Y0} historic upload error tag=0x${x.toString(16)}: ${s}`),{tag:x,sTag:e.sTag,historic:!0,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async uploadSingleTag(x,e,A,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t)return this.logger?.info(`${Y0} single upload tag=0x${x.toString(16)} \u2014 device returned no data (skip)`),{tag:x,sTag:e.sTag,historic:!1,outcome:Ur,dbStamp40:A,deviceStamp40:r};let s=await this.storage.getRowForTag(x);return await this.storage.replaceUtoRow({tag:x,stamp:me(t.stamp),flags:s?.flags??0,site_related:s?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null}),this.logger?.info(`${Y0} single upload tag=0x${x.toString(16)}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"upload",dbStamp40:A,deviceStamp40:r}}catch(t){return this.logger?.error(`${Y0} single upload error tag=0x${x.toString(16)}: ${JSON.stringify(t)}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async uploadUtoTags(x,e,A,r){let t=x.length;this.emitProgress(ms,null,0,t);let s=0;for(let i of x){ne(r);let v=e.get(i),{tagInfo:c,dbStamp40:B,deviceStamp40:p}=v;if(this.emitProgress(ms,c?.sTag??`0x${i.toString(16)}`,s,t),!c||p===null)A.set(i,{tag:i,sTag:"?",historic:!1,outcome:"unknown-tag",dbStamp40:B,deviceStamp40:p});else if(!(!c.flags.up||p<=B)){let b=c.sTag,h=s,w=c.historic?await this.uploadHistoricTag(i,c,B,p,k=>{this.emitProgress(ms,b,h,t,{recordsReceived:k})}):await this.uploadSingleTag(i,c,B,p);A.set(i,w)}++s}}async pullFileFromDevice(x,e,A,r,t,s){let i=e.stamp;try{let v=await this.utoMaster.requestFile(x,B=>{this.emitProgress(js,x,s,t,{bytesTransferred:B})}),c=Qs(v);if(c!==e.crc32)throw new Error(`crc32 mismatch: expected 0x${e.crc32.toString(16)}, got 0x${c.toString(16)}`);return await this.storage.upsertFile({filename:x,stamp:me(i),crc:e.crc32,size:v.byteLength,flags:e._flags,flags_int:r,data:v}),{filename:x,outcome:bs,dbStamp40:A,deviceStamp40:i}}catch(v){return this.logger?.error(`${Y0} file upload error ${x}: ${JSON.stringify(v)}`),{filename:x,outcome:Er,dbStamp40:A,deviceStamp40:i}}}async autoSyncUploadFile(x,e,A,r,t,s,i,v){let c=e.stamp;if(c>r)return this.fileContentMatches(e,A)?this.convergeFileStamp(x,e,A,r):s?this.pullFileFromDevice(x,e,r,t,i,v):void 0;if(c===r&&this.fileContentMatches(e,A))return{filename:x,outcome:Ur,dbStamp40:r,deviceStamp40:c}}async convergeFileStamp(x,e,A,r){let t=e.stamp;try{return await this.storage.upsertFile({filename:x,stamp:me(t),crc:e.crc32,size:e.size,flags:e._flags,flags_int:A.flags_int,data:A.data}),{filename:x,outcome:Ur,dbStamp40:r,deviceStamp40:t}}catch(s){return this.logger?.error(`${Y0} file upload error ${x}: ${JSON.stringify(s)}`),{filename:x,outcome:Er,dbStamp40:r,deviceStamp40:t}}}async mirrorUploadFile(x,e,A,r,t,s,i){let v=e.stamp;if(v!==r||!this.fileContentMatches(e,A))return t?this.pullFileFromDevice(x,e,r,A.flags_int,s,i):{filename:x,outcome:mt,dbStamp40:r,deviceStamp40:v}}async decideFileUpload(x,e,A,r){let t=await this.storage.getFile(x),s=!!(e._flags&1);if(!t)return s?this.pullFileFromDevice(x,e,0,16,A,r):void 0;let i=Ie(t.stamp);return e._flags&8?this.autoSyncUploadFile(x,e,t,i,t.flags_int,s,A,r):this.decideNonSystemUpload(x,e,t,i,s,A,r)}pullIfReadable(x,e,A,r,t,s,i){return x?this.pullFileFromDevice(e,A,r,t,s,i):void 0}async decideNonSystemUpload(x,e,A,r,t,s,i){let v=A.flags_int;if(!(v&2))return v&4?this.pullIfReadable(t,x,e,r,v,s,i):this.decideUploadBySyncLogic(x,e,A,r,t,s,i)}async decideUploadBySyncLogic(x,e,A,r,t,s,i){let v=A.flags_int,c=Qn(v);if(c===65)return this.fileContentMatches(e,A)?this.convergeFileStamp(x,e,A,r):this.pullIfReadable(t,x,e,r,v,s,i);if(c===1)return this.autoSyncUploadFile(x,e,A,r,v,t,s,i);if(c===97)return e.stamp>r?this.pullIfReadable(t,x,e,r,v,s,i):void 0;if(c!==33)return this.mirrorUploadFile(x,e,A,r,t,s,i)}async uploadFiles(x,e,A,r){let t=Object.entries(x),s=t.length;this.emitProgress(js,null,0,s);let i=0;for(let[v,c]of t){if(ne(r),!(v===Zs||v===jt&&!A)){let p=await this.decideFileUpload(v,c,s,i);p&&e.set(v,p)}this.emitProgress(js,v,++i,s)}}fileContentMatches(x,e){return e!==null&&x.crc32===e.crc&&x.size===e.size}async downloadSingleTag(x,e,A,r){try{let t=await this.storage.getRowForTag(x);return t?.data&&await this.utoMaster.sendUTOCmdExt(3,x,t.data,A),{tag:x,sTag:e.sTag,historic:!1,outcome:"download",dbStamp40:A,deviceStamp40:r}}catch(t){return this.logger?.error(`${Y0} download error tag=0x${x.toString(16)}: ${t}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async processDownloadTag(x,e,A,r,t){if(A===r&&!t.has(x)){let s=e.flags.up?Ur:"skip-db-readonly";t.set(x,{tag:x,sTag:e.sTag,historic:!1,outcome:s,dbStamp40:A,deviceStamp40:r});return}if(A>r){let s=e.flags.down?await this.downloadSingleTag(x,e,A,r):{tag:x,sTag:e.sTag,historic:!1,outcome:mt,dbStamp40:A,deviceStamp40:r};t.set(x,s)}}async downloadUtoTags(x,e,A,r){let t=x.length;this.emitProgress(v8,null,0,t);let s=0;for(let i of x){ne(r);let{tagInfo:v,dbStamp40:c,deviceStamp40:B}=e.get(i);v&&B!==null&&!v.historic&&await this.processDownloadTag(i,v,c,B,A),this.emitProgress(v8,v?.sTag??`0x${i.toString(16)}`,++s,t)}}async sendFileToDevice(x,e,A,r,t){let s=x.data.byteLength,i=v=>{if(v!==null){let c=Math.round(s*parseInt(v,10)/100);this.emitProgress(Un,x.filename,t,r,{bytesTransferred:c,bytesTotal:s})}};this.utoMaster.on("installing",i);try{return await this.utoMaster.sendFile(0,x.data,W0.stamp40ToMS(e),x.filename),{filename:x.filename,outcome:"download",dbStamp40:e,deviceStamp40:A}}catch(v){return this.logger?.error(`${Y0} file download error ${x.filename}: ${v}`),{filename:x.filename,outcome:"error",dbStamp40:e,deviceStamp40:A}}finally{this.utoMaster.removeListener("installing",i)}}async processDownloadFile(x,e,A,r,t=!1){if(!x.data)return;let s=e?.stamp??0,i=Ie(x.stamp);if(e!==void 0&&this.fileContentMatches(e,x))return i===s?void 0:{filename:x.filename,outcome:Ur,dbStamp40:i,deviceStamp40:s};if(!(!t&&i<s))return!t&&e!==void 0&&!(e._flags&2)?{filename:x.filename,outcome:mt,dbStamp40:i,deviceStamp40:s}:this.sendFileToDevice(x,i,s,A,r)}async isAppInDevPhase(){let x=await this.storage.getMetadataValue(fD);if(!x)return!1;try{return JSON.parse(x).app?.phase==="dev"}catch(e){return this.logger?.error(`${Y0} corrupt site_info metadata: ${e}`),!1}}async downloadFiles(x,e,A,r){let t=await this.storage.getFiles(),s=t.filter(b=>b.flags&8),i=t.filter(b=>!(b.flags&8)),v=[...s,...i].filter(b=>b.filename),c=Object.entries(x).filter(([,b])=>b._flags&4).map(([b])=>b),B=v.length;this.emitProgress(Un,null,0,B);let p=0;for(let b of v){if(ne(r),A&&b.filename===jt){this.emitProgress(Un,b.filename,++p,B);continue}let h=b.filename===jt&&!A,w=await this.decideFileDownload(b,x[b.filename],e.get(b.filename),c,h,B,p);w&&e.set(b.filename,w),this.emitProgress(Un,b.filename,++p,B)}}async decideFileDownload(x,e,A,r,t,s,i){return e!==void 0?this.decideDownloadExisting(x,e,A,t,s,i):this.decideDownloadMissing(x,r,s,i)}async decideDownloadExisting(x,e,A,r,t,s){if(e._flags&4)return;if(x.flags&8)return A?void 0:this.processDownloadFile(x,e,t,s,r);let i=x.flags_int;if(i&8)return this.handleDeviceDelete(x,e,A);if(!A&&!(i&4))return this.pushToDevice(x,e,t,s)}async pushToDevice(x,e,A,r){let t=e.stamp,s=Ie(x.stamp),i=this.wantDownloadPush(x,e,s,t);if(i==="match")return{filename:x.filename,outcome:Ur,dbStamp40:s,deviceStamp40:t};if(i!=="none"&&!(s===0||!x.data||x.data.byteLength===0))return e._flags&2?this.sendFileToDevice(x,s,t,A,r):{filename:x.filename,outcome:mt,dbStamp40:s,deviceStamp40:t}}wantDownloadPush(x,e,A,r){let t=x.flags_int;if(t&2)return"push";let s=this.fileContentMatches(e,x),i=Qn(t);return i===33||i===1&&A>=r?s?"match":"push":i===97&&A>r?"push":"none"}async handleDeviceDelete(x,e,A){let r=e.stamp,t=Ie(x.stamp);if(!(A&&(A.outcome===bs||A.outcome===Er))){if(!(e._flags&2))return{filename:x.filename,outcome:mt,dbStamp40:t,deviceStamp40:r};try{return await this.utoMaster.deleteFile(x.filename),await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:ps,dbStamp40:t,deviceStamp40:r}}catch(s){return this.logger?.error(`${Y0} file delete error ${x.filename}: ${JSON.stringify(s)}`),{filename:x.filename,outcome:Er,dbStamp40:t,deviceStamp40:r}}}}async decideDownloadMissing(x,e,A,r){let t=x.flags_int,s=Ie(x.stamp);if(t&8)try{return await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:ps,dbStamp40:s,deviceStamp40:null}}catch(i){return this.logger?.error(`${Y0} file delete error ${x.filename}: ${JSON.stringify(i)}`),{filename:x.filename,outcome:Er,dbStamp40:s,deviceStamp40:null}}if(!(x.flags&12)&&cD(t)&&x.flags&2&&this.hasMatchingNode(x.filename,e)&&x.data)return this.sendFileToDevice(x,s,0,A,r)}hasMatchingNode(x,e){return e.some(A=>A.slice(0,-1)===x.slice(0,A.length-1))}async reconcileFileState(x){try{await this.reconcileFileStateUnguarded(x)}catch(e){if(x?.aborted)throw e;this.logger?.error(`${Y0} file-state reconciliation failed: ${JSON.stringify(e)}`)}}async reconcileFileStateUnguarded(x){let e=await this.utoMaster.requestFileList(),A=new Set(Object.keys(e)),r=await this.storage.getFiles(),t=new Map(r.map(s=>[s.filename,s]));for(let[s,i]of Object.entries(e))ne(x),await this.reconcileDeviceFile(s,i,t.get(s)??null);for(let s of r)ne(x),A.has(s.filename)||await this.dropRowMissingFromDevice(s)}async reconcileDeviceFile(x,e,A){let r=!!((e._flags|(A?.flags??0))&8);if(A?.data&&!this.fileContentMatches(e,A)){this.logger?.info(`${Y0} reconcile keep ${x}: row holds undeployed content`);return}if(!A?.data&&!r)return;let t={filename:x,stamp:me(e.stamp),crc:e.crc32,size:e.size,flags:e._flags,flags_int:A?.flags_int??16,data:this.keepBlob(x,r)?A?.data??null:null};A&&this.fileRowMatches(A,t)||await this.storage.upsertFile(t)}keepBlob(x,e){return!e||lD.has(x)}fileRowMatches(x,e){return x.stamp===e.stamp&&x.crc===e.crc&&x.size===e.size&&x.flags===e.flags&&x.flags_int===e.flags_int&&(x.data??null)===e.data}async dropRowMissingFromDevice(x){try{await this.storage.deleteFile(x.filename)}catch(e){this.logger?.error(`${Y0} reconcile delete error ${x.filename}: ${JSON.stringify(e)}`)}}async validateDevice(x){ne(x),this.emitProgress("validating",null,0,1);let e=await this.utoMaster.requestDeviceInfo();if(!e)throw new Error(`${Y0} requestDeviceInfo returned null`);let A=await this.storage.getMetadataValue("device_id");if(A===null){if(!e.serialNumber)throw new Error(`${Y0} DB metadata missing device_id and connected device has no serialNumber`);if(!this.storage.setMetadataValue)throw new Error(`${Y0} DB metadata missing device_id`);await this.storage.setMetadataValue("device_id",e.serialNumber),A=e.serialNumber}if(A.toUpperCase()!==e.serialNumber.toUpperCase())throw new Error(`${Y0} DB device_id "${A}" does not match connected device "${e.serialNumber}"`);return this.emitProgress("validating",null,1,1),e}buildTagMap(x){let e=new Map;for(let A=0;A<x.utos.length;A++){let r=x.utos[A];e.set(r.wTag,{index:A,flags:{up:r.flags.up,down:r.flags.down,setValue:!!r.flags.setValue},historic:r.flags.historic,sTag:r.sTag})}return e}async resolveDbTags(x){let e=await this.storage.getUtoDataTags(),A=new Set(e);for(let[r,t]of x)t.historic&&!A.has(r)&&e.push(r);return e}async buildTagStampCache(x,e,A){let r=new Map;for(let t of x){let s=e.get(t),i=await this.storage.getLatestStampForTag(t),v=i?Ie(i):0,c=s&&s.index<A.stamps.length?A.stamps[s.index]:null;r.set(t,{dbStamp40:v,deviceStamp40:c,tagInfo:s})}return r}async executeChangeRequests(x,e,A,r,t,s){let i=await this.storage.getUtoChangeRequests(),v=this.groupChangeRequests(i),c=v.size;if(this.emitProgress(f8,null,0,c),c===0)return;let B=new Set,p=0;for(let[b,h]of v){ne(s);let w=x.get(b),k=w?.sTag??`0x${b.toString(16)}`;this.emitProgress(f8,k,p,c),await this.executeChangeRequestTag(b,k,w,h,e,r,t,B),++p}B.size>0&&await this.repullExecutedTags(B,x,A,s)}groupChangeRequests(x){let e=new Map;for(let A of x){let r=e.get(A.tag)??[];r.push({stamp40:Ie(A.stamp),user:A.user,json:A.json}),e.set(A.tag,r)}return e}async executeChangeRequestTag(x,e,A,r,t,s,i,v){if(!A){this.pushChangeResults(i,x,e,r,"unknown-tag");return}if(!A.flags.setValue){this.pushChangeResults(i,x,e,r,"skip-unsupported");return}let c=A.index<t.stamps.length?t.stamps[A.index]:0,B=r.filter(b=>b.stamp40<=c),p=r.filter(b=>b.stamp40>c);this.pushChangeResults(i,x,e,B,hs),p.length>0&&await this.coalesceAndSend(x,e,A,p,s,i,v)}async coalesceAndSend(x,e,A,r,t,s,i){let v=await this.storage.getRowForTag(x);if(t.get(x)?.outcome===Er||!v||!v.data){this.pushChangeResults(s,x,e,r,"error");return}let c=this.resolveSetObject(v.data,r,e);if(c===null){this.pushChangeResults(s,x,e,r,"error");return}if(Object.keys(c).length===0){this.pushChangeResults(s,x,e,r,"skip-no-change");return}let B=r[r.length-1].stamp40,p=await this.utoMaster.sendSetValue(x,JSON.stringify(c),B);p.outcome==="ok"||p.outcome==="stamp"?(i.add(x),this.pushChangeResults(s,x,e,r,l8,p.resultCode)):p.outcome==="denied"?(this.logger?.warn(`${Y0} change-request denied ${e} (result=${p.resultCode}) \u2014 server will retry`),this.pushChangeResults(s,x,e,r,"denied",p.resultCode)):(this.logger?.error(`${Y0} change-request error ${e} (result=${p.resultCode})`),this.pushChangeResults(s,x,e,r,"error",p.resultCode))}resolveSetObject(x,e,A){try{let r=JSON.parse(W0.cp1252Unpack(x,0,x.byteLength));return this.buildSetObject(r,e,A)}catch(r){return this.logger?.error(`${Y0} change-request unparseable uto_data ${A}: ${r}`),null}}buildSetObject(x,e,A){let r={};for(let t of e){let s=JSON.parse(t.json);if(!this.isPlainRecord(s))throw new Error(`change-request JSON is not an object on ${A}`);for(let[i,v]of Object.entries(s)){let c=this.resolveChangeField(x[i],v,i,A);c.apply&&(r[i]=c.value,x[i]=c.value)}}return r}resolveChangeField(x,e,A,r){if(this.isBitwiseOp(e)){let{op:t,val:s}=e;return this.resolveBitwiseOp(x,t,s,A,r)}return x===e?{apply:!1}:{apply:!0,value:e}}resolveBitwiseOp(x,e,A,r,t){return e!=="|"&&e!=="&"?(this.logger?.warn(`${Y0} change-request unknown op "${e}" on ${t}.${r} \u2014 skipped`),{apply:!1}):typeof A!="number"?(this.logger?.warn(`${Y0} change-request op "${e}" with non-number val on ${t}.${r} \u2014 skipped`),{apply:!1}):x===void 0?e==="|"?{apply:!0,value:A}:{apply:!1}:typeof x!="number"?(this.logger?.warn(`${Y0} change-request op "${e}" on non-number ${t}.${r} \u2014 skipped`),{apply:!1}):{apply:!0,value:e==="|"?x|A:x&A}}isBitwiseOp(x){return this.isPlainRecord(x)&&"op"in x}isPlainRecord(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}pushChangeResults(x,e,A,r,t,s){for(let i of r)x.push({tag:e,sTag:A,stamp40:i.stamp40,user:i.user,outcome:t,resultCode:s})}async repullExecutedTags(x,e,A,r){let t=null;try{t=await this.utoMaster.requestStamps()}catch(s){this.logger?.warn(`${Y0} change-request STAMPS re-fetch failed \u2014 using per-tag stamps: ${s}`)}for(let s of x)ne(r),await this.repullExecutedTag(s,e,t,A)}async repullExecutedTag(x,e,A,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t){this.logger?.info(`${Y0} change-request re-pull tag=0x${x.toString(16)} \u2014 device returned no data (E_EOD), DB row unchanged`);return}let s=await this.storage.getRowForTag(x),i=t.stamp;await this.storage.replaceUtoRow({tag:x,stamp:me(i),flags:s?.flags??0,site_related:s?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null});let v=r.get(x);if(v){let c=e.get(x),B=A&&c&&c.index<A.stamps.length?A.stamps[c.index]:i;v.dbStamp40=i,v.deviceStamp40=B}this.logger?.info(`${Y0} change-request re-pull tag=0x${x.toString(16)} \u2192 stamp ${i}`)}catch(t){this.logger?.error(`${Y0} change-request re-pull error tag=0x${x.toString(16)}: ${t}`)}}aggregateResult(x,e,A){let r=[...x.values()],t=[...e.values()],s=F8(t);return{tags:r,files:t,changeRequests:A,requiresReconnectSync:s.length>0,rebootFilesDeployed:s,totalTagsUploaded:r.filter(i=>i.outcome==="upload"&&!i.historic).length,totalTagsDownloaded:r.filter(i=>i.outcome==="download").length,totalTagsSkipped:r.filter(i=>i.outcome===Ur||i.outcome==="skip-db-readonly"||i.outcome===mt).length,totalHistoricRecordsAppended:r.reduce((i,v)=>i+(v.recordsAppended??0),0),totalFilesUploaded:t.filter(i=>i.outcome===bs).length,totalFilesDownloaded:t.filter(i=>i.outcome==="download").length,totalFilesDeleted:t.filter(i=>i.outcome===ps).length,totalChangeRequestsExecuted:A.filter(i=>i.outcome===l8).length,totalErrors:r.filter(i=>i.outcome===Er).length+t.filter(i=>i.outcome===Er).length+A.filter(i=>i.outcome===ED).length}}async sync(x){let{signal:e}=x??{},A=await this.validateDevice(e);ne(e),this.emitProgress(Gn,null,0,3);let r=this.buildTagMap(A),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${Y0} requestStamps returned null`);this.emitProgress(Gn,"stamps",1,3);let s=await this.utoMaster.requestFileList();this.emitProgress(Gn,"file-list",2,3);let i=await this.resolveDbTags(r);this.emitProgress(Gn,"db-tags",3,3);let v=await this.buildTagStampCache(i,r,t),c=new Map,B=new Map,p=[],b=await this.isAppInDevPhase();return ne(e),await this.uploadUtoTags(i,v,c,e),ne(e),await this.uploadFiles(s,B,b,e),ne(e),await this.executeChangeRequests(r,t,v,c,p,e),ne(e),await this.downloadUtoTags(i,v,c,e),ne(e),await this.downloadFiles(s,B,b,e),ne(e),F8([...B.values()]).length===0&&await this.reconcileFileState(e),this.emitProgress("complete",null,0,0),this.aggregateResult(c,B,p)}async executeAdHocChangeRequest(x,e){let A=await this.utoMaster.requestDeviceInfo();if(!A)throw new Error(`${Y0} requestDeviceInfo returned null`);let r=this.buildTagMap(A),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${Y0} requestStamps returned null`);let s=r.get(x),i=s?.sTag??`0x${x.toString(16)}`,v=e.map(h=>({stamp40:h.stamp40,user:"",json:h.json})).sort((h,w)=>h.stamp40-w.stamp40),c=new Map,B=[],p=new Set;return await this.executeChangeRequestTag(x,i,s,v,t,c,B,p),p.size>0&&await this.repullExecutedTags(p,r,new Map,void 0),B.find(h=>h.outcome!==hs)?.outcome??hs}},BD=require("events"),dD=require("events"),uD=require("events"),DD=5e3,ca=class jv extends uD.EventEmitter{constructor(e=yA){super(),X(this,"logger",e),X(this,"ws",null),X(this,"bridgeTransport",null),X(this,"bridgeSignal"),X(this,"bridgeResolve",null),X(this,"bridgeReject",null),X(this,"serverMessageCount",0),X(this,"settled",!1),X(this,"abortHandler",null),X(this,"connectTimeout"),X(this,"writeQueue",[]),X(this,"isProcessingQueue",!1),X(this,"queueAborted",!1),X(this,"queueDrainPromise",Promise.resolve()),X(this,"transportUnsubscribe",null)}static buildSyncUrl(e,A){return`wss://${e}/uto/1/sync/${A}`}resetBridgeState(){this.serverMessageCount=0,this.settled=!1,this.abortHandler=null,this.connectTimeout=void 0,this.writeQueue=[],this.isProcessingQueue=!1,this.queueAborted=!1,this.queueDrainPromise=Promise.resolve(),this.bridgeResolve=null,this.bridgeReject=null,this.bridgeTransport=null,this.bridgeSignal=void 0,this.transportUnsubscribe=null}async processWriteQueue(){if(!this.isProcessingQueue){for(this.isProcessingQueue=!0;this.writeQueue.length>0&&!this.queueAborted;){let e=this.writeQueue.shift();try{await V8(this.bridgeTransport,e)}catch(A){let r=A instanceof Error?A.message:String(A);this.logger.error(`Error writing to transport: ${r}`)}}this.isProcessingQueue=!1}}cleanup(){this.transportUnsubscribe&&(this.transportUnsubscribe(),this.transportUnsubscribe=null),this.abortHandler&&this.bridgeSignal&&(this.bridgeSignal.removeEventListener("abort",this.abortHandler),this.abortHandler=null),this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.ws=null}settle(e,A){this.settled||(this.settled=!0,this.cleanup(),e==="resolve"?this.bridgeResolve?.({serverMessageCount:this.serverMessageCount}):this.bridgeReject?.(A))}attachWebSocketHandlers(e,A){let r=t=>{e.readyState===WebSocket.OPEN&&!this.bridgeSignal?.aborted&&!this.settled&&e.send(t)};this.abortHandler=()=>{this.logger.info("WebSocket bridge aborted"),this.queueAborted=!0,this.writeQueue.length=0,(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close(),this.settle("reject",new Error("Operation aborted"))},this.bridgeSignal&&this.bridgeSignal.addEventListener("abort",this.abortHandler),e.onopen=()=>{this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.logger.info(`WebSocket connected to ${A}`),this.transportUnsubscribe=this.bridgeTransport.onData(r),this.emit("wsConnected")},e.onmessage=t=>{this.serverMessageCount++,this.emit("serverMessage",this.serverMessageCount),!(this.bridgeSignal?.aborted||this.settled)&&(this.writeQueue.push(t.data),this.isProcessingQueue||(this.queueDrainPromise=this.processWriteQueue()))},e.onclose=t=>{this.logger.info(`WebSocket closed (server=${A}, code=${t.code}, messages=${this.serverMessageCount})`),this.emit("wsClosed",t.code,t.reason),this.queueDrainPromise.then(()=>this.settle("resolve")).catch(()=>this.settle("resolve"))},e.onerror=t=>{this.logger.error(`WebSocket error (server=${A})`),this.emit("wsError",t),this.queueAborted=!0,this.writeQueue.length=0,this.settle("reject",new Error("WebSocket error"))}}async bridge(e,A,r,t){return new Promise((s,i)=>{if(t?.aborted){i(new Error("Operation aborted"));return}this.resetBridgeState(),this.bridgeTransport=e,this.bridgeSignal=t,this.bridgeResolve=s,this.bridgeReject=i;let v=jv.buildSyncUrl(A,r);this.logger.info(`Opening WebSocket: ${v}`);let c=new WebSocket(v);c.binaryType="arraybuffer",this.ws=c,this.connectTimeout=setTimeout(()=>{c.readyState===WebSocket.CONNECTING&&(this.logger.error("WebSocket connection timeout"),c.close(),this.settle("reject",new Error("WebSocket connection timeout")))},DD),this.attachWebSocketHandlers(c,A)})}close(){this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.close()}},hv="https://lic.mydatanet.at/api/2/";async function gv(x,e=hv){let A=`${e}devices/${x}/assignment`,r=await fetch(A);if(!r.ok)throw new Error(`Failed to get device assignment: ${r.status} ${r.statusText}`);return r.json()}var yv=class extends dD.EventEmitter{constructor(x=yA){super(),X(this,"logger",x)}async execute(x,e,A,r){let t=A;t||(this.logger.info("[LegacySync] No serverUrl provided, resolving via device assignment..."),this.emit("syncPhase",{phase:"resolving-server"}),t=(await gv(e)).server_url,this.logger.info("[LegacySync] Resolved server URL: "+t)),this.logger.info("[LegacySync] Starting legacy sync (server="+t+")");let s=new ca(this.logger);s.on("wsConnected",()=>this.emit("wsConnected")),s.on("wsClosed",(v,c)=>this.emit("wsClosed",v,c)),s.on("wsError",v=>this.emit("wsError",v)),s.on("serverMessage",v=>this.emit("serverMessage",v));let i=await s.bridge(x,t,e,r);return this.logger.info("[LegacySync] Legacy sync completed (serverMessages="+i.serverMessageCount+")"),{serverMessageCount:i.serverMessageCount}}},pD=require("events"),kv="Operation aborted";function bD(x){return x instanceof Error?x.message:String(x)}function gs(x){if(x?.aborted)throw new Error(kv)}var wv=class extends pD.EventEmitter{constructor(x,e=yA){super(),X(this,"atHandler",x),X(this,"logger",e)}async execute(x,e,A,r){this.logger.info("Starting debug-enabled sync");let t=[{name:"mnt",queryServer:i=>this.atHandler.queryMntServerConfig(i),initiateSync:i=>this.atHandler.initiateMntSync(i)},{name:"mdn",queryServer:i=>this.atHandler.queryMdnServerConfig(i),initiateSync:i=>this.atHandler.initiateMdnSync(i)}],s={};for(let i of t)try{s[i.name]=await this.runSyncPhase(i,x,e,r)}catch(v){if(r?.aborted)throw new Error(kv);let c=`${i.name.toUpperCase()} sync phase failed: ${bD(v)}`;throw this.logger.error(c),new Error(c)}return this.logger.info(`Debug sync completed (mntMessages=${s.mnt}, mdnMessages=${s.mdn})`),{mntServerMessageCount:s.mnt,mdnServerMessageCount:s.mdn}}async runSyncPhase(x,e,A,r){gs(r);let t=x.name.toUpperCase();this.emit("syncPhase",{phase:x.name}),this.logger.info(`Phase: Querying ${t} server configuration`);let s=await x.queryServer(r);this.logger.info(`${t} server domain: ${s}`),gs(r),await x.initiateSync(r),gs(r);let i=await this.syncWithServer(e,s,A,r);return this.logger.info(`${t} phase completed (serverMessages=${i.serverMessageCount})`),i.serverMessageCount}async syncWithServer(x,e,A,r){let t=new ca(this.logger),s=!1;t.on("wsConnected",()=>this.emit("wsConnected"));let i=this.atHandler.createConCloseMonitor(()=>{s=!0,this.logger.info("Device initiated close (+CONCLOSE), closing WebSocket"),t.close()});try{let v=await t.bridge(x,e,A,r);return s?this.logger.info("Connection closed by device (+CONCLOSE)"):(this.logger.info("Connection closed by server, sending +CONCLOSE to device"),await this.atHandler.sendConnectionClose(r)),v}finally{i()}}},mD=class extends BD.EventEmitter{constructor(x,e,A=yA){super(),X(this,"syncTransport",x),X(this,"logger",A),X(this,"atHandler"),this.atHandler=e??null}async sync(x){let e=this.atHandler?"debug":"legacy";this.emit("syncStart",{mode:e});try{if(this.atHandler)try{return this.emit("syncPhase",{phase:"debug-sync"}),await this.syncWithDebug(x)}catch(A){return this.logger.warn("[SyncManager] Debug sync failed, falling back to legacy sync: "+(A instanceof Error?A.message:String(A))),this.emit("syncPhase",{phase:"debug-fallback-legacy"}),await this.syncLegacy(x)}return this.emit("syncPhase",{phase:"legacy"}),await this.syncLegacy(x)}catch(A){throw this.emit("syncError",A),A}}async syncLegacy(x){let e=new yv(this.logger);e.on("syncPhase",t=>this.emit("syncPhase",t));let r={mode:"legacy",serverMessageCount:(await e.execute(this.syncTransport,x.serialNumber,x.serverUrl,x.signal)).serverMessageCount};return this.emit("syncComplete",r),r}async syncWithDebug(x){let e=new wv(this.atHandler,this.logger);e.on("syncPhase",t=>this.emit("syncPhase",t));let A=await e.execute(this.syncTransport,x.serialNumber,x.serverUrl??"",x.signal),r={mode:"debug",serverMessageCount:A.mntServerMessageCount+A.mdnServerMessageCount,mntServerMessageCount:A.mntServerMessageCount,mdnServerMessageCount:A.mdnServerMessageCount};return this.emit("syncComplete",r),r}dispose(){}},jD=require("events"),Hx={MNT_CFG:"at+mntcfg?",MDN_CFG:"at+mdncfg?",MNT_SYNC:"at+mntsync",MDN_SYNC:"at+mdnsync",CON_CLOSE:"at+conclose",APP_GET_METADATA:"AT+APP=GETMETADATA",APP_GET_DATAVALUE:"AT+APP=GETDATAVALUE",APP_TRIG_MEASURE:"AT+APP=TRIGMEASURE",APP_TRIG_MEASURE_TEST:"AT+APP=TRIGMEASURE=?",ATI:"ati",RM2M_STATE:"at+rm2mstate?",TX:"at+tx",TX_MAINTENANCE:"at+tx=4",TX_GSM_POSITION:"at+tx=1",TX_MODE_TRIGGERED:"at+txmode=0",TX_MODE_WAKEUP:"at+txmode=1",TX_MODE_ONLINE:"at+txmode=2",COMPANION_CERT:"AT+COMPCERT",COMPANION_CERT_TEST:"AT+COMPCERT=?"},ix={OK:"OK",ERROR:"ERROR",SYNC_START:"+SYNC START",MEASURED:"+MEASURED",CON_CLOSE:"+CONCLOSE",MNT_CFG_PREFIX:"+MNTCFG",MDN_CFG_PREFIX:"+MDNCFG",RM2M_STATE:"+RM2MSTATE",ERROR_PIN_REQUIRED:"ERROR PIN REQUIRED",ERROR_NO_DATA:"ERROR NO DATA",COMPCERT_ERROR:/\+COMPCERT ERROR:\s*(\d+)/},fe=1e4,_v=9e4,Sv=/(?:ERROR PIN REQUIRED|ERROR NO DATA|ERROR|OK)\r\n/;function Tv(){return{buffer:"",closedByDevice:!1,reset(){this.buffer="",this.closedByDevice=!1}}}var Hr="Operation aborted",oe=class extends Error{constructor(x="AT command handler was disposed"){super(x),this.name="AtHandlerDisposedError"}},ti=class extends Error{constructor(x="Device returned ERROR response"){super(x),this.name="AtDeviceError"}},hD=class extends jD.EventEmitter{constructor(x,e=yA){super(),X(this,"transport",x),X(this,"logger",e),X(this,"mutex",new ea("AtCommandHandler")),X(this,"bufferState",Tv()),X(this,"responseCallback",null),X(this,"decoder",new TextDecoder),X(this,"dataHandler"),X(this,"disposeTransportListener"),X(this,"isDisposed",!1),X(this,"activeAbort",null),X(this,"session"),this.dataHandler=A=>this.handleIncomingData(A),this.disposeTransportListener=this.transport.onData(this.dataHandler),this.session={sendAndWait:(A,r,t=fe,s)=>this.executeSendAndWait(A,r,t,s),sendRaw:(A,r=fe)=>this.executeSendRaw(A,r),queryMntServerConfig:A=>this.executeQueryConfig(Hx.MNT_CFG,ix.MNT_CFG_PREFIX,A),queryMdnServerConfig:A=>this.executeQueryConfig(Hx.MDN_CFG,ix.MDN_CFG_PREFIX,A),initiateMntSync:A=>this.executeInitiateMntSync(A),initiateMdnSync:A=>this.executeInitiateMdnSync(A),sendCompanionCert:(A,r)=>this.executeSendCompanionCert(A,r),queryCompanionCertSupport:A=>this.executeQueryCompanionCertSupport(A),sendConnectionClose:A=>this.executeSendConnectionClose(A)}}get isBusy(){return this.mutex.islocked}get disposed(){return this.isDisposed}async withAtLock(x){await this.mutex.requestLock();try{if(this.isDisposed)throw new oe;return await x(this.session)}finally{this.mutex.unlock()}}handleIncomingData(x){let e=this.decoder.decode(x);this.bufferState.buffer+=e,this.emit("data",e),this.responseCallback&&this.responseCallback(this.bufferState.buffer),!this.responseCallback&&this.bufferState.buffer.length>1e3&&(this.bufferState.buffer=this.bufferState.buffer.slice(-500))}encodeCommand(x){let e=new Uint8Array(x.length+2);for(let A=0;A<x.length;A++)e[A]=x.charCodeAt(A);return e[x.length]=10,e[x.length+1]=13,e.buffer}makeCleanup(x,e,A){return()=>{this.responseCallback=null,this.activeAbort=null,clearTimeout(x),e&&A&&e.removeEventListener("abort",A)}}makeResponseChecker(x,e,A,r){let t=x instanceof RegExp;return s=>{if(x!==ix.ERROR&&s.includes(ix.ERROR)){e(),r(new ti);return}let i=!1,v=s;if(t){let c=s.match(x);c&&(i=!0,v=c[0])}else i=s.includes(x);if(i){e(),A(v);return}s.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))}}executeSendAndWait(x,e,A,r){return new Promise((t,s)=>{if(this.isDisposed){s(new oe);return}if(r?.aborted){s(new Error(Hr));return}x&&(this.bufferState.buffer="");let v=e instanceof RegExp?e.source:e,c={cleanup:()=>{}},B=setTimeout(()=>{c.cleanup(),s(new Error(`Timeout waiting for response: ${v}`))},A),p=()=>{c.cleanup(),s(new Error(Hr))};c.cleanup=this.makeCleanup(B,r,p),r&&r.addEventListener("abort",p);let b=this.makeResponseChecker(e,c.cleanup,t,s);this.responseCallback=b,this.activeAbort=()=>{c.cleanup(),s(new oe)},!x&&this.bufferState.buffer&&b(this.bufferState.buffer),x&&(this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(h=>{c.cleanup(),s(h)}))})}executeSendRaw(x,e){return new Promise((A,r)=>{if(this.isDisposed){r(new oe);return}this.bufferState.buffer="";let t=setTimeout(()=>{s(),r(new Error(`Timeout waiting for raw AT response to: ${x}`))},e),s=this.makeCleanup(t);this.activeAbort=()=>{s(),r(new oe)},this.responseCallback=i=>{Sv.test(i)&&(s(),this.logger.info("RX: "+i.trim()),A(i))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(i=>{s(),r(i)})})}executeQueryConfig(x,e,A){return new Promise((r,t)=>{if(this.isDisposed){t(new oe);return}if(A?.aborted){t(new Error(Hr));return}this.bufferState.buffer="";let s={cleanup:()=>{}},i=setTimeout(()=>{s.cleanup(),this.logger.error(`Timeout waiting for ${e} server config`),t(new Error(`Timeout waiting for ${e} response \u2014 server configuration not available`))},fe),v=()=>{s.cleanup(),t(new Error(Hr))};s.cleanup=this.makeCleanup(i,A,v),A&&A.addEventListener("abort",v);let c=new RegExp(`\\${e}:\\s*<?([^,>\\s]+)>?`);this.activeAbort=()=>{s.cleanup(),t(new oe)},this.responseCallback=B=>{let p=B.match(c);if(p){s.cleanup();let b=p[1].trim();this.logger.info(`Server config ${e}: ${b}`),r(b);return}B.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(B=>{s.cleanup(),this.logger.error(`Failed to send ${e} command: `+(B instanceof Error?B.message:String(B))),t(B)})})}async sendAndWait(x,e,A=fe,r){return this.withAtLock(t=>t.sendAndWait(x,e,A,r))}async sendRaw(x,e=fe){return this.withAtLock(A=>A.sendRaw(x,e))}async queryMntServerConfig(x){return this.withAtLock(e=>e.queryMntServerConfig(x))}async queryMdnServerConfig(x){return this.withAtLock(e=>e.queryMdnServerConfig(x))}async initiateMntSync(x){return this.withAtLock(e=>e.initiateMntSync(x))}async initiateMdnSync(x){return this.withAtLock(e=>e.initiateMdnSync(x))}async sendCompanionCert(x,e){return this.withAtLock(A=>A.sendCompanionCert(x,e))}async executeInitiateMntSync(x){this.logger.info("Initiating MNT sync"),await this.executeSendAndWait(Hx.MNT_SYNC,ix.OK,fe,x)}async executeInitiateMdnSync(x){this.logger.info("Initiating MDN sync");try{await this.executeSendAndWait(Hx.MDN_SYNC,ix.OK,fe,x),await this.executeSendAndWait(null,ix.SYNC_START,fe,x)}catch(e){this.logger.error("Failed to initiate MDN sync: "+(e instanceof Error?e.message:String(e)))}}async executeSendCompanionCert(x,e){if(this.isDisposed)throw new oe;if(e?.aborted)throw new Error(Hr);let A=x.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-x.length%4)%4),r=A.length,t=await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${r}`,ix.OK,fe,e),s=t.match(/(\d+)/),i=s?parseInt(s[1],10):NaN;if(!Number.isFinite(i)||i<=0)throw new ti(`AT+COMPCERT init: reply carries no chunk size (${JSON.stringify(t.trim())})`);let v=0;for(;v<r;){let c=Math.min(i,r-v),B=A.slice(v,v+c);await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${c},${v},${B}`,ix.OK,fe,e),v+=c}return this.executeCompanionCertFinalize(r,e)}executeCompanionCertFinalize(x,e){return new Promise((A,r)=>{if(this.isDisposed){r(new oe);return}if(e?.aborted){r(new Error(Hr));return}this.bufferState.buffer="";let t={cleanup:()=>{}},s=setTimeout(()=>{t.cleanup(),r(new Error("Timeout waiting for AT+COMPCERT finalize response"))},fe),i=()=>{t.cleanup(),r(new Error(Hr))};t.cleanup=this.makeCleanup(s,e,i),e&&e.addEventListener("abort",i),this.activeAbort=()=>{t.cleanup(),r(new oe)},this.responseCallback=c=>{let B=c.match(ix.COMPCERT_ERROR);if(B){t.cleanup(),A({success:!1,errorCode:parseInt(B[1],10)});return}if(c.includes(ix.OK)){t.cleanup(),A({success:!0});return}c.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))};let v=`${Hx.COMPANION_CERT}=0,${x}`;this.logger.info("TX: "+v),this.transport.write(this.encodeCommand(v)).catch(c=>{t.cleanup(),r(c)})})}async queryCompanionCertSupport(x){return this.withAtLock(e=>e.queryCompanionCertSupport(x))}async executeQueryCompanionCertSupport(x){try{return await this.executeSendAndWait(Hx.COMPANION_CERT_TEST,ix.OK,fe,x),!0}catch(e){if(e instanceof oe)throw e;return!1}}async sendConnectionClose(x){return this.withAtLock(e=>e.sendConnectionClose(x))}async executeSendConnectionClose(x){try{await this.executeSendAndWait(Hx.CON_CLOSE,ix.CON_CLOSE,fe,x)}catch(e){this.logger.error("Failed to receive +CONCLOSE response: "+(e instanceof Error?e.message:String(e)))}}createConCloseMonitor(x){let e="",A=r=>{e+=r,e.includes(ix.CON_CLOSE)&&(e="",this.bufferState.closedByDevice=!0,x()),e.length>1e3&&(e=e.slice(-500))};return this.on("data",A),()=>{this.off("data",A)}}dispose(){this.isDisposed||(this.isDisposed=!0,this.activeAbort?.(),this.disposeTransportListener(),this.responseCallback=null,this.activeAbort=null,this.removeAllListeners())}},Rv=(x=>(x[x.FORMAT=1]="FORMAT",x[x.SIGNATURE=2]="SIGNATURE",x[x.EXPIRED=3]="EXPIRED",x[x.NO_MDN_PUBKEY=4]="NO_MDN_PUBKEY",x[x.BUSY=5]="BUSY",x[x.INTERNAL=6]="INTERNAL",x))(Rv||{}),gD=require("events"),ys="requesting-cert",ks="cert-revoked",Pv=class Kt extends gD.EventEmitter{constructor(){super(...arguments),X(this,"utoMaster",null),X(this,"disposed",!1),X(this,"atHandler",null)}async authenticate(e){let A=e.logger??GA,{signal:r,atHandler:t}=e;if(this.disposed)return this.fail("error","CompanionAuthManager disposed");let s=()=>{if(r?.aborted)throw new Error("Operation aborted")},i=()=>{if(this.disposed)throw new Error("CompanionAuthManager disposed")},v=!1,c=!1,B=null;this.atHandler=t;try{this.emitPhase("checking-cert"),s();let p=await this.loadOrGenerateKeypair(e.storage),b=await e.storage.getCertificate(e.apiConfig.apiHost);(b===null||!Ys(b.notAfter))&&(A.info("Companion cert missing or near expiry \u2014 requesting new cert"),this.emitPhase(ys),s(),b=await this.requestAndStoreCert(p,e)),i(),B=new Q8(e.utoTransport,A,e.timeSource),this.utoMaster=B,this.emitPhase("cert-presenting"),s();let h=b;b=await t.withAtLock(async k=>{let P=await this.presentCertWithRefresh(k,h,p,e);return await k.initiateMdnSync(r),v=!0,P}),i(),this.emitPhase("ecs-handshake"),s(),await B.init(),i();let w=await B.initiateEcsHandshake({companionPublicKey:p.publicKey,companionPrivateKey:p.privateKey,signal:r});return c=w.success,i(),w.success?(this.emitPhase("connected"),i(),this.utoMaster=null,this.atHandler=null,{success:!0,utoMaster:B}):(await this.abandonAttempt(A,B,v,t),this.fail("ecs-handshake",`ECS handshake failed (code ${w.resultCode})`))}catch(p){return await this.abandonAttempt(A,B,v&&!c,t),this.handleError(p)}}async abandonAttempt(e,A,r,t){r&&await t.sendConnectionClose().catch(s=>{e.warn(`at+conclose after failed auth skipped: ${s instanceof Error?s.message:String(s)}`)}),this.utoMaster=null,this.atHandler=null,await Kt.disposeMaster(A,e,t)}static async disposeMaster(e,A,r){if(e)try{await e.dispose(r)}catch(t){A.error(`Failed to dispose UtoMaster: ${t instanceof Error?t.message:String(t)}`)}}dispose(){this.disposed=!0;let e=this.utoMaster,A=this.atHandler;this.utoMaster=null,this.atHandler=null,Kt.disposeMaster(e,GA,A??void 0),this.removeAllListeners()}async loadOrGenerateKeypair(e){let A=await e.getKeypair();if(A!==null)return A;let r=await Ts();return await e.saveKeypair(r),r}static async fetchCertOrThrowRevoked(e,A){try{return await I8(A.apiConfig,{publicKey:e.publicKey,subject:A.subject})}catch(r){throw r instanceof Jt&&(r.httpStatus===401||r.httpStatus===404)?(await A.storage.clearCertificate(A.apiConfig.apiHost),new ws(ks,`Companion cert revoked or session expired (HTTP ${r.httpStatus})`,{httpStatus:r.httpStatus,apiCode:r.code})):r}}async requestAndStoreCert(e,A){let r=await Kt.fetchCertOrThrowRevoked(e,A),t={base64Url:r.certificateBase64Url,notAfter:r.notAfter};return await A.storage.saveCertificate(t,A.apiConfig.apiHost),t}static async refreshCertificate(e){let A=await e.storage.getKeypair(),r=A!==null?A:await(async()=>{let i=await Ts();return await e.storage.saveKeypair(i),i})(),t=await Kt.fetchCertOrThrowRevoked(r,e),s={base64Url:t.certificateBase64Url,notAfter:t.notAfter};return await e.storage.saveCertificate(s,e.apiConfig.apiHost),s}static async clearCredentials(e,A){await e.clearCertificate(A)}async presentCertWithRefresh(e,A,r,t){let s=await e.sendCompanionCert(A.base64Url,t.signal);if(s.success||s.errorCode===3&&((t.logger??GA).info("Device reported EXPIRED \u2014 refreshing cert and retrying"),this.emitPhase(ys),A=await this.requestAndStoreCert(r,t),s=await e.sendCompanionCert(A.base64Url,t.signal),s.success))return A;throw new ws("cert-presenting",`AT+COMPCERT rejected (code ${s.errorCode??"?"})`,{certErrorCode:s.errorCode})}emitPhase(e){this.emit("phase",e)}fail(e,A){return this.emit("phase","error"),{success:!1,phase:e,error:A}}handleError(e){return e instanceof ws?(this.emit("phase",e.phase===ks?ks:"error"),{success:!1,phase:e.phase,error:e.message,certErrorCode:e.certErrorCode,httpStatus:e.httpStatus,apiCode:e.apiCode}):(this.emit("phase","error"),e instanceof Jt?{success:!1,phase:ys,error:e.message,httpStatus:e.httpStatus,apiCode:e.code}:{success:!1,phase:"error",error:e instanceof Error?e.message:String(e)})}};X(Pv,"encodePublicKeyBase64Url",Xs);var yD=Pv,ws=class extends Error{constructor(x,e,A={}){super(e),X(this,"phase",x),X(this,"extra",A),this.name="AuthError"}get certErrorCode(){return this.extra.certErrorCode}get httpStatus(){return this.extra.httpStatus}get apiCode(){return this.extra.apiCode}},Iv=(x=>(x.CERT_FORMAT="cert_format",x.CERT_SIGNATURE="cert_signature",x.CERT_EXPIRED="cert_expired",x.NO_MDN_PUBKEY="no_mdn_pubkey",x.DEVICE_BUSY="device_busy",x.DEVICE_INTERNAL="device_internal",x.ECS_FAILURE="ecs_failure",x.CERT_REVOKED="cert_revoked",x.SESSION_EXPIRED="session_expired",x.ABORTED="aborted",x.UNKNOWN="unknown",x))(Iv||{}),kD={cert_format:"companion_auth.error.cert_format",cert_signature:"companion_auth.error.cert_signature",cert_expired:"companion_auth.error.cert_expired",no_mdn_pubkey:"companion_auth.error.no_mdn_pubkey",device_busy:"companion_auth.error.device_busy",device_internal:"companion_auth.error.device_internal",ecs_failure:"companion_auth.error.ecs_failure",cert_revoked:"companion_auth.error.cert_revoked",session_expired:"companion_auth.error.session_expired",aborted:"companion_auth.error.aborted",unknown:"companion_auth.error.unknown"};function wD(x){if(x.certErrorCode!==void 0)switch(x.certErrorCode){case 1:return"cert_format";case 2:return"cert_signature";case 3:return"cert_expired";case 4:return"no_mdn_pubkey";case 5:return"device_busy";case 6:return"device_internal"}return x.phase==="cert-revoked"?x.httpStatus===401?"session_expired":"cert_revoked":x.phase==="ecs-handshake"?"ecs_failure":x.error==="Operation aborted"?"aborted":"unknown"}var _D=require("events");function Ov(x){let e=x.replace(/\r\nOK\r\n$/,"").trim();return e?e.split("\f").map(A=>{let r=A.split(" ");return r.length<4?null:{name:r[0],scale:parseFloat(r[1]),offset:parseFloat(r[2]),unit:r[3]}}).filter(A=>A!==null):[]}function Nv(x){let e=x.replace(/^\+[^\r\n]*\r\n/gm,"").replace(/\r\nOK\r\n$/,"").trim();return e?e.split("\f"):[]}function qv(x,e,A){let r=parseFloat(x);return isNaN(r)?x:parseFloat(Number(r*e+A).toFixed(3)).toString()}function Ks(x,e){return x.map((A,r)=>({name:A.name,displayValue:qv(e[r]??"",A.scale,A.offset),unit:A.unit}))}var SD=2e3,Mv=class extends _D.EventEmitter{constructor(x,e=yA){super(),X(this,"atHandler",x),X(this,"logger",e),X(this,"datapoints",[]),X(this,"values",[]),X(this,"polling",!1),X(this,"pollTimer",null),X(this,"fetchInProgress",!1),X(this,"fetchPromise",null)}async checkSupport(){this.logger.info("Checking local data support");let x=await this.atHandler.sendRaw(Hx.APP_GET_METADATA),e=x.includes(ix.OK)?{supported:!0,pinRequired:!1}:x.includes(ix.ERROR_PIN_REQUIRED)?{supported:!0,pinRequired:!0}:x.includes(ix.ERROR_NO_DATA)?{supported:!1,pinRequired:!1}:x.includes(ix.ERROR)?{supported:!1,pinRequired:!1}:{supported:!1,pinRequired:!1};return this.logger.info("Local data support: "+JSON.stringify(e)),e}async fetchMetadata(x){this.logger.info("Fetching metadata"+(x?" (with PIN)":""));let e=x?`${Hx.APP_GET_METADATA}=${x}`:Hx.APP_GET_METADATA,A=await this.atHandler.sendRaw(e);if(this.logger.debug("Metadata response: "+A),A.includes(ix.ERROR_PIN_REQUIRED))return this.logger.warn("PIN required/invalid for metadata"),null;if(A.includes(ix.ERROR_NO_DATA))return this.logger.warn("No data available from device"),this.datapoints=[],this.values=[],this.emit("metadata",[]),this.emit("error","No local data available from device"),[];if(A.includes(ix.OK)){let r=Ov(A);return this.logger.info("Parsed "+r.length+" datapoints"),this.datapoints=r,this.values=new Array(r.length).fill(""),this.emit("metadata",r),r}return A.includes(ix.ERROR)?(this.logger.error("Metadata fetch error: "+A),this.emit("error","Device returned error during metadata fetch"),[]):[]}async fetchValues(x){return this.readValues(e=>this.atHandler.sendRaw(e),x)}async readValues(x,e){try{this.logger.debug("Fetching values");let A=e?`${Hx.APP_GET_DATAVALUE}=${e}`:Hx.APP_GET_DATAVALUE,r=await x(A);if(r.includes(ix.OK)){let t=Nv(r);return this.logger.debug("Values: "+t.join(", ")),this.values=t,this.emit("values",t),this.emit("displayValues",Ks(this.datapoints,t)),t}return[]}catch(A){return this.logger.warn("Value fetch error: "+(A instanceof Error?A.message:String(A))),[]}}async checkMeasurementTriggerSupport(){this.logger.info("Checking measurement trigger support");try{let e=(await this.atHandler.sendRaw(Hx.APP_TRIG_MEASURE_TEST)).includes(ix.OK);return this.logger.info("Measurement trigger support: "+e),e}catch(x){if(x instanceof oe)throw x;return this.logger.warn("Measurement trigger probe failed: "+(x instanceof Error?x.message:String(x))),!1}}async triggerMeasurement(x={}){let{pin:e,timeoutMs:A=_v,signal:r}=x;return this.logger.info("Triggering measurement"),this.atHandler.withAtLock(async t=>{let s=await t.sendRaw(Hx.APP_TRIG_MEASURE);if(this.logger.debug("Trigger measurement response: "+s),!s.includes(ix.OK))return this.logger.warn("Measurement trigger rejected: "+s.trim()),{outcome:"rejected",values:[],response:s};this.emit("measurementTriggered");try{let i=await t.sendAndWait(null,ix.MEASURED,A,r);return this.emit("measurementCompleted"),{outcome:"measured",values:await this.readValues(c=>t.sendRaw(c),e),response:i}}catch(i){if(i instanceof oe)throw i;let v="timeout";return i instanceof ti?v="error":r?.aborted&&(v="aborted"),this.logger.warn(`Measurement ${v} while waiting for ${ix.MEASURED}: `+(i instanceof Error?i.message:String(i))),this.emit("measurementFailed",v),{outcome:v,values:[],response:s}}})}async startPolling(x,e=SD){if(this.polling){this.logger.warn("Polling already active \u2014 ignoring startPolling call");return}this.logger.info("Starting polling every "+e+" ms"),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.fetchPromise=this.fetchValues(x),await this.fetchPromise,this.fetchPromise=null,this.polling&&(this.pollTimer=setInterval(()=>{this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchValues(x).finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))},e))}async stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.polling&&(this.logger.info("Polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getSnapshot(){return{datapoints:[...this.datapoints],values:[...this.values],isPolling:this.polling}}getDisplayValues(){return Ks(this.datapoints,this.values)}dispose(){this.stopPolling(),this.datapoints=[],this.values=[],this.removeAllListeners()}};async function TD(x,e,A){let r=s=>{if(s instanceof oe)throw s},t=new Mv(x);try{let s=await x.queryMdnServerConfig(A).catch(b=>(r(b),!1)),i=await t.checkSupport().catch(b=>(r(b),{supported:!1,pinRequired:!1})),v=i.supported?await t.checkMeasurementTriggerSupport().catch(b=>(r(b),!1)):!1,c=i.supported?{pinRequired:i.pinRequired,canTriggerMeasurement:v}:!1,B=!1,p=!1;if(s){let[b,h]=await Promise.all([x.queryCompanionCertSupport(A).catch(w=>(r(w),!1)),e?.getCertificate(s)]);B=b,p=h!=null&&Ys(h.notAfter)}return{hostname:s,localData:c,secureConnection:B,validCert:p}}finally{t.dispose()}}var RD=require("events"),PD={0:"trigger",1:"wakeup",2:"online"},ID={0:["2G","","GSM"],1:["2G","Compact","GSM-COMPACT"],2:["3G","","UTRAN"],3:["2G","EDGE","GSM-EGPRS"],4:["3G","HSDPA","UTRAN-HSDPA"],5:["3G","HSUPA","UTRAN-HSUPA"],6:["3G","HSPA+","UTRAN-HSXPA"],7:["4G","","EUTRAN"],8:["4G","LTE-M","LTE-CATM1"],9:["4G","NB-IoT","LTE-CATNB1"],100:["WiFi","","WIFI"],101:["LAN","Ethernet","ETHERNET"],102:["Local","Wireless","WIRELESS"],103:["Local","Wired","WIRED"]},OD={"NO SCRIPT":"none","SCRIPT ERROR":"error","SCRIPT OK":"ok"},Yx={FAILED:1,ACTIVE:2,STARTED:4,RETRY:8,WAKEUPABLE:16,EXTSIM:32,DISABLED:64,WAKEUP:256,POSUPDATE_ACTIVE:512},ND=Yx.FAILED|Yx.ACTIVE|Yx.STARTED|Yx.RETRY|Yx.WAKEUPABLE|Yx.EXTSIM|Yx.DISABLED|Yx.WAKEUP|Yx.POSUPDATE_ACTIVE,c8=`${ix.RM2M_STATE}: `;function $v(x=0){let e=(x&Yx.WAKEUPABLE)!==0,A="offline",r=e;return x&Yx.POSUPDATE_ACTIVE?(A="locating",r=!1):x&Yx.RETRY?(A="retry",r=!1):x&Yx.STARTED?(A="dialing",r=!1):x&Yx.ACTIVE?(A="active",r=!1):x&Yx.FAILED?(A="failed",r=e):x&Yx.DISABLED&&(A="disabled",r=!1),{signal:A,simType:(x&Yx.EXTSIM)!==0?"external":"internal",wakeupable:r,unknownFlags:x&~ND}}function qD(x){if(x===void 0)return null;let e=parseInt(x,10);return isNaN(e)?x:PD[e]??x}function MD(x){if(x===void 0)return null;let e=parseInt(x,10);return isNaN(e)?null:ID[e]??["unknown",`itf#${x}`,`itf#${x}`]}function $D(x){if(x.length===0)return null;let e=x.join(",");return OD[e]??e}function Lv(x){let e=x.split(","),[A,r,t,s,...i]=e;if(!A||!/^-?\d+$/.test(A)||!r||!/^\d+$/.test(r))return null;let v=parseInt(r,10),c=MD(s),B=s!==void 0?parseInt(s,10):NaN;return{stamp:new Date,rssi:B>=101?null:parseInt(A,10),state:v,uplinkState:$v(v),uplinkMode:qD(t),uplinkInterface:c?c[0]:null,uplinkInterfaceExtended:c?c[1]:null,uplinkInterfaceTechnical:c?c[2]:null,scriptState:$D(i)}}function Gv(x){let e=x.indexOf(c8);if(e===-1)return null;let A=x.substring(e+c8.length),r=A.search(/\r?\n/);if(r===-1)return null;let t=A.substring(0,r).trim();return t?Lv(t):null}var LD=5e3,GD=class extends RD.EventEmitter{constructor(x,e=GA){super(),X(this,"atHandler"),X(this,"logger"),X(this,"lastState",null),X(this,"pollingTimer",null),X(this,"polling",!1),X(this,"fetchInProgress",!1),X(this,"fetchPromise",null),this.atHandler=x,this.logger=e}async fetchState(){try{let x=await this.atHandler.sendRaw(Hx.RM2M_STATE),e=Gv(x);return e?(this.lastState=e,this.emit("state",e),this.logger.debug("RM2M state fetched successfully")):this.logger.warn("Failed to parse RM2M state response"),e}catch(x){let e=x instanceof Error?x.message:String(x);return this.logger.error(`Failed to fetch RM2M state: ${e}`),this.emit("error",e),null}}startPolling(x=LD){if(this.polling){this.logger.debug("Polling already active, ignoring startPolling call");return}this.logger.info(`Starting RM2M state polling every ${x}ms`),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.runGuardedFetch(),this.pollingTimer=setInterval(()=>this.runGuardedFetch(),x)}runGuardedFetch(){this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchState().finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))}async stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),this.polling&&(this.logger.info("RM2M state polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getLastState(){return this.lastState?{...this.lastState,uplinkState:{...this.lastState.uplinkState}}:null}get isPolling(){return this.polling}dispose(){this.stopPolling(),this.lastState=null,this.removeAllListeners()}},UD=require("events"),Uv=class extends UD.EventEmitter{constructor(){super(...arguments),X(this,"serialNumber",""),X(this,"serverUrl",""),X(this,"deviceId",""),X(this,"rssi",null),X(this,"hasDebugSupport",!1),X(this,"connectionState","disconnected"),X(this,"connectionError",""),X(this,"mtuSize",23)}get isConnected(){return this.connectionState==="connected"}setConnected(x){this.serialNumber=x.serialNumber,this.deviceId=x.deviceId,this.serverUrl=x.serverUrl??this.serverUrl,this.hasDebugSupport=x.hasDebugSupport??!1,this.mtuSize=x.mtuSize??23,this.rssi=x.rssi??null,this.connectionState="connected",this.connectionError="",this.emit("connected",this.snapshot()),this.emit("stateChange",this.snapshot())}setDisconnected(){this.connectionState="disconnected",this.rssi=null,this.emit("disconnected"),this.emit("stateChange",this.snapshot())}setError(x){this.connectionError=x,this.connectionState="disconnected",this.emit("error",x),this.emit("stateChange",this.snapshot())}setConnectionState(x){this.connectionState=x,this.emit("stateChange",this.snapshot())}updateRssi(x){this.rssi=x,this.emit("rssiUpdate",x)}reset(){this.serialNumber="",this.serverUrl="",this.deviceId="",this.rssi=null,this.hasDebugSupport=!1,this.connectionState="disconnected",this.connectionError="",this.mtuSize=23,this.emit("reset"),this.emit("stateChange",this.snapshot())}snapshot(){return{serialNumber:this.serialNumber,serverUrl:this.serverUrl,deviceId:this.deviceId,rssi:this.rssi,hasDebugSupport:this.hasDebugSupport,connectionState:this.connectionState,connectionError:this.connectionError,mtuSize:this.mtuSize,isConnected:this.isConnected}}},HD=require("events"),Hv={maxDuration:6e4,initialDelay:1e3,maxDelay:1e4,maxGattRetries:3},KD=class extends HD.EventEmitter{constructor(x=yA,e){super(),X(this,"logger",x),X(this,"state"),X(this,"transports",null),X(this,"transportFactory",null),X(this,"disconnectFn",null),X(this,"reconnectOptions"),X(this,"reconnectAbortController",null),this.state=new Uv,this.reconnectOptions={...Hv,...e}}async connect(x,e,A){this.transportFactory=x,this.disconnectFn=e,this.state.setConnectionState("connecting");try{return this.transports=await x(),this.state.setConnected(A),this.logger.info(`Connected to device ${A.serialNumber}`),this.transports}catch(r){let t=r instanceof Error?r.message:String(r);throw this.state.setError(t),this.logger.error(`Connection failed: ${t}`),r}}async disconnect(){if(this.stopReconnect(),this.disconnectFn)try{await this.disconnectFn()}catch(x){this.logger.warn(`Disconnect error: ${x}`)}this.transports=null,this.state.setDisconnected(),this.logger.info("Disconnected from device")}async reconnect(){if(!this.transportFactory||!this.disconnectFn)return this.logger.error("Cannot reconnect: no transport factory"),!1;this.state.setConnectionState("reconnecting"),this.reconnectAbortController=new AbortController;let{signal:x}=this.reconnectAbortController,e=Date.now(),A=this.reconnectOptions.initialDelay;for(;Date.now()-e<this.reconnectOptions.maxDuration;){if(x.aborted||(this.logger.info(`Reconnecting in ${A}ms...`),await this.sleep(A,x),x.aborted))return!1;try{return this.transports=await this.transportFactory(),this.state.setConnectionState("connected"),this.state.connectionError="",this.logger.info("Reconnected successfully"),this.emit("reconnected"),!0}catch(r){this.logger.warn(`Reconnect attempt failed: ${r}`),A=Math.min(A*2,this.reconnectOptions.maxDelay)}}return this.state.setError("Reconnect timeout exceeded"),this.logger.error("Reconnect failed: timeout exceeded"),this.emit("reconnectFailed"),!1}stopReconnect(){this.reconnectAbortController?.abort(),this.reconnectAbortController=null}getTransports(){return this.transports}sleep(x,e){return new Promise(A=>{let r=setTimeout(A,x);e?.addEventListener("abort",()=>{clearTimeout(r),A()},{once:!0})})}},WD={configurationNumber:1,utoInterface:0,utoEndpoint:1,utoSize:64*1024,debugInterface:1,debugEndpoint:2,debugSize:1024},JD={service:"BC300000-0FA0-4ED4-860A-CF95434B5A4E",txCharacteristic:"BC30E1FF-0FA0-4ED4-860A-CF95434B5A4E",rxCharacteristic:"BC30E1FE-0FA0-4ED4-860A-CF95434B5A4E",txDebugCharacteristic:"BC30E201-0FA0-4ED4-860A-CF95434B5A4E",rxDebugCharacteristic:"BC30E200-0FA0-4ED4-860A-CF95434B5A4E"},zD=590,VD=3e4,M0=class extends Error{constructor(x){super(x),this.name="ApiBadRequestError"}},Oe=class extends Error{constructor(x){super(x),this.name="ApiNotFoundError"}},Fi=class extends Error{constructor(x){super(x),this.name="ApiForbiddenError"}},Ea=class extends Error{constructor(x){super(x),this.name="ApiMethodNotAllowedError"}};function Ne(x){try{return decodeURIComponent(x)}catch{throw new M0("malformed url encoding")}}var XD=2e3,YD=2136;function Ca(x){if(x.length===0)return!0;if(!/^\d{4,17}$/.test(x))return!1;let e=Number(x.slice(0,4));return e>=XD&&e<=YD}function yt(x){if(x)for(let e of["stamp","from","until"]){let A=x[e];if(typeof A=="string"&&!(e==="until"&&A==="*")&&!(e!=="stamp"&&A.trim().length===0)&&!Ca(A))throw new M0(`attribute '${e}' is not valid`)}}function QD(x){return typeof x.setMetadataValue=="function"?x:null}function ZD(x){return typeof x.insertUtoChangeRequests=="function"?x:null}function Ba(){return{lastIssuedStamp40:0,tagMutexTails:new Map}}async function x7(x){return{status:200,body:e7(x.ctx)}}function e7(x){if(!x.live)return x.siteInfo;let e=x.siteInfo.device;return{...x.siteInfo,device:{...e,con:{...e?.con,state:A7(x)}}}}function A7(x){try{return x.live?.state()==="live"?"connected":"disconnected"}catch(e){return x.logger?.warn("[localApi] live state lookup failed; serving con.state=disconnected",e),"disconnected"}}async function r7(x){let{blueprint:e}=x.ctx;if(!e)throw new Oe("blueprint unavailable");return{status:200,body:e}}async function t7(x){let{me:e}=x.ctx;if(e==null)throw new Oe("no profile stored");return{status:200,body:e}}function Kv(x,e,A,r){let t=x.push;t&&(async()=>{try{await t.container(e,A,r)}catch(s){x.logger?.error(`[localApi] device push for tag ${e} failed:`,s)}})()}async function n7(x,e,A){let r=x.push;if(!r)return null;try{return await r.adHocChangeRequest(e,A)}catch(t){return x.logger?.error(`[localApi] change request for tag ${e} failed:`,t),null}}var i7=1024;function xn(x){let e=x.indexOf(0),A=e<0?x:x.subarray(0,e);try{let r=new TextDecoder("utf-8").decode(A),t=JSON.parse(r);return typeof t!="object"||t===null||Array.isArray(t)?null:t}catch{return null}}function Wv(x,e=0){let A=new TextEncoder().encode(x),r=Math.max(i7,e,A.length+1),t=new Uint8Array(r);return t.set(A,0),t}var s7="device_id";function a7(x){return async e=>(await en(e),{status:200,body:await F7(e.ctx,x)})}async function en(x){let e=Ne(x.params[0]),A=await o7(x.ctx);if(!A||A.toLowerCase()!==e.toLowerCase())throw new Oe(`unknown device "${e}"`)}async function o7(x){return x.deviceId||x.siteInfo.device?.device_id||x.storage.getMetadataValue(s7)}async function F7(x,e){let A=await x.storage.getRowForTag(e);if(!A||!A.data)return{};let r=xn(A.data);return r?(typeof r.pipAppVer=="number"&&(r.pipAppVer=`${r.pipAppVer}.0.0`),r.stamp=Yr(W0.stamp40ToMS(Ie(A.stamp))),r):{}}function da(x,e,A){let t=(x.tagMutexTails.get(e)??Promise.resolve()).then(A);return x.tagMutexTails.set(e,t.catch(()=>{})),t}function v7(x){return async e=>{await en(e);let A=c7(e.request.body??null);if(!A)throw new M0("invalid or missing request body");return da(e.session,x,async()=>{let r=await e.ctx.storage.getRowForTag(x),t=r?.data?xn(r.data)??{}:{};return await ua(e.ctx,x,r,{...t,...A}),{status:204,body:""}})}}function f7(x){return async e=>(await en(e),da(e.session,x,async()=>{let A=await e.ctx.storage.getRowForTag(x);return!A||!A.data?{status:204,body:""}:(await ua(e.ctx,x,A,{}),{status:204,body:""})}))}function l7(x){return async e=>{await en(e);let A=Ne(e.params[1]);return da(e.session,x,async()=>{let r=await e.ctx.storage.getRowForTag(x);if(!r||!r.data)return{status:204,body:""};let t=xn(r.data)??{},s=A.toLowerCase();for(let i of Object.keys(t))i.toLowerCase()===s&&delete t[i];return await ua(e.ctx,x,r,t),{status:204,body:""}})}}function c7(x){if(!x)return null;let e;try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}async function ua(x,e,A,r){let t=Wv(JSON.stringify(r),A?.data?.length??0),s=W0.msToStamp40((x.timeSource??gt).nowMs());await x.storage.replaceUtoRow({tag:e,stamp:me(s),flags:A?.flags??0,site_related:A?.site_related??0,data:t}),Kv(x,e,t,s)}var vi=26432,Qr={aberrant:1,service:2,standby:4,commissioned:8,offline:16,commissioning:65536,online:131072},Jv=["preprovisioned","provisioned","claimed","fielded","discarded"];function E7(x){return typeof x=="string"&&Jv.includes(x)}var zv=Object.keys(Qr),An=["standby","commissioned","offline","commissioning","online"],Ws=An.reduce((x,e)=>x|Qr[e],0)>>>0;function Vv(x){let e=0;for(let A of zv)x[A]===!0&&(e|=Qr[A]);return e>>>0}function Da(x,e){let A={};for(let r of zv)x&Qr[r]?A[r]=!0:typeof e?.[r]=="boolean"&&(A[r]=!1);return A}function Xv(x,e,A){let r=x;for(let s of An){let i=e[s];typeof i=="boolean"&&(r=i?r|Qr[s]:r&~Qr[s])}if(r>>>=0,r===x)return null;let t=A();return{newFlags:r,entries:[{json:JSON.stringify({lifecycleFlags:{op:"&",val:~Ws>>>0}}),stamp40:t},{json:JSON.stringify({lifecycleFlags:{op:"|",val:r&Ws}}),stamp40:t+1}]}}async function Yv(x,e){let A=e.device;if(!A)return!1;let r=await x.getRowForTag(vi);if(!r?.data)return!1;let t=xn(r.data);if(!t)return!1;let s=!1;if(typeof t.lifecycleFlags=="number"){let i=Da(t.lifecycleFlags,A.lifecycle_flags);JSON.stringify(A.lifecycle_flags)!==JSON.stringify(i)&&(A.lifecycle_flags=i,s=!0)}return typeof t.lifecycleState=="string"&&A.lifecycle_state!==t.lifecycleState&&(A.lifecycle_state=t.lifecycleState,s=!0),s}var C7=new Set([...An,"service","lifecycle_state"]);function B7(x,e){let A=Math.max(W0.msToStamp40((x.timeSource??gt).nowMs()),e.lastIssuedStamp40+1);return e.lastIssuedStamp40=A+1,A}async function d7(x){return await en(x),Qv(x)}async function Qv(x){let e=b7(x.request.body??null);if(!e)throw new M0("invalid or missing request body");u7(e);let A=x.ctx,r=A.siteInfo.lifecycle_flags;if(!p7(r))throw new M0("this site does not support lifecycle flags!");let t=Vv(r),s=Xv(t,e,()=>B7(A,x.session));if(!s)return{status:204,body:""};let{newFlags:i,entries:v}=s,c=ZD(A.storage);return c&&await c.insertUtoChangeRequests(v.map(B=>({tag:vi,stamp40:B.stamp40,json:B.json}))),A.siteInfo.lifecycle_flags=Da(i,r),await Zv(A),D7(A,v),{status:204,body:""}}function u7(x){let e=[];for(let[A,r]of Object.entries(x))C7.has(A)?(A==="lifecycle_state"?typeof r!="string":typeof r!="boolean")&&e.push(`"${A}" is not valid`):e.push(`"${A}" is not an allowed lifecycle property`);if(e.length>0)throw new M0(`validation errors: ${e.join(", ")}`);if(Object.keys(x).some(A=>!An.includes(A)))throw new M0("invalid parameters")}async function D7(x,e){try{let A=await n7(x,vi,e);A==="executed"?await Yv(x.storage,x.siteInfo)&&await Zv(x):A!==null&&x.logger?.warn(`[localApi] lifecycle change request not applied by the device (outcome=${A})`)}catch(A){x.logger?.error("[localApi] lifecycle device-mirror refresh failed:",A)}}async function Zv(x){await QD(x.storage)?.setMetadataValue("site_info",JSON.stringify(x.siteInfo))}function p7(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}function b7(x){if(!x)return null;let e;try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}async function m7(x){return await xf(x).go(),{status:204,body:""}}async function j7(x){return await xf(x).stop(),{status:204,body:""}}function xf(x){let{live:e}=x.ctx;if(!e)throw new Error("live mode not available");return e}function ef(x){if(x!=null){if(Array.isArray(x)&&x.every(e=>typeof e=="string"))return x;throw new M0('"select" must be an array')}}function h7(x){if(x!=null){if(Array.isArray(x)&&x.every(e=>typeof e=="string"))return x;throw new M0("invalid parameter, select must be an array")}}function g7(x,e){let A=new Map;if(e){for(let[r,t]of e)A.set(t,r);return A}for(let r of x?.fields??[]){if(UA(r))continue;let t=r.alias??r.name;A.set(t,t.toLowerCase())}return A}function y7(x){let e=new Map;for(let A of x.fields){if(UA(A))continue;let r=(A.alias??A.name).toLowerCase();e.set(A.name,r),A.alias&&e.set(A.alias,r)}return e}function k7(x){let e=new Set;for(let A of x.fields)UA(A)||e.add((A.alias??A.name).toLowerCase());return e.add("stamp"),e}function w7(x,e,A){if(!A)return null;let r=g7(x,e),t=new Set,s=[];for(let i of A){if(i==="stamp")continue;let v=r.get(i);v?t.add(v):s.push(i)}if(s.length>0)throw Af(s);return t}function _7(x,e){let A=y7(x),r=[],t=[],s=!1;for(let i of e){if(i==="stamp"){s=!0,r.push("stamp");continue}let v=A.get(i);v?r.push(v):t.push(i)}if(t.length>0)throw Af(t);return s||r.unshift("stamp"),r}function S7(x,e){if(e===void 0)return;let A=k7(x),r=e.map(s=>s.toLowerCase()),t=r.filter(s=>!A.has(s));if(t.length>0)throw new M0(`unknown field name(s): ${t.join(",")}`);return r.includes("stamp")?r:["stamp",...r]}function T7(x,e){if(!e)return x;let A={};for(let[r,t]of Object.entries(x))(r==="stamp"||e.has(r))&&(A[r]=t);return A}function pa(x,e){if(!e)return x;let A={};for(let r of e)A[r]=r in x?x[r]:null;return A}function Af(x){return new M0(`Fields [\`${x.join("`, `")}\`] do not exist in this container`)}function fi(x,e){return x.containers.find(A=>A.name===e||A.alias===e)??null}async function R7(x){let e=x.ctx,A=Ne(x.params[1]),r=fi(e.model,A);if(!r)throw new M0("container does not exist");let t=await e.mapper.readContainer(A);if(!t)throw new Oe(`no data for container "${A}"`);let s=I7(e,r,t,P7(x));return{status:200,body:rf(e,A,s)}}function P7(x){let e=x.query.json??{};return ef(e.select)}function I7(x,e,A,r){let t=w7(e,Zt(x.blueprint??null,e),r);return T7(A,t)}function rf(x,e,A){let r=x.model.byNameOrAlias(e);return r?mv(A,Zt(x.blueprint??null,r)):A}async function O7(x){let e=x.ctx,A=Ne(x.params[1]),r=e.model.byNameOrAlias(A);if(!r)throw new Oe(`unknown container "${A}"`);let t=await e.mapper.readContainer(A);if(!t)throw new Oe(`unknown container "${A}"`);let s=x.query.json??{},i=h7(s.select),v=S7(r,i);return{status:200,body:pa(t,v)}}async function N7(x){let e=Ne(x.params[1]);return tf(x,e,"canonical")}async function q7(x){let e=Ne(x.params[1]);if(!x.ctx.model.byNameOrAlias(e))throw new Oe(`unknown container "${e}"`);return tf(x,e,"legacy")}async function tf(x,e,A){let r=H7(x);if(!r)throw new M0("invalid or missing request body");yt(r);let{stamp:t,...s}=r;if(A==="canonical"&&t!==void 0&&typeof t!="string")throw new M0("value(s) of field(s) stamp are not valid");let i=x.ctx;if(A==="canonical"&&!fi(i.model,e))throw new M0("container does not exist");let v=i.model.byNameOrAlias(e);if(v?.kind==="histdata")throw new Oe(`unknown container "${e}"`);let c=A==="canonical"?L7(i,v,s):G7(v,s);try{let B=A==="canonical"&&t!==void 0?{...c,stamp:t}:c,p=await i.mapper.writeContainer(e,B);return p.devicePushable&&Kv(i,p.tag,p.data,p.stamp40),{status:204,body:""}}catch(B){throw M7(B,e,A,i,v)}}function M7(x,e,A,r,t){if(x instanceof Xt){let s=x.field?$7(r,t,x.field,A):void 0;return A==="canonical"?s?new M0(`no permission to modify container field \`${s}\``):new M0(`no permission to modify container \`${e}\``):s?new Fi(`unknown field name(s): ${s}`):new Ea(`no permission to modify '${e}'`)}return x}function $7(x,e,A,r){if(!e)return A;let t=e.fields.find(i=>i.name===A||i.name.toLowerCase()===A||(i.alias??i.name).toLowerCase()===A);return t?r==="legacy"?(t.alias??t.name).toLowerCase():Zt(x.blueprint??null,e)?.get(A)??t.alias??t.name:A}function L7(x,e,A){if(!e)return A;let r=Zt(x.blueprint??null,e),t=new Map;if(r)for(let[s,i]of r)t.set(i,s);else for(let s of e.fields){let i=s.alias??s.name;t.set(i,i.toLowerCase()),t.set(i.toLowerCase(),i.toLowerCase())}return nf(e,t,A,s=>new M0(`unknown field name(s): ${s}`))}function G7(x,e){if(!x)return e;let A=new Map;for(let r of x.fields){let t=r.alias??r.name;A.set(t.toLowerCase(),t.toLowerCase()),A.set(t,t.toLowerCase())}return nf(x,A,e,r=>new Fi(`unknown field name(s): ${r}`))}var U7=new Set(["stamp","stamp4","stamp8","datetime"]);function nf(x,e,A,r){let t=new Map(x.fields.map(c=>[(c.alias??c.name).toLowerCase(),c])),s={},i=[],v=[];for(let[c,B]of Object.entries(A)){let p=e.get(c);if(!p){i.push(c);continue}let b=t.get(p);if(b&&U7.has(b.type)&&!(typeof B=="string"&&Ca(B))){v.push(c);continue}s[p]=B}if(i.length>0)throw r(i.join(","));if(v.length>0)throw new M0(`value(s) of field(s) ${v.join(",")} are not valid`);return s}function H7(x){let e=x.query.json,A=e!=null&&typeof e=="object"&&!Array.isArray(e)?e:void 0,r=x.request.body;if(!r)return A?{...A}:null;let t=K7(r);if(t===void 0)throw new M0("request supplied data which is not json formatted");return typeof t!="object"||t===null||Array.isArray(t)?null:{...A,...t}}function K7(x){try{return JSON.parse(x)}catch{return}}var sf="x-mt-backfill",af="pending";async function ba(x,e,A){let r=x.push?.backfill;if(!(!r||e===void 0||e===null||A===null))try{return await r.call(x.push,{fromMs:A})==="pending"?{[sf]:af}:void 0}catch(t){x.logger?.error("[localApi] historic backfill check failed:",t);return}}function W7(x,e){if(!x.live)return;let A=x.model.byNameOrAlias(e)?.name??e;return x.live.latest(A)}async function ma(x,e,A,r){if(r.hasUpperBound||(r.offset??0)>0||r.order==="asc"&&A.length>=r.limit)return A;let t=W7(x,e);if(!t)return A;let s=J7(A,r.order);if(s!==null&&t.stampMs<=s)return A;let i=await x.mapper.projectRecord(e,{stamp40:t.stamp40,data:t.data},{select:r.select});if(r.order==="asc")return[...A,i];let v=[i,...A];return v.length<=r.limit?v:v.slice(0,r.limit)}async function of(x,e,A,r){return(await ma(x,e,A?[A]:[],{order:"desc",limit:1,select:r.select,hasUpperBound:r.hasUpperBound}))[0]??null}function J7(x,e){let A=e==="asc"?x[x.length-1]:x[0];return!A||typeof A.stamp!="string"?null:xt(A.stamp)}var z7=1e3,Hn=1e3,Ff="20000101",vf="*";async function V7(x){let e=x.query.json??{};Bf(e,["from","until","count","offset","select"]),yt(e);let A=x.ctx,r=Ne(x.params[1]),{mapperSelect:t,order:s}=lf(A,r,e.select);cf(A,r);let i=ni(e.from,Ff,"from"),v=ni(e.until,vf,"until");Ef(i,v),v!==null&&(v=Y7(v));let c=Q7(e.count),B=Cf(e.offset),p=await ba(A,e.from,i),b=await A.mapper.readTimeseries(r,{fromMs:i,untilMs:v,count:c,offset:B,select:t});return{status:200,body:(await ma(A,r,b,{order:c<0?"desc":"asc",limit:Math.abs(c),select:t,hasUpperBound:v!==null,offset:B})).map(w=>ff(x,A,r,pa(w,s))),headers:p}}async function X7(x){let e=x.query.json??{};Bf(e,["from","until","offset","select"]),yt(e);let A=x.ctx,r=Ne(x.params[1]),t=x.params[2],{mapperSelect:s,order:i}=lf(A,r,e.select);cf(A,r);let v=ni(e.from,Ff,"from"),c=ni(e.until,vf,"until");Ef(v,c);let B=Cf(e.offset),p=await ba(A,e.from,v),b=await A.mapper.readTimeseries(r,{fromMs:v,untilMs:c,count:t==="youngest"?-1:1,offset:B,select:s}),h=t==="youngest"&&B===0?await of(A,r,b[0]??null,{select:s,hasUpperBound:c!==null}):b[0];return h?{status:200,body:ff(x,A,r,pa(h,i)),headers:p}:{status:204,body:JSON.stringify("no timeseries recordData found"),headers:p}}function ff(x,e,A,r){return x.apiVersion==="1"?r:rf(e,A,r)}function lf(x,e,A){let r=ef(A);if(!r)return{mapperSelect:void 0,order:null};let t=fi(x.model,e);if(!t)return{mapperSelect:r,order:null};let s=_7(t,r),i=s.filter(v=>v!=="stamp");return{mapperSelect:i.length>0?i:void 0,order:s}}function cf(x,e){if(!fi(x.model,e))throw new M0("timeseries does not exist")}function ni(x,e,A){let t=x==null||typeof x=="string"&&x.trim()===""?e:String(x);if(t==="*")return null;try{return xt(t)}catch{throw new M0(`attribute '${A}' is not valid`)}}function Ef(x,e){if(x!==null&&e!==null&&x>e)throw new M0('E_BAD_REQUEST "from" value must be older than "until"')}function Y7(x){let e=W0.msToStamp40(x);return W0.stamp40ToMS(e)>=x&&(e-=1),W0.stamp40ToMS(e)}function Q7(x){if(x==null||x==="")return z7;let e=Number(x);if(!Number.isInteger(e))throw new M0('"count" must be an integer');if(e===0)throw new M0("`count` cannot be 0");if(e<-Hn)throw new M0(`"count" must be greater than or equal to -${Hn}`);if(e>Hn)throw new M0(`"count" must be less than or equal to ${Hn}`);return e}function Cf(x){if(x==null||x==="")return 0;let e=Number(x);if(!Number.isInteger(e))throw new M0('"offset" must be an integer');if(e<0)throw new M0('"offset" must be greater than or equal to 0');return e}function Bf(x,e){for(let A of Object.keys(x))if(!e.includes(A))throw new M0(`"${A}" is not allowed`)}var Z7=1e5,x6="20000101",e6="*";async function A6(x){let A=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.ctx,t=r.model.byNameOrAlias(A);if(!t)throw new Oe(`unknown container "${A}"`);let s=x.query.json??{};yt(s);let{fromMs:i,untilMs:v}=n6(s);i6(i,v);let c=s6(s),B=a6(s),p=df(t,s.select)??["stamp"],b=ii(s.from)?await ba(r,s.from,i):void 0,h=p.filter(N=>N!=="stamp"),w=h.length>0?h:void 0,k=await r.mapper.readTimeseries(A,{fromMs:i,untilMs:v,count:c,offset:B,select:w});return{status:200,body:(await ma(r,A,k,{order:c<0?"desc":"asc",limit:Math.abs(c),select:w,hasUpperBound:v!==null,offset:B})).map(N=>p.map(O=>O==="stamp"?N.stamp:N[O]??null)),headers:b}}async function r6(x){let A=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.params[2],t=x.ctx,s=t.model.byNameOrAlias(A);if(!s)throw new Oe(`unknown container "${A}"`);let i=x.query.json??{};yt(i);let v=df(s,i.select)??["stamp"],c=t6(i),B=v.filter(w=>w!=="stamp"),p=B.length>0?B:void 0,b=await t.mapper.readTimeseries(A,{fromMs:null,untilMs:c??null,count:c!==void 0||r==="youngest"?-1:1,select:p}),h=r==="youngest"?await of(t,A,b[0]??null,{select:p,hasUpperBound:c!==void 0}):b[0];return h?{status:200,body:[v.map(w=>w==="stamp"?h.stamp:h[w]??null)]}:{status:200,body:[]}}function t6(x){if(!(!ii(x.until)||x.until==="*"))try{return xt(String(x.until))??void 0}catch{throw new M0("from or until value invalid")}}function n6(x){let e=ii(x.from),A=ii(x.until);if((!e||!A)&&!ja(x.count))throw new M0("missing or invalid parameters (from and until and/or count)");return{fromMs:E8(e?x.from:x6),untilMs:E8(A?x.until:e6)}}function i6(x,e){if(x!==null&&e!==null&&x>e)throw new M0('"from" value must be older than "until"')}function E8(x){let e=String(x);try{return xt(e)}catch{throw new M0(`invalid stamp "${e}"`)}}function s6(x){if(!ja(x.count))return Z7;if(typeof x.count!="number")throw new M0("invalid parameter count");return x.count}function a6(x){let e=x.offset;if(e==null||e==="")return 0;if(typeof e!="number"||e<0)throw new M0("invalid parameter offset");return e}function df(x,e){if(e==null)return;if(!Array.isArray(e))throw new M0("invalid parameter, select must be an array");let A=e.map(v=>String(v).toLowerCase()),r=A.filter(v=>v.includes(" "));if(r.length>0)throw new M0(`aggregation suffix not allowed: ${r.join(",")}`);let t=A.includes("stamp")?A:["stamp",...A],s=new Set(x.fields.filter(v=>!UA(v)).map(v=>(v.alias??v.name).toLowerCase()));s.add("stamp");let i=t.filter(v=>!s.has(v));if(i.length>0)throw new M0(`invalid channel(s) ${i.join(",")}`);return t}function ja(x){return!!x}function ii(x){return typeof x=="string"?x.trim().length>0:ja(x)}var uf={"content-type":"application/json"},o6=[{method:"GET",pattern:/^\/api\/1\/me$/,handler:t7,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)$/,handler:x7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/blueprint$/,handler:r7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-set-lifecycle$/,handler:Qv,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-livemode-go$/,handler:m7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-livemode-stop$/,handler:j7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/devices\/([^/]+)\/cn-set-lifecycle$/,handler:d7,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)\/(oldest|youngest)$/,handler:X7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)$/,handler:V7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:R7,checksUid:!0},{method:"PUT",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:N7,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?\/(oldest|youngest)$/,handler:r6,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?$/,handler:A6,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:O7,checksUid:!0},{method:"PUT",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:q7,checksUid:!0},...F6()];function F6(){let x={"sys-otp":26432,"sys-flash":26433,"app-otp":26434,"app-flash":26435,"app-state":26436,"sys-info":26437,"app-info":26438},e={"sys-flash":26433,"app-flash":26435},A=Object.entries(x).map(([t,s])=>({method:"GET",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:a7(s),checksUid:!1})),r=Object.entries(e).flatMap(([t,s])=>[{method:"PUT",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:v7(s),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:f7(s),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}/([^/]+)$`),handler:l7(s),checksUid:!1}]);return[...A,...r]}var v6=/^\/api\/([12])\/customers\/([^/]+)\/sites\/(.*)$/;function f6(x){let e=Ba();return A=>Df(x,A,e)}async function Df(x,e,A=Ba()){try{let[r,t]=E6(e.path),s=C6(t),i=c6(r,x);if(i===null)return Xr(404,"E_NOT_FOUND","unknown customer");let v=e.method.toUpperCase();for(let c of o6){if(c.method!==v)continue;let B=c.pattern.exec(i);if(!B)continue;let p=B.slice(1);if(c.checksUid&&!l6(x,p[0]))return Xr(404,"E_NOT_FOUND","unknown site");let b=/^\/api\/([12])\//.exec(i)?.[1]??"1",h=await c.handler({request:e,params:p,query:s,ctx:x,session:A,apiVersion:b});return u6(h)}return Xr(404,"E_NOT_FOUND","not found")}catch(r){return bf(r)}}function l6(x,e){return x.allowAnySiteUid===!0||e!==void 0&&Ne(e)===x.siteUid}function c6(x,e){let A=v6.exec(x);if(!A)return x;let r=Ne(A[2]).toLowerCase();return(e.siteInfo.customer_id??"").toLowerCase()===r||(e.siteInfo.customer_uid??"").toLowerCase()===r?`/api/${A[1]}/sites/${A[3]}`:null}function E6(x){let e=x.indexOf("?");return e<0?[x,""]:[x.slice(0,e),x.slice(e+1)]}function C6(x){let e={params:{}};if(!x)return e;for(let A of x.split("&"))A&&B6(e,A);return e}function B6(x,e){let A=e.indexOf("="),r=Ne(A<0?e:e.slice(0,A)),t=A<0?"":Ne(e.slice(A+1));r==="json"?x.json=d6(t):x.params[r]=t}function d6(x){try{return JSON.parse(x)}catch{throw new M0("request supplied data which is not json formatted ")}}function u6(x){let e=typeof x.body=="string"?x.body:JSON.stringify(x.body);return{status:x.status,headers:{...uf,...x.headers},body:e}}function pf(x,e){return{status:x,headers:{...uf},body:JSON.stringify(e)}}function bf(x){return x instanceof M0||x instanceof la||x instanceof ta?Xr(400,"E_BAD_REQUEST",x.message):x instanceof Fi||x instanceof Xt?Xr(403,"E_FORBIDDEN",x.message):x instanceof Ea?Xr(405,"E_METHOD_NOT_ALLOWED",x.message):x instanceof Oe||x instanceof LA?Xr(404,"E_NOT_FOUND",x.message):pf(500,{err:x instanceof Error?x.message:String(x)})}function Xr(x,e,A){return pf(x,{err:`${e} ${A}`})}function D6(x,e={}){let A=e.logger??GA;return{go:async()=>{x.start().catch(r=>{A.warn("[localApi] detached live-mode start failed",r)})},stop:async()=>x.stop(),state:()=>x.state,latest:r=>x.latest(r)}}var mf="histdata_backfill_floor",jf=2e3,hf=15e3;function gf(x,e){let A=x.storage,r=x.logger??GA,t=x.timeSource??gt,s=x.tag??26623,i=x.metadataKey??mf,v=x.graceWaitMs??jf,c=x.failureCooldownMs??hf,B=null,p=0,b=!1,h=!1,w=Promise.resolve();async function k(){let L=await A.getMetadataValue(i);if(L===null)return null;let U=Number(L);return Number.isFinite(U)?U:null}function P(L){return w=w.then(async()=>{let U=await k();U!==null&&U<=L||await A.setMetadataValue?.(i,String(L))}),w}async function R(){let L=await k();if(L!==null)return L;let[U]=await A.getHistoricRows(s,{order:"asc",limit:1});return U?Ie(U.stamp):null}async function N(L){let U=await R();return U===null||L<U}function O(){return typeof A.setMetadataValue=="function"?!0:(h||(h=!0,r.warn("[localApi] historic backfill disabled: storage has no setMetadataValue")),!1)}function W(L){let U=!1,r0=!1,Q=null,x0=[],f0=async a0=>{try{await a0()}catch(c0){r.warn("[localApi] historic backfill cancel hook failed:",c0)}};return{api:{from40:L,anchor40:Math.max(0,L-1),cancelled:()=>U,onCancel:a0=>{if(U){f0(a0);return}x0.push(a0)},persist:async a0=>{U||(r0=!0,await A.insertHistoricRows(a0))}},snapshot:async()=>{Q=await R()},persisted:()=>r0,startBefore:()=>Q,cancel:async()=>{if(U)return;U=!0;let a0=r0?P(Q??W0.msToStamp40(t.nowMs())):Promise.resolve();await Promise.all([a0,...x0.splice(0).map(f0)])}}}async function s0(L){L.persisted()&&await P(L.startBefore()??W0.msToStamp40(t.nowMs()))}function M(L){let U=W(L),r0=Promise.resolve().then(async()=>(await U.snapshot(),e.fetch(U.api))).then(async Q=>{if(Q==="completed"&&!U.api.cancelled()){await P(L);return}Q!=="skipped"&&await s0(U)}).catch(async Q=>{U.api.cancelled()?r.debug("[localApi] historic backfill abandoned after cancel:",Q):(r.error("[localApi] historic backfill failed:",Q),p=t.nowMs()+c),await s0(U)}).finally(()=>{B?.promise===r0&&(B=null)});return B={from40:L,promise:r0,run:U},r0}function y(L){return B?B.from40<=L?B:"pending":null}async function G(L){let U,r0=await Promise.race([L.then(()=>"ready"),new Promise(Q=>{U=setTimeout(()=>Q("pending"),v)})]);return clearTimeout(U),r0}async function V(L){return L==="pending"?"pending":G(L.promise)}async function Y(L){try{if(b||!O())return"ready";let U=Math.max(0,W0.msToStamp40(L));if(!await N(U))return"ready";let r0=y(U);if(r0)return await V(r0);if(t.nowMs()<p||e.canFetch&&!await e.canFetch()||b)return"ready";let Q=y(U);return Q?await V(Q):await G(M(U))}catch(U){return r.error("[localApi] historic backfill check failed:",U),"ready"}}return{ensureRange:Y,cancel:async()=>{b=!0;let L=B;L&&(B=null,r.info("[localApi] cancelling historic backfill: the device link is needed elsewhere"),await L.run.cancel())},resume:()=>{b=!1},reset:()=>{B?.run.cancel(),B=null,p=0,b=!1,h=!1}}}var yf=1e4,kf=500;function p6(x,e,A,r){return{tag:e,stamp:me(x.stamp40),flags:A,site_related:r,data:x.data}}function b6(x){let{hooks:e,storage:A}=x,r=x.logger??GA,t=x.tag??26623,s=x.idleTimeoutMs??yf,i=x.flushSize??kf;async function v(p,b){let h=await A.getRowForTag(t),w=h?.flags??0,k=h?.site_related??0;if(p.cancelled())return"aborted";let P=new Promise(s0=>p.onCancel(()=>s0())),R=b.utoMaster.requestHistoricUtos(t,p.anchor40,void 0,s,i,async s0=>p.persist(s0.map(M=>p6(M,t,w,k))));if(await Promise.race([R.then(()=>!0),P.then(()=>!1)]))return"completed";let O=R.then(()=>{},s0=>r.debug("[localApi] abandoned historic stream settled:",s0)),W;return await Promise.race([O,new Promise(s0=>{W=setTimeout(s0,s)})]),clearTimeout(W),"aborted"}async function c(p){if(p.cancelled())return"aborted";if(!await e.canFetch())return"skipped";if(p.cancelled())return"aborted";let b=e.openSession(),h=null,w=()=>(h??(h=b.then(P=>P?.close(),()=>{})),h);p.onCancel(w);let k=await b;if(!k)return"skipped";if(p.cancelled())return"aborted";try{return await v(p,k)}finally{await w().catch(P=>r.warn("[localApi] historic backfill session close failed:",P))}}let B=gf(x,{canFetch:()=>e.canFetch(),fetch:p=>e.runDeviceWork(()=>c(p))});return{...B,backfill:p=>B.ensureRange(p.fromMs)}}function m6(x,e){let A=e.apmId??"local",r=e.version??1;return{uid:e.siteUid,name:e.name??e.siteUid,customer_id:A,customer_uid:A,app:{apmid:A,version:String(r)},device:{device_id:e.deviceId,lifecycle_flags:{}},lifecycle_flags:{},containers:x.containers.map(t=>({name:t.name,alias:t.alias??t.name,kind:t.kind}))}}var wf=4;function _f(x){if(!x.data||x.data.byteLength!==wf)return null;let e=new DataView(x.data.buffer,x.data.byteOffset,x.data.byteLength);return{stamp40:x.stamp40,stampMs:W0.stamp40ToMS(x.stamp40),code:e.getInt16(0,!1),param:e.getInt16(2,!1)}}function Sf(x){let e=[];for(let A of x){let r=_f(A);r&&e.push(r)}return e}var ha=[["1000","","POWER ON","","8080FF",""],["1001","0","POST","OK","88FF88",""],["1001","1","POST","ERROR 1WIRE","FF8888",""],["1001","2","POST","ERROR SUPPLY","FF8888",""],["1001","3","POST","ERROR EXTVOLTAGE","FF8888",""],["1001","4","POST","ERROR IDLE_CURR","FF8888",""],["1001","5","POST","ERROR LED_CURR","FF8888",""],["1001","6","POST","ERROR XFLASH","FF8888",""],["1001","7","POST","ERROR BURST_CURR","FF8888",""],["1001","8","POST","ERROR PIN_CURR","FF8888",""],["1001","9","POST","ERROR KEY_CURR","FF8888",""],["1001","10","POST","ERROR KEY","FF8888",""],["1001","11","POST","ERROR MODEM_CURR","FF8888",""],["1002","","EXCESSIVE POWER ON","","FFFF80","10 Power ONs in the last 30 minutes!"],["1003","","INVALID RTC TIMESTAMP","","FFFF80","RTC not initialized on power ON!"],["1010","","CYCLIC RESET","","FF8080","Internal fault! Contact your support engineer!"],["1011","","BSL RESET","","C0C0C0",""],["1012","","USER RESET","","C0C0C0",""],["1013","","IO RESET","","FF8080",""],["1020","","ERROR SOD","","FF8080","Internal fault!"],["1021","","OVT SHUTDOWN","","FF8080","overtemperature shutdown!"],["1030","","UV LOCKOUT","","FF8080",""],["1031","","UV RECOVER","","FFFF80",""],["1032","","OSC FAULT","","FF8080","Oscillator fault!"],["1033","","MODEM UPDATE","","C0C0C0","Modem updated!"],["1034","","CONTROLLER UPDATE","","C0C0C0","Controller updated!"],["1035","","EXCEPTION","","FF8080","Exception occured!"],["1036","","EXCEPTION ADDR 1","$x1 $x2","","Exception at address $x1 $x2!",1],["1037","","EXCEPTION ADDR 2","$x1 $x2","","Return address for last function call before exception!",1],["1038","","UV MODEM LOCKOUT","","FF8080",""],["1039","","UV MODEM RECOVER","","FFFF80",""],["1040","","SYSTEM ERROR","","FF8080",""],["1041","0","UPLINK INTERFACE","NONE","",""],["1041","1","UPLINK INTERFACE","MODEM","",""],["1041","2","UPLINK INTERFACE","WIFI","",""],["1041","3","UPLINK INTERFACE","LAN","",""],["1041","","UPLINK INTERFACE","","",""],["1042","","FORCED SHUTDOWN","","C0C0C0",""],["1043","","SYSTEM FILE UPDATE","","C0C0C0",""],["1044","","SYSTEM FILE DOWNLOAD ERROR","","FFFF80",""],["1045","","SYSTEM FILE UPDATE ERROR","","FF8080",""],["1046","0","CONTROLLER UPDATE ERROR","CRC","FF8080","The CRC of the firmware pack couldn`t be verified"],["1046","1","CONTROLLER UPDATE ERROR","SIGNATURE","FF8080","The signature of the firmware pack couldn`t be verified"],["1046","2","CONTROLLER UPDATE ERROR","TLV","FF8080","The data structure of the firmware pack is invalid"],["1046","3","CONTROLLER UPDATE ERROR","FW INFO","FF8080","The firmware pack is not suitable for this device"],["1046","4","CONTROLLER UPDATE ERROR","MIN VERSION","FF8080","The version of the firmware package is below the minimum version stored in the firmware currently installed on the device"],["1046","","CONTROLLER UPDATE ERROR","","FF8080","Error updating the firmware of the controller"],["1047","-2","RADIO FW UPDATE ERROR","WRONG INFO TAG","FF8080","Error updating radio module!"],["1047","-3","RADIO FW UPDATE ERROR","DOWNGRADE NOT ALLOWED","FF8080","Error updating radio module!"],["1047","-4","RADIO FW UPDATE ERROR","SAME VERSION","FF8080","Error updating radio module!"],["1047","-5","RADIO FW UPDATE ERROR","INCORRECT INFO STRING","FF8080","Error updating radio module!"],["1047","-6","RADIO FW UPDATE ERROR","CRC","FF8080","Error updating radio module!"],["1047","-7","RADIO FW UPDATE ERROR","BIN TAG","FF8080","Error updating radio module!"],["1047","","RADIO FW UPDATE ERROR","","FF8080","Error updating radio module!"],["1100","","BUTTON","","C0C0C0","user action"],["1110","","ALOHA START","","C0C0FF",""],["1111","","ALOHA STOP","","",""],["1112","","WAKEUP","","C0C0FF",""],["1113","","BACKUP CONNECTION","","FFFF80",""],["1114","","BACKUP SUPPLY","","FFFF80",""],["1120","","TRANSPORT MODE","","C0C0FF",""],["1126","","MODEM COPS MODE","","FFFF80","The modem has changed the mode for the operator selection. Contact the manufacturer if the device log includes this error several times"],["1130","","LOG ENTRY DELETED","","C0C0C0",""],["1140","","RECORD DELETED","","C0C0C0",""],["1141","","RECORD2 DELETED","","C0C0C0",""],["1142","","DAT ENTRY FAILED","","FF8080",""],["1145","","ALARM ENTRY DELETED","","C0C0C0",""],["1150","","SAMPLE HOLD","","",""],["1160","","FILE INTEGRITY","","FF8080","Internal fault!"],["1161","","LOG REFORMATFILE","","FF8080","Reformat (leads to data loss)"],["1162","0","FLFILE ERROR","WRITING PROPS FILE","FF8080",""],["1162","1","FLFILE ERROR","WRITING FILE","FF8080",""],["1163","0","FLSTOR ERROR","OPENING/CREATING FILE","FF8080",""],["1163","1","FLSTOR ERROR","CREATING FOLDER","FF8080",""],["1163","2","FLSTOR ERROR","DELETING FILE","FF8080",""],["1163","3","FLSTOR ERROR","WRITING FILE","FF8080",""],["1170","","EXT FLASH DEF","","FF8080","Internal fault!"],["1171","","AD RECOMPACT","","","Recompact A&D Flash"],["1180","","INCREASE ITV","","",""],["1181","","TIME OFFSET","","C0C0C0",""],["1182","","RTC ERROR","","FF8080","Error writing time"],["1190","","DP INVALID","","FF8080","Internal fault!"],["1191","","IP ADDRESS MISMATCH","","FFFF80","IP address configuration is not valid!"],["1192","","FUTURE TIMESTAMP","","FFFF80","Timestamp in the future detected!"],["1193","","UTO CONTEXT RESTORED","","C0C0C0","Uto context was restored!"],["1194","","RTC TIME SET BY DLO","","","System time was manually set by application script"],["1195","","RTC TIME SET BY SERVER","","","Manually set system time replaced by server time"],["1196","","RTC TIME INVALID","","FFFF80","System time may be invalid"],["1200","-1000","GPRS ERROR","-1000","FFFF80","Check the provider settings.|Eventually try to connect later again."],["1200","-999","SIM PIN NO ATTEMPT","-999","FFFF80","Activate the SIM using an unlocked mobile phone. Hold the PUK ready."],["1200","-998","SIM ERROR","-998","FFFF80","Try the SIM in an unlocked mobile phone.|Clean the SIM contact layer.|Replace the SIM if necessary."],["1200","-997","CMD UNKNOWN","-997","FF8080","Internal fault!"],["1200","-996","CMD STATE NOINIT NOT ALLOWED","-996","FF8080","Internal fault!"],["1200","-995","CMD STATE CON NOT ALLOWED","-995","FF8080","Internal fault!"],["1200","-994","CMD STATE DISC NOT ALLOWED","-994","FF8080","Internal fault!"],["1200","-993","BEARER LINE BUSY","-993","FFFF80","Try to connect later again."],["1200","-992","BEARER NO ANSWER","-992","FFFF80","Try to connect later again.|Eventually contact the network provider support."],["1200","-991","BEARER NO CARRIER","-991","FFFF80","Try to connect later again.|Eventually contact the network provider support."],["1200","-990","BEARER NO SIM","-990","FFFF80","Check the SIM card."],["1200","-989","BEARER PIN NOT READY","-989","FFFF80","Check the PIN setting.|Eventually check the SIM using an unlocked mobile phone. Keep the PUK ready."],["1200","-988","BEARER GPRS FAILED","-988","FFFF80","Try to improve the antenna position.|Check the provider settings!|Check the GPRS capability with MMS or internet on your mobile phone.|Eventually ask the SIM provider support whether the GPRS service is blocked."],["1200","-987","BEARER PPP LCP FAILED","-987","FF8080","Internal fault!"],["1200","-986","BEARER PPP AUTH FAILED","-986","FF8080","Internal fault!"],["1200","-985","BEARER PPP IPCP FAILED","-985","FF8080","Internal fault!"],["1200","-984","BEARER PPP LINK FAILED","-984","FF8080","Internal fault!"],["1200","-983","BEARER PPP TERM REQ","-983","FF8080","Internal fault!"],["1200","-982","BEARER CALL REFUSED","-982","FFFF80","Try to connection later again."],["1200","-981","BEARER UNKNOWN","-981","FFFF80","Check the provider settings.|Eventually try to connect later again."],["1200","-980","BEARER BAD HDL","-980","FF8080","Internal fault!"],["1200","-979","BEARER BAD STATE","-979","FF8080","Internal fault!"],["1200","-978","BEARER DEV","-978","FF8080","Internal fault!"],["1200","-977","BEARER GPRS START UNKNOWN","-977","FFFF80","Internal fault!"],["1200","-976","BEARER GPRS STOP BAD HDL","-976","FF8080","Internal fault!"],["1200","-975","BEARER GPRS STOP UNKNOWN","-975","FFFF80","Internal fault!"],["1200","-974","USB START","-974","",""],["1200","-973","USB STOP","-973","",""],["1200","-972","FW DLD","-972","C0C0C0",""],["1200","-971","NO PROVIDER","-971","FFFF80","Try to improve the antenna position.|Eventually contact the network provider support."],["1200","-970","NETLOCK FAILURE","-970","FFFF80","Check the netlock setting and eventually remove the netlock.|Eventually contact the network provider support for existing partner networks."],["1200","-969","BAND SEL FAILED","-969","FFFF80","Try to improve the antenna position."],["1200","-968","SIM PIN WRONG","-968","FFFF80","Check the PIN setting."],["1200","-967","SIM NO PIN","-967","FFFF80","Check the PIN setting."],["1200","-966","NETLOCK ERROR","-966","FFFF80","Check the netlock setting.|Eventually remove the netlock."],["1200","-965","CHANNEL ABORTED","-965","FFFF80","Try to connect later again."],["1200","-964","CHANNEL CSTATE","-964","FFFF80","Try to connect later again."],["1200","-963","CHANNEL NOT SUPPORTED","-963","FFFF80","Try to connect later again."],["1200","-962","CHANNEL OUT OF RANGE","-962","FFFF80","Try to connect later again."],["1200","-961","CHANNEL MEMORY","-961","FF8080","Internal fault!"],["1200","-960","CHANNEL INTERNAL","-960","FF8080","Internal fault!"],["1200","-959","CHANNEL INVALID","-959","FF8080","Internal fault!"],["1200","-958","TCP DNS FAILURE","-958","FFFF80","Check the IP address setting."],["1200","-957","CHANNEL RESOURCES","-957","FFFF80","Try to connect later again."],["1200","-956","CHANNEL PORT IN USE","-956","FFFF80","Try to connect later again."],["1200","-955","CHANNEL REFUSED","-955","FFFF80","Try to connect later again.|Check the provider settings."],["1200","-954","CHANNEL HOST UNREACHABLE","-954","FFFF80","Try to connect later again."],["1200","-953","CHANNEL NETWORK UNREACHABLE","-953","FFFF80","Try to connect later again."],["1200","-952","CHANNEL PIPE BROKEN","-952","FFFF80","Try to connect later again."],["1200","-951","CHANNEL TIMEOUT","-951","FFFF80","Try to connect later again."],["1200","-950","CHANNEL UNKNOWN","-950","FF8080","Internal fault!"],["1200","-949","NETWORK LOST","-949","FFFF80","Try to connect later again.|Eventually try to improve the antenna position."],["1200","-948","MODEM UNS RESTART","","FF8080","Modem unsolicited restart! Contact your support engineer!"],["1200","-947","MODEM INIT ERROR","","FF8080","Modem initialization! Contact your support engineer!"],["1200","-946","MODEM TIMEOUT","","FFFF80","Modem communication timeout. Try to connect later again."],["1200","-945","MODEM AT SEND ERROR","","FFFF80","Error sending AT command. Contact your support engineer!"],["1200","-944","MODEM EXITONLINE ERROR","","FFFF80","Error leaving modem onlinemode. Contact your support engineer!"],["1200","-943","MODEM POSITION UPDATE ERROR","","FFFF80","Error processing position update. Contact your support engineer!"],["1200","-942","MODEM TCP IO STALL","","FF8080","Error during online connection. Contact your support engineer!"],["1200","-941","MODEM NETINFO STALL","","FF8080","Error detected during online connection. Contact the manufacturer if the device log includes this error several times"],["1200","-940","MODEM RESETLOOP","","FF8080","Restart loop on modem detected. Contact the manufacturer if the device log includes this error several times"],["1200","-939","MODEM UNDERVOLTAGE","","FF8080","Undervoltage on the modem detected. The power supply should be checked."],["1200","-938","MODEM OVERHEAT","","FF8080","Overheating of the modem detected."],["1200","","MODEM ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1201","","MODEM NOT FOUND","","FF8080",""],["1202","","MODEM CMME ERROR","","","GPRS-Modem reported +CMME ERROR"],["1203","","SELECTED NETWORK","MCC=$1 MNC=$2","","selected network MCC=$1 MNC=$2",1],["1204","","BANNED NETWORK","MCC=$1 MNC=$2","","banned network MCC=$1 MNC=$2",1],["1205","","BAN LIST CLEARED","","",""],["1206","","SIGNAL QUALITY","","",""],["1207","0","NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1207","1","NETWORK REGISTRATION","HOME","","registered, home network"],["1207","2","NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1207","3","NETWORK REGISTRATION","DENIED","","registration denied"],["1207","4","NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1207","5","NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1207","","NETWORK REGISTRATION","","",""],["1208","0","GPRS NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1208","1","GPRS NETWORK REGISTRATION","HOME","","registered, home network"],["1208","2","GPRS NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1208","3","GPRS NETWORK REGISTRATION","DENIED","","registration denied"],["1208","4","GPRS NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1208","5","GPRS NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1208","","GPRS NETWORK REGISTRATION","","",""],["1209","1","TCP CLOSED","FIN","","regular remote disconnection from server"],["1209","2","TCP CLOSED","RST","","irregular remote disconnection from server"],["1209","3","TCP CLOSED","TIMEOUT","","socket inactivity timeout"],["1209","4","TCP CLOSED","PDP CTX","","network deactivation (PDP context)"],["1209","","TCP CLOSED","","",""],["1210","","MODEM REGULAR ON","","",""],["1211","","MODEM REGULAR OFF","","",""],["1212","","ERROR MODEM IRREGULAR OFF","","FFFF80",""],["1213","","MODEM REGULAR DISCON","","",""],["1214","","MODEM REQUEST DISCON","","",""],["1215","","MODEM TESTMODE ON","","C0C0C0",""],["1216","","MODEM TESTMODE OFF","","",""],["1217","","MODEM TESTMODE IRREGULAR OFF","","FFFF80",""],["1218","","MODEM TESTMODE ERROR","","FF8080",""],["1219","0","LTE NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1219","1","LTE NETWORK REGISTRATION","HOME","","registered, home network"],["1219","2","LTE NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1219","3","LTE NETWORK REGISTRATION","DENIED","","registration denied"],["1219","4","LTE NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1219","5","LTE NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1219","","LTE NETWORK REGISTRATION","","",""],["1220","","MODEM ON","","",""],["1221","","MODEM OFF","","",""],["1222","","MODEM RESET","","C0C0C0",""],["1224","","MODEM SIM RESET","","C0C0C0",""],["1225","","MODEM STANDBY","","",""],["1227","0","WC NWREG","CONTINUED","","Logging of network registration continued"],["1227","1","WC NWREG","PAUSED","","Logging of network registration paused"],["1228","","EMM REJECT CAUSE","","FFFF80",""],["1230","","MODEM INIT USB","","80C0F0",""],["1231","","MODEM INIT GPRS","","",""],["1240","","DEVICE CONNECTED","","80FF80",""],["1241","","MODEM SMS BACKUP OK","","80FF80","SMS backup successful"],["1242","","MODEM SMS BACKUP ERROR","","FF8080","SMS backup failed"],["1243","","BAD GSM QUALITY","","FF8080","The GSM signal is low"],["1244","","WC MNT ABORTED","","FF8080","Connection to Maintenance server failed"],["1245","","WC CON STARTED","","","TCP connection started"],["1250","","MODEM TO ON","","FF8080","Unknown fault!"],["1251","","MODEM TO INIT","","FF8080","Unknown fault!"],["1252","","MODEM TO CON","","FF8080","Unknown fault!"],["1253","","MODEM TO DISC","","FFFF80","Unknown fault!"],["1254","","MODEM TO OFF","","FF8080","Unknown fault!"],["1255","","MODEM TO EVAL","","",""],["1260","","MODEM FW ERROR","","FF8080","Internal fault! Contact your support engineer!"],["1261","","MODEM FW TO","","FF8080","Internal fault! Contact your support engineer!"],["1270","","MODEM DLY BEFOR RST","","",""],["1271","","MODEM RST OK","","80FF80",""],["1272","","MODEM RST NOT OK","","FF8080","Unknown fault!"],["1280","","MODEM UNKNOWN TASK STATE","","FF8080","Unknown fault!"],["1281","","MODEM ZLIB STREAMPROCESS ERR","","FF8080",""],["1282","","MODEM ZLIB STREAMFINISH ERR","","FF8080",""],["1283","","MODEM ZLIB STREAMINIT ERR","","FF8080",""],["1284","","BYTE STUFF PENDING","","FF8080","Internal error. Contact the manufacturer if the device log includes this error several times"],["1290","","COM UNKNOWN TASK STATE","","FF8080","Unknown fault!"],["1300","","USB CONNECTED","","80C0F0",""],["1310","","USB DISCONNECTED","","",""],["1315","","UART CONNECTED","","80C0F0",""],["1316","","UART DISCONNECTED","","",""],["1317","","RADIO CONNECTED","","80C0F0",""],["1318","","RADIO DISCONNECTED","","",""],["1319","","RADIO RESET","","80C0F0",""],["1320","0","LAN LINKUP","","",""],["1320","1","LAN LINKDOWN","","",""],["1320","2","LAN TIMEOUT","","FF8080",""],["1320","3","LAN OPEN SOCKET FAILED","","FF8080",""],["1320","4","LAN DISCONNECT","","",""],["1320","5","LAN NO IP","","FF8080",""],["1320","6","LAN DHCP DISCOVER","","",""],["1320","7","LAN DHCP REQ","","",""],["1320","8","LAN DHCP REREQ","","",""],["1320","9","LAN DHCP NEW IP","","",""],["1320","10","LAN DHCP ABORT","","FF8080",""],["1320","11","LAN MAC READ ERROR","","FF8080",""],["1321","23","LAN SOCK ESTABLISHED","","",""],["1321","24","LAN SOCK FIN WAIT","","",""],["1321","26","LAN SOCK CLOSING","","",""],["1321","27","LAN SOCK TIME WAIT","","",""],["1321","28","LAN SOCK CLOSE WAIT","","",""],["1321","29","LAN SOCK LAST ACT","","",""],["1325","0","RADIO ADVERTISING","OFF","","Advertising deactivated"],["1325","1","RADIO ADVERTISING","ON","","Advertising has been activated"],["1335","0","SHT2X SENSOR OK","","80FF80","The internal temperature and air humidity sensor is returning valid values"],["1335","1","SHT2X RH ERROR","","FF8080","A communication error occured when reading the air humidity value from the internal temperature and air humidity sensor."],["1335","2","SHT2X TEMP ERROR","","FF8080","A communication error occured when reading the temperature value from the internal temperature and air humidity sensor."],["1335","3","SHT2X RH+TEMP ERROR","","FF8080","A communication error occured when reading the measurement value from the internal temperature and air humidity sensor."],["1335","4","SHT2X PLAUSIBILITY ERROR","","FF8080","The values received from the internal temperature and air humidity sensor are not plausible (rH <0% rH or >100% rH or temperature <-40\xB0C or >125\xB0C)"],["1336","","SHT2X COM ERR","","FF8080","Communication with the internal temperature and air humidity sensor is not possible (sensor not present or faulty)"],["1337","","SHT2X COM ERR1","","FF8080","Starting the internal temperature measurement failed"],["1338","","SHT2X COM ERR2","","FF8080","Starting the internal air humidity measurement failed"],["1339","","SHT2X TEMP RAW","","","Temperature raw value (register value from the internal temperature and air humidity sensor) if a plausibility error (SHT2X PLAUSIBILITY ERROR) was detected"],["1340","","SHT2X RH RAW","","","Air humidity raw value (register value from the internal temperature and air humidity sensor) if a plausibility error (SHT2X PLAUSIBILITY ERROR) was detected"],["1350","-999","WIFI INIT ERROR","-999","FF8080",""],["1350","-998","WIFI COMMUNICATION TIMEOUT","-998","FF8080",""],["1350","-997","WIFI AP SCAN TIMEOUT","-997","FF8080","Timeout scanning for available access points"],["1350","-996","WIFI AP SCAN ERROR","-996","FF8080","Error scanning access points"],["1350","-995","WIFI NETWORK TIMEOUT","-995","FF8080","Error accessing network.|Check network settings."],["1350","-994","WIFI IP TIMEOUT","-994","FF8080","Error obtaining IP address!"],["1350","-993","WIFI TCP TIMEOUT","-993","FF8080","Timeout opening TCP connection!"],["1350","-992","WIFI TCP SEND TIMEOUT","-992","FF8080","Timeout sending TCP data.|WiFi internal error."],["1350","-991","WIFI IO ERROR PROCESS","-991","FF8080","WiFi internal error!"],["1350","-990","WIFI IO ERROR RECV","-990","FF8080","WiFi internal error!"],["1350","","WIFI ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1351","","WIFI HW NOT FOUND","","FF8080",""],["1352","","WIFI NETWORK CONNECTED","","",""],["1353","","WIFI RSSI","","",""],["1354","1","TCP CLOSED","FIN","","regular remote disconnection from server"],["1354","2","TCP CLOSED","RST","FF8080","irregular remote disconnection from server"],["1354","3","TCP CLOSED","TIMEOUT","FF8080","socket inactivity timeout"],["1354","4","TCP CLOSED","CLIENT","","socket closed by client (device)"],["1354","","TCP CLOSED","","",""],["1355","1","WIFI NETWORK CLOSED","","","disconnected from AP"],["1355","2","WIFI NETWORK CLOSED","SCAN FAIL","FF8080","scan failed"],["1355","3","WIFI NETWORK CLOSED","JOIN FAIL","FF8080","failed to join the BSS"],["1355","4","WIFI NETWORK CLOSED","AUTH FAIL","FF8080","failed to authenticate with the AP"],["1355","5","WIFI NETWORK CLOSED","ASSOC FAIL","FF8080","failed to associate with the AP"],["1355","6","WIFI NETWORK CLOSED","CONN INPROGRESS","FF8080","another connection request in progress"],["1355","7","WIFI NETWORK CLOSED","INTERNAL ERR","FF8080","internal driver error"],["1355","","WIFI NETWORK CLOSED","","",""],["1356","2","TCP FAILED","SOCKET","FF8080","Error creating socket!"],["1356","3","TCP FAILED","CONNECT","FF8080","Error connecting socket!"],["1356","5","TCP FAILED","SOCKET CONNECT","FF8080","Error connecting socket!"],["1356","6","TCP FAILED","DNS","FF8080","Error resolving IP address (DNS)!"],["1356","7","TCP FAILED","SHUTDOWN","","Error closing TCP connection"],["1356","","TCP FAILED","","",""],["1357","1","WIFI NETWORK FAILED","CONNECT","FF8080","probably wrong settings (e.g. key too long/short)"],["1357","2","WIFI NETWORK FAILED","DISCONNECTED","FF8080","probably AP not available or wrong settings"],["1357","3","WIFI NETWORK FAILED","AP NOT FOUND","FF8080","AP not found during scan!"],["1357","4","WIFI NETWORK FAILED","AP SECURITY","FF8080","AP security not supported"],["1357","5","WIFI NETWORK FAILED","WEP PWDLEN","FF8080","PWD length for WEP is not valid"],["1357","6","WIFI NETWORK FAILED","DIRECT MODE NA","FF8080","WiFi Direct Mode is not available"],["1357","7","WIFI NETWORK FAILED","SNIFFER MODE NA","FF8080","WiFi Sniffer Mode is not available"],["1357","8","WIFI NETWORK FAILED","AP MODE NA","FF8080","WiFi Access Point Mode is not available"],["1357","9","WIFI NETWORK FAILED","SECURITY TYPE NA","FF8080","WiFi Security Type is not available"],["1357","10","WIFI NETWORK FAILED","AP CONFIG","FF8080","WiFi Access Point Configuration is invalid"],["1357","","WIFI NETWORK FAILED","","FF8080",""],["1360","","WIFI REGULAR ON","","",""],["1361","","WIFI REGULAR OFF","","",""],["1362","","ERROR WIFI IRREGULAR OFF","","FFFF80",""],["1363","","WIFI TO CON","","FF8080","Unknown fault!"],["1370","-999","ETH INIT ERR","Ethernet initialization error","FF8080","Ethernet initialization error"],["1370","-998","ETH TIMEOUT","Ethernet communication timeout","FF8080","Ethernet communication timeout"],["1370","-997","ETH NETWORK TIMEOUT","timeout accessing network","FF8080","timeout accessing network"],["1370","-996","ETH IP TIMEOUT","error obtaining IP address (DHCP)","FF8080","error obtaining IP address (DHCP)"],["1370","-995","ETH TCP OPEN TIMEOUT","timeout opening TCP connection","FF8080","timeout opening TCP connection"],["1370","-994","ETH TCP SEND TIMEOUT","timeout sending TCP data","FF8080","timeout sending TCP data"],["1370","-993","ETH IO ERR PROCESS","IO error: processing events","FF8080","IO error: processing events"],["1370","-992","ETH IO ERR RECV","IO error: recv","FF8080","IO error: recv"],["1370","-991","ETH INIT ERR MAC PHY","Error initializing MAC PHY interface","FF8080","Error initializing MAC PHY interface"],["1370","-990","ETH ERR ITF UP","TCPIP Stack: Internal error bringing interface up","FF8080","TCPIP Stack: Internal error bringing interface up"],["1370","","ETH ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1371","","ETH NETWORK CONNECTED","connected to network","","connected to network"],["1372","","ETH TCP CLOSE","TCP connection closed","","TCP connection closed"],["1373","","ETH NETWORK CLOSE","network connection closed","","network connection closed"],["1374","","ETH TCP FAILED","TCP connection could not be opened","FF8080","TCP connection could not be opened"],["1375","","ETH NETWORK FAILED","connection to network could not be opened","FF8080","connection to network could not be opened"],["1380","","ETH REGULAR ON","","",""],["1381","","ETH REGULAR OFF","","",""],["1382","","ETH IRREGULAR OFF","","FFFF80",""],["1383","","ETH TO CON","","FFFF80","Unknown fault!"],["1400","","MEASURE UNKNOWN MODE","","FF8080","Unknown fault!"],["1401","","MEASURE UNKNOWN STATE","","FF8080","Unknown fault!"],["1402","","MEASURE TO","","FF8080","Unknown fault!"],["1403","","MEASURE USER ABORT","","C0C0C0",""],["1420","","I2C BUS CONNECTION ERR1","","FF8080","Internal fault!"],["1421","","I2C BUS CONNECTION ERR2","","FF8080","Internal fault!"],["1422","","I2C BUS CONNECTION ERR3","","FF8080","Internal fault!"],["1423","","I2C BUS CONNECTION ERR4","","FF8080","Internal fault!"],["1430","","ADC CONV ERR","","FF8080","Internal fault!"],["1440","","IMPULSE OUT PARAM ERROR","","FF8080",""],["1441","","UART CONNECTION ERROR","","FF8080",""],["1442","","UART CONNECTION ERROR OK","","80FF80",""],["1450","","MUC EXTENSION COUNT","","C0C0C0",""],["1451","-32752","MUC EXTENSION 1","","FF8080","Communication error"],["1451","-32751","MUC EXTENSION 1","","C0C0C0","Communication restored"],["1451","-32750","MUC EXTENSION 1","","","Retry of command"],["1451","","MUC EXTENSION 1 - ERROR SOD","","FF8080","error SOD"],["1452","-32752","MUC EXTENSION 2","","FF8080","Communication error"],["1452","-32751","MUC EXTENSION 2","","C0C0C0","Communication restored"],["1452","-32750","MUC EXTENSION 2","","","Retry of command"],["1452","","MUC EXTENSION 2 - ERROR SOD","","FF8080","error SOD"],["1453","-32752","MUC EXTENSION 3","","FF8080","Communication error"],["1453","-32751","MUC EXTENSION 3","","C0C0C0","Communication restored"],["1453","-32750","MUC EXTENSION 3","","","Retry of command"],["1453","","MUC EXTENSION 3 - ERROR SOD","","FF8080","error SOD"],["1500","","LOGMSG_DSP_FONTSET_ERROR","","FF8080","Internal fault!"],["1501","","LOGMSG_DSP_LNGFILE_ERROR","","FF8080","Internal fault!"],["1502","","LOGMSG_DSP_APNFILE_ERROR","","FF8080","Internal fault!"],["1600","1","STATE","OK","",""],["1600","2","STATE","TRANSMISSION ERROR","",""],["1600","3","STATE","MEASUREMENT ERROR","",""],["1600","4","STATE","HOLD","",""],["1600","5","STATE","TRANSPORT","",""],["1600","6","STATE","OFFLINE","",""],["1600","7","STATE","NO NET (NET LOCK)","",""],["1600","8","STATE","NO NET","",""],["1600","9","STATE","SIM PIN ERROR","",""],["1600","10","STATE","GPRS ERROR","",""],["1600","11","STATE","IP ERROR","",""],["1600","12","STATE","SIM CARD ERROR","",""],["1601","0","SIM_STATE","NONE","",""],["1601","1","SIM_STATE","PRODUCTION","C0C0C0",""],["1601","2","SIM_STATE","HOT","C0C0C0",""],["1601","3","SIM_STATE","COLD","FF8080",""],["1601","4","SIM_STATE","DISCARDED","FF8080",""],["1602","-2","EXTERNAL SIM","NOT ALLOWED","FF8080",""],["1602","-1","EXTERNAL SIM","NOT FOUND","FF8080",""],["1602","0","EXTERNAL SIM","OK","80FF80",""],["1603","","FEATURE ERROR","","FF8080",""],["1610","0","STATE","OFF","",""],["1610","1","STATE","BOOT","",""],["1610","2","STATE","READY","",""],["1610","3","STATE","ACTIVE OK","",""],["1610","4","STATE","ACTIVE WARNING","",""],["1610","5","STATE","ACTIVE ALARM","",""],["1610","6","STATE","FAULT","",""],["1610","7","STATE","RUN ERROR","",""],["1610","8","STATE","DANGER","",""],["1620","0","TRANSMISSION PROFILE","NORMAL","",""],["1620","1","TRANSMISSION PROFILE","ECO","",""],["1620","2","TRANSMISSION PROFILE","DIAGNOSTIC","",""],["1620","3","TRANSMISSION PROFILE","ADAPTIVE","",""],["1630","0","NEW LIFECYCLE STATE","PREPROVISIONED","",""],["1630","10","NEW LIFECYCLE STATE","PROVISIONED","",""],["1630","20","NEW LIFECYCLE STATE","CLAIMED","",""],["1630","30","NEW LIFECYCLE STATE","FIELDED","",""],["1630","100","NEW LIFECYCLE STATE","DECOMMISIONED","",""],["1630","","NEW LIFECYCLE STATE","","",""],["1631","","NEW LIFECYCLE FLAGS","","",""],["1700","","GPS TIMEOUT","","FFFF80","Try to improve the GPS antenna position."],["1710","","GPS POS START","","",""],["1720","","GPS POS FIX","","80C0FF",""],["1800","","SEC SETUP ERROR","Error on initiating a secure connection - ","FF8080",""],["1801","","SEC ERROR ENCRYPT","","FF8080",""],["1802","","SEC ERROR DECRYPT","","FF8080",""],["1803","0","LOCAL CFG INTERFACE","AUTH OK","80C0F0",""],["1803","1","LOCAL CFG INTERFACE","AUTH FAILED","FF8080",""],["1803","2","LOCAL CFG INTERFACE","DEAUTH","",""],["1804","","LOCAL CFG INTERFACE PARAM","","C0C0C0",""],["1900","","ACCU 0 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1910","0","ACCU 0 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1910","1","ACCU 0 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1910","2","ACCU 0 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1910","3","ACCU 0 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1910","4","ACCU 0 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1910","5","ACCU 0 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1910","6","ACCU 0 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1910","","ACCU 0 E2PROM ERROR","","FF8080",""],["1920","0","ACCU 0 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1920","1","ACCU 0 E2PROM TYPE","Battery","C0C0C0",""],["1920","2","ACCU 0 E2PROM TYPE","AccuPack","C0C0C0",""],["1920","255","ACCU 0 E2PROM TYPE","Undefined","C0C0C0",""],["1901","","ACCU 1 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1911","0","ACCU 1 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1911","1","ACCU 1 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1911","2","ACCU 1 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1911","3","ACCU 1 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1911","4","ACCU 1 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1911","5","ACCU 1 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1911","6","ACCU 1 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1911","","ACCU 1 E2PROM ERROR","","FF8080",""],["1921","0","ACCU 1 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1921","1","ACCU 1 E2PROM TYPE","Battery","C0C0C0",""],["1921","2","ACCU 1 E2PROM TYPE","AccuPack","C0C0C0",""],["1921","255","ACCU 1 E2PROM TYPE","Undefined","C0C0C0",""],["1902","","ACCU 2 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1912","0","ACCU 2 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1912","1","ACCU 2 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1912","2","ACCU 2 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1912","3","ACCU 2 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1912","4","ACCU 2 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1912","5","ACCU 2 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1912","6","ACCU 2 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1912","","ACCU 2 E2PROM ERROR","","FF8080",""],["1922","0","ACCU 2 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1922","1","ACCU 2 E2PROM TYPE","Battery","C0C0C0",""],["1922","2","ACCU 2 E2PROM TYPE","AccuPack","C0C0C0",""],["1922","255","ACCU 2 E2PROM TYPE","Undefined","C0C0C0",""],["1903","","ACCU 3 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1913","0","ACCU 3 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1913","1","ACCU 3 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1913","2","ACCU 3 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1913","3","ACCU 3 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1913","4","ACCU 3 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1913","5","ACCU 3 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1913","6","ACCU 3 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1913","","ACCU 3 E2PROM ERROR","","FF8080",""],["1923","0","ACCU 3 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1923","1","ACCU 3 E2PROM TYPE","Battery","C0C0C0",""],["1923","2","ACCU 3 E2PROM TYPE","AccuPack","C0C0C0",""],["1923","255","ACCU 3 E2PROM TYPE","Undefined","C0C0C0",""],["1904","","ACCU 4 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1914","0","ACCU 4 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1914","1","ACCU 4 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1914","2","ACCU 4 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1914","3","ACCU 4 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1914","4","ACCU 4 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1914","5","ACCU 4 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1914","6","ACCU 4 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1914","","ACCU 4 E2PROM ERROR","","FF8080",""],["1924","0","ACCU 4 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1924","1","ACCU 4 E2PROM TYPE","Battery","C0C0C0",""],["1924","2","ACCU 4 E2PROM TYPE","AccuPack","C0C0C0",""],["1924","255","ACCU 4 E2PROM TYPE","Undefined","C0C0C0",""],["1905","","ACCU 5 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1915","0","ACCU 5 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1915","1","ACCU 5 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1915","2","ACCU 5 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1915","3","ACCU 5 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1915","4","ACCU 5 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1915","5","ACCU 5 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1915","6","ACCU 5 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1915","","ACCU 5 E2PROM ERROR","","FF8080",""],["1925","0","ACCU 5 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1925","1","ACCU 5 E2PROM TYPE","Battery","C0C0C0",""],["1925","2","ACCU 5 E2PROM TYPE","AccuPack","C0C0C0",""],["1925","255","ACCU 5 E2PROM TYPE","Undefined","C0C0C0",""],["1906","","ACCU 6 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1916","0","ACCU 6 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1916","1","ACCU 6 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1916","2","ACCU 6 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1916","3","ACCU 6 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1916","4","ACCU 6 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1916","5","ACCU 6 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1916","6","ACCU 6 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1916","","ACCU 6 E2PROM ERROR","","FF8080",""],["1926","0","ACCU 6 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1926","1","ACCU 6 E2PROM TYPE","Battery","C0C0C0",""],["1926","2","ACCU 6 E2PROM TYPE","AccuPack","C0C0C0",""],["1926","255","ACCU 6 E2PROM TYPE","Undefined","C0C0C0",""],["1907","","ACCU 7 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1917","0","ACCU 7 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1917","1","ACCU 7 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1917","2","ACCU 7 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1917","3","ACCU 7 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1917","4","ACCU 7 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1917","5","ACCU 7 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1917","6","ACCU 7 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1917","","ACCU 7 E2PROM ERROR","","FF8080",""],["1927","0","ACCU 7 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1927","1","ACCU 7 E2PROM TYPE","Battery","C0C0C0",""],["1927","2","ACCU 7 E2PROM TYPE","AccuPack","C0C0C0",""],["1927","255","ACCU 7 E2PROM TYPE","Undefined","C0C0C0",""],["1908","","ACCU 8 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1918","0","ACCU 8 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1918","1","ACCU 8 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1918","2","ACCU 8 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1918","3","ACCU 8 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1918","4","ACCU 8 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1918","5","ACCU 8 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1918","6","ACCU 8 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1918","","ACCU 8 E2PROM ERROR","","FF8080",""],["1928","0","ACCU 8 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1928","1","ACCU 8 E2PROM TYPE","Battery","C0C0C0",""],["1928","2","ACCU 8 E2PROM TYPE","AccuPack","C0C0C0",""],["1928","255","ACCU 8 E2PROM TYPE","Undefined","C0C0C0",""],["1909","","ACCU 9 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1919","0","ACCU 9 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1919","1","ACCU 9 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1919","2","ACCU 9 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1919","3","ACCU 9 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1919","4","ACCU 9 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1919","5","ACCU 9 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1919","6","ACCU 9 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1919","","ACCU 9 E2PROM ERROR","","FF8080",""],["1929","0","ACCU 9 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1929","1","ACCU 9 E2PROM TYPE","Battery","C0C0C0",""],["1929","2","ACCU 9 E2PROM TYPE","AccuPack","C0C0C0",""],["1929","255","ACCU 9 E2PROM TYPE","Undefined","C0C0C0",""],["1950","","CHARGE START","","C0C0C0",""],["1951","0","CHARGE STOP","","C0C0C0",""],["1951","1","CHARGE STOP","Maximal charging time elapsed","FF8080",""],["1960","","SOC","","","[%] State of charge. Value to be divided by 100."],["1961","","VBATT","","","[mV] Battery/Accu voltage."],["1962","","VIN","","","[mV] Input voltage."],["1963","","IACCU","","","[mA] Charging or discharging current."],["1964","","TEMP","","","[\xB0C] Temperature. Value to be divided by 100."],["1965","","RH","","","[%] Air humidity. Value to be divided by 10."],["1966","","VDD","","","[mV] VDD System Voltage."],["1967","","Sys Button Interrupts","","","Number of Interrupts on Sys Button IO since Power On"],["20??","","MODULE ERROR ($e)","","FF8080",""],["21??","","MODULE ERROR ($e)","","FF8080",""],["22??","","MODULE WARNING ($e)","","FFFF80",""],["23??","","MODULE WARNING ($e)","","FFFF80",""],["24??","","MODULE INFO ($e)","","C0C0C0",""],["25??","","MODULE INFO ($e)","","C0C0C0",""],["26??","","MODULE DEBUG ($e)","","",""],["27??","","MODULE DEBUG ($e)","","",""],["3000","0","NO SCRIPT","","FF8080",""],["3000","1","SCRIPT UPDATE","","C0C0C0",""],["3000","2","SCRIPT EXCEPT LOOP","Script exception loop - script is now deactivated to be able to replace it","FF8080",""],["3000","3","SCRIPT SOFT ERROR 1","detected script error number 1 - restarting script","FFFF80",""],["3000","4","SCRIPT SOFT ERROR 2","detected script error number 2 - restarting script","FFFF80",""],["3000","5","SCRIPT SOFT ERROR 3","detected script error number 3 - restarting script","FFFF80",""],["3000","6","SCRIPT UPDATE ERROR","","FF8080",""],["3000","7","SCRIPT SYSTEM SHUTDOWN","System shutdown forced by script","C0C0C0",""],["3000","8","SCRIPT DOWNLOAD ERROR","","C0C0C0",""],["3000","9","SCRIPT DELETED","","FF8080",""],["3001","","SCRIPT aborted","","FF8080",""],["3002","","SCRIPT Assertion failed","","FF8080",""],["3003","","SCRIPT Stack/heap collision (insufficient stack size)","","FF8080",""],["3004","","SCRIPT Array index outside the valid area","","FF8080",""],["3005","","SCRIPT Invalid memory access","","FF8080","$x1"],["3006","","SCRIPT Invalid statement","","FF8080",""],["3007","","SCRIPT Stack underflow","","FF8080",""],["3008","","SCRIPT Heap underflow","","FF8080",""],["3009","","SCRIPT No (invalid) native callback function","","FF8080",""],["3010","","SCRIPT Native function failed","","FF8080",""],["3011","","SCRIPT Divide by zero","","FF8080",""],["3012","","SCRIPT Sleep mode","","FF8080",""],["3013","","SCRIPT Invalid state","","FF8080",""],["3014","","SCRIPT ERROR (14)","","FF8080",""],["3015","","SCRIPT ERROR (15)","","FF8080",""],["3016","","SCRIPT Out of memory","","FF8080",""],["3017","","SCRIPT P-code file format is invalid/not supported","","FF8080",""],["3018","","SCRIPT File is for a newer version of AMX","","FF8080",""],["3019","","SCRIPT File or function not found","","FF8080",""],["3020","","SCRIPT Invalid index parameter (invalid entry point)","","FF8080",""],["3021","","SCRIPT Debugger cannot be executed","","FF8080",""],["3022","","SCRIPT AMX not initialized (or initialized twice)","","FF8080",""],["3023","","SCRIPT User data field cannot be set (table full)","","FF8080",""],["3024","","SCRIPT JIT cannot be initialised","","FF8080",""],["3025","","SCRIPT Faulty parameter","","FF8080",""],["3026","","SCRIPT Domain error. The result of the expression is not in the valid area","","FF8080",""],["3027","","SCRIPT General error (invalid or non-specific error)","","FF8080",""],["3028","","SCRIPT Overlays are not supported (JIT) or are not initialised","","FF8080",""],["3050","1","SCRIPT File not available","","FF8080",""],["3050","2","SCRIPT File not fully downloaded","","FF8080",""],["3050","3","SCRIPT Error reading file","","FF8080",""],["3050","4","SCRIPT Marked faulty","","FF8080",""],["3050","5","SCRIPT Invalid type","","FF8080",""],["3050","6","SCRIPT Error loading program","","FF8080",""],["3050","7","SCRIPT Exception loop detected","","",""],["3050","8","SCRIPT Invalid filesize","","FF8080",""],["3???","","SCRIPT ERROR ($e)","","FF8080",""],["5555","","TEST 1","","0080FF",""]],j6=" (aggregation error)";function Tf(x){return(x<0?65535+x+1:x).toString(16).padStart(4,"0")}function ga(x){let e=String(x);return e.charAt(0)==="-"?e.slice(1):e}function Rf(x,e,A){let r=e.slice(0,1)+"???",t=e.slice(0,2)+"??";for(let s of x)if((s[0]===e||s[0]===r||s[0]===t)&&(s[1]===""||s[1]===A))return s;return null}function Pf(x,e,A){let r=null;for(let t of x)if(t[0]===e){if(t[1]==="")return[e,A,t[2],t[3],t[4],t[5],t[6]];t[1]===A&&!r&&(r=[e,A,t[2],t[3],t[4],t[5],t[6]])}return r}function h6(x,e,A=ha,r){let t=ga(x),s=String(e);return(r?Pf(r,t,s):null)??Rf(A,t,s)}function g6(x,e){let A=e.table??ha,r=ga(x.code),t=String(x.param),s=r.slice(0,1)+"???",i=r.slice(0,2)+"??",v=e.overrides?Pf(e.overrides,r,t):null,c=Rf(A,r,t),B=v??c,p={stamp40:x.stamp40,stampMs:x.stampMs,code:x.code,params:[x.param],text:r,detail:t,color:null,help:"",verbose:!0,matchedCode:null};if(!B)return{entry:p,xparams:0};let b=(B[4]===""&&c?c[4]:B[4])||"",h=B[2].toUpperCase();(B[0]===s||B[0]===i)&&(h=h.replace(/\$e/gi,r.slice(1)));let w=B[1]!==""||B[3]?B[3]:t,k=Tf(x.param),P=R=>R.replace(/\$1/g,t).replace(/\$x1/g,k);return p.matchedCode=B[0],p.text=h,p.detail=P(w),p.help=P(B[5]),p.color=b===""?null:b,p.verbose=p.color===null,{entry:p,xparams:B.length>=7?B[6]??0:0}}function C8(x){return x.replace(/\$x?[0-9]/g,"??")}function B8(x){return x.help=C8(x.help+j6),x.detail=C8(x.detail),x.aggregationError=!0,x}function If(x={}){let e=null,A="",r=0,t=0;return{push(s){let i=[],v=ga(s.code),c=String(s.param);if(r&&e)if(A!==v)i.push(B8(e)),e=null,r=0;else{r--,t++;let p=new RegExp("\\$"+t,"g"),b=new RegExp("\\$x"+t,"gi"),h=Tf(s.param);return e.detail=e.detail.replace(p,c).replace(b,h),e.help=e.help.replace(p,c).replace(b,h),e.params.push(s.param),r||(i.push(e),e=null),i}A=v;let B=g6(s,x);return B.xparams>0?(e=B.entry,r=B.xparams,t=1):i.push(B.entry),i},finish(){if(!e)return[];let s=B8(e);return e=null,r=0,[s]}}}function Of(x,e={}){let A=If(e),r=[];for(let t of x)r.push(...A.push(t));return r.push(...A.finish()),r}var Js="devicelog_",y6=6;function k6(x){let e=[];for(let[A,r]of Object.entries(x)){if(!A.startsWith(Js)||typeof r!="string")continue;let t=A.slice(Js.length),s=t.indexOf("_"),i=s<0?t:t.slice(0,s),v=s<0?"":t.slice(s+1);if(!i)continue;let c=r.split(";");for(;c.length<y6-2;)c.push("");let[B,p,b,h,w]=c,k=Number(w);e.push(Number.isInteger(k)&&k>0?[i,v,B,p,b,h,k]:[i,v,B,p,b,h])}return e}var w6=256;function d8(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function _6(x){return Math.round(x*w6/1e3)}function S6(x){if(x.sinceStamp40!==void 0)return x.sinceStamp40;if(x.sinceMs!==void 0)return Math.max(0,W0.msToStamp40(x.sinceMs));throw new Error("readDeviceLog: one of sinceMs or sinceStamp40 is required")}async function Nf(x,e){let A=S6(e),r=d8(),t=await x.requestHistoricUtos(26375,A,e.onProgress,e.timeoutMs),s=Sf(t);return{entries:Of(s,{table:e.table,overrides:e.overrides}),records:s,oldestStamp40:s.length?s[0].stamp40:null,youngestStamp40:s.length?s[s.length-1].stamp40:null,sinceStamp40:A,truncated:!1,durationMs:d8()-r}}var T6=class{constructor(x,e={}){X(this,"utoMaster"),X(this,"options"),X(this,"heldEntries",[]),X(this,"heldRecords",[]),X(this,"anchorStamp40",null),X(this,"busy",!1),X(this,"generation",0),this.utoMaster=x,this.options=e}get entries(){return this.heldEntries}get records(){return this.heldRecords}get oldestStamp40(){return this.heldRecords.length?this.heldRecords[0].stamp40:null}get youngestStamp40(){return this.heldRecords.length?this.heldRecords[this.heldRecords.length-1].stamp40:null}get sinceStamp40(){return this.anchorStamp40}async load(x){if(this.busy)throw new Error("DeviceLogReader: a load is already running (the UTO port lock is held)");this.busy=!0;let e=this.generation;try{let A=await Nf(this.utoMaster,{...this.options,...x});return e===this.generation&&(this.heldEntries=A.entries,this.heldRecords=A.records,this.anchorStamp40=A.sinceStamp40),A}finally{this.busy=!1}}async extendBack(x){if(this.anchorStamp40===null)throw new Error("DeviceLogReader: extendBack() requires a previous load()");return this.load({sinceStamp40:Math.max(0,this.anchorStamp40-_6(x))})}clear(){this.generation++,this.heldEntries=[],this.heldRecords=[],this.anchorStamp40=null}};});var uj={};RE(uj,{default:()=>Ic,deviceExitCode:()=>Pc,program:()=>ge});module.exports=PE(uj);var tx=require("commander"),Bn=Q0(require("chalk"));var Ji={name:"@microtronics/studio-cli",version:"1.3.0-alpha.6",description:"Microtronics Studio CLI Tool",main:"./out/api.js",typings:"./out/studio-cli.d.ts",bin:{"studio-cli":"studio-cli"},publishConfig:{access:"public"},scripts:{compile:"npm run build:registryApiTypings && tsc","build:cli":"node build.mjs","build:exe":"node build-exe.mjs",api:"api-extractor run --local --verbose",build:"npm run compile && npm run api && npm run build:cli","watch:build":"npm run compile -- --watch",test:"cross-env STUDIO_ENV=lucky mocha","test-ci":"cross-env STUDIO_ENV=lucky mocha --reporter mocha-junit-reporter","watch:test":"npm run test -- --watch",prepublishOnly:"npm run build","build:registryApiTypings":"npx openapi-typescript https://api.registry.lucky.ci.microtronics.com/v1/openapi.yaml -o ./src/typings/registry.ts"},author:"Microtronics",license:"ISC",dependencies:{"@gera2ld/tarjs":"^0.3.1",ajv:"^8.17.1","ajv-formats":"^3.0.1","ajv-keywords":"^5.1.0",chalk:"^5.4.1",commander:"^12.1.0","cross-fetch":"^4.0.0","deepmerge-ts":"^7.1.5",dotenv:"^16.4.7","file-type-checker":"^1.1.2",glob:"^11.0.1","iconv-lite":"^0.6.3","image-dimensions":"^2.3.0",ini:"^5.0.0",minimatch:"^10.0.1","openapi-fetch":"^0.13.0",pako:"^2.1.0",semver:"^7.7.2","sql.js":"^1.14.2","tinytar-fix":"^0.1.1","update-notifier":"^7.3.1",usb:"^2.14.0",uuid:"^9.0.1","vscode-uri":"^3.0.8",yaml:"^2.6.1"},engines:{node:">= 22"},devDependencies:{"@microsoft/api-extractor":"^7.47.11","@microtronics/device-master":"bitbucket:microtronics-core/device-master#v4.3.1","@types/chai":"^4.3.6","@types/chai-as-promised":"^7.1.5","@types/ini":"^4.1.1","@types/mocha":"^10.0.9","@types/node":"^22.9.1","@types/semver":"^7.5.6","@types/sql.js":"^1.4.11","@types/update-notifier":"^6.0.8","@types/vscode":"^1.86.2","@yao-pkg/pkg":"^6.22.0",chai:"^4.3.8","chai-as-promised":"^7.1.2","cross-env":"^7.0.3",esbuild:"^0.27.3","extract-zip":"^2.0.1",mocha:"^10.8.2","mocha-junit-reporter":"^2.2.1","openapi-typescript":"^7.6.0","pawncc-wasm":"bitbucket:microtronics-core/pawncc-wasm#v1.2.0",resedit:"^3.0.2",tar:"^7.5.7","ts-node":"^10.9.2",typescript:"^5.6.3"},mocha:{require:["ts-node/register"],"watch-files":"src/**",spec:"./test/**/*.spec.ts",recursive:!0},files:["out/api.js","out/studio-cli.d.ts","dist/main.js","dist/studio-cli.d.ts","studio-cli","CHANGELOG.md"]};var Ze=Q0(require("node:fs/promises"));var Nt=require("vscode-uri"),ko=require("glob"),xA={readFile(x){return Ze.default.readFile(x.fsPath)},async rm(x){if(await this.stat(x))return Ze.default.rm(x.fsPath,{recursive:!0})},async stat(x){try{let e=await Ze.default.stat(x.fsPath),A=(e.isDirectory()?2:0)|(e.isFile()?1:0)|(e.isSymbolicLink()?64:0);return{ctime:e.ctimeMs,mtime:e.mtimeMs,permissions:void 0,size:e.size,type:A}}catch{return null}},async writeFile(x,e){typeof e=="string"&&(e=new TextEncoder().encode(e));let A=Nt.Utils.dirname(x);return await Ze.default.mkdir(A.fsPath,{recursive:!0}),Ze.default.writeFile(x.fsPath,e,{flag:"w"})},async findFiles(x,e,A){let r={ignore:A,nodir:!0,absolute:!0,dot:!0,cwd:x.fsPath};return(await(0,ko.glob)(e,r)).map(s=>{let i=s.replace(/\\/g,"/");return Nt.URI.parse(`file:///${i}`)})},async copy(x,e){let A=await Ze.default.stat(x.fsPath);return await Ze.default.mkdir(Nt.Utils.dirname(e).fsPath,{recursive:!0}),A.isDirectory()?Ze.default.cp(x.fsPath,e.fsPath,{force:!0,recursive:!0}):Ze.default.copyFile(x.fsPath,e.fsPath)},async mkdir(x){await Ze.default.mkdir(x.fsPath,{recursive:!0})}};var Tt=require("vscode-uri");var KA=require("vscode-uri");var lt=require("vscode-uri");var OE=new Uint32Array([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117]);function bn(x,e=0){let A=~~e^-1;for(let r=0;r<x.length;r++)A=A>>>8^OE[(A^x[r])&255];return(A^-1)>>>0}var Sj=new Uint8Array([0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64]),Tj=new Uint8Array([0,192,193,1,195,3,2,194,198,6,7,199,5,197,196,4,204,12,13,205,15,207,206,14,10,202,203,11,201,9,8,200,216,24,25,217,27,219,218,26,30,222,223,31,221,29,28,220,20,212,213,21,215,23,22,214,210,18,19,211,17,209,208,16,240,48,49,241,51,243,242,50,54,246,247,55,245,53,52,244,60,252,253,61,255,63,62,254,250,58,59,251,57,249,248,56,40,232,233,41,235,43,42,234,238,46,47,239,45,237,236,44,228,36,37,229,39,231,230,38,34,226,227,35,225,33,32,224,160,96,97,161,99,163,162,98,102,166,167,103,165,101,100,164,108,172,173,109,175,111,110,174,170,106,107,171,105,169,168,104,120,184,185,121,187,123,122,186,190,126,127,191,125,189,188,124,180,116,117,181,119,183,182,118,114,178,179,115,177,113,112,176,80,144,145,81,147,83,82,146,150,86,87,151,85,149,148,84,156,92,93,157,95,159,158,94,90,154,155,91,153,89,88,152,136,72,73,137,75,139,138,74,78,142,143,79,141,77,76,140,68,132,133,69,135,71,70,134,130,66,67,131,65,129,128,64]);var R0;(w=>{function x(k,P){let[R,N]=P,{line:O,col:W}=k.linePos(R);return{line:Number(O)-1,startCharacter:W-1,endCharacter:W+(N-R)}}w.yamlRangeToLineInformation=x;let e=new TextEncoder;function A(k){return bn(e.encode(k)).toString(16)}w.generateHashForLibraryName=A;function r(k){return bn(e.encode(k)).toString(16)}w.generateHashForFilePath=r;function t(k){return bn(k).toString(16).toUpperCase().padStart(8,"0")}w.generateCRC32ForFileContent=t;function s(k){try{let P=null;return k?.type==="Buffer"?P=Uint8Array.from(k.data):P=k,new TextDecoder("utf8").decode(P)}catch{return""}}w.convertBlobToString=s;function i(k=""){return k.replace(/\r\n|\n\r|\r/g,`
2642
+ `).entries()){e.line=A;let t=r.trim();t===""||t.startsWith("//")||pu(e,t)||t.includes("=")&&bu(e,t)}return Du(e.containers,e.splits)}var iv=null,ju=4;function Yr(x){let e=new Date(x),A=(r,t)=>r.toString().padStart(t,"0");return A(e.getUTCFullYear(),4)+A(e.getUTCMonth()+1,2)+A(e.getUTCDate(),2)+A(e.getUTCHours(),2)+A(e.getUTCMinutes(),2)+A(e.getUTCSeconds(),2)+A(e.getUTCMilliseconds(),3)}function xt(x){let e=x.trim();if(e==="*")return iv;if(!/^\d{4,17}$/.test(e))throw new Error(`?apiStamp.invalid-input."${x}"`);let A=(p,b,h)=>{let w=e.slice(p,p+b);return parseInt(w.length?w.padEnd(b,"0"):h,10)},r=parseInt(e.slice(0,ju),10),t=e.length>=6?A(4,2,"01"):1,s=e.length>=8?A(6,2,"01"):1,i=A(8,2,"00"),v=A(10,2,"00"),c=A(12,2,"00"),B=A(14,3,"000");return Date.UTC(r,t-1,s,i,v,c,B)}var Vt="NAN",hu="%HEX%",gu=65535,ta=class extends Error{constructor(x){super(`?ddeCodec.unknown-alias."${x}"`),X(this,"alias",x),this.name="DdeUnknownAliasError"}};function ai(x){return(x.alias??x.name).toLowerCase()}function oi(x){return x==="string"}function na(x){return x==="stamp"||x==="stamp4"||x==="stamp8"||x==="datetime"}function sv(x){return(x.editmask??"").toUpperCase()===hu}function yu(x,e){return e===void 0||!Number.isFinite(x)?x:ia(x,e)}function ia(x,e){if(!Number.isFinite(x))return x;let A=10**e;return Math.sign(x)*Math.round(Math.abs(x)*A)/A}function ku(x,e){if(!Number.isFinite(x)||x===0)return x;let A=Math.abs(x),r=Math.floor(Math.log10(A));return 10**(r+1)<=A?r+=1:10**r>A&&(r-=1),ia(x,e-1-r)}function wu(x){return x==="floatm16"||x==="f32"||x==="f64"}function _u(x,e){if(!Number.isFinite(e))return e;let A=x.decpl??(wu(x.type)?9:0),r=ia(e,A),t=x.type==="floatm16"?3:x.type==="f32"?7:15;return ku(r,t)}function xi(x,e){let A=BigInt.asUintN(64,BigInt(Math.trunc(x))),r=BigInt.asUintN(64,BigInt(Math.trunc(e))),t=0n,s=1n;for(;r!==0n;)r&1n&&(A&1n&&(t|=s),s<<=1n),A>>=1n,r>>=1n;return Number(t)}function av(x,e,A){let r=BigInt.asUintN(64,BigInt(Math.trunc(x))),t=BigInt.asUintN(64,BigInt(Math.trunc(e))),s=BigInt.asUintN(64,BigInt(Math.trunc(A))),i=1n;for(;s!==0n;)s&1n&&(r=t&1n?r|i:r&~i,t>>=1n),s>>=1n,i<<=1n;return Number(r)}var Su=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function ei(x){return!!x.bitmask&&Su.has(x.type)}var ov=255,Fv=254,vv=253,fv=252,lv=251,Tu=207,sa=65535,Ai=65534,aa=65533,oa=65532,Fa=65531;function Ru(x){switch(x){case ov:return sa;case Fv:return Ai;case vv:return aa;case fv:return oa;case lv:return Fa;default:return x<=31?x:x>Tu?Ai:(x&15|16)<<(x>>4)-1}}function Pu(x){switch(x){case sa:return ov;case Ai:return Fv;case aa:return vv;case oa:return fv;case Fa:return lv;default:{if(x<=31)return x;let e=1,A=x;for(;(A&65504)>0;)A>>=1,e++;return e<<4|A&15}}}var ri=1023,qs=31,cv=127,us=8388607,Iu=255,Ms=15,Ou=-14,i8=15;function Ev(x){let e=(x&ri)<<13,A=(x&31744)>>10;if(A===qs)return Bv(1024-(x&ri));A!==0&&(A=A-Ms+4+cv);let r=(e|A<<23)>>>0;x&32768&&(r=(r|2147483648)>>>0);let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,r),t.getFloat32(0)}function Cv(x){if(typeof x=="string"||Number.isNaN(x))return gu;let e=new DataView(new ArrayBuffer(4));e.setFloat32(0,x);let A=e.getUint32(0),r=A>>>16&32768,t=(A&us)+4096,s=(t>us?1:0)+(A>>>23&Iu),i=(t&us)>>>13;return s!==0&&(s=s-cv-4,s<Ou?(i=0,s=0):s>i8?(i=ri,s=i8+Ms):s=s+Ms),r|s<<10|i}var Nu=["OF","UF","OL","SC"],$s={u8:{NAN:255,OF:254,UF:253,OL:252,SC:251},u16:{NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},u32:{NAN:4294967295,OF:4294967294,UF:4294967293,OL:4294967292,SC:4294967291},s8:{NAN:127,OF:126,UF:-126,OL:-127,SC:-128},s16:{NAN:32767,OF:32766,UF:-32766,OL:-32767,SC:-32768},s32:{NAN:2147483647,OF:2147483646,UF:-2147483646,OL:-2147483647,SC:-2147483648},s64:{NAN:0x7fffffffffffffffn,OF:0x7ffffffffffffffen,UF:-0x7ffffffffffffffen,OL:-0x7fffffffffffffffn,SC:-0x8000000000000000n},ufm8:{NAN:sa,OF:Ai,UF:aa,OL:oa,SC:Fa}},qu={NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},le={NAN:1,OF:2,UF:3,OL:4,SC:5},Mu=new Set(["u8","u16","u32","ufm8"]);function $u(x){let e=Math.floor(x),A=x-e;return A<.5?e:A>.5?e+1:e%2===0?e:e+1}function va(x){let e=x.replace(/,/g,"").trim();if(!/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(e))return null;let A=Number(e);return Number.isFinite(A)?A:null}function fa(x,e,A){switch(x){case"u8":return e.getUint8(A);case"s8":return e.getInt8(A);case"u16":return e.getUint16(A,!1);case"s16":return e.getInt16(A,!1);case"u32":return e.getUint32(A,!1);case"s32":return e.getInt32(A,!1);case"s64":return Number(e.getBigInt64(A,!1));case"f32":return e.getFloat32(A,!1);case"f64":return e.getFloat64(A,!1);case"floatm16":return Ev(e.getUint16(A,!1));case"ufm8":return Ru(e.getUint8(A));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function Bv(x){switch(x){case le.OF:return"OF";case le.UF:return"UF";case le.OL:return"OL";case le.SC:return"SC";default:return Vt}}var s8=[["NAN",le.NAN],["OF",le.OF],["UF",le.UF],["OL",le.OL],["SC",le.SC]];function Lu(x,e){let A=x.getUint32(e,!1);if((A&2139095040)!==2139095040)return 0;let r=A&8388607;return r===0?le.NAN:(r=r&4194304?8388608-r:r&255,r===0?le.NAN:r)}function Gu(x,e){let A=x.getBigUint64(e,!1);if((A&0x7ff0000000000000n)!==0x7ff0000000000000n)return 0;let r=Number(A&0xffn);return r===0?le.NAN:r}function Uu(x,e){if(x.type==="s64"){let t=e.getBigInt64(x.byteofs,!1);ei(x)&&(t=BigInt(xi(Number(t),x.bitmask)));let s=$s.s64;return s8.find(([i])=>t===BigInt(s[i]))?.[1]??0}let A=$s[x.type];if(!A)return 0;let r=fa(x.type,e,x.byteofs);return ei(x)&&(r=xi(r,x.bitmask)),s8.find(([t])=>r===A[t])?.[1]??0}function dv(x,e){switch(x.type){case"floatm16":{let A=e.getUint16(x.byteofs,!1);return(A>>10&qs)===qs?1024-(A&ri):0}case"f32":return Lu(e,x.byteofs);case"f64":return Gu(e,x.byteofs);default:return Uu(x,e)}}function uv(x,e){let A=fa(x.type,e,x.byteofs);return typeof A=="string"||Number.isNaN(A)?NaN:(ei(x)&&(A=xi(A,x.bitmask)),A*x.vscale+x.vofs)}function Hu(x,e){let A=dv(x,e);if(A!==0)return Bv(A);let r=uv(x,e);return Number.isNaN(r)?Vt:_u(x,r)}function Ku(x,e){if(x.byteofs+x.size>e.byteLength)return null;if(oi(x.type)||na(x.type))return NaN;let A=new DataView(e.buffer,e.byteOffset,e.byteLength);return dv(x,A)!==0?NaN:uv(x,A)}function Wu(x,e){if(sv(x)){let A="";for(let r=0;r<x.size;r++)A+=e.getUint8(x.byteofs+r).toString(16).padStart(2,"0");return A.toUpperCase()}return W0.cp1252Unpack(e,x.byteofs,x.size)}var Dv=25569,pv=864e5;function Ju(x){return(x-Dv)*pv}function zu(x){return x/pv+Dv}function Vu(x,e){if(x.type==="datetime")return Yr(Ju(e.getFloat64(x.byteofs,!1)));if(x.type==="stamp8"){let r=e.getBigUint64(x.byteofs,!1),t=Number(r&0xffffffffffn);return Yr(W0.stamp40ToMS(t))}let A=e.getUint32(x.byteofs,!1)*256;return x.size>=5&&(A+=e.getUint8(x.byteofs+4)),Yr(W0.stamp40ToMS(A))}var Xu=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Yu(x,e){return/^[+-]?\d+$/.test(x)?parseInt(x,10):/^\$[0-9a-fA-F]+$/.test(x)?parseInt(x.slice(1),16):e}function Qu(x){let e=x.default;if(e===void 0)return;if(oi(x.type))return e;let A=e.trim();if(A===""||A.toUpperCase()===Vt)return Vt;if(Xu.has(x.type))return Yu(A,0);let r=va(A);return r!==null?r:e}function Zu(x,e,A){return x.byteofs+x.size>A?Qu(x):oi(x.type)?Wu(x,e):na(x.type)?Vu(x,e):Hu(x,e)}function Ls(x,e){let A=new DataView(e.buffer,e.byteOffset,e.byteLength),r={};for(let t of x.fields)UA(t)||zt(t.type)||(r[ai(t)]=Zu(t,A,e.byteLength));return r}function xD(x,e){if(typeof e=="number")return Number.isFinite(e)?{kind:"value",physical:e}:{kind:"sentinel",state:"NAN"};if(typeof e=="string"){if(e.toUpperCase()===Vt||e==="")return{kind:"sentinel",state:"NAN"};let A=Nu.find(t=>t===e);if(A)return{kind:"sentinel",state:A};if("OUS".includes(e[0]))return{kind:"skip"};let r=va(e);return r!==null?{kind:"value",physical:r}:a8(x)}return a8(x)}function a8(x){let e=x.default;return e!==void 0&&e.startsWith("%")?{kind:"sentinel",state:"NAN"}:{kind:"value",physical:(e!==void 0?va(e):null)??0}}function Gs(x,e,A){switch(x.type){case"floatm16":return e.setUint16(x.byteofs,qu[A],!1);case"f32":return e.setUint32(x.byteofs,(2139095040|le[A])>>>0,!1);case"f64":return e.setBigUint64(x.byteofs,0x7ff0000000000000n|BigInt(le[A]),!1);default:break}let r=$s[x.type]?.[A];if(r===void 0)throw new Error(`?ddeCodec.non-numeric-type."${x.type}"`);if(x.type==="s64")return e.setBigInt64(x.byteofs,BigInt(r),!1);bv(x,e,Number(r))}function eD(x,e,A){if(x.vscale===0)return;let r=(A-x.vofs)/x.vscale;switch(x.type){case"f32":return e.setFloat32(x.byteofs,r,!1);case"f64":return e.setFloat64(x.byteofs,r,!1);case"floatm16":return e.setUint16(x.byteofs,Cv(r),!1);default:break}if(Number.isNaN(r))return Gs(x,e,"NAN");if(!Number.isFinite(r))return Gs(x,e,"OF");let t=r;Mu.has(x.type)&&t<0&&(t=0),bv(x,e,$u(t))}function bv(x,e,A){if(ei(x)){let r=fa(x.type,e,x.byteofs);A=av(r,A,x.bitmask)}AD(x.type,e,x.byteofs,A)}function AD(x,e,A,r){switch(x){case"u8":return e.setUint8(A,r);case"s8":return e.setInt8(A,r);case"u16":return e.setUint16(A,r,!1);case"s16":return e.setInt16(A,r,!1);case"u32":return e.setUint32(A,r,!1);case"s32":return e.setInt32(A,r,!1);case"s64":return e.setBigInt64(A,BigInt(r),!1);case"ufm8":return e.setUint8(A,Pu(r));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function rD(x,e,A){let r=String(A);if(sv(x)){let t=r.trim();if(t.length%2!==0||t.length>x.size*2)throw new Error(`?ddeCodec.invalid-hex."${ai(x)}"`);for(let s=0;s<x.size;s++){let i=s*2<t.length?parseInt(t.substr(s*2,2),16):0;e.setUint8(x.byteofs+s,i)}return}W0.cp1252Pack(e,x.byteofs,x.size,r)}function tD(x,e,A){let r=xt(String(A));if(r===null)throw new Error(`?ddeCodec.unbounded-stamp."${ai(x)}"`);if(x.type==="datetime"){e.setFloat64(x.byteofs,zu(r),!1);return}let t=W0.msToStamp40(r);if(x.type==="stamp8"){e.setBigUint64(x.byteofs,BigInt(t),!1);return}e.setUint32(x.byteofs,Math.trunc(t/256),!1),x.size>=5&&e.setUint8(x.byteofs+4,t&255)}function nD(x,e,A){if(oi(x.type))return rD(x,e,A);if(na(x.type))return tD(x,e,A);let r=xD(x,A);switch(r.kind){case"skip":return;case"sentinel":return Gs(x,e,r.state);case"value":return eD(x,e,r.physical)}}function Us(x,e,A){let r=A?new Uint8Array(A):new Uint8Array(x.recordSize),t=new DataView(r.buffer,r.byteOffset,r.byteLength),s=new Map(x.fields.filter(i=>!UA(i)&&!zt(i.type)).map(i=>[ai(i),i]));for(let[i,v]of Object.entries(e)){let c=s.get(i.toLowerCase());if(!c)throw new ta(i);nD(c,t,v)}return r}var o8=99,iD=256,LA=class extends Error{constructor(x){super(`?ddeMapper.unknown-container."${x}"`),X(this,"container",x),this.name="DdeUnknownContainerError"}},Xt=class extends Error{constructor(x,e){let A=e?`${x}.${e}`:x;super(`?ddeMapper.write-forbidden."${A}"`),X(this,"container",x),X(this,"field",e),this.name="DdeWriteForbiddenError"}},la=class extends Error{constructor(x){super(`?ddeMapper.unknown-field."${x}"`),X(this,"field",x),this.name="DdeUnknownFieldError"}};function Ds(x){return(x.alias??x.name).toLowerCase()}var sD=class{constructor(x,e,A=gt){X(this,"model",x),X(this,"storage",e),X(this,"timeSource",A)}async readContainer(x){let e=this.model.byNameOrAlias(x);if(!e)return null;let A=Ht(e);if(A===null)return null;let r=await this.storage.getRowForTag(A);if(!r||!r.data)return null;let t=Ls(await this.resolveScaleRefs(e),r.data);return delete t.stamp,{stamp:this.rowStamp(r),...t}}async writeContainer(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=Ht(A);if(r===null)throw new LA(x);if(A.edit===o8)throw new Xt(A.name);let{stamp:t,...s}=e;this.assertFieldsWritable(A,s);let i=await this.storage.getRowForTag(r),v=Us(await this.resolveScaleRefs(A),s,i?.data??null),c=W0.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs()),B=me(c);return await this.storage.replaceUtoRow({tag:r,stamp:B,flags:i?.flags??0,site_related:i?.site_related??0,data:v}),{tag:r,stampHex:B,stamp40:c,data:v,devicePushable:tv(r)&&A.download!==0,upload:A.upload,download:A.download}}async seedContainer(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=Ht(A);if(r===null)throw new LA(x);let{stamp:t,...s}=e,i=Us(await this.resolveScaleRefs(A),s,null),v=W0.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs());await this.storage.replaceUtoRow({tag:r,stamp:me(v),flags:0,site_related:0,data:i})}recordStampMs(x){if(typeof x!="string")return null;try{return xt(x)}catch{return null}}async readTimeseries(x,e){let A=this.model.byNameOrAlias(x);if(!A)throw new LA(x);let r=this.model.splits.find(B=>B.target.toLowerCase()===A.name.toLowerCase());if(!r)throw new LA(x);let t=Math.abs(e.count),s=e.offset??0,i=this.buildSelectSet(A,e.select),v=await this.resolveScaleRefs(A);return(await this.collectMatched(v,r,s+t,{fromStamp:this.boundHex(e.fromMs),untilStamp:this.boundHex(e.untilMs),order:e.count<0?"desc":"asc",selectSet:i})).slice(s,s+t)}resolveHistdataContainer(x){let e=this.model.splits.find(A=>!A.matchAll&&this.matchesSplit(x,A))??this.model.splits.find(A=>A.matchAll&&this.matchesSplit(x,A));return e?this.model.byNameOrAlias(e.target)?.name??e.target:null}async projectRecord(x,e,A){let r=this.model.byNameOrAlias(x);if(!r)throw new LA(x);let t=this.buildSelectSet(r,A?.select),s=await this.resolveScaleRefs(r);return this.projectResolved(s,e.stamp40,e.data,t)}matchesSplit(x,e){return x.length===0?!1:e.matchAll?!0:x.length<e.keyBytes.length?!1:e.keyBytes.every((A,r)=>x[r]===A)}async collectMatched(x,e,A,r){let t=[];if(A<=0)return t;let s=Math.max(A,iD);for(let i=0;;i+=s){let v=await this.storage.getHistoricRows(26623,{fromStamp:r.fromStamp,untilStamp:r.untilStamp,order:r.order,limit:s,offset:i});for(let c of v)if(c.data&&this.matchesSplit(c.data,e)&&(t.push(this.projectResolved(x,Ie(c.stamp),c.data,r.selectSet)),t.length>=A))return t;if(v.length<s)return t}}async readTimeseriesEdge(x,e,A){return(await this.readTimeseries(x,{count:e==="youngest"?-1:1,select:A}))[0]??null}projectResolved(x,e,A,r){let t=Ls(x,A),s={stamp:Yr(W0.stamp40ToMS(e))};for(let[i,v]of Object.entries(t))i!=="stamp"&&(!r||r.has(i))&&(s[i]=v);return s}rowStamp(x){return Yr(W0.stamp40ToMS(Ie(x.stamp)))}boundHex(x){if(x!=null)return me(W0.msToStamp40(x))}async resolveScaleRefs(x){if(!x.fields.some(r=>r.vscaleRef||r.vofsRef))return x;let e=new Map,A=[];for(let r of x.fields){if(!r.vscaleRef&&!r.vofsRef){A.push(r);continue}A.push({...r,vscale:r.vscaleRef?await this.resolveRef(r.vscaleRef,e,r.vscale):r.vscale,vofs:r.vofsRef?await this.resolveRef(r.vofsRef,e,r.vofs):r.vofs})}return{...x,fields:A}}async resolveRef(x,e,A){if(!/^config[0-9a-f]$/i.test(x.container))return A;let r=this.referencedField(x);if(!r)return A;let t=x.container.toLowerCase();e.has(t)||e.set(t,await this.referencedRecordData(x.container));let s=e.get(t);if(!s)return A;let i=Ku(r,s);return i===null?A:i}referencedField(x){let e=x.field.toLowerCase();return this.model.byNameOrAlias(x.container)?.fields.find(r=>Ds(r)===e||r.name.toLowerCase()===e)??null}async referencedRecordData(x){let e=this.model.byNameOrAlias(x);if(!e)return null;let A=Ht(e);return A===null?null:(await this.storage.getRowForTag(A))?.data??null}assertFieldsWritable(x,e){let A=new Map(x.fields.filter(r=>!UA(r)&&!zt(r.type)).map(r=>[Ds(r),r]));for(let r of Object.keys(e)){let t=A.get(r.toLowerCase());if(t&&t.edit===o8)throw new Xt(x.name,t.name)}}buildSelectSet(x,e){if(!e||e.length===0)return null;let A=new Set(x.fields.filter(t=>!UA(t)&&!zt(t.type)).map(t=>Ds(t))),r=new Set;for(let t of e){let s=t.toLowerCase();if(s!=="stamp"){if(!A.has(s))throw new la(t);r.add(s)}}return r}},aD=new Set(["$titles","$meta"]);function oD(x){let e=x;if(typeof x=="string")try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}function Hs(x,e){let A=e.toLowerCase();if(aD.has(A))return null;let r=x[A];if(typeof r!="object"||r===null)return null;let t=new Map;for(let[s,i]of Object.entries(r)){if(typeof i!="object"||i===null)continue;let v=i.alias;typeof v=="string"&&v.length>0&&t.set(s.toLowerCase(),v)}return t}function mv(x,e){let A={};for(let[r,t]of Object.entries(x)){if(r==="stamp"){A[r]=t;continue}let s=e?.get(r.toLowerCase());A[s??r]=t}return A}function Zt(x,e){if(!x)return null;let A=Hs(x,e.name);return A||(e.alias?Hs(x,e.alias):null)}var FD=require("events"),Y0="[OfflineSyncManager]",vD=500,fD="site_info",lD=new Set(["local-data-interface.json"]);function ne(x){if(x?.aborted)throw x.reason??new DOMException("The operation was aborted.","AbortError")}function cD(x){let e=Qn(x);return!!(x&2)||e!==0&&e!==65}function F8(x){return x.filter(e=>(e.filename===jt||e.filename===Zs)&&e.outcome==="download").map(e=>e.filename)}var Ur="skip-equal",mt="skip-device-readonly",ps="delete",Er="error",bs="upload",ms="uploading-utos",v8="downloading-utos",Gn="fetching-device-state",js="uploading-files",Un="downloading-files",f8="executing-change-requests",l8="executed",ED="error",hs="skip-old-stamp",CD=class extends FD.EventEmitter{constructor(x,e,A){super(),X(this,"utoMaster",x),X(this,"storage",e),X(this,"logger",A)}emitProgress(x,e,A,r,t){let s={phase:x,item:e,completed:A,total:r,...t};this.emit("progress",s)}async uploadHistoricTag(x,e,A,r,t){try{let s=await this.storage.getRowForTag(x),i=0,v=async c=>{let B=c.filter(p=>p.stamp40>A).map(p=>({tag:x,stamp:me(p.stamp40),flags:s?.flags??0,site_related:s?.site_related??0,data:p.data}));await this.storage.insertHistoricRows(B),i+=B.length};return await this.utoMaster.requestHistoricUtos(x,A,t,void 0,vD,v),this.logger?.info(`${Y0} historic upload tag=0x${x.toString(16)} +${i} records`),{tag:x,sTag:e.sTag,historic:!0,outcome:"upload",dbStamp40:A,deviceStamp40:r,recordsAppended:i}}catch(s){return this.logger?.error(`${Y0} historic upload error tag=0x${x.toString(16)}: ${s}`),{tag:x,sTag:e.sTag,historic:!0,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async uploadSingleTag(x,e,A,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t)return this.logger?.info(`${Y0} single upload tag=0x${x.toString(16)} \u2014 device returned no data (skip)`),{tag:x,sTag:e.sTag,historic:!1,outcome:Ur,dbStamp40:A,deviceStamp40:r};let s=await this.storage.getRowForTag(x);return await this.storage.replaceUtoRow({tag:x,stamp:me(t.stamp),flags:s?.flags??0,site_related:s?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null}),this.logger?.info(`${Y0} single upload tag=0x${x.toString(16)}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"upload",dbStamp40:A,deviceStamp40:r}}catch(t){return this.logger?.error(`${Y0} single upload error tag=0x${x.toString(16)}: ${JSON.stringify(t)}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async uploadUtoTags(x,e,A,r){let t=x.length;this.emitProgress(ms,null,0,t);let s=0;for(let i of x){ne(r);let v=e.get(i),{tagInfo:c,dbStamp40:B,deviceStamp40:p}=v;if(this.emitProgress(ms,c?.sTag??`0x${i.toString(16)}`,s,t),!c||p===null)A.set(i,{tag:i,sTag:"?",historic:!1,outcome:"unknown-tag",dbStamp40:B,deviceStamp40:p});else if(!(!c.flags.up||p<=B)){let b=c.sTag,h=s,w=c.historic?await this.uploadHistoricTag(i,c,B,p,k=>{this.emitProgress(ms,b,h,t,{recordsReceived:k})}):await this.uploadSingleTag(i,c,B,p);A.set(i,w)}++s}}async pullFileFromDevice(x,e,A,r,t,s){let i=e.stamp;try{let v=await this.utoMaster.requestFile(x,B=>{this.emitProgress(js,x,s,t,{bytesTransferred:B})}),c=Qs(v);if(c!==e.crc32)throw new Error(`crc32 mismatch: expected 0x${e.crc32.toString(16)}, got 0x${c.toString(16)}`);return await this.storage.upsertFile({filename:x,stamp:me(i),crc:e.crc32,size:v.byteLength,flags:e._flags,flags_int:r,data:v}),{filename:x,outcome:bs,dbStamp40:A,deviceStamp40:i}}catch(v){return this.logger?.error(`${Y0} file upload error ${x}: ${JSON.stringify(v)}`),{filename:x,outcome:Er,dbStamp40:A,deviceStamp40:i}}}async autoSyncUploadFile(x,e,A,r,t,s,i,v){let c=e.stamp;if(c>r)return this.fileContentMatches(e,A)?this.convergeFileStamp(x,e,A,r):s?this.pullFileFromDevice(x,e,r,t,i,v):void 0;if(c===r&&this.fileContentMatches(e,A))return{filename:x,outcome:Ur,dbStamp40:r,deviceStamp40:c}}async convergeFileStamp(x,e,A,r){let t=e.stamp;try{return await this.storage.upsertFile({filename:x,stamp:me(t),crc:e.crc32,size:e.size,flags:e._flags,flags_int:A.flags_int,data:A.data}),{filename:x,outcome:Ur,dbStamp40:r,deviceStamp40:t}}catch(s){return this.logger?.error(`${Y0} file upload error ${x}: ${JSON.stringify(s)}`),{filename:x,outcome:Er,dbStamp40:r,deviceStamp40:t}}}async mirrorUploadFile(x,e,A,r,t,s,i){let v=e.stamp;if(v!==r||!this.fileContentMatches(e,A))return t?this.pullFileFromDevice(x,e,r,A.flags_int,s,i):{filename:x,outcome:mt,dbStamp40:r,deviceStamp40:v}}async decideFileUpload(x,e,A,r){let t=await this.storage.getFile(x),s=!!(e._flags&1);if(!t)return s?this.pullFileFromDevice(x,e,0,16,A,r):void 0;let i=Ie(t.stamp);return e._flags&8?this.autoSyncUploadFile(x,e,t,i,t.flags_int,s,A,r):this.decideNonSystemUpload(x,e,t,i,s,A,r)}pullIfReadable(x,e,A,r,t,s,i){return x?this.pullFileFromDevice(e,A,r,t,s,i):void 0}async decideNonSystemUpload(x,e,A,r,t,s,i){let v=A.flags_int;if(!(v&2))return v&4?this.pullIfReadable(t,x,e,r,v,s,i):this.decideUploadBySyncLogic(x,e,A,r,t,s,i)}async decideUploadBySyncLogic(x,e,A,r,t,s,i){let v=A.flags_int,c=Qn(v);if(c===65)return this.fileContentMatches(e,A)?this.convergeFileStamp(x,e,A,r):this.pullIfReadable(t,x,e,r,v,s,i);if(c===1)return this.autoSyncUploadFile(x,e,A,r,v,t,s,i);if(c===97)return e.stamp>r?this.pullIfReadable(t,x,e,r,v,s,i):void 0;if(c!==33)return this.mirrorUploadFile(x,e,A,r,t,s,i)}async uploadFiles(x,e,A,r){let t=Object.entries(x),s=t.length;this.emitProgress(js,null,0,s);let i=0;for(let[v,c]of t){if(ne(r),!(v===Zs||v===jt&&!A)){let p=await this.decideFileUpload(v,c,s,i);p&&e.set(v,p)}this.emitProgress(js,v,++i,s)}}fileContentMatches(x,e){return e!==null&&x.crc32===e.crc&&x.size===e.size}async downloadSingleTag(x,e,A,r){try{let t=await this.storage.getRowForTag(x);return t?.data&&await this.utoMaster.sendUTOCmdExt(3,x,t.data,A),{tag:x,sTag:e.sTag,historic:!1,outcome:"download",dbStamp40:A,deviceStamp40:r}}catch(t){return this.logger?.error(`${Y0} download error tag=0x${x.toString(16)}: ${t}`),{tag:x,sTag:e.sTag,historic:!1,outcome:"error",dbStamp40:A,deviceStamp40:r}}}async processDownloadTag(x,e,A,r,t){if(A===r&&!t.has(x)){let s=e.flags.up?Ur:"skip-db-readonly";t.set(x,{tag:x,sTag:e.sTag,historic:!1,outcome:s,dbStamp40:A,deviceStamp40:r});return}if(A>r){let s=e.flags.down?await this.downloadSingleTag(x,e,A,r):{tag:x,sTag:e.sTag,historic:!1,outcome:mt,dbStamp40:A,deviceStamp40:r};t.set(x,s)}}async downloadUtoTags(x,e,A,r){let t=x.length;this.emitProgress(v8,null,0,t);let s=0;for(let i of x){ne(r);let{tagInfo:v,dbStamp40:c,deviceStamp40:B}=e.get(i);v&&B!==null&&!v.historic&&await this.processDownloadTag(i,v,c,B,A),this.emitProgress(v8,v?.sTag??`0x${i.toString(16)}`,++s,t)}}async sendFileToDevice(x,e,A,r,t){let s=x.data.byteLength,i=v=>{if(v!==null){let c=Math.round(s*parseInt(v,10)/100);this.emitProgress(Un,x.filename,t,r,{bytesTransferred:c,bytesTotal:s})}};this.utoMaster.on("installing",i);try{return await this.utoMaster.sendFile(0,x.data,W0.stamp40ToMS(e),x.filename),{filename:x.filename,outcome:"download",dbStamp40:e,deviceStamp40:A}}catch(v){return this.logger?.error(`${Y0} file download error ${x.filename}: ${v}`),{filename:x.filename,outcome:"error",dbStamp40:e,deviceStamp40:A}}finally{this.utoMaster.removeListener("installing",i)}}async processDownloadFile(x,e,A,r,t=!1){if(!x.data)return;let s=e?.stamp??0,i=Ie(x.stamp);if(e!==void 0&&this.fileContentMatches(e,x))return i===s?void 0:{filename:x.filename,outcome:Ur,dbStamp40:i,deviceStamp40:s};if(!(!t&&i<s))return!t&&e!==void 0&&!(e._flags&2)?{filename:x.filename,outcome:mt,dbStamp40:i,deviceStamp40:s}:this.sendFileToDevice(x,i,s,A,r)}async isAppInDevPhase(){let x=await this.storage.getMetadataValue(fD);if(!x)return!1;try{return JSON.parse(x).app?.phase==="dev"}catch(e){return this.logger?.error(`${Y0} corrupt site_info metadata: ${e}`),!1}}async downloadFiles(x,e,A,r){let t=await this.storage.getFiles(),s=t.filter(b=>b.flags&8),i=t.filter(b=>!(b.flags&8)),v=[...s,...i].filter(b=>b.filename),c=Object.entries(x).filter(([,b])=>b._flags&4).map(([b])=>b),B=v.length;this.emitProgress(Un,null,0,B);let p=0;for(let b of v){if(ne(r),A&&b.filename===jt){this.emitProgress(Un,b.filename,++p,B);continue}let h=b.filename===jt&&!A,w=await this.decideFileDownload(b,x[b.filename],e.get(b.filename),c,h,B,p);w&&e.set(b.filename,w),this.emitProgress(Un,b.filename,++p,B)}}async decideFileDownload(x,e,A,r,t,s,i){return e!==void 0?this.decideDownloadExisting(x,e,A,t,s,i):this.decideDownloadMissing(x,r,s,i)}async decideDownloadExisting(x,e,A,r,t,s){if(e._flags&4)return;if(x.flags&8)return A?void 0:this.processDownloadFile(x,e,t,s,r);let i=x.flags_int;if(i&8)return this.handleDeviceDelete(x,e,A);if(!A&&!(i&4))return this.pushToDevice(x,e,t,s)}async pushToDevice(x,e,A,r){let t=e.stamp,s=Ie(x.stamp),i=this.wantDownloadPush(x,e,s,t);if(i==="match")return{filename:x.filename,outcome:Ur,dbStamp40:s,deviceStamp40:t};if(i!=="none"&&!(s===0||!x.data||x.data.byteLength===0))return e._flags&2?this.sendFileToDevice(x,s,t,A,r):{filename:x.filename,outcome:mt,dbStamp40:s,deviceStamp40:t}}wantDownloadPush(x,e,A,r){let t=x.flags_int;if(t&2)return"push";let s=this.fileContentMatches(e,x),i=Qn(t);return i===33||i===1&&A>=r?s?"match":"push":i===97&&A>r?"push":"none"}async handleDeviceDelete(x,e,A){let r=e.stamp,t=Ie(x.stamp);if(!(A&&(A.outcome===bs||A.outcome===Er))){if(!(e._flags&2))return{filename:x.filename,outcome:mt,dbStamp40:t,deviceStamp40:r};try{return await this.utoMaster.deleteFile(x.filename),await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:ps,dbStamp40:t,deviceStamp40:r}}catch(s){return this.logger?.error(`${Y0} file delete error ${x.filename}: ${JSON.stringify(s)}`),{filename:x.filename,outcome:Er,dbStamp40:t,deviceStamp40:r}}}}async decideDownloadMissing(x,e,A,r){let t=x.flags_int,s=Ie(x.stamp);if(t&8)try{return await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:ps,dbStamp40:s,deviceStamp40:null}}catch(i){return this.logger?.error(`${Y0} file delete error ${x.filename}: ${JSON.stringify(i)}`),{filename:x.filename,outcome:Er,dbStamp40:s,deviceStamp40:null}}if(!(x.flags&12)&&cD(t)&&x.flags&2&&this.hasMatchingNode(x.filename,e)&&x.data)return this.sendFileToDevice(x,s,0,A,r)}hasMatchingNode(x,e){return e.some(A=>A.slice(0,-1)===x.slice(0,A.length-1))}async reconcileFileState(x){try{await this.reconcileFileStateUnguarded(x)}catch(e){if(x?.aborted)throw e;this.logger?.error(`${Y0} file-state reconciliation failed: ${JSON.stringify(e)}`)}}async reconcileFileStateUnguarded(x){let e=await this.utoMaster.requestFileList(),A=new Set(Object.keys(e)),r=await this.storage.getFiles(),t=new Map(r.map(s=>[s.filename,s]));for(let[s,i]of Object.entries(e))ne(x),await this.reconcileDeviceFile(s,i,t.get(s)??null);for(let s of r)ne(x),A.has(s.filename)||await this.dropRowMissingFromDevice(s)}async reconcileDeviceFile(x,e,A){let r=!!((e._flags|(A?.flags??0))&8);if(A?.data&&!this.fileContentMatches(e,A)){this.logger?.info(`${Y0} reconcile keep ${x}: row holds undeployed content`);return}if(!A?.data&&!r)return;let t={filename:x,stamp:me(e.stamp),crc:e.crc32,size:e.size,flags:e._flags,flags_int:A?.flags_int??16,data:this.keepBlob(x,r)?A?.data??null:null};A&&this.fileRowMatches(A,t)||await this.storage.upsertFile(t)}keepBlob(x,e){return!e||lD.has(x)}fileRowMatches(x,e){return x.stamp===e.stamp&&x.crc===e.crc&&x.size===e.size&&x.flags===e.flags&&x.flags_int===e.flags_int&&(x.data??null)===e.data}async dropRowMissingFromDevice(x){try{await this.storage.deleteFile(x.filename)}catch(e){this.logger?.error(`${Y0} reconcile delete error ${x.filename}: ${JSON.stringify(e)}`)}}async validateDevice(x){ne(x),this.emitProgress("validating",null,0,1);let e=await this.utoMaster.requestDeviceInfo();if(!e)throw new Error(`${Y0} requestDeviceInfo returned null`);let A=await this.storage.getMetadataValue("device_id");if(A===null){if(!e.serialNumber)throw new Error(`${Y0} DB metadata missing device_id and connected device has no serialNumber`);if(!this.storage.setMetadataValue)throw new Error(`${Y0} DB metadata missing device_id`);await this.storage.setMetadataValue("device_id",e.serialNumber),A=e.serialNumber}if(A.toUpperCase()!==e.serialNumber.toUpperCase())throw new Error(`${Y0} DB device_id "${A}" does not match connected device "${e.serialNumber}"`);return this.emitProgress("validating",null,1,1),e}buildTagMap(x){let e=new Map;for(let A=0;A<x.utos.length;A++){let r=x.utos[A];e.set(r.wTag,{index:A,flags:{up:r.flags.up,down:r.flags.down,setValue:!!r.flags.setValue},historic:r.flags.historic,sTag:r.sTag})}return e}async resolveDbTags(x){let e=await this.storage.getUtoDataTags(),A=new Set(e);for(let[r,t]of x)t.historic&&!A.has(r)&&e.push(r);return e}async buildTagStampCache(x,e,A){let r=new Map;for(let t of x){let s=e.get(t),i=await this.storage.getLatestStampForTag(t),v=i?Ie(i):0,c=s&&s.index<A.stamps.length?A.stamps[s.index]:null;r.set(t,{dbStamp40:v,deviceStamp40:c,tagInfo:s})}return r}async executeChangeRequests(x,e,A,r,t,s){let i=await this.storage.getUtoChangeRequests(),v=this.groupChangeRequests(i),c=v.size;if(this.emitProgress(f8,null,0,c),c===0)return;let B=new Set,p=0;for(let[b,h]of v){ne(s);let w=x.get(b),k=w?.sTag??`0x${b.toString(16)}`;this.emitProgress(f8,k,p,c),await this.executeChangeRequestTag(b,k,w,h,e,r,t,B),++p}B.size>0&&await this.repullExecutedTags(B,x,A,s)}groupChangeRequests(x){let e=new Map;for(let A of x){let r=e.get(A.tag)??[];r.push({stamp40:Ie(A.stamp),user:A.user,json:A.json}),e.set(A.tag,r)}return e}async executeChangeRequestTag(x,e,A,r,t,s,i,v){if(!A){this.pushChangeResults(i,x,e,r,"unknown-tag");return}if(!A.flags.setValue){this.pushChangeResults(i,x,e,r,"skip-unsupported");return}let c=A.index<t.stamps.length?t.stamps[A.index]:0,B=r.filter(b=>b.stamp40<=c),p=r.filter(b=>b.stamp40>c);this.pushChangeResults(i,x,e,B,hs),p.length>0&&await this.coalesceAndSend(x,e,A,p,s,i,v)}async coalesceAndSend(x,e,A,r,t,s,i){let v=await this.storage.getRowForTag(x);if(t.get(x)?.outcome===Er||!v||!v.data){this.pushChangeResults(s,x,e,r,"error");return}let c=this.resolveSetObject(v.data,r,e);if(c===null){this.pushChangeResults(s,x,e,r,"error");return}if(Object.keys(c).length===0){this.pushChangeResults(s,x,e,r,"skip-no-change");return}let B=r[r.length-1].stamp40,p=await this.utoMaster.sendSetValue(x,JSON.stringify(c),B);p.outcome==="ok"||p.outcome==="stamp"?(i.add(x),this.pushChangeResults(s,x,e,r,l8,p.resultCode)):p.outcome==="denied"?(this.logger?.warn(`${Y0} change-request denied ${e} (result=${p.resultCode}) \u2014 server will retry`),this.pushChangeResults(s,x,e,r,"denied",p.resultCode)):(this.logger?.error(`${Y0} change-request error ${e} (result=${p.resultCode})`),this.pushChangeResults(s,x,e,r,"error",p.resultCode))}resolveSetObject(x,e,A){try{let r=JSON.parse(W0.cp1252Unpack(x,0,x.byteLength));return this.buildSetObject(r,e,A)}catch(r){return this.logger?.error(`${Y0} change-request unparseable uto_data ${A}: ${r}`),null}}buildSetObject(x,e,A){let r={};for(let t of e){let s=JSON.parse(t.json);if(!this.isPlainRecord(s))throw new Error(`change-request JSON is not an object on ${A}`);for(let[i,v]of Object.entries(s)){let c=this.resolveChangeField(x[i],v,i,A);c.apply&&(r[i]=c.value,x[i]=c.value)}}return r}resolveChangeField(x,e,A,r){if(this.isBitwiseOp(e)){let{op:t,val:s}=e;return this.resolveBitwiseOp(x,t,s,A,r)}return x===e?{apply:!1}:{apply:!0,value:e}}resolveBitwiseOp(x,e,A,r,t){return e!=="|"&&e!=="&"?(this.logger?.warn(`${Y0} change-request unknown op "${e}" on ${t}.${r} \u2014 skipped`),{apply:!1}):typeof A!="number"?(this.logger?.warn(`${Y0} change-request op "${e}" with non-number val on ${t}.${r} \u2014 skipped`),{apply:!1}):x===void 0?e==="|"?{apply:!0,value:A}:{apply:!1}:typeof x!="number"?(this.logger?.warn(`${Y0} change-request op "${e}" on non-number ${t}.${r} \u2014 skipped`),{apply:!1}):{apply:!0,value:e==="|"?x|A:x&A}}isBitwiseOp(x){return this.isPlainRecord(x)&&"op"in x}isPlainRecord(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}pushChangeResults(x,e,A,r,t,s){for(let i of r)x.push({tag:e,sTag:A,stamp40:i.stamp40,user:i.user,outcome:t,resultCode:s})}async repullExecutedTags(x,e,A,r){let t=null;try{t=await this.utoMaster.requestStamps()}catch(s){this.logger?.warn(`${Y0} change-request STAMPS re-fetch failed \u2014 using per-tag stamps: ${s}`)}for(let s of x)ne(r),await this.repullExecutedTag(s,e,t,A)}async repullExecutedTag(x,e,A,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t){this.logger?.info(`${Y0} change-request re-pull tag=0x${x.toString(16)} \u2014 device returned no data (E_EOD), DB row unchanged`);return}let s=await this.storage.getRowForTag(x),i=t.stamp;await this.storage.replaceUtoRow({tag:x,stamp:me(i),flags:s?.flags??0,site_related:s?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null});let v=r.get(x);if(v){let c=e.get(x),B=A&&c&&c.index<A.stamps.length?A.stamps[c.index]:i;v.dbStamp40=i,v.deviceStamp40=B}this.logger?.info(`${Y0} change-request re-pull tag=0x${x.toString(16)} \u2192 stamp ${i}`)}catch(t){this.logger?.error(`${Y0} change-request re-pull error tag=0x${x.toString(16)}: ${t}`)}}aggregateResult(x,e,A){let r=[...x.values()],t=[...e.values()],s=F8(t);return{tags:r,files:t,changeRequests:A,requiresReconnectSync:s.length>0,rebootFilesDeployed:s,totalTagsUploaded:r.filter(i=>i.outcome==="upload"&&!i.historic).length,totalTagsDownloaded:r.filter(i=>i.outcome==="download").length,totalTagsSkipped:r.filter(i=>i.outcome===Ur||i.outcome==="skip-db-readonly"||i.outcome===mt).length,totalHistoricRecordsAppended:r.reduce((i,v)=>i+(v.recordsAppended??0),0),totalFilesUploaded:t.filter(i=>i.outcome===bs).length,totalFilesDownloaded:t.filter(i=>i.outcome==="download").length,totalFilesDeleted:t.filter(i=>i.outcome===ps).length,totalChangeRequestsExecuted:A.filter(i=>i.outcome===l8).length,totalErrors:r.filter(i=>i.outcome===Er).length+t.filter(i=>i.outcome===Er).length+A.filter(i=>i.outcome===ED).length}}async sync(x){let{signal:e}=x??{},A=await this.validateDevice(e);ne(e),this.emitProgress(Gn,null,0,3);let r=this.buildTagMap(A),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${Y0} requestStamps returned null`);this.emitProgress(Gn,"stamps",1,3);let s=await this.utoMaster.requestFileList();this.emitProgress(Gn,"file-list",2,3);let i=await this.resolveDbTags(r);this.emitProgress(Gn,"db-tags",3,3);let v=await this.buildTagStampCache(i,r,t),c=new Map,B=new Map,p=[],b=await this.isAppInDevPhase();return ne(e),await this.uploadUtoTags(i,v,c,e),ne(e),await this.uploadFiles(s,B,b,e),ne(e),await this.executeChangeRequests(r,t,v,c,p,e),ne(e),await this.downloadUtoTags(i,v,c,e),ne(e),await this.downloadFiles(s,B,b,e),ne(e),F8([...B.values()]).length===0&&await this.reconcileFileState(e),this.emitProgress("complete",null,0,0),this.aggregateResult(c,B,p)}async executeAdHocChangeRequest(x,e){let A=await this.utoMaster.requestDeviceInfo();if(!A)throw new Error(`${Y0} requestDeviceInfo returned null`);let r=this.buildTagMap(A),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${Y0} requestStamps returned null`);let s=r.get(x),i=s?.sTag??`0x${x.toString(16)}`,v=e.map(h=>({stamp40:h.stamp40,user:"",json:h.json})).sort((h,w)=>h.stamp40-w.stamp40),c=new Map,B=[],p=new Set;return await this.executeChangeRequestTag(x,i,s,v,t,c,B,p),p.size>0&&await this.repullExecutedTags(p,r,new Map,void 0),B.find(h=>h.outcome!==hs)?.outcome??hs}},BD=require("events"),dD=require("events"),uD=require("events"),DD=5e3,ca=class jv extends uD.EventEmitter{constructor(e=yA){super(),X(this,"logger",e),X(this,"ws",null),X(this,"bridgeTransport",null),X(this,"bridgeSignal"),X(this,"bridgeResolve",null),X(this,"bridgeReject",null),X(this,"serverMessageCount",0),X(this,"settled",!1),X(this,"abortHandler",null),X(this,"connectTimeout"),X(this,"writeQueue",[]),X(this,"isProcessingQueue",!1),X(this,"queueAborted",!1),X(this,"queueDrainPromise",Promise.resolve()),X(this,"transportUnsubscribe",null)}static buildSyncUrl(e,A){return`wss://${e}/uto/1/sync/${A}`}resetBridgeState(){this.serverMessageCount=0,this.settled=!1,this.abortHandler=null,this.connectTimeout=void 0,this.writeQueue=[],this.isProcessingQueue=!1,this.queueAborted=!1,this.queueDrainPromise=Promise.resolve(),this.bridgeResolve=null,this.bridgeReject=null,this.bridgeTransport=null,this.bridgeSignal=void 0,this.transportUnsubscribe=null}async processWriteQueue(){if(!this.isProcessingQueue){for(this.isProcessingQueue=!0;this.writeQueue.length>0&&!this.queueAborted;){let e=this.writeQueue.shift();try{await V8(this.bridgeTransport,e)}catch(A){let r=A instanceof Error?A.message:String(A);this.logger.error(`Error writing to transport: ${r}`)}}this.isProcessingQueue=!1}}cleanup(){this.transportUnsubscribe&&(this.transportUnsubscribe(),this.transportUnsubscribe=null),this.abortHandler&&this.bridgeSignal&&(this.bridgeSignal.removeEventListener("abort",this.abortHandler),this.abortHandler=null),this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.ws=null}settle(e,A){this.settled||(this.settled=!0,this.cleanup(),e==="resolve"?this.bridgeResolve?.({serverMessageCount:this.serverMessageCount}):this.bridgeReject?.(A))}attachWebSocketHandlers(e,A){let r=t=>{e.readyState===WebSocket.OPEN&&!this.bridgeSignal?.aborted&&!this.settled&&e.send(t)};this.abortHandler=()=>{this.logger.info("WebSocket bridge aborted"),this.queueAborted=!0,this.writeQueue.length=0,(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close(),this.settle("reject",new Error("Operation aborted"))},this.bridgeSignal&&this.bridgeSignal.addEventListener("abort",this.abortHandler),e.onopen=()=>{this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.logger.info(`WebSocket connected to ${A}`),this.transportUnsubscribe=this.bridgeTransport.onData(r),this.emit("wsConnected")},e.onmessage=t=>{this.serverMessageCount++,this.emit("serverMessage",this.serverMessageCount),!(this.bridgeSignal?.aborted||this.settled)&&(this.writeQueue.push(t.data),this.isProcessingQueue||(this.queueDrainPromise=this.processWriteQueue()))},e.onclose=t=>{this.logger.info(`WebSocket closed (server=${A}, code=${t.code}, messages=${this.serverMessageCount})`),this.emit("wsClosed",t.code,t.reason),this.queueDrainPromise.then(()=>this.settle("resolve")).catch(()=>this.settle("resolve"))},e.onerror=t=>{this.logger.error(`WebSocket error (server=${A})`),this.emit("wsError",t),this.queueAborted=!0,this.writeQueue.length=0,this.settle("reject",new Error("WebSocket error"))}}async bridge(e,A,r,t){return new Promise((s,i)=>{if(t?.aborted){i(new Error("Operation aborted"));return}this.resetBridgeState(),this.bridgeTransport=e,this.bridgeSignal=t,this.bridgeResolve=s,this.bridgeReject=i;let v=jv.buildSyncUrl(A,r);this.logger.info(`Opening WebSocket: ${v}`);let c=new WebSocket(v);c.binaryType="arraybuffer",this.ws=c,this.connectTimeout=setTimeout(()=>{c.readyState===WebSocket.CONNECTING&&(this.logger.error("WebSocket connection timeout"),c.close(),this.settle("reject",new Error("WebSocket connection timeout")))},DD),this.attachWebSocketHandlers(c,A)})}close(){this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.close()}},hv="https://lic.mydatanet.at/api/2/";async function gv(x,e=hv){let A=`${e}devices/${x}/assignment`,r=await fetch(A);if(!r.ok)throw new Error(`Failed to get device assignment: ${r.status} ${r.statusText}`);return r.json()}var yv=class extends dD.EventEmitter{constructor(x=yA){super(),X(this,"logger",x)}async execute(x,e,A,r){let t=A;t||(this.logger.info("[LegacySync] No serverUrl provided, resolving via device assignment..."),this.emit("syncPhase",{phase:"resolving-server"}),t=(await gv(e)).server_url,this.logger.info("[LegacySync] Resolved server URL: "+t)),this.logger.info("[LegacySync] Starting legacy sync (server="+t+")");let s=new ca(this.logger);s.on("wsConnected",()=>this.emit("wsConnected")),s.on("wsClosed",(v,c)=>this.emit("wsClosed",v,c)),s.on("wsError",v=>this.emit("wsError",v)),s.on("serverMessage",v=>this.emit("serverMessage",v));let i=await s.bridge(x,t,e,r);return this.logger.info("[LegacySync] Legacy sync completed (serverMessages="+i.serverMessageCount+")"),{serverMessageCount:i.serverMessageCount}}},pD=require("events"),kv="Operation aborted";function bD(x){return x instanceof Error?x.message:String(x)}function gs(x){if(x?.aborted)throw new Error(kv)}var wv=class extends pD.EventEmitter{constructor(x,e=yA){super(),X(this,"atHandler",x),X(this,"logger",e)}async execute(x,e,A,r){this.logger.info("Starting debug-enabled sync");let t=[{name:"mnt",queryServer:i=>this.atHandler.queryMntServerConfig(i),initiateSync:i=>this.atHandler.initiateMntSync(i)},{name:"mdn",queryServer:i=>this.atHandler.queryMdnServerConfig(i),initiateSync:i=>this.atHandler.initiateMdnSync(i)}],s={};for(let i of t)try{s[i.name]=await this.runSyncPhase(i,x,e,r)}catch(v){if(r?.aborted)throw new Error(kv);let c=`${i.name.toUpperCase()} sync phase failed: ${bD(v)}`;throw this.logger.error(c),new Error(c)}return this.logger.info(`Debug sync completed (mntMessages=${s.mnt}, mdnMessages=${s.mdn})`),{mntServerMessageCount:s.mnt,mdnServerMessageCount:s.mdn}}async runSyncPhase(x,e,A,r){gs(r);let t=x.name.toUpperCase();this.emit("syncPhase",{phase:x.name}),this.logger.info(`Phase: Querying ${t} server configuration`);let s=await x.queryServer(r);this.logger.info(`${t} server domain: ${s}`),gs(r),await x.initiateSync(r),gs(r);let i=await this.syncWithServer(e,s,A,r);return this.logger.info(`${t} phase completed (serverMessages=${i.serverMessageCount})`),i.serverMessageCount}async syncWithServer(x,e,A,r){let t=new ca(this.logger),s=!1;t.on("wsConnected",()=>this.emit("wsConnected"));let i=this.atHandler.createConCloseMonitor(()=>{s=!0,this.logger.info("Device initiated close (+CONCLOSE), closing WebSocket"),t.close()});try{let v=await t.bridge(x,e,A,r);return s?this.logger.info("Connection closed by device (+CONCLOSE)"):(this.logger.info("Connection closed by server, sending +CONCLOSE to device"),await this.atHandler.sendConnectionClose(r)),v}finally{i()}}},mD=class extends BD.EventEmitter{constructor(x,e,A=yA){super(),X(this,"syncTransport",x),X(this,"logger",A),X(this,"atHandler"),this.atHandler=e??null}async sync(x){let e=this.atHandler?"debug":"legacy";this.emit("syncStart",{mode:e});try{if(this.atHandler)try{return this.emit("syncPhase",{phase:"debug-sync"}),await this.syncWithDebug(x)}catch(A){return this.logger.warn("[SyncManager] Debug sync failed, falling back to legacy sync: "+(A instanceof Error?A.message:String(A))),this.emit("syncPhase",{phase:"debug-fallback-legacy"}),await this.syncLegacy(x)}return this.emit("syncPhase",{phase:"legacy"}),await this.syncLegacy(x)}catch(A){throw this.emit("syncError",A),A}}async syncLegacy(x){let e=new yv(this.logger);e.on("syncPhase",t=>this.emit("syncPhase",t));let r={mode:"legacy",serverMessageCount:(await e.execute(this.syncTransport,x.serialNumber,x.serverUrl,x.signal)).serverMessageCount};return this.emit("syncComplete",r),r}async syncWithDebug(x){let e=new wv(this.atHandler,this.logger);e.on("syncPhase",t=>this.emit("syncPhase",t));let A=await e.execute(this.syncTransport,x.serialNumber,x.serverUrl??"",x.signal),r={mode:"debug",serverMessageCount:A.mntServerMessageCount+A.mdnServerMessageCount,mntServerMessageCount:A.mntServerMessageCount,mdnServerMessageCount:A.mdnServerMessageCount};return this.emit("syncComplete",r),r}dispose(){}},jD=require("events"),Hx={MNT_CFG:"at+mntcfg?",MDN_CFG:"at+mdncfg?",MNT_SYNC:"at+mntsync",MDN_SYNC:"at+mdnsync",CON_CLOSE:"at+conclose",APP_GET_METADATA:"AT+APP=GETMETADATA",APP_GET_DATAVALUE:"AT+APP=GETDATAVALUE",APP_TRIG_MEASURE:"AT+APP=TRIGMEASURE",APP_TRIG_MEASURE_TEST:"AT+APP=TRIGMEASURE=?",ATI:"ati",RM2M_STATE:"at+rm2mstate?",TX:"at+tx",TX_MAINTENANCE:"at+tx=4",TX_GSM_POSITION:"at+tx=1",TX_MODE_TRIGGERED:"at+txmode=0",TX_MODE_WAKEUP:"at+txmode=1",TX_MODE_ONLINE:"at+txmode=2",COMPANION_CERT:"AT+COMPCERT",COMPANION_CERT_TEST:"AT+COMPCERT=?"},ix={OK:"OK",ERROR:"ERROR",SYNC_START:"+SYNC START",MEASURED:"+MEASURED",CON_CLOSE:"+CONCLOSE",MNT_CFG_PREFIX:"+MNTCFG",MDN_CFG_PREFIX:"+MDNCFG",RM2M_STATE:"+RM2MSTATE",ERROR_PIN_REQUIRED:"ERROR PIN REQUIRED",ERROR_NO_DATA:"ERROR NO DATA",COMPCERT_ERROR:/\+COMPCERT ERROR:\s*(\d+)/},fe=1e4,_v=9e4,Sv=/(?:ERROR PIN REQUIRED|ERROR NO DATA|ERROR|OK)\r\n/;function Tv(){return{buffer:"",closedByDevice:!1,reset(){this.buffer="",this.closedByDevice=!1}}}var Hr="Operation aborted",oe=class extends Error{constructor(x="AT command handler was disposed"){super(x),this.name="AtHandlerDisposedError"}},ti=class extends Error{constructor(x="Device returned ERROR response"){super(x),this.name="AtDeviceError"}},hD=class extends jD.EventEmitter{constructor(x,e=yA){super(),X(this,"transport",x),X(this,"logger",e),X(this,"mutex",new ea("AtCommandHandler")),X(this,"bufferState",Tv()),X(this,"responseCallback",null),X(this,"decoder",new TextDecoder),X(this,"dataHandler"),X(this,"disposeTransportListener"),X(this,"isDisposed",!1),X(this,"activeAbort",null),X(this,"session"),this.dataHandler=A=>this.handleIncomingData(A),this.disposeTransportListener=this.transport.onData(this.dataHandler),this.session={sendAndWait:(A,r,t=fe,s)=>this.executeSendAndWait(A,r,t,s),sendRaw:(A,r=fe)=>this.executeSendRaw(A,r),queryMntServerConfig:A=>this.executeQueryConfig(Hx.MNT_CFG,ix.MNT_CFG_PREFIX,A),queryMdnServerConfig:A=>this.executeQueryConfig(Hx.MDN_CFG,ix.MDN_CFG_PREFIX,A),initiateMntSync:A=>this.executeInitiateMntSync(A),initiateMdnSync:A=>this.executeInitiateMdnSync(A),sendCompanionCert:(A,r)=>this.executeSendCompanionCert(A,r),queryCompanionCertSupport:A=>this.executeQueryCompanionCertSupport(A),sendConnectionClose:A=>this.executeSendConnectionClose(A)}}get isBusy(){return this.mutex.islocked}get disposed(){return this.isDisposed}async withAtLock(x){await this.mutex.requestLock();try{if(this.isDisposed)throw new oe;return await x(this.session)}finally{this.mutex.unlock()}}handleIncomingData(x){let e=this.decoder.decode(x);this.bufferState.buffer+=e,this.emit("data",e),this.responseCallback&&this.responseCallback(this.bufferState.buffer),!this.responseCallback&&this.bufferState.buffer.length>1e3&&(this.bufferState.buffer=this.bufferState.buffer.slice(-500))}encodeCommand(x){let e=new Uint8Array(x.length+2);for(let A=0;A<x.length;A++)e[A]=x.charCodeAt(A);return e[x.length]=10,e[x.length+1]=13,e.buffer}makeCleanup(x,e,A){return()=>{this.responseCallback=null,this.activeAbort=null,clearTimeout(x),e&&A&&e.removeEventListener("abort",A)}}makeResponseChecker(x,e,A,r){let t=x instanceof RegExp;return s=>{if(x!==ix.ERROR&&s.includes(ix.ERROR)){e(),r(new ti);return}let i=!1,v=s;if(t){let c=s.match(x);c&&(i=!0,v=c[0])}else i=s.includes(x);if(i){e(),A(v);return}s.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))}}executeSendAndWait(x,e,A,r){return new Promise((t,s)=>{if(this.isDisposed){s(new oe);return}if(r?.aborted){s(new Error(Hr));return}x&&(this.bufferState.buffer="");let v=e instanceof RegExp?e.source:e,c={cleanup:()=>{}},B=setTimeout(()=>{c.cleanup(),s(new Error(`Timeout waiting for response: ${v}`))},A),p=()=>{c.cleanup(),s(new Error(Hr))};c.cleanup=this.makeCleanup(B,r,p),r&&r.addEventListener("abort",p);let b=this.makeResponseChecker(e,c.cleanup,t,s);this.responseCallback=b,this.activeAbort=()=>{c.cleanup(),s(new oe)},!x&&this.bufferState.buffer&&b(this.bufferState.buffer),x&&(this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(h=>{c.cleanup(),s(h)}))})}executeSendRaw(x,e){return new Promise((A,r)=>{if(this.isDisposed){r(new oe);return}this.bufferState.buffer="";let t=setTimeout(()=>{s(),r(new Error(`Timeout waiting for raw AT response to: ${x}`))},e),s=this.makeCleanup(t);this.activeAbort=()=>{s(),r(new oe)},this.responseCallback=i=>{Sv.test(i)&&(s(),this.logger.info("RX: "+i.trim()),A(i))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(i=>{s(),r(i)})})}executeQueryConfig(x,e,A){return new Promise((r,t)=>{if(this.isDisposed){t(new oe);return}if(A?.aborted){t(new Error(Hr));return}this.bufferState.buffer="";let s={cleanup:()=>{}},i=setTimeout(()=>{s.cleanup(),this.logger.error(`Timeout waiting for ${e} server config`),t(new Error(`Timeout waiting for ${e} response \u2014 server configuration not available`))},fe),v=()=>{s.cleanup(),t(new Error(Hr))};s.cleanup=this.makeCleanup(i,A,v),A&&A.addEventListener("abort",v);let c=new RegExp(`\\${e}:\\s*<?([^,>\\s]+)>?`);this.activeAbort=()=>{s.cleanup(),t(new oe)},this.responseCallback=B=>{let p=B.match(c);if(p){s.cleanup();let b=p[1].trim();this.logger.info(`Server config ${e}: ${b}`),r(b);return}B.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(B=>{s.cleanup(),this.logger.error(`Failed to send ${e} command: `+(B instanceof Error?B.message:String(B))),t(B)})})}async sendAndWait(x,e,A=fe,r){return this.withAtLock(t=>t.sendAndWait(x,e,A,r))}async sendRaw(x,e=fe){return this.withAtLock(A=>A.sendRaw(x,e))}async queryMntServerConfig(x){return this.withAtLock(e=>e.queryMntServerConfig(x))}async queryMdnServerConfig(x){return this.withAtLock(e=>e.queryMdnServerConfig(x))}async initiateMntSync(x){return this.withAtLock(e=>e.initiateMntSync(x))}async initiateMdnSync(x){return this.withAtLock(e=>e.initiateMdnSync(x))}async sendCompanionCert(x,e){return this.withAtLock(A=>A.sendCompanionCert(x,e))}async executeInitiateMntSync(x){this.logger.info("Initiating MNT sync"),await this.executeSendAndWait(Hx.MNT_SYNC,ix.OK,fe,x)}async executeInitiateMdnSync(x){this.logger.info("Initiating MDN sync");try{await this.executeSendAndWait(Hx.MDN_SYNC,ix.OK,fe,x),await this.executeSendAndWait(null,ix.SYNC_START,fe,x)}catch(e){this.logger.error("Failed to initiate MDN sync: "+(e instanceof Error?e.message:String(e)))}}async executeSendCompanionCert(x,e){if(this.isDisposed)throw new oe;if(e?.aborted)throw new Error(Hr);let A=x.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-x.length%4)%4),r=A.length,t=await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${r}`,ix.OK,fe,e),s=t.match(/(\d+)/),i=s?parseInt(s[1],10):NaN;if(!Number.isFinite(i)||i<=0)throw new ti(`AT+COMPCERT init: reply carries no chunk size (${JSON.stringify(t.trim())})`);let v=0;for(;v<r;){let c=Math.min(i,r-v),B=A.slice(v,v+c);await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${c},${v},${B}`,ix.OK,fe,e),v+=c}return this.executeCompanionCertFinalize(r,e)}executeCompanionCertFinalize(x,e){return new Promise((A,r)=>{if(this.isDisposed){r(new oe);return}if(e?.aborted){r(new Error(Hr));return}this.bufferState.buffer="";let t={cleanup:()=>{}},s=setTimeout(()=>{t.cleanup(),r(new Error("Timeout waiting for AT+COMPCERT finalize response"))},fe),i=()=>{t.cleanup(),r(new Error(Hr))};t.cleanup=this.makeCleanup(s,e,i),e&&e.addEventListener("abort",i),this.activeAbort=()=>{t.cleanup(),r(new oe)},this.responseCallback=c=>{let B=c.match(ix.COMPCERT_ERROR);if(B){t.cleanup(),A({success:!1,errorCode:parseInt(B[1],10)});return}if(c.includes(ix.OK)){t.cleanup(),A({success:!0});return}c.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))};let v=`${Hx.COMPANION_CERT}=0,${x}`;this.logger.info("TX: "+v),this.transport.write(this.encodeCommand(v)).catch(c=>{t.cleanup(),r(c)})})}async queryCompanionCertSupport(x){return this.withAtLock(e=>e.queryCompanionCertSupport(x))}async executeQueryCompanionCertSupport(x){try{return await this.executeSendAndWait(Hx.COMPANION_CERT_TEST,ix.OK,fe,x),!0}catch(e){if(e instanceof oe)throw e;return!1}}async sendConnectionClose(x){return this.withAtLock(e=>e.sendConnectionClose(x))}async executeSendConnectionClose(x){try{await this.executeSendAndWait(Hx.CON_CLOSE,ix.CON_CLOSE,fe,x)}catch(e){this.logger.error("Failed to receive +CONCLOSE response: "+(e instanceof Error?e.message:String(e)))}}createConCloseMonitor(x){let e="",A=r=>{e+=r,e.includes(ix.CON_CLOSE)&&(e="",this.bufferState.closedByDevice=!0,x()),e.length>1e3&&(e=e.slice(-500))};return this.on("data",A),()=>{this.off("data",A)}}dispose(){this.isDisposed||(this.isDisposed=!0,this.activeAbort?.(),this.disposeTransportListener(),this.responseCallback=null,this.activeAbort=null,this.removeAllListeners())}},Rv=(x=>(x[x.FORMAT=1]="FORMAT",x[x.SIGNATURE=2]="SIGNATURE",x[x.EXPIRED=3]="EXPIRED",x[x.NO_MDN_PUBKEY=4]="NO_MDN_PUBKEY",x[x.BUSY=5]="BUSY",x[x.INTERNAL=6]="INTERNAL",x))(Rv||{}),gD=require("events"),ys="requesting-cert",ks="cert-revoked",Pv=class Kt extends gD.EventEmitter{constructor(){super(...arguments),X(this,"utoMaster",null),X(this,"disposed",!1),X(this,"atHandler",null)}async authenticate(e){let A=e.logger??GA,{signal:r,atHandler:t}=e;if(this.disposed)return this.fail("error","CompanionAuthManager disposed");let s=()=>{if(r?.aborted)throw new Error("Operation aborted")},i=()=>{if(this.disposed)throw new Error("CompanionAuthManager disposed")},v=!1,c=!1,B=null;this.atHandler=t;try{this.emitPhase("checking-cert"),s();let p=await this.loadOrGenerateKeypair(e.storage),b=await e.storage.getCertificate(e.apiConfig.apiHost);(b===null||!Ys(b.notAfter))&&(A.info("Companion cert missing or near expiry \u2014 requesting new cert"),this.emitPhase(ys),s(),b=await this.requestAndStoreCert(p,e)),i(),B=new Q8(e.utoTransport,A,e.timeSource),this.utoMaster=B,this.emitPhase("cert-presenting"),s();let h=b;b=await t.withAtLock(async k=>{let P=await this.presentCertWithRefresh(k,h,p,e);return await k.initiateMdnSync(r),v=!0,P}),i(),this.emitPhase("ecs-handshake"),s(),await B.init(),i();let w=await B.initiateEcsHandshake({companionPublicKey:p.publicKey,companionPrivateKey:p.privateKey,signal:r});return c=w.success,i(),w.success?(this.emitPhase("connected"),i(),this.utoMaster=null,this.atHandler=null,{success:!0,utoMaster:B}):(await this.abandonAttempt(A,B,v,t),this.fail("ecs-handshake",`ECS handshake failed (code ${w.resultCode})`))}catch(p){return await this.abandonAttempt(A,B,v&&!c,t),this.handleError(p)}}async abandonAttempt(e,A,r,t){r&&await t.sendConnectionClose().catch(s=>{e.warn(`at+conclose after failed auth skipped: ${s instanceof Error?s.message:String(s)}`)}),this.utoMaster=null,this.atHandler=null,await Kt.disposeMaster(A,e,t)}static async disposeMaster(e,A,r){if(e)try{await e.dispose(r)}catch(t){A.error(`Failed to dispose UtoMaster: ${t instanceof Error?t.message:String(t)}`)}}dispose(){this.disposed=!0;let e=this.utoMaster,A=this.atHandler;this.utoMaster=null,this.atHandler=null,Kt.disposeMaster(e,GA,A??void 0),this.removeAllListeners()}async loadOrGenerateKeypair(e){let A=await e.getKeypair();if(A!==null)return A;let r=await Ts();return await e.saveKeypair(r),r}static async fetchCertOrThrowRevoked(e,A){try{return await I8(A.apiConfig,{publicKey:e.publicKey,subject:A.subject})}catch(r){throw r instanceof Jt&&(r.httpStatus===401||r.httpStatus===404)?(await A.storage.clearCertificate(A.apiConfig.apiHost),new ws(ks,`Companion cert revoked or session expired (HTTP ${r.httpStatus})`,{httpStatus:r.httpStatus,apiCode:r.code})):r}}async requestAndStoreCert(e,A){let r=await Kt.fetchCertOrThrowRevoked(e,A),t={base64Url:r.certificateBase64Url,notAfter:r.notAfter};return await A.storage.saveCertificate(t,A.apiConfig.apiHost),t}static async refreshCertificate(e){let A=await e.storage.getKeypair(),r=A!==null?A:await(async()=>{let i=await Ts();return await e.storage.saveKeypair(i),i})(),t=await Kt.fetchCertOrThrowRevoked(r,e),s={base64Url:t.certificateBase64Url,notAfter:t.notAfter};return await e.storage.saveCertificate(s,e.apiConfig.apiHost),s}static async clearCredentials(e,A){await e.clearCertificate(A)}async presentCertWithRefresh(e,A,r,t){let s=await e.sendCompanionCert(A.base64Url,t.signal);if(s.success||s.errorCode===3&&((t.logger??GA).info("Device reported EXPIRED \u2014 refreshing cert and retrying"),this.emitPhase(ys),A=await this.requestAndStoreCert(r,t),s=await e.sendCompanionCert(A.base64Url,t.signal),s.success))return A;throw new ws("cert-presenting",`AT+COMPCERT rejected (code ${s.errorCode??"?"})`,{certErrorCode:s.errorCode})}emitPhase(e){this.emit("phase",e)}fail(e,A){return this.emit("phase","error"),{success:!1,phase:e,error:A}}handleError(e){return e instanceof ws?(this.emit("phase",e.phase===ks?ks:"error"),{success:!1,phase:e.phase,error:e.message,certErrorCode:e.certErrorCode,httpStatus:e.httpStatus,apiCode:e.apiCode}):(this.emit("phase","error"),e instanceof Jt?{success:!1,phase:ys,error:e.message,httpStatus:e.httpStatus,apiCode:e.code}:{success:!1,phase:"error",error:e instanceof Error?e.message:String(e)})}};X(Pv,"encodePublicKeyBase64Url",Xs);var yD=Pv,ws=class extends Error{constructor(x,e,A={}){super(e),X(this,"phase",x),X(this,"extra",A),this.name="AuthError"}get certErrorCode(){return this.extra.certErrorCode}get httpStatus(){return this.extra.httpStatus}get apiCode(){return this.extra.apiCode}},Iv=(x=>(x.CERT_FORMAT="cert_format",x.CERT_SIGNATURE="cert_signature",x.CERT_EXPIRED="cert_expired",x.NO_MDN_PUBKEY="no_mdn_pubkey",x.DEVICE_BUSY="device_busy",x.DEVICE_INTERNAL="device_internal",x.ECS_FAILURE="ecs_failure",x.CERT_REVOKED="cert_revoked",x.SESSION_EXPIRED="session_expired",x.ABORTED="aborted",x.UNKNOWN="unknown",x))(Iv||{}),kD={cert_format:"companion_auth.error.cert_format",cert_signature:"companion_auth.error.cert_signature",cert_expired:"companion_auth.error.cert_expired",no_mdn_pubkey:"companion_auth.error.no_mdn_pubkey",device_busy:"companion_auth.error.device_busy",device_internal:"companion_auth.error.device_internal",ecs_failure:"companion_auth.error.ecs_failure",cert_revoked:"companion_auth.error.cert_revoked",session_expired:"companion_auth.error.session_expired",aborted:"companion_auth.error.aborted",unknown:"companion_auth.error.unknown"};function wD(x){if(x.certErrorCode!==void 0)switch(x.certErrorCode){case 1:return"cert_format";case 2:return"cert_signature";case 3:return"cert_expired";case 4:return"no_mdn_pubkey";case 5:return"device_busy";case 6:return"device_internal"}return x.phase==="cert-revoked"?x.httpStatus===401?"session_expired":"cert_revoked":x.phase==="ecs-handshake"?"ecs_failure":x.error==="Operation aborted"?"aborted":"unknown"}var _D=require("events");function Ov(x){let e=x.replace(/\r\nOK\r\n$/,"").trim();return e?e.split("\f").map(A=>{let r=A.split(" ");return r.length<4?null:{name:r[0],scale:parseFloat(r[1]),offset:parseFloat(r[2]),unit:r[3]}}).filter(A=>A!==null):[]}function Nv(x){let e=x.replace(/^\+[^\r\n]*\r\n/gm,"").replace(/\r\nOK\r\n$/,"").trim();return e?e.split("\f"):[]}function qv(x,e,A){let r=parseFloat(x);return isNaN(r)?x:parseFloat(Number(r*e+A).toFixed(3)).toString()}function Ks(x,e){return x.map((A,r)=>({name:A.name,displayValue:qv(e[r]??"",A.scale,A.offset),unit:A.unit}))}var SD=2e3,Mv=class extends _D.EventEmitter{constructor(x,e=yA){super(),X(this,"atHandler",x),X(this,"logger",e),X(this,"datapoints",[]),X(this,"values",[]),X(this,"polling",!1),X(this,"pollTimer",null),X(this,"fetchInProgress",!1),X(this,"fetchPromise",null)}async checkSupport(){this.logger.info("Checking local data support");let x=await this.atHandler.sendRaw(Hx.APP_GET_METADATA),e=x.includes(ix.OK)?{supported:!0,pinRequired:!1}:x.includes(ix.ERROR_PIN_REQUIRED)?{supported:!0,pinRequired:!0}:x.includes(ix.ERROR_NO_DATA)?{supported:!1,pinRequired:!1}:x.includes(ix.ERROR)?{supported:!1,pinRequired:!1}:{supported:!1,pinRequired:!1};return this.logger.info("Local data support: "+JSON.stringify(e)),e}async fetchMetadata(x){this.logger.info("Fetching metadata"+(x?" (with PIN)":""));let e=x?`${Hx.APP_GET_METADATA}=${x}`:Hx.APP_GET_METADATA,A=await this.atHandler.sendRaw(e);if(this.logger.debug("Metadata response: "+A),A.includes(ix.ERROR_PIN_REQUIRED))return this.logger.warn("PIN required/invalid for metadata"),null;if(A.includes(ix.ERROR_NO_DATA))return this.logger.warn("No data available from device"),this.datapoints=[],this.values=[],this.emit("metadata",[]),this.emit("error","No local data available from device"),[];if(A.includes(ix.OK)){let r=Ov(A);return this.logger.info("Parsed "+r.length+" datapoints"),this.datapoints=r,this.values=new Array(r.length).fill(""),this.emit("metadata",r),r}return A.includes(ix.ERROR)?(this.logger.error("Metadata fetch error: "+A),this.emit("error","Device returned error during metadata fetch"),[]):[]}async fetchValues(x){return this.readValues(e=>this.atHandler.sendRaw(e),x)}async readValues(x,e){try{this.logger.debug("Fetching values");let A=e?`${Hx.APP_GET_DATAVALUE}=${e}`:Hx.APP_GET_DATAVALUE,r=await x(A);if(r.includes(ix.OK)){let t=Nv(r);return this.logger.debug("Values: "+t.join(", ")),this.values=t,this.emit("values",t),this.emit("displayValues",Ks(this.datapoints,t)),t}return[]}catch(A){return this.logger.warn("Value fetch error: "+(A instanceof Error?A.message:String(A))),[]}}async checkMeasurementTriggerSupport(){this.logger.info("Checking measurement trigger support");try{let e=(await this.atHandler.sendRaw(Hx.APP_TRIG_MEASURE_TEST)).includes(ix.OK);return this.logger.info("Measurement trigger support: "+e),e}catch(x){if(x instanceof oe)throw x;return this.logger.warn("Measurement trigger probe failed: "+(x instanceof Error?x.message:String(x))),!1}}async triggerMeasurement(x={}){let{pin:e,timeoutMs:A=_v,signal:r}=x;return this.logger.info("Triggering measurement"),this.atHandler.withAtLock(async t=>{let s=await t.sendRaw(Hx.APP_TRIG_MEASURE);if(this.logger.debug("Trigger measurement response: "+s),!s.includes(ix.OK))return this.logger.warn("Measurement trigger rejected: "+s.trim()),{outcome:"rejected",values:[],response:s};this.emit("measurementTriggered");try{let i=await t.sendAndWait(null,ix.MEASURED,A,r);return this.emit("measurementCompleted"),{outcome:"measured",values:await this.readValues(c=>t.sendRaw(c),e),response:i}}catch(i){if(i instanceof oe)throw i;let v="timeout";return i instanceof ti?v="error":r?.aborted&&(v="aborted"),this.logger.warn(`Measurement ${v} while waiting for ${ix.MEASURED}: `+(i instanceof Error?i.message:String(i))),this.emit("measurementFailed",v),{outcome:v,values:[],response:s}}})}async startPolling(x,e=SD){if(this.polling){this.logger.warn("Polling already active \u2014 ignoring startPolling call");return}this.logger.info("Starting polling every "+e+" ms"),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.fetchPromise=this.fetchValues(x),await this.fetchPromise,this.fetchPromise=null,this.polling&&(this.pollTimer=setInterval(()=>{this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchValues(x).finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))},e))}async stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.polling&&(this.logger.info("Polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getSnapshot(){return{datapoints:[...this.datapoints],values:[...this.values],isPolling:this.polling}}getDisplayValues(){return Ks(this.datapoints,this.values)}dispose(){this.stopPolling(),this.datapoints=[],this.values=[],this.removeAllListeners()}};async function TD(x,e,A){let r=s=>{if(s instanceof oe)throw s},t=new Mv(x);try{let s=await x.queryMdnServerConfig(A).catch(b=>(r(b),!1)),i=await t.checkSupport().catch(b=>(r(b),{supported:!1,pinRequired:!1})),v=i.supported?await t.checkMeasurementTriggerSupport().catch(b=>(r(b),!1)):!1,c=i.supported?{pinRequired:i.pinRequired,canTriggerMeasurement:v}:!1,B=!1,p=!1;if(s){let[b,h]=await Promise.all([x.queryCompanionCertSupport(A).catch(w=>(r(w),!1)),e?.getCertificate(s)]);B=b,p=h!=null&&Ys(h.notAfter)}return{hostname:s,localData:c,secureConnection:B,validCert:p}}finally{t.dispose()}}var RD=require("events"),PD={0:"trigger",1:"wakeup",2:"online"},ID={0:["2G","","GSM"],1:["2G","Compact","GSM-COMPACT"],2:["3G","","UTRAN"],3:["2G","EDGE","GSM-EGPRS"],4:["3G","HSDPA","UTRAN-HSDPA"],5:["3G","HSUPA","UTRAN-HSUPA"],6:["3G","HSPA+","UTRAN-HSXPA"],7:["4G","","EUTRAN"],8:["4G","LTE-M","LTE-CATM1"],9:["4G","NB-IoT","LTE-CATNB1"],100:["WiFi","","WIFI"],101:["LAN","Ethernet","ETHERNET"],102:["Local","Wireless","WIRELESS"],103:["Local","Wired","WIRED"]},OD={"NO SCRIPT":"none","SCRIPT ERROR":"error","SCRIPT OK":"ok"},Yx={FAILED:1,ACTIVE:2,STARTED:4,RETRY:8,WAKEUPABLE:16,EXTSIM:32,DISABLED:64,WAKEUP:256,POSUPDATE_ACTIVE:512},ND=Yx.FAILED|Yx.ACTIVE|Yx.STARTED|Yx.RETRY|Yx.WAKEUPABLE|Yx.EXTSIM|Yx.DISABLED|Yx.WAKEUP|Yx.POSUPDATE_ACTIVE,c8=`${ix.RM2M_STATE}: `;function $v(x=0){let e=(x&Yx.WAKEUPABLE)!==0,A="offline",r=e;return x&Yx.POSUPDATE_ACTIVE?(A="locating",r=!1):x&Yx.RETRY?(A="retry",r=!1):x&Yx.STARTED?(A="dialing",r=!1):x&Yx.ACTIVE?(A="active",r=!1):x&Yx.FAILED?(A="failed",r=e):x&Yx.DISABLED&&(A="disabled",r=!1),{signal:A,simType:(x&Yx.EXTSIM)!==0?"external":"internal",wakeupable:r,unknownFlags:x&~ND}}function qD(x){if(x===void 0)return null;let e=parseInt(x,10);return isNaN(e)?x:PD[e]??x}function MD(x){if(x===void 0)return null;let e=parseInt(x,10);return isNaN(e)?null:ID[e]??["unknown",`itf#${x}`,`itf#${x}`]}function $D(x){if(x.length===0)return null;let e=x.join(",");return OD[e]??e}function Lv(x){let e=x.split(","),[A,r,t,s,...i]=e;if(!A||!/^-?\d+$/.test(A)||!r||!/^\d+$/.test(r))return null;let v=parseInt(r,10),c=MD(s),B=s!==void 0?parseInt(s,10):NaN;return{stamp:new Date,rssi:B>=101?null:parseInt(A,10),state:v,uplinkState:$v(v),uplinkMode:qD(t),uplinkInterface:c?c[0]:null,uplinkInterfaceExtended:c?c[1]:null,uplinkInterfaceTechnical:c?c[2]:null,scriptState:$D(i)}}function Gv(x){let e=x.indexOf(c8);if(e===-1)return null;let A=x.substring(e+c8.length),r=A.search(/\r?\n/);if(r===-1)return null;let t=A.substring(0,r).trim();return t?Lv(t):null}var LD=5e3,GD=class extends RD.EventEmitter{constructor(x,e=GA){super(),X(this,"atHandler"),X(this,"logger"),X(this,"lastState",null),X(this,"pollingTimer",null),X(this,"polling",!1),X(this,"fetchInProgress",!1),X(this,"fetchPromise",null),this.atHandler=x,this.logger=e}async fetchState(){try{let x=await this.atHandler.sendRaw(Hx.RM2M_STATE),e=Gv(x);return e?(this.lastState=e,this.emit("state",e),this.logger.debug("RM2M state fetched successfully")):this.logger.warn("Failed to parse RM2M state response"),e}catch(x){let e=x instanceof Error?x.message:String(x);return this.logger.error(`Failed to fetch RM2M state: ${e}`),this.emit("error",e),null}}startPolling(x=LD){if(this.polling){this.logger.debug("Polling already active, ignoring startPolling call");return}this.logger.info(`Starting RM2M state polling every ${x}ms`),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.runGuardedFetch(),this.pollingTimer=setInterval(()=>this.runGuardedFetch(),x)}runGuardedFetch(){this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchState().finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))}async stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),this.polling&&(this.logger.info("RM2M state polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getLastState(){return this.lastState?{...this.lastState,uplinkState:{...this.lastState.uplinkState}}:null}get isPolling(){return this.polling}dispose(){this.stopPolling(),this.lastState=null,this.removeAllListeners()}},UD=require("events"),Uv=class extends UD.EventEmitter{constructor(){super(...arguments),X(this,"serialNumber",""),X(this,"serverUrl",""),X(this,"deviceId",""),X(this,"rssi",null),X(this,"hasDebugSupport",!1),X(this,"connectionState","disconnected"),X(this,"connectionError",""),X(this,"mtuSize",23)}get isConnected(){return this.connectionState==="connected"}setConnected(x){this.serialNumber=x.serialNumber,this.deviceId=x.deviceId,this.serverUrl=x.serverUrl??this.serverUrl,this.hasDebugSupport=x.hasDebugSupport??!1,this.mtuSize=x.mtuSize??23,this.rssi=x.rssi??null,this.connectionState="connected",this.connectionError="",this.emit("connected",this.snapshot()),this.emit("stateChange",this.snapshot())}setDisconnected(){this.connectionState="disconnected",this.rssi=null,this.emit("disconnected"),this.emit("stateChange",this.snapshot())}setError(x){this.connectionError=x,this.connectionState="disconnected",this.emit("error",x),this.emit("stateChange",this.snapshot())}setConnectionState(x){this.connectionState=x,this.emit("stateChange",this.snapshot())}updateRssi(x){this.rssi=x,this.emit("rssiUpdate",x)}reset(){this.serialNumber="",this.serverUrl="",this.deviceId="",this.rssi=null,this.hasDebugSupport=!1,this.connectionState="disconnected",this.connectionError="",this.mtuSize=23,this.emit("reset"),this.emit("stateChange",this.snapshot())}snapshot(){return{serialNumber:this.serialNumber,serverUrl:this.serverUrl,deviceId:this.deviceId,rssi:this.rssi,hasDebugSupport:this.hasDebugSupport,connectionState:this.connectionState,connectionError:this.connectionError,mtuSize:this.mtuSize,isConnected:this.isConnected}}},HD=require("events"),Hv={maxDuration:6e4,initialDelay:1e3,maxDelay:1e4,maxGattRetries:3},KD=class extends HD.EventEmitter{constructor(x=yA,e){super(),X(this,"logger",x),X(this,"state"),X(this,"transports",null),X(this,"transportFactory",null),X(this,"disconnectFn",null),X(this,"reconnectOptions"),X(this,"reconnectAbortController",null),this.state=new Uv,this.reconnectOptions={...Hv,...e}}async connect(x,e,A){this.transportFactory=x,this.disconnectFn=e,this.state.setConnectionState("connecting");try{return this.transports=await x(),this.state.setConnected(A),this.logger.info(`Connected to device ${A.serialNumber}`),this.transports}catch(r){let t=r instanceof Error?r.message:String(r);throw this.state.setError(t),this.logger.error(`Connection failed: ${t}`),r}}async disconnect(){if(this.stopReconnect(),this.disconnectFn)try{await this.disconnectFn()}catch(x){this.logger.warn(`Disconnect error: ${x}`)}this.transports=null,this.state.setDisconnected(),this.logger.info("Disconnected from device")}async reconnect(){if(!this.transportFactory||!this.disconnectFn)return this.logger.error("Cannot reconnect: no transport factory"),!1;this.state.setConnectionState("reconnecting"),this.reconnectAbortController=new AbortController;let{signal:x}=this.reconnectAbortController,e=Date.now(),A=this.reconnectOptions.initialDelay;for(;Date.now()-e<this.reconnectOptions.maxDuration;){if(x.aborted||(this.logger.info(`Reconnecting in ${A}ms...`),await this.sleep(A,x),x.aborted))return!1;try{return this.transports=await this.transportFactory(),this.state.setConnectionState("connected"),this.state.connectionError="",this.logger.info("Reconnected successfully"),this.emit("reconnected"),!0}catch(r){this.logger.warn(`Reconnect attempt failed: ${r}`),A=Math.min(A*2,this.reconnectOptions.maxDelay)}}return this.state.setError("Reconnect timeout exceeded"),this.logger.error("Reconnect failed: timeout exceeded"),this.emit("reconnectFailed"),!1}stopReconnect(){this.reconnectAbortController?.abort(),this.reconnectAbortController=null}getTransports(){return this.transports}sleep(x,e){return new Promise(A=>{let r=setTimeout(A,x);e?.addEventListener("abort",()=>{clearTimeout(r),A()},{once:!0})})}},WD={configurationNumber:1,utoInterface:0,utoEndpoint:1,utoSize:64*1024,debugInterface:1,debugEndpoint:2,debugSize:1024},JD={service:"BC300000-0FA0-4ED4-860A-CF95434B5A4E",txCharacteristic:"BC30E1FF-0FA0-4ED4-860A-CF95434B5A4E",rxCharacteristic:"BC30E1FE-0FA0-4ED4-860A-CF95434B5A4E",txDebugCharacteristic:"BC30E201-0FA0-4ED4-860A-CF95434B5A4E",rxDebugCharacteristic:"BC30E200-0FA0-4ED4-860A-CF95434B5A4E"},zD=590,VD=3e4,M0=class extends Error{constructor(x){super(x),this.name="ApiBadRequestError"}},Oe=class extends Error{constructor(x){super(x),this.name="ApiNotFoundError"}},Fi=class extends Error{constructor(x){super(x),this.name="ApiForbiddenError"}},Ea=class extends Error{constructor(x){super(x),this.name="ApiMethodNotAllowedError"}};function Ne(x){try{return decodeURIComponent(x)}catch{throw new M0("malformed url encoding")}}var XD=2e3,YD=2136;function Ca(x){if(x.length===0)return!0;if(!/^\d{4,17}$/.test(x))return!1;let e=Number(x.slice(0,4));return e>=XD&&e<=YD}function yt(x){if(x)for(let e of["stamp","from","until"]){let A=x[e];if(typeof A=="string"&&!(e==="until"&&A==="*")&&!(e!=="stamp"&&A.trim().length===0)&&!Ca(A))throw new M0(`attribute '${e}' is not valid`)}}function QD(x){return typeof x.setMetadataValue=="function"?x:null}function ZD(x){return typeof x.insertUtoChangeRequests=="function"?x:null}function Ba(){return{lastIssuedStamp40:0,tagMutexTails:new Map}}async function x7(x){return{status:200,body:e7(x.ctx)}}function e7(x){if(!x.live)return x.siteInfo;let e=x.siteInfo.device;return{...x.siteInfo,device:{...e,con:{...e?.con,state:A7(x)}}}}function A7(x){try{return x.live?.state()==="live"?"connected":"disconnected"}catch(e){return x.logger?.warn("[localApi] live state lookup failed; serving con.state=disconnected",e),"disconnected"}}async function r7(x){let{blueprint:e}=x.ctx;if(!e)throw new Oe("blueprint unavailable");return{status:200,body:e}}async function t7(x){let{me:e}=x.ctx;if(e==null)throw new Oe("no profile stored");return{status:200,body:e}}function Kv(x,e,A,r){let t=x.push;t&&(async()=>{try{await t.container(e,A,r)}catch(s){x.logger?.error(`[localApi] device push for tag ${e} failed:`,s)}})()}async function n7(x,e,A){let r=x.push;if(!r)return null;try{return await r.adHocChangeRequest(e,A)}catch(t){return x.logger?.error(`[localApi] change request for tag ${e} failed:`,t),null}}var i7=1024;function xn(x){let e=x.indexOf(0),A=e<0?x:x.subarray(0,e);try{let r=new TextDecoder("utf-8").decode(A),t=JSON.parse(r);return typeof t!="object"||t===null||Array.isArray(t)?null:t}catch{return null}}function Wv(x,e=0){let A=new TextEncoder().encode(x),r=Math.max(i7,e,A.length+1),t=new Uint8Array(r);return t.set(A,0),t}var s7="device_id";function a7(x){return async e=>(await en(e),{status:200,body:await F7(e.ctx,x)})}async function en(x){let e=Ne(x.params[0]),A=await o7(x.ctx);if(!A||A.toLowerCase()!==e.toLowerCase())throw new Oe(`unknown device "${e}"`)}async function o7(x){return x.deviceId||x.siteInfo.device?.device_id||x.storage.getMetadataValue(s7)}async function F7(x,e){let A=await x.storage.getRowForTag(e);if(!A||!A.data)return{};let r=xn(A.data);return r?(typeof r.pipAppVer=="number"&&(r.pipAppVer=`${r.pipAppVer}.0.0`),r.stamp=Yr(W0.stamp40ToMS(Ie(A.stamp))),r):{}}function da(x,e,A){let t=(x.tagMutexTails.get(e)??Promise.resolve()).then(A);return x.tagMutexTails.set(e,t.catch(()=>{})),t}function v7(x){return async e=>{await en(e);let A=c7(e.request.body??null);if(!A)throw new M0("invalid or missing request body");return da(e.session,x,async()=>{let r=await e.ctx.storage.getRowForTag(x),t=r?.data?xn(r.data)??{}:{};return await ua(e.ctx,x,r,{...t,...A}),{status:204,body:""}})}}function f7(x){return async e=>(await en(e),da(e.session,x,async()=>{let A=await e.ctx.storage.getRowForTag(x);return!A||!A.data?{status:204,body:""}:(await ua(e.ctx,x,A,{}),{status:204,body:""})}))}function l7(x){return async e=>{await en(e);let A=Ne(e.params[1]);return da(e.session,x,async()=>{let r=await e.ctx.storage.getRowForTag(x);if(!r||!r.data)return{status:204,body:""};let t=xn(r.data)??{},s=A.toLowerCase();for(let i of Object.keys(t))i.toLowerCase()===s&&delete t[i];return await ua(e.ctx,x,r,t),{status:204,body:""}})}}function c7(x){if(!x)return null;let e;try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}async function ua(x,e,A,r){let t=Wv(JSON.stringify(r),A?.data?.length??0),s=W0.msToStamp40((x.timeSource??gt).nowMs());await x.storage.replaceUtoRow({tag:e,stamp:me(s),flags:A?.flags??0,site_related:A?.site_related??0,data:t}),Kv(x,e,t,s)}var vi=26432,Qr={aberrant:1,service:2,standby:4,commissioned:8,offline:16,commissioning:65536,online:131072},Jv=["preprovisioned","provisioned","claimed","fielded","discarded"];function E7(x){return typeof x=="string"&&Jv.includes(x)}var zv=Object.keys(Qr),An=["standby","commissioned","offline","commissioning","online"],Ws=An.reduce((x,e)=>x|Qr[e],0)>>>0;function Vv(x){let e=0;for(let A of zv)x[A]===!0&&(e|=Qr[A]);return e>>>0}function Da(x,e){let A={};for(let r of zv)x&Qr[r]?A[r]=!0:typeof e?.[r]=="boolean"&&(A[r]=!1);return A}function Xv(x,e,A){let r=x;for(let s of An){let i=e[s];typeof i=="boolean"&&(r=i?r|Qr[s]:r&~Qr[s])}if(r>>>=0,r===x)return null;let t=A();return{newFlags:r,entries:[{json:JSON.stringify({lifecycleFlags:{op:"&",val:~Ws>>>0}}),stamp40:t},{json:JSON.stringify({lifecycleFlags:{op:"|",val:r&Ws}}),stamp40:t+1}]}}async function Yv(x,e){let A=e.device;if(!A)return!1;let r=await x.getRowForTag(vi);if(!r?.data)return!1;let t=xn(r.data);if(!t)return!1;let s=!1;if(typeof t.lifecycleFlags=="number"){let i=Da(t.lifecycleFlags,A.lifecycle_flags);JSON.stringify(A.lifecycle_flags)!==JSON.stringify(i)&&(A.lifecycle_flags=i,s=!0)}return typeof t.lifecycleState=="string"&&A.lifecycle_state!==t.lifecycleState&&(A.lifecycle_state=t.lifecycleState,s=!0),s}var C7=new Set([...An,"service","lifecycle_state"]);function B7(x,e){let A=Math.max(W0.msToStamp40((x.timeSource??gt).nowMs()),e.lastIssuedStamp40+1);return e.lastIssuedStamp40=A+1,A}async function d7(x){return await en(x),Qv(x)}async function Qv(x){let e=b7(x.request.body??null);if(!e)throw new M0("invalid or missing request body");u7(e);let A=x.ctx,r=A.siteInfo.lifecycle_flags;if(!p7(r))throw new M0("this site does not support lifecycle flags!");let t=Vv(r),s=Xv(t,e,()=>B7(A,x.session));if(!s)return{status:204,body:""};let{newFlags:i,entries:v}=s,c=ZD(A.storage);return c&&await c.insertUtoChangeRequests(v.map(B=>({tag:vi,stamp40:B.stamp40,json:B.json}))),A.siteInfo.lifecycle_flags=Da(i,r),await Zv(A),D7(A,v),{status:204,body:""}}function u7(x){let e=[];for(let[A,r]of Object.entries(x))C7.has(A)?(A==="lifecycle_state"?typeof r!="string":typeof r!="boolean")&&e.push(`"${A}" is not valid`):e.push(`"${A}" is not an allowed lifecycle property`);if(e.length>0)throw new M0(`validation errors: ${e.join(", ")}`);if(Object.keys(x).some(A=>!An.includes(A)))throw new M0("invalid parameters")}async function D7(x,e){try{let A=await n7(x,vi,e);A==="executed"?await Yv(x.storage,x.siteInfo)&&await Zv(x):A!==null&&x.logger?.warn(`[localApi] lifecycle change request not applied by the device (outcome=${A})`)}catch(A){x.logger?.error("[localApi] lifecycle device-mirror refresh failed:",A)}}async function Zv(x){await QD(x.storage)?.setMetadataValue("site_info",JSON.stringify(x.siteInfo))}function p7(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}function b7(x){if(!x)return null;let e;try{e=JSON.parse(x)}catch{return null}return typeof e!="object"||e===null||Array.isArray(e)?null:e}async function m7(x){return await xf(x).go(),{status:204,body:""}}async function j7(x){return await xf(x).stop(),{status:204,body:""}}function xf(x){let{live:e}=x.ctx;if(!e)throw new Error("live mode not available");return e}function ef(x){if(x!=null){if(Array.isArray(x)&&x.every(e=>typeof e=="string"))return x;throw new M0('"select" must be an array')}}function h7(x){if(x!=null){if(Array.isArray(x)&&x.every(e=>typeof e=="string"))return x;throw new M0("invalid parameter, select must be an array")}}function g7(x,e){let A=new Map;if(e){for(let[r,t]of e)A.set(t,r);return A}for(let r of x?.fields??[]){if(UA(r))continue;let t=r.alias??r.name;A.set(t,t.toLowerCase())}return A}function y7(x){let e=new Map;for(let A of x.fields){if(UA(A))continue;let r=(A.alias??A.name).toLowerCase();e.set(A.name,r),A.alias&&e.set(A.alias,r)}return e}function k7(x){let e=new Set;for(let A of x.fields)UA(A)||e.add((A.alias??A.name).toLowerCase());return e.add("stamp"),e}function w7(x,e,A){if(!A)return null;let r=g7(x,e),t=new Set,s=[];for(let i of A){if(i==="stamp")continue;let v=r.get(i);v?t.add(v):s.push(i)}if(s.length>0)throw Af(s);return t}function _7(x,e){let A=y7(x),r=[],t=[],s=!1;for(let i of e){if(i==="stamp"){s=!0,r.push("stamp");continue}let v=A.get(i);v?r.push(v):t.push(i)}if(t.length>0)throw Af(t);return s||r.unshift("stamp"),r}function S7(x,e){if(e===void 0)return;let A=k7(x),r=e.map(s=>s.toLowerCase()),t=r.filter(s=>!A.has(s));if(t.length>0)throw new M0(`unknown field name(s): ${t.join(",")}`);return r.includes("stamp")?r:["stamp",...r]}function T7(x,e){if(!e)return x;let A={};for(let[r,t]of Object.entries(x))(r==="stamp"||e.has(r))&&(A[r]=t);return A}function pa(x,e){if(!e)return x;let A={};for(let r of e)A[r]=r in x?x[r]:null;return A}function Af(x){return new M0(`Fields [\`${x.join("`, `")}\`] do not exist in this container`)}function fi(x,e){return x.containers.find(A=>A.name===e||A.alias===e)??null}async function R7(x){let e=x.ctx,A=Ne(x.params[1]),r=fi(e.model,A);if(!r)throw new M0("container does not exist");let t=await e.mapper.readContainer(A);if(!t)throw new Oe(`no data for container "${A}"`);let s=I7(e,r,t,P7(x));return{status:200,body:rf(e,A,s)}}function P7(x){let e=x.query.json??{};return ef(e.select)}function I7(x,e,A,r){let t=w7(e,Zt(x.blueprint??null,e),r);return T7(A,t)}function rf(x,e,A){let r=x.model.byNameOrAlias(e);return r?mv(A,Zt(x.blueprint??null,r)):A}async function O7(x){let e=x.ctx,A=Ne(x.params[1]),r=e.model.byNameOrAlias(A);if(!r)throw new Oe(`unknown container "${A}"`);let t=await e.mapper.readContainer(A);if(!t)throw new Oe(`unknown container "${A}"`);let s=x.query.json??{},i=h7(s.select),v=S7(r,i);return{status:200,body:pa(t,v)}}async function N7(x){let e=Ne(x.params[1]);return tf(x,e,"canonical")}async function q7(x){let e=Ne(x.params[1]);if(!x.ctx.model.byNameOrAlias(e))throw new Oe(`unknown container "${e}"`);return tf(x,e,"legacy")}async function tf(x,e,A){let r=H7(x);if(!r)throw new M0("invalid or missing request body");yt(r);let{stamp:t,...s}=r;if(A==="canonical"&&t!==void 0&&typeof t!="string")throw new M0("value(s) of field(s) stamp are not valid");let i=x.ctx;if(A==="canonical"&&!fi(i.model,e))throw new M0("container does not exist");let v=i.model.byNameOrAlias(e);if(v?.kind==="histdata")throw new Oe(`unknown container "${e}"`);let c=A==="canonical"?L7(i,v,s):G7(v,s);try{let B=A==="canonical"&&t!==void 0?{...c,stamp:t}:c,p=await i.mapper.writeContainer(e,B);return p.devicePushable&&Kv(i,p.tag,p.data,p.stamp40),{status:204,body:""}}catch(B){throw M7(B,e,A,i,v)}}function M7(x,e,A,r,t){if(x instanceof Xt){let s=x.field?$7(r,t,x.field,A):void 0;return A==="canonical"?s?new M0(`no permission to modify container field \`${s}\``):new M0(`no permission to modify container \`${e}\``):s?new Fi(`unknown field name(s): ${s}`):new Ea(`no permission to modify '${e}'`)}return x}function $7(x,e,A,r){if(!e)return A;let t=e.fields.find(i=>i.name===A||i.name.toLowerCase()===A||(i.alias??i.name).toLowerCase()===A);return t?r==="legacy"?(t.alias??t.name).toLowerCase():Zt(x.blueprint??null,e)?.get(A)??t.alias??t.name:A}function L7(x,e,A){if(!e)return A;let r=Zt(x.blueprint??null,e),t=new Map;if(r)for(let[s,i]of r)t.set(i,s);else for(let s of e.fields){let i=s.alias??s.name;t.set(i,i.toLowerCase()),t.set(i.toLowerCase(),i.toLowerCase())}return nf(e,t,A,s=>new M0(`unknown field name(s): ${s}`))}function G7(x,e){if(!x)return e;let A=new Map;for(let r of x.fields){let t=r.alias??r.name;A.set(t.toLowerCase(),t.toLowerCase()),A.set(t,t.toLowerCase())}return nf(x,A,e,r=>new Fi(`unknown field name(s): ${r}`))}var U7=new Set(["stamp","stamp4","stamp8","datetime"]);function nf(x,e,A,r){let t=new Map(x.fields.map(c=>[(c.alias??c.name).toLowerCase(),c])),s={},i=[],v=[];for(let[c,B]of Object.entries(A)){let p=e.get(c);if(!p){i.push(c);continue}let b=t.get(p);if(b&&U7.has(b.type)&&!(typeof B=="string"&&Ca(B))){v.push(c);continue}s[p]=B}if(i.length>0)throw r(i.join(","));if(v.length>0)throw new M0(`value(s) of field(s) ${v.join(",")} are not valid`);return s}function H7(x){let e=x.query.json,A=e!=null&&typeof e=="object"&&!Array.isArray(e)?e:void 0,r=x.request.body;if(!r)return A?{...A}:null;let t=K7(r);if(t===void 0)throw new M0("request supplied data which is not json formatted");return typeof t!="object"||t===null||Array.isArray(t)?null:{...A,...t}}function K7(x){try{return JSON.parse(x)}catch{return}}var sf="x-mt-backfill",af="pending";async function ba(x,e,A){let r=x.push?.backfill;if(!(!r||e===void 0||e===null||A===null))try{return await r.call(x.push,{fromMs:A})==="pending"?{[sf]:af}:void 0}catch(t){x.logger?.error("[localApi] historic backfill check failed:",t);return}}function W7(x,e){if(!x.live)return;let A=x.model.byNameOrAlias(e)?.name??e;return x.live.latest(A)}async function ma(x,e,A,r){if(r.hasUpperBound||(r.offset??0)>0||r.order==="asc"&&A.length>=r.limit)return A;let t=W7(x,e);if(!t)return A;let s=J7(A,r.order);if(s!==null&&t.stampMs<=s)return A;let i=await x.mapper.projectRecord(e,{stamp40:t.stamp40,data:t.data},{select:r.select});if(r.order==="asc")return[...A,i];let v=[i,...A];return v.length<=r.limit?v:v.slice(0,r.limit)}async function of(x,e,A,r){return(await ma(x,e,A?[A]:[],{order:"desc",limit:1,select:r.select,hasUpperBound:r.hasUpperBound}))[0]??null}function J7(x,e){let A=e==="asc"?x[x.length-1]:x[0];return!A||typeof A.stamp!="string"?null:xt(A.stamp)}var z7=1e3,Hn=1e3,Ff="20000101",vf="*";async function V7(x){let e=x.query.json??{};Bf(e,["from","until","count","offset","select"]),yt(e);let A=x.ctx,r=Ne(x.params[1]),{mapperSelect:t,order:s}=lf(A,r,e.select);cf(A,r);let i=ni(e.from,Ff,"from"),v=ni(e.until,vf,"until");Ef(i,v),v!==null&&(v=Y7(v));let c=Q7(e.count),B=Cf(e.offset),p=await ba(A,e.from,i),b=await A.mapper.readTimeseries(r,{fromMs:i,untilMs:v,count:c,offset:B,select:t});return{status:200,body:(await ma(A,r,b,{order:c<0?"desc":"asc",limit:Math.abs(c),select:t,hasUpperBound:v!==null,offset:B})).map(w=>ff(x,A,r,pa(w,s))),headers:p}}async function X7(x){let e=x.query.json??{};Bf(e,["from","until","offset","select"]),yt(e);let A=x.ctx,r=Ne(x.params[1]),t=x.params[2],{mapperSelect:s,order:i}=lf(A,r,e.select);cf(A,r);let v=ni(e.from,Ff,"from"),c=ni(e.until,vf,"until");Ef(v,c);let B=Cf(e.offset),p=await ba(A,e.from,v),b=await A.mapper.readTimeseries(r,{fromMs:v,untilMs:c,count:t==="youngest"?-1:1,offset:B,select:s}),h=t==="youngest"&&B===0?await of(A,r,b[0]??null,{select:s,hasUpperBound:c!==null}):b[0];return h?{status:200,body:ff(x,A,r,pa(h,i)),headers:p}:{status:204,body:JSON.stringify("no timeseries recordData found"),headers:p}}function ff(x,e,A,r){return x.apiVersion==="1"?r:rf(e,A,r)}function lf(x,e,A){let r=ef(A);if(!r)return{mapperSelect:void 0,order:null};let t=fi(x.model,e);if(!t)return{mapperSelect:r,order:null};let s=_7(t,r),i=s.filter(v=>v!=="stamp");return{mapperSelect:i.length>0?i:void 0,order:s}}function cf(x,e){if(!fi(x.model,e))throw new M0("timeseries does not exist")}function ni(x,e,A){let t=x==null||typeof x=="string"&&x.trim()===""?e:String(x);if(t==="*")return null;try{return xt(t)}catch{throw new M0(`attribute '${A}' is not valid`)}}function Ef(x,e){if(x!==null&&e!==null&&x>e)throw new M0('E_BAD_REQUEST "from" value must be older than "until"')}function Y7(x){let e=W0.msToStamp40(x);return W0.stamp40ToMS(e)>=x&&(e-=1),W0.stamp40ToMS(e)}function Q7(x){if(x==null||x==="")return z7;let e=Number(x);if(!Number.isInteger(e))throw new M0('"count" must be an integer');if(e===0)throw new M0("`count` cannot be 0");if(e<-Hn)throw new M0(`"count" must be greater than or equal to -${Hn}`);if(e>Hn)throw new M0(`"count" must be less than or equal to ${Hn}`);return e}function Cf(x){if(x==null||x==="")return 0;let e=Number(x);if(!Number.isInteger(e))throw new M0('"offset" must be an integer');if(e<0)throw new M0('"offset" must be greater than or equal to 0');return e}function Bf(x,e){for(let A of Object.keys(x))if(!e.includes(A))throw new M0(`"${A}" is not allowed`)}var Z7=1e5,x6="20000101",e6="*";async function A6(x){let A=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.ctx,t=r.model.byNameOrAlias(A);if(!t)throw new Oe(`unknown container "${A}"`);let s=x.query.json??{};yt(s);let{fromMs:i,untilMs:v}=n6(s);i6(i,v);let c=s6(s),B=a6(s),p=df(t,s.select)??["stamp"],b=ii(s.from)?await ba(r,s.from,i):void 0,h=p.filter(N=>N!=="stamp"),w=h.length>0?h:void 0,k=await r.mapper.readTimeseries(A,{fromMs:i,untilMs:v,count:c,offset:B,select:w});return{status:200,body:(await ma(r,A,k,{order:c<0?"desc":"asc",limit:Math.abs(c),select:w,hasUpperBound:v!==null,offset:B})).map(N=>p.map(O=>O==="stamp"?N.stamp:N[O]??null)),headers:b}}async function r6(x){let A=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.params[2],t=x.ctx,s=t.model.byNameOrAlias(A);if(!s)throw new Oe(`unknown container "${A}"`);let i=x.query.json??{};yt(i);let v=df(s,i.select)??["stamp"],c=t6(i),B=v.filter(w=>w!=="stamp"),p=B.length>0?B:void 0,b=await t.mapper.readTimeseries(A,{fromMs:null,untilMs:c??null,count:c!==void 0||r==="youngest"?-1:1,select:p}),h=r==="youngest"?await of(t,A,b[0]??null,{select:p,hasUpperBound:c!==void 0}):b[0];return h?{status:200,body:[v.map(w=>w==="stamp"?h.stamp:h[w]??null)]}:{status:200,body:[]}}function t6(x){if(!(!ii(x.until)||x.until==="*"))try{return xt(String(x.until))??void 0}catch{throw new M0("from or until value invalid")}}function n6(x){let e=ii(x.from),A=ii(x.until);if((!e||!A)&&!ja(x.count))throw new M0("missing or invalid parameters (from and until and/or count)");return{fromMs:E8(e?x.from:x6),untilMs:E8(A?x.until:e6)}}function i6(x,e){if(x!==null&&e!==null&&x>e)throw new M0('"from" value must be older than "until"')}function E8(x){let e=String(x);try{return xt(e)}catch{throw new M0(`invalid stamp "${e}"`)}}function s6(x){if(!ja(x.count))return Z7;if(typeof x.count!="number")throw new M0("invalid parameter count");return x.count}function a6(x){let e=x.offset;if(e==null||e==="")return 0;if(typeof e!="number"||e<0)throw new M0("invalid parameter offset");return e}function df(x,e){if(e==null)return;if(!Array.isArray(e))throw new M0("invalid parameter, select must be an array");let A=e.map(v=>String(v).toLowerCase()),r=A.filter(v=>v.includes(" "));if(r.length>0)throw new M0(`aggregation suffix not allowed: ${r.join(",")}`);let t=A.includes("stamp")?A:["stamp",...A],s=new Set(x.fields.filter(v=>!UA(v)).map(v=>(v.alias??v.name).toLowerCase()));s.add("stamp");let i=t.filter(v=>!s.has(v));if(i.length>0)throw new M0(`invalid channel(s) ${i.join(",")}`);return t}function ja(x){return!!x}function ii(x){return typeof x=="string"?x.trim().length>0:ja(x)}var uf={"content-type":"application/json"},o6=[{method:"GET",pattern:/^\/api\/1\/me$/,handler:t7,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)$/,handler:x7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/blueprint$/,handler:r7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-set-lifecycle$/,handler:Qv,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-livemode-go$/,handler:m7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-livemode-stop$/,handler:j7,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/devices\/([^/]+)\/cn-set-lifecycle$/,handler:d7,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)\/(oldest|youngest)$/,handler:X7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)$/,handler:V7,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:R7,checksUid:!0},{method:"PUT",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:N7,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?\/(oldest|youngest)$/,handler:r6,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?$/,handler:A6,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:O7,checksUid:!0},{method:"PUT",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:q7,checksUid:!0},...F6()];function F6(){let x={"sys-otp":26432,"sys-flash":26433,"app-otp":26434,"app-flash":26435,"app-state":26436,"sys-info":26437,"app-info":26438},e={"sys-flash":26433,"app-flash":26435},A=Object.entries(x).map(([t,s])=>({method:"GET",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:a7(s),checksUid:!1})),r=Object.entries(e).flatMap(([t,s])=>[{method:"PUT",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:v7(s),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:f7(s),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}/([^/]+)$`),handler:l7(s),checksUid:!1}]);return[...A,...r]}var v6=/^\/api\/([12])\/customers\/([^/]+)\/sites\/(.*)$/;function f6(x){let e=Ba();return A=>Df(x,A,e)}async function Df(x,e,A=Ba()){try{let[r,t]=E6(e.path),s=C6(t),i=c6(r,x);if(i===null)return Xr(404,"E_NOT_FOUND","unknown customer");let v=e.method.toUpperCase();for(let c of o6){if(c.method!==v)continue;let B=c.pattern.exec(i);if(!B)continue;let p=B.slice(1);if(c.checksUid&&!l6(x,p[0]))return Xr(404,"E_NOT_FOUND","unknown site");let b=/^\/api\/([12])\//.exec(i)?.[1]??"1",h=await c.handler({request:e,params:p,query:s,ctx:x,session:A,apiVersion:b});return u6(h)}return Xr(404,"E_NOT_FOUND","not found")}catch(r){return bf(r)}}function l6(x,e){return x.allowAnySiteUid===!0||e!==void 0&&Ne(e)===x.siteUid}function c6(x,e){let A=v6.exec(x);if(!A)return x;let r=Ne(A[2]).toLowerCase();return(e.siteInfo.customer_id??"").toLowerCase()===r||(e.siteInfo.customer_uid??"").toLowerCase()===r?`/api/${A[1]}/sites/${A[3]}`:null}function E6(x){let e=x.indexOf("?");return e<0?[x,""]:[x.slice(0,e),x.slice(e+1)]}function C6(x){let e={params:{}};if(!x)return e;for(let A of x.split("&"))A&&B6(e,A);return e}function B6(x,e){let A=e.indexOf("="),r=Ne(A<0?e:e.slice(0,A)),t=A<0?"":Ne(e.slice(A+1));r==="json"?x.json=d6(t):x.params[r]=t}function d6(x){try{return JSON.parse(x)}catch{throw new M0("request supplied data which is not json formatted ")}}function u6(x){let e=typeof x.body=="string"?x.body:JSON.stringify(x.body);return{status:x.status,headers:{...uf,...x.headers},body:e}}function pf(x,e){return{status:x,headers:{...uf},body:JSON.stringify(e)}}function bf(x){return x instanceof M0||x instanceof la||x instanceof ta?Xr(400,"E_BAD_REQUEST",x.message):x instanceof Fi||x instanceof Xt?Xr(403,"E_FORBIDDEN",x.message):x instanceof Ea?Xr(405,"E_METHOD_NOT_ALLOWED",x.message):x instanceof Oe||x instanceof LA?Xr(404,"E_NOT_FOUND",x.message):pf(500,{err:x instanceof Error?x.message:String(x)})}function Xr(x,e,A){return pf(x,{err:`${e} ${A}`})}function D6(x,e={}){let A=e.logger??GA;return{go:async()=>{x.start().catch(r=>{A.warn("[localApi] detached live-mode start failed",r)})},stop:async()=>x.stop(),state:()=>x.state,latest:r=>x.latest(r)}}var mf="histdata_backfill_floor",jf=2e3,hf=15e3;function gf(x,e){let A=x.storage,r=x.logger??GA,t=x.timeSource??gt,s=x.tag??26623,i=x.metadataKey??mf,v=x.graceWaitMs??jf,c=x.failureCooldownMs??hf,B=null,p=0,b=!1,h=!1,w=Promise.resolve();async function k(){let L=await A.getMetadataValue(i);if(L===null)return null;let U=Number(L);return Number.isFinite(U)?U:null}function P(L){return w=w.then(async()=>{let U=await k();U!==null&&U<=L||await A.setMetadataValue?.(i,String(L))}),w}async function R(){let L=await k();if(L!==null)return L;let[U]=await A.getHistoricRows(s,{order:"asc",limit:1});return U?Ie(U.stamp):null}async function N(L){let U=await R();return U===null||L<U}function O(){return typeof A.setMetadataValue=="function"?!0:(h||(h=!0,r.warn("[localApi] historic backfill disabled: storage has no setMetadataValue")),!1)}function W(L){let U=!1,r0=!1,Q=null,x0=[],f0=async a0=>{try{await a0()}catch(c0){r.warn("[localApi] historic backfill cancel hook failed:",c0)}};return{api:{from40:L,anchor40:Math.max(0,L-1),cancelled:()=>U,onCancel:a0=>{if(U){f0(a0);return}x0.push(a0)},persist:async a0=>{U||(r0=!0,await A.insertHistoricRows(a0))}},snapshot:async()=>{Q=await R()},persisted:()=>r0,startBefore:()=>Q,cancel:async()=>{if(U)return;U=!0;let a0=r0?P(Q??W0.msToStamp40(t.nowMs())):Promise.resolve();await Promise.all([a0,...x0.splice(0).map(f0)])}}}async function s0(L){L.persisted()&&await P(L.startBefore()??W0.msToStamp40(t.nowMs()))}function M(L){let U=W(L),r0=Promise.resolve().then(async()=>(await U.snapshot(),e.fetch(U.api))).then(async Q=>{if(Q==="completed"&&!U.api.cancelled()){await P(L);return}Q!=="skipped"&&await s0(U)}).catch(async Q=>{U.api.cancelled()?r.debug("[localApi] historic backfill abandoned after cancel:",Q):(r.error("[localApi] historic backfill failed:",Q),p=t.nowMs()+c),await s0(U)}).finally(()=>{B?.promise===r0&&(B=null)});return B={from40:L,promise:r0,run:U},r0}function y(L){return B?B.from40<=L?B:"pending":null}async function G(L){let U,r0=await Promise.race([L.then(()=>"ready"),new Promise(Q=>{U=setTimeout(()=>Q("pending"),v)})]);return clearTimeout(U),r0}async function V(L){return L==="pending"?"pending":G(L.promise)}async function Y(L){try{if(b||!O())return"ready";let U=Math.max(0,W0.msToStamp40(L));if(!await N(U))return"ready";let r0=y(U);if(r0)return await V(r0);if(t.nowMs()<p||e.canFetch&&!await e.canFetch()||b)return"ready";let Q=y(U);return Q?await V(Q):await G(M(U))}catch(U){return r.error("[localApi] historic backfill check failed:",U),"ready"}}return{ensureRange:Y,cancel:async()=>{b=!0;let L=B;L&&(B=null,r.info("[localApi] cancelling historic backfill: the device link is needed elsewhere"),await L.run.cancel())},resume:()=>{b=!1},reset:()=>{B?.run.cancel(),B=null,p=0,b=!1,h=!1}}}var yf=1e4,kf=500;function p6(x,e,A,r){return{tag:e,stamp:me(x.stamp40),flags:A,site_related:r,data:x.data}}function b6(x){let{hooks:e,storage:A}=x,r=x.logger??GA,t=x.tag??26623,s=x.idleTimeoutMs??yf,i=x.flushSize??kf;async function v(p,b){let h=await A.getRowForTag(t),w=h?.flags??0,k=h?.site_related??0;if(p.cancelled())return"aborted";let P=new Promise(s0=>p.onCancel(()=>s0())),R=b.utoMaster.requestHistoricUtos(t,p.anchor40,void 0,s,i,async s0=>p.persist(s0.map(M=>p6(M,t,w,k))));if(await Promise.race([R.then(()=>!0),P.then(()=>!1)]))return"completed";let O=R.then(()=>{},s0=>r.debug("[localApi] abandoned historic stream settled:",s0)),W;return await Promise.race([O,new Promise(s0=>{W=setTimeout(s0,s)})]),clearTimeout(W),"aborted"}async function c(p){if(p.cancelled())return"aborted";if(!await e.canFetch())return"skipped";if(p.cancelled())return"aborted";let b=e.openSession(),h=null,w=()=>(h??(h=b.then(P=>P?.close(),()=>{})),h);p.onCancel(w);let k=await b;if(!k)return"skipped";if(p.cancelled())return"aborted";try{return await v(p,k)}finally{await w().catch(P=>r.warn("[localApi] historic backfill session close failed:",P))}}let B=gf(x,{canFetch:()=>e.canFetch(),fetch:p=>e.runDeviceWork(()=>c(p))});return{...B,backfill:p=>B.ensureRange(p.fromMs)}}function m6(x,e){let A=e.apmId??"local",r=e.version??1;return{uid:e.siteUid,name:e.name??e.siteUid,customer_id:A,customer_uid:A,app:{apmid:A,version:String(r)},device:{device_id:e.deviceId,lifecycle_flags:{}},lifecycle_flags:{},containers:x.containers.map(t=>({name:t.name,alias:t.alias??t.name,kind:t.kind}))}}var wf=4;function _f(x){if(!x.data||x.data.byteLength!==wf)return null;let e=new DataView(x.data.buffer,x.data.byteOffset,x.data.byteLength);return{stamp40:x.stamp40,stampMs:W0.stamp40ToMS(x.stamp40),code:e.getInt16(0,!1),param:e.getInt16(2,!1)}}function Sf(x){let e=[];for(let A of x){let r=_f(A);r&&e.push(r)}return e}var ha=[["1000","","POWER ON","","8080FF",""],["1001","0","POST","OK","88FF88",""],["1001","1","POST","ERROR 1WIRE","FF8888",""],["1001","2","POST","ERROR SUPPLY","FF8888",""],["1001","3","POST","ERROR EXTVOLTAGE","FF8888",""],["1001","4","POST","ERROR IDLE_CURR","FF8888",""],["1001","5","POST","ERROR LED_CURR","FF8888",""],["1001","6","POST","ERROR XFLASH","FF8888",""],["1001","7","POST","ERROR BURST_CURR","FF8888",""],["1001","8","POST","ERROR PIN_CURR","FF8888",""],["1001","9","POST","ERROR KEY_CURR","FF8888",""],["1001","10","POST","ERROR KEY","FF8888",""],["1001","11","POST","ERROR MODEM_CURR","FF8888",""],["1002","","EXCESSIVE POWER ON","","FFFF80","10 Power ONs in the last 30 minutes!"],["1003","","INVALID RTC TIMESTAMP","","FFFF80","RTC not initialized on power ON!"],["1010","","CYCLIC RESET","","FF8080","Internal fault! Contact your support engineer!"],["1011","","BSL RESET","","C0C0C0",""],["1012","","USER RESET","","C0C0C0",""],["1013","","IO RESET","","FF8080",""],["1020","","ERROR SOD","","FF8080","Internal fault!"],["1021","","OVT SHUTDOWN","","FF8080","overtemperature shutdown!"],["1030","","UV LOCKOUT","","FF8080",""],["1031","","UV RECOVER","","FFFF80",""],["1032","","OSC FAULT","","FF8080","Oscillator fault!"],["1033","","MODEM UPDATE","","C0C0C0","Modem updated!"],["1034","","CONTROLLER UPDATE","","C0C0C0","Controller updated!"],["1035","","EXCEPTION","","FF8080","Exception occured!"],["1036","","EXCEPTION ADDR 1","$x1 $x2","","Exception at address $x1 $x2!",1],["1037","","EXCEPTION ADDR 2","$x1 $x2","","Return address for last function call before exception!",1],["1038","","UV MODEM LOCKOUT","","FF8080",""],["1039","","UV MODEM RECOVER","","FFFF80",""],["1040","","SYSTEM ERROR","","FF8080",""],["1041","0","UPLINK INTERFACE","NONE","",""],["1041","1","UPLINK INTERFACE","MODEM","",""],["1041","2","UPLINK INTERFACE","WIFI","",""],["1041","3","UPLINK INTERFACE","LAN","",""],["1041","","UPLINK INTERFACE","","",""],["1042","","FORCED SHUTDOWN","","C0C0C0",""],["1043","","SYSTEM FILE UPDATE","","C0C0C0",""],["1044","","SYSTEM FILE DOWNLOAD ERROR","","FFFF80",""],["1045","","SYSTEM FILE UPDATE ERROR","","FF8080",""],["1046","0","CONTROLLER UPDATE ERROR","CRC","FF8080","The CRC of the firmware pack couldn`t be verified"],["1046","1","CONTROLLER UPDATE ERROR","SIGNATURE","FF8080","The signature of the firmware pack couldn`t be verified"],["1046","2","CONTROLLER UPDATE ERROR","TLV","FF8080","The data structure of the firmware pack is invalid"],["1046","3","CONTROLLER UPDATE ERROR","FW INFO","FF8080","The firmware pack is not suitable for this device"],["1046","4","CONTROLLER UPDATE ERROR","MIN VERSION","FF8080","The version of the firmware package is below the minimum version stored in the firmware currently installed on the device"],["1046","","CONTROLLER UPDATE ERROR","","FF8080","Error updating the firmware of the controller"],["1047","-2","RADIO FW UPDATE ERROR","WRONG INFO TAG","FF8080","Error updating radio module!"],["1047","-3","RADIO FW UPDATE ERROR","DOWNGRADE NOT ALLOWED","FF8080","Error updating radio module!"],["1047","-4","RADIO FW UPDATE ERROR","SAME VERSION","FF8080","Error updating radio module!"],["1047","-5","RADIO FW UPDATE ERROR","INCORRECT INFO STRING","FF8080","Error updating radio module!"],["1047","-6","RADIO FW UPDATE ERROR","CRC","FF8080","Error updating radio module!"],["1047","-7","RADIO FW UPDATE ERROR","BIN TAG","FF8080","Error updating radio module!"],["1047","","RADIO FW UPDATE ERROR","","FF8080","Error updating radio module!"],["1100","","BUTTON","","C0C0C0","user action"],["1110","","ALOHA START","","C0C0FF",""],["1111","","ALOHA STOP","","",""],["1112","","WAKEUP","","C0C0FF",""],["1113","","BACKUP CONNECTION","","FFFF80",""],["1114","","BACKUP SUPPLY","","FFFF80",""],["1120","","TRANSPORT MODE","","C0C0FF",""],["1126","","MODEM COPS MODE","","FFFF80","The modem has changed the mode for the operator selection. Contact the manufacturer if the device log includes this error several times"],["1130","","LOG ENTRY DELETED","","C0C0C0",""],["1140","","RECORD DELETED","","C0C0C0",""],["1141","","RECORD2 DELETED","","C0C0C0",""],["1142","","DAT ENTRY FAILED","","FF8080",""],["1145","","ALARM ENTRY DELETED","","C0C0C0",""],["1150","","SAMPLE HOLD","","",""],["1160","","FILE INTEGRITY","","FF8080","Internal fault!"],["1161","","LOG REFORMATFILE","","FF8080","Reformat (leads to data loss)"],["1162","0","FLFILE ERROR","WRITING PROPS FILE","FF8080",""],["1162","1","FLFILE ERROR","WRITING FILE","FF8080",""],["1163","0","FLSTOR ERROR","OPENING/CREATING FILE","FF8080",""],["1163","1","FLSTOR ERROR","CREATING FOLDER","FF8080",""],["1163","2","FLSTOR ERROR","DELETING FILE","FF8080",""],["1163","3","FLSTOR ERROR","WRITING FILE","FF8080",""],["1170","","EXT FLASH DEF","","FF8080","Internal fault!"],["1171","","AD RECOMPACT","","","Recompact A&D Flash"],["1180","","INCREASE ITV","","",""],["1181","","TIME OFFSET","","C0C0C0",""],["1182","","RTC ERROR","","FF8080","Error writing time"],["1190","","DP INVALID","","FF8080","Internal fault!"],["1191","","IP ADDRESS MISMATCH","","FFFF80","IP address configuration is not valid!"],["1192","","FUTURE TIMESTAMP","","FFFF80","Timestamp in the future detected!"],["1193","","UTO CONTEXT RESTORED","","C0C0C0","Uto context was restored!"],["1194","","RTC TIME SET BY DLO","","","System time was manually set by application script"],["1195","","RTC TIME SET BY SERVER","","","Manually set system time replaced by server time"],["1196","","RTC TIME INVALID","","FFFF80","System time may be invalid"],["1200","-1000","GPRS ERROR","-1000","FFFF80","Check the provider settings.|Eventually try to connect later again."],["1200","-999","SIM PIN NO ATTEMPT","-999","FFFF80","Activate the SIM using an unlocked mobile phone. Hold the PUK ready."],["1200","-998","SIM ERROR","-998","FFFF80","Try the SIM in an unlocked mobile phone.|Clean the SIM contact layer.|Replace the SIM if necessary."],["1200","-997","CMD UNKNOWN","-997","FF8080","Internal fault!"],["1200","-996","CMD STATE NOINIT NOT ALLOWED","-996","FF8080","Internal fault!"],["1200","-995","CMD STATE CON NOT ALLOWED","-995","FF8080","Internal fault!"],["1200","-994","CMD STATE DISC NOT ALLOWED","-994","FF8080","Internal fault!"],["1200","-993","BEARER LINE BUSY","-993","FFFF80","Try to connect later again."],["1200","-992","BEARER NO ANSWER","-992","FFFF80","Try to connect later again.|Eventually contact the network provider support."],["1200","-991","BEARER NO CARRIER","-991","FFFF80","Try to connect later again.|Eventually contact the network provider support."],["1200","-990","BEARER NO SIM","-990","FFFF80","Check the SIM card."],["1200","-989","BEARER PIN NOT READY","-989","FFFF80","Check the PIN setting.|Eventually check the SIM using an unlocked mobile phone. Keep the PUK ready."],["1200","-988","BEARER GPRS FAILED","-988","FFFF80","Try to improve the antenna position.|Check the provider settings!|Check the GPRS capability with MMS or internet on your mobile phone.|Eventually ask the SIM provider support whether the GPRS service is blocked."],["1200","-987","BEARER PPP LCP FAILED","-987","FF8080","Internal fault!"],["1200","-986","BEARER PPP AUTH FAILED","-986","FF8080","Internal fault!"],["1200","-985","BEARER PPP IPCP FAILED","-985","FF8080","Internal fault!"],["1200","-984","BEARER PPP LINK FAILED","-984","FF8080","Internal fault!"],["1200","-983","BEARER PPP TERM REQ","-983","FF8080","Internal fault!"],["1200","-982","BEARER CALL REFUSED","-982","FFFF80","Try to connection later again."],["1200","-981","BEARER UNKNOWN","-981","FFFF80","Check the provider settings.|Eventually try to connect later again."],["1200","-980","BEARER BAD HDL","-980","FF8080","Internal fault!"],["1200","-979","BEARER BAD STATE","-979","FF8080","Internal fault!"],["1200","-978","BEARER DEV","-978","FF8080","Internal fault!"],["1200","-977","BEARER GPRS START UNKNOWN","-977","FFFF80","Internal fault!"],["1200","-976","BEARER GPRS STOP BAD HDL","-976","FF8080","Internal fault!"],["1200","-975","BEARER GPRS STOP UNKNOWN","-975","FFFF80","Internal fault!"],["1200","-974","USB START","-974","",""],["1200","-973","USB STOP","-973","",""],["1200","-972","FW DLD","-972","C0C0C0",""],["1200","-971","NO PROVIDER","-971","FFFF80","Try to improve the antenna position.|Eventually contact the network provider support."],["1200","-970","NETLOCK FAILURE","-970","FFFF80","Check the netlock setting and eventually remove the netlock.|Eventually contact the network provider support for existing partner networks."],["1200","-969","BAND SEL FAILED","-969","FFFF80","Try to improve the antenna position."],["1200","-968","SIM PIN WRONG","-968","FFFF80","Check the PIN setting."],["1200","-967","SIM NO PIN","-967","FFFF80","Check the PIN setting."],["1200","-966","NETLOCK ERROR","-966","FFFF80","Check the netlock setting.|Eventually remove the netlock."],["1200","-965","CHANNEL ABORTED","-965","FFFF80","Try to connect later again."],["1200","-964","CHANNEL CSTATE","-964","FFFF80","Try to connect later again."],["1200","-963","CHANNEL NOT SUPPORTED","-963","FFFF80","Try to connect later again."],["1200","-962","CHANNEL OUT OF RANGE","-962","FFFF80","Try to connect later again."],["1200","-961","CHANNEL MEMORY","-961","FF8080","Internal fault!"],["1200","-960","CHANNEL INTERNAL","-960","FF8080","Internal fault!"],["1200","-959","CHANNEL INVALID","-959","FF8080","Internal fault!"],["1200","-958","TCP DNS FAILURE","-958","FFFF80","Check the IP address setting."],["1200","-957","CHANNEL RESOURCES","-957","FFFF80","Try to connect later again."],["1200","-956","CHANNEL PORT IN USE","-956","FFFF80","Try to connect later again."],["1200","-955","CHANNEL REFUSED","-955","FFFF80","Try to connect later again.|Check the provider settings."],["1200","-954","CHANNEL HOST UNREACHABLE","-954","FFFF80","Try to connect later again."],["1200","-953","CHANNEL NETWORK UNREACHABLE","-953","FFFF80","Try to connect later again."],["1200","-952","CHANNEL PIPE BROKEN","-952","FFFF80","Try to connect later again."],["1200","-951","CHANNEL TIMEOUT","-951","FFFF80","Try to connect later again."],["1200","-950","CHANNEL UNKNOWN","-950","FF8080","Internal fault!"],["1200","-949","NETWORK LOST","-949","FFFF80","Try to connect later again.|Eventually try to improve the antenna position."],["1200","-948","MODEM UNS RESTART","","FF8080","Modem unsolicited restart! Contact your support engineer!"],["1200","-947","MODEM INIT ERROR","","FF8080","Modem initialization! Contact your support engineer!"],["1200","-946","MODEM TIMEOUT","","FFFF80","Modem communication timeout. Try to connect later again."],["1200","-945","MODEM AT SEND ERROR","","FFFF80","Error sending AT command. Contact your support engineer!"],["1200","-944","MODEM EXITONLINE ERROR","","FFFF80","Error leaving modem onlinemode. Contact your support engineer!"],["1200","-943","MODEM POSITION UPDATE ERROR","","FFFF80","Error processing position update. Contact your support engineer!"],["1200","-942","MODEM TCP IO STALL","","FF8080","Error during online connection. Contact your support engineer!"],["1200","-941","MODEM NETINFO STALL","","FF8080","Error detected during online connection. Contact the manufacturer if the device log includes this error several times"],["1200","-940","MODEM RESETLOOP","","FF8080","Restart loop on modem detected. Contact the manufacturer if the device log includes this error several times"],["1200","-939","MODEM UNDERVOLTAGE","","FF8080","Undervoltage on the modem detected. The power supply should be checked."],["1200","-938","MODEM OVERHEAT","","FF8080","Overheating of the modem detected."],["1200","","MODEM ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1201","","MODEM NOT FOUND","","FF8080",""],["1202","","MODEM CMME ERROR","","","GPRS-Modem reported +CMME ERROR"],["1203","","SELECTED NETWORK","MCC=$1 MNC=$2","","selected network MCC=$1 MNC=$2",1],["1204","","BANNED NETWORK","MCC=$1 MNC=$2","","banned network MCC=$1 MNC=$2",1],["1205","","BAN LIST CLEARED","","",""],["1206","","SIGNAL QUALITY","","",""],["1207","0","NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1207","1","NETWORK REGISTRATION","HOME","","registered, home network"],["1207","2","NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1207","3","NETWORK REGISTRATION","DENIED","","registration denied"],["1207","4","NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1207","5","NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1207","","NETWORK REGISTRATION","","",""],["1208","0","GPRS NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1208","1","GPRS NETWORK REGISTRATION","HOME","","registered, home network"],["1208","2","GPRS NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1208","3","GPRS NETWORK REGISTRATION","DENIED","","registration denied"],["1208","4","GPRS NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1208","5","GPRS NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1208","","GPRS NETWORK REGISTRATION","","",""],["1209","1","TCP CLOSED","FIN","","regular remote disconnection from server"],["1209","2","TCP CLOSED","RST","","irregular remote disconnection from server"],["1209","3","TCP CLOSED","TIMEOUT","","socket inactivity timeout"],["1209","4","TCP CLOSED","PDP CTX","","network deactivation (PDP context)"],["1209","","TCP CLOSED","","",""],["1210","","MODEM REGULAR ON","","",""],["1211","","MODEM REGULAR OFF","","",""],["1212","","ERROR MODEM IRREGULAR OFF","","FFFF80",""],["1213","","MODEM REGULAR DISCON","","",""],["1214","","MODEM REQUEST DISCON","","",""],["1215","","MODEM TESTMODE ON","","C0C0C0",""],["1216","","MODEM TESTMODE OFF","","",""],["1217","","MODEM TESTMODE IRREGULAR OFF","","FFFF80",""],["1218","","MODEM TESTMODE ERROR","","FF8080",""],["1219","0","LTE NETWORK REGISTRATION","NOT REGISTERED","","not registered, modem is not currently searching a new operator to register to"],["1219","1","LTE NETWORK REGISTRATION","HOME","","registered, home network"],["1219","2","LTE NETWORK REGISTRATION","SEARCHING","","not registered, but modem is currently searching a new operator to register to"],["1219","3","LTE NETWORK REGISTRATION","DENIED","","registration denied"],["1219","4","LTE NETWORK REGISTRATION","UNKNOWN","","registration unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)"],["1219","5","LTE NETWORK REGISTRATION","ROAMING","","registered, roaming"],["1219","","LTE NETWORK REGISTRATION","","",""],["1220","","MODEM ON","","",""],["1221","","MODEM OFF","","",""],["1222","","MODEM RESET","","C0C0C0",""],["1224","","MODEM SIM RESET","","C0C0C0",""],["1225","","MODEM STANDBY","","",""],["1227","0","WC NWREG","CONTINUED","","Logging of network registration continued"],["1227","1","WC NWREG","PAUSED","","Logging of network registration paused"],["1228","","EMM REJECT CAUSE","","FFFF80",""],["1230","","MODEM INIT USB","","80C0F0",""],["1231","","MODEM INIT GPRS","","",""],["1240","","DEVICE CONNECTED","","80FF80",""],["1241","","MODEM SMS BACKUP OK","","80FF80","SMS backup successful"],["1242","","MODEM SMS BACKUP ERROR","","FF8080","SMS backup failed"],["1243","","BAD GSM QUALITY","","FF8080","The GSM signal is low"],["1244","","WC MNT ABORTED","","FF8080","Connection to Maintenance server failed"],["1245","","WC CON STARTED","","","TCP connection started"],["1250","","MODEM TO ON","","FF8080","Unknown fault!"],["1251","","MODEM TO INIT","","FF8080","Unknown fault!"],["1252","","MODEM TO CON","","FF8080","Unknown fault!"],["1253","","MODEM TO DISC","","FFFF80","Unknown fault!"],["1254","","MODEM TO OFF","","FF8080","Unknown fault!"],["1255","","MODEM TO EVAL","","",""],["1260","","MODEM FW ERROR","","FF8080","Internal fault! Contact your support engineer!"],["1261","","MODEM FW TO","","FF8080","Internal fault! Contact your support engineer!"],["1270","","MODEM DLY BEFOR RST","","",""],["1271","","MODEM RST OK","","80FF80",""],["1272","","MODEM RST NOT OK","","FF8080","Unknown fault!"],["1280","","MODEM UNKNOWN TASK STATE","","FF8080","Unknown fault!"],["1281","","MODEM ZLIB STREAMPROCESS ERR","","FF8080",""],["1282","","MODEM ZLIB STREAMFINISH ERR","","FF8080",""],["1283","","MODEM ZLIB STREAMINIT ERR","","FF8080",""],["1284","","BYTE STUFF PENDING","","FF8080","Internal error. Contact the manufacturer if the device log includes this error several times"],["1290","","COM UNKNOWN TASK STATE","","FF8080","Unknown fault!"],["1300","","USB CONNECTED","","80C0F0",""],["1310","","USB DISCONNECTED","","",""],["1315","","UART CONNECTED","","80C0F0",""],["1316","","UART DISCONNECTED","","",""],["1317","","RADIO CONNECTED","","80C0F0",""],["1318","","RADIO DISCONNECTED","","",""],["1319","","RADIO RESET","","80C0F0",""],["1320","0","LAN LINKUP","","",""],["1320","1","LAN LINKDOWN","","",""],["1320","2","LAN TIMEOUT","","FF8080",""],["1320","3","LAN OPEN SOCKET FAILED","","FF8080",""],["1320","4","LAN DISCONNECT","","",""],["1320","5","LAN NO IP","","FF8080",""],["1320","6","LAN DHCP DISCOVER","","",""],["1320","7","LAN DHCP REQ","","",""],["1320","8","LAN DHCP REREQ","","",""],["1320","9","LAN DHCP NEW IP","","",""],["1320","10","LAN DHCP ABORT","","FF8080",""],["1320","11","LAN MAC READ ERROR","","FF8080",""],["1321","23","LAN SOCK ESTABLISHED","","",""],["1321","24","LAN SOCK FIN WAIT","","",""],["1321","26","LAN SOCK CLOSING","","",""],["1321","27","LAN SOCK TIME WAIT","","",""],["1321","28","LAN SOCK CLOSE WAIT","","",""],["1321","29","LAN SOCK LAST ACT","","",""],["1325","0","RADIO ADVERTISING","OFF","","Advertising deactivated"],["1325","1","RADIO ADVERTISING","ON","","Advertising has been activated"],["1335","0","SHT2X SENSOR OK","","80FF80","The internal temperature and air humidity sensor is returning valid values"],["1335","1","SHT2X RH ERROR","","FF8080","A communication error occured when reading the air humidity value from the internal temperature and air humidity sensor."],["1335","2","SHT2X TEMP ERROR","","FF8080","A communication error occured when reading the temperature value from the internal temperature and air humidity sensor."],["1335","3","SHT2X RH+TEMP ERROR","","FF8080","A communication error occured when reading the measurement value from the internal temperature and air humidity sensor."],["1335","4","SHT2X PLAUSIBILITY ERROR","","FF8080","The values received from the internal temperature and air humidity sensor are not plausible (rH <0% rH or >100% rH or temperature <-40\xB0C or >125\xB0C)"],["1336","","SHT2X COM ERR","","FF8080","Communication with the internal temperature and air humidity sensor is not possible (sensor not present or faulty)"],["1337","","SHT2X COM ERR1","","FF8080","Starting the internal temperature measurement failed"],["1338","","SHT2X COM ERR2","","FF8080","Starting the internal air humidity measurement failed"],["1339","","SHT2X TEMP RAW","","","Temperature raw value (register value from the internal temperature and air humidity sensor) if a plausibility error (SHT2X PLAUSIBILITY ERROR) was detected"],["1340","","SHT2X RH RAW","","","Air humidity raw value (register value from the internal temperature and air humidity sensor) if a plausibility error (SHT2X PLAUSIBILITY ERROR) was detected"],["1350","-999","WIFI INIT ERROR","-999","FF8080",""],["1350","-998","WIFI COMMUNICATION TIMEOUT","-998","FF8080",""],["1350","-997","WIFI AP SCAN TIMEOUT","-997","FF8080","Timeout scanning for available access points"],["1350","-996","WIFI AP SCAN ERROR","-996","FF8080","Error scanning access points"],["1350","-995","WIFI NETWORK TIMEOUT","-995","FF8080","Error accessing network.|Check network settings."],["1350","-994","WIFI IP TIMEOUT","-994","FF8080","Error obtaining IP address!"],["1350","-993","WIFI TCP TIMEOUT","-993","FF8080","Timeout opening TCP connection!"],["1350","-992","WIFI TCP SEND TIMEOUT","-992","FF8080","Timeout sending TCP data.|WiFi internal error."],["1350","-991","WIFI IO ERROR PROCESS","-991","FF8080","WiFi internal error!"],["1350","-990","WIFI IO ERROR RECV","-990","FF8080","WiFi internal error!"],["1350","","WIFI ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1351","","WIFI HW NOT FOUND","","FF8080",""],["1352","","WIFI NETWORK CONNECTED","","",""],["1353","","WIFI RSSI","","",""],["1354","1","TCP CLOSED","FIN","","regular remote disconnection from server"],["1354","2","TCP CLOSED","RST","FF8080","irregular remote disconnection from server"],["1354","3","TCP CLOSED","TIMEOUT","FF8080","socket inactivity timeout"],["1354","4","TCP CLOSED","CLIENT","","socket closed by client (device)"],["1354","","TCP CLOSED","","",""],["1355","1","WIFI NETWORK CLOSED","","","disconnected from AP"],["1355","2","WIFI NETWORK CLOSED","SCAN FAIL","FF8080","scan failed"],["1355","3","WIFI NETWORK CLOSED","JOIN FAIL","FF8080","failed to join the BSS"],["1355","4","WIFI NETWORK CLOSED","AUTH FAIL","FF8080","failed to authenticate with the AP"],["1355","5","WIFI NETWORK CLOSED","ASSOC FAIL","FF8080","failed to associate with the AP"],["1355","6","WIFI NETWORK CLOSED","CONN INPROGRESS","FF8080","another connection request in progress"],["1355","7","WIFI NETWORK CLOSED","INTERNAL ERR","FF8080","internal driver error"],["1355","","WIFI NETWORK CLOSED","","",""],["1356","2","TCP FAILED","SOCKET","FF8080","Error creating socket!"],["1356","3","TCP FAILED","CONNECT","FF8080","Error connecting socket!"],["1356","5","TCP FAILED","SOCKET CONNECT","FF8080","Error connecting socket!"],["1356","6","TCP FAILED","DNS","FF8080","Error resolving IP address (DNS)!"],["1356","7","TCP FAILED","SHUTDOWN","","Error closing TCP connection"],["1356","","TCP FAILED","","",""],["1357","1","WIFI NETWORK FAILED","CONNECT","FF8080","probably wrong settings (e.g. key too long/short)"],["1357","2","WIFI NETWORK FAILED","DISCONNECTED","FF8080","probably AP not available or wrong settings"],["1357","3","WIFI NETWORK FAILED","AP NOT FOUND","FF8080","AP not found during scan!"],["1357","4","WIFI NETWORK FAILED","AP SECURITY","FF8080","AP security not supported"],["1357","5","WIFI NETWORK FAILED","WEP PWDLEN","FF8080","PWD length for WEP is not valid"],["1357","6","WIFI NETWORK FAILED","DIRECT MODE NA","FF8080","WiFi Direct Mode is not available"],["1357","7","WIFI NETWORK FAILED","SNIFFER MODE NA","FF8080","WiFi Sniffer Mode is not available"],["1357","8","WIFI NETWORK FAILED","AP MODE NA","FF8080","WiFi Access Point Mode is not available"],["1357","9","WIFI NETWORK FAILED","SECURITY TYPE NA","FF8080","WiFi Security Type is not available"],["1357","10","WIFI NETWORK FAILED","AP CONFIG","FF8080","WiFi Access Point Configuration is invalid"],["1357","","WIFI NETWORK FAILED","","FF8080",""],["1360","","WIFI REGULAR ON","","",""],["1361","","WIFI REGULAR OFF","","",""],["1362","","ERROR WIFI IRREGULAR OFF","","FFFF80",""],["1363","","WIFI TO CON","","FF8080","Unknown fault!"],["1370","-999","ETH INIT ERR","Ethernet initialization error","FF8080","Ethernet initialization error"],["1370","-998","ETH TIMEOUT","Ethernet communication timeout","FF8080","Ethernet communication timeout"],["1370","-997","ETH NETWORK TIMEOUT","timeout accessing network","FF8080","timeout accessing network"],["1370","-996","ETH IP TIMEOUT","error obtaining IP address (DHCP)","FF8080","error obtaining IP address (DHCP)"],["1370","-995","ETH TCP OPEN TIMEOUT","timeout opening TCP connection","FF8080","timeout opening TCP connection"],["1370","-994","ETH TCP SEND TIMEOUT","timeout sending TCP data","FF8080","timeout sending TCP data"],["1370","-993","ETH IO ERR PROCESS","IO error: processing events","FF8080","IO error: processing events"],["1370","-992","ETH IO ERR RECV","IO error: recv","FF8080","IO error: recv"],["1370","-991","ETH INIT ERR MAC PHY","Error initializing MAC PHY interface","FF8080","Error initializing MAC PHY interface"],["1370","-990","ETH ERR ITF UP","TCPIP Stack: Internal error bringing interface up","FF8080","TCPIP Stack: Internal error bringing interface up"],["1370","","ETH ERROR","","FF8080","Unknown error! Contact your support engineer!"],["1371","","ETH NETWORK CONNECTED","connected to network","","connected to network"],["1372","","ETH TCP CLOSE","TCP connection closed","","TCP connection closed"],["1373","","ETH NETWORK CLOSE","network connection closed","","network connection closed"],["1374","","ETH TCP FAILED","TCP connection could not be opened","FF8080","TCP connection could not be opened"],["1375","","ETH NETWORK FAILED","connection to network could not be opened","FF8080","connection to network could not be opened"],["1380","","ETH REGULAR ON","","",""],["1381","","ETH REGULAR OFF","","",""],["1382","","ETH IRREGULAR OFF","","FFFF80",""],["1383","","ETH TO CON","","FFFF80","Unknown fault!"],["1400","","MEASURE UNKNOWN MODE","","FF8080","Unknown fault!"],["1401","","MEASURE UNKNOWN STATE","","FF8080","Unknown fault!"],["1402","","MEASURE TO","","FF8080","Unknown fault!"],["1403","","MEASURE USER ABORT","","C0C0C0",""],["1420","","I2C BUS CONNECTION ERR1","","FF8080","Internal fault!"],["1421","","I2C BUS CONNECTION ERR2","","FF8080","Internal fault!"],["1422","","I2C BUS CONNECTION ERR3","","FF8080","Internal fault!"],["1423","","I2C BUS CONNECTION ERR4","","FF8080","Internal fault!"],["1430","","ADC CONV ERR","","FF8080","Internal fault!"],["1440","","IMPULSE OUT PARAM ERROR","","FF8080",""],["1441","","UART CONNECTION ERROR","","FF8080",""],["1442","","UART CONNECTION ERROR OK","","80FF80",""],["1450","","MUC EXTENSION COUNT","","C0C0C0",""],["1451","-32752","MUC EXTENSION 1","","FF8080","Communication error"],["1451","-32751","MUC EXTENSION 1","","C0C0C0","Communication restored"],["1451","-32750","MUC EXTENSION 1","","","Retry of command"],["1451","","MUC EXTENSION 1 - ERROR SOD","","FF8080","error SOD"],["1452","-32752","MUC EXTENSION 2","","FF8080","Communication error"],["1452","-32751","MUC EXTENSION 2","","C0C0C0","Communication restored"],["1452","-32750","MUC EXTENSION 2","","","Retry of command"],["1452","","MUC EXTENSION 2 - ERROR SOD","","FF8080","error SOD"],["1453","-32752","MUC EXTENSION 3","","FF8080","Communication error"],["1453","-32751","MUC EXTENSION 3","","C0C0C0","Communication restored"],["1453","-32750","MUC EXTENSION 3","","","Retry of command"],["1453","","MUC EXTENSION 3 - ERROR SOD","","FF8080","error SOD"],["1500","","LOGMSG_DSP_FONTSET_ERROR","","FF8080","Internal fault!"],["1501","","LOGMSG_DSP_LNGFILE_ERROR","","FF8080","Internal fault!"],["1502","","LOGMSG_DSP_APNFILE_ERROR","","FF8080","Internal fault!"],["1600","1","STATE","OK","",""],["1600","2","STATE","TRANSMISSION ERROR","",""],["1600","3","STATE","MEASUREMENT ERROR","",""],["1600","4","STATE","HOLD","",""],["1600","5","STATE","TRANSPORT","",""],["1600","6","STATE","OFFLINE","",""],["1600","7","STATE","NO NET (NET LOCK)","",""],["1600","8","STATE","NO NET","",""],["1600","9","STATE","SIM PIN ERROR","",""],["1600","10","STATE","GPRS ERROR","",""],["1600","11","STATE","IP ERROR","",""],["1600","12","STATE","SIM CARD ERROR","",""],["1601","0","SIM_STATE","NONE","",""],["1601","1","SIM_STATE","PRODUCTION","C0C0C0",""],["1601","2","SIM_STATE","HOT","C0C0C0",""],["1601","3","SIM_STATE","COLD","FF8080",""],["1601","4","SIM_STATE","DISCARDED","FF8080",""],["1602","-2","EXTERNAL SIM","NOT ALLOWED","FF8080",""],["1602","-1","EXTERNAL SIM","NOT FOUND","FF8080",""],["1602","0","EXTERNAL SIM","OK","80FF80",""],["1603","","FEATURE ERROR","","FF8080",""],["1610","0","STATE","OFF","",""],["1610","1","STATE","BOOT","",""],["1610","2","STATE","READY","",""],["1610","3","STATE","ACTIVE OK","",""],["1610","4","STATE","ACTIVE WARNING","",""],["1610","5","STATE","ACTIVE ALARM","",""],["1610","6","STATE","FAULT","",""],["1610","7","STATE","RUN ERROR","",""],["1610","8","STATE","DANGER","",""],["1620","0","TRANSMISSION PROFILE","NORMAL","",""],["1620","1","TRANSMISSION PROFILE","ECO","",""],["1620","2","TRANSMISSION PROFILE","DIAGNOSTIC","",""],["1620","3","TRANSMISSION PROFILE","ADAPTIVE","",""],["1630","0","NEW LIFECYCLE STATE","PREPROVISIONED","",""],["1630","10","NEW LIFECYCLE STATE","PROVISIONED","",""],["1630","20","NEW LIFECYCLE STATE","CLAIMED","",""],["1630","30","NEW LIFECYCLE STATE","FIELDED","",""],["1630","100","NEW LIFECYCLE STATE","DECOMMISIONED","",""],["1630","","NEW LIFECYCLE STATE","","",""],["1631","","NEW LIFECYCLE FLAGS","","",""],["1700","","GPS TIMEOUT","","FFFF80","Try to improve the GPS antenna position."],["1710","","GPS POS START","","",""],["1720","","GPS POS FIX","","80C0FF",""],["1800","","SEC SETUP ERROR","Error on initiating a secure connection - ","FF8080",""],["1801","","SEC ERROR ENCRYPT","","FF8080",""],["1802","","SEC ERROR DECRYPT","","FF8080",""],["1803","0","LOCAL CFG INTERFACE","AUTH OK","80C0F0",""],["1803","1","LOCAL CFG INTERFACE","AUTH FAILED","FF8080",""],["1803","2","LOCAL CFG INTERFACE","DEAUTH","",""],["1804","","LOCAL CFG INTERFACE PARAM","","C0C0C0",""],["1900","","ACCU 0 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1910","0","ACCU 0 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1910","1","ACCU 0 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1910","2","ACCU 0 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1910","3","ACCU 0 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1910","4","ACCU 0 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1910","5","ACCU 0 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1910","6","ACCU 0 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1910","","ACCU 0 E2PROM ERROR","","FF8080",""],["1920","0","ACCU 0 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1920","1","ACCU 0 E2PROM TYPE","Battery","C0C0C0",""],["1920","2","ACCU 0 E2PROM TYPE","AccuPack","C0C0C0",""],["1920","255","ACCU 0 E2PROM TYPE","Undefined","C0C0C0",""],["1901","","ACCU 1 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1911","0","ACCU 1 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1911","1","ACCU 1 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1911","2","ACCU 1 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1911","3","ACCU 1 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1911","4","ACCU 1 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1911","5","ACCU 1 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1911","6","ACCU 1 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1911","","ACCU 1 E2PROM ERROR","","FF8080",""],["1921","0","ACCU 1 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1921","1","ACCU 1 E2PROM TYPE","Battery","C0C0C0",""],["1921","2","ACCU 1 E2PROM TYPE","AccuPack","C0C0C0",""],["1921","255","ACCU 1 E2PROM TYPE","Undefined","C0C0C0",""],["1902","","ACCU 2 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1912","0","ACCU 2 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1912","1","ACCU 2 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1912","2","ACCU 2 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1912","3","ACCU 2 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1912","4","ACCU 2 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1912","5","ACCU 2 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1912","6","ACCU 2 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1912","","ACCU 2 E2PROM ERROR","","FF8080",""],["1922","0","ACCU 2 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1922","1","ACCU 2 E2PROM TYPE","Battery","C0C0C0",""],["1922","2","ACCU 2 E2PROM TYPE","AccuPack","C0C0C0",""],["1922","255","ACCU 2 E2PROM TYPE","Undefined","C0C0C0",""],["1903","","ACCU 3 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1913","0","ACCU 3 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1913","1","ACCU 3 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1913","2","ACCU 3 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1913","3","ACCU 3 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1913","4","ACCU 3 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1913","5","ACCU 3 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1913","6","ACCU 3 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1913","","ACCU 3 E2PROM ERROR","","FF8080",""],["1923","0","ACCU 3 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1923","1","ACCU 3 E2PROM TYPE","Battery","C0C0C0",""],["1923","2","ACCU 3 E2PROM TYPE","AccuPack","C0C0C0",""],["1923","255","ACCU 3 E2PROM TYPE","Undefined","C0C0C0",""],["1904","","ACCU 4 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1914","0","ACCU 4 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1914","1","ACCU 4 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1914","2","ACCU 4 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1914","3","ACCU 4 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1914","4","ACCU 4 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1914","5","ACCU 4 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1914","6","ACCU 4 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1914","","ACCU 4 E2PROM ERROR","","FF8080",""],["1924","0","ACCU 4 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1924","1","ACCU 4 E2PROM TYPE","Battery","C0C0C0",""],["1924","2","ACCU 4 E2PROM TYPE","AccuPack","C0C0C0",""],["1924","255","ACCU 4 E2PROM TYPE","Undefined","C0C0C0",""],["1905","","ACCU 5 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1915","0","ACCU 5 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1915","1","ACCU 5 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1915","2","ACCU 5 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1915","3","ACCU 5 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1915","4","ACCU 5 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1915","5","ACCU 5 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1915","6","ACCU 5 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1915","","ACCU 5 E2PROM ERROR","","FF8080",""],["1925","0","ACCU 5 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1925","1","ACCU 5 E2PROM TYPE","Battery","C0C0C0",""],["1925","2","ACCU 5 E2PROM TYPE","AccuPack","C0C0C0",""],["1925","255","ACCU 5 E2PROM TYPE","Undefined","C0C0C0",""],["1906","","ACCU 6 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1916","0","ACCU 6 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1916","1","ACCU 6 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1916","2","ACCU 6 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1916","3","ACCU 6 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1916","4","ACCU 6 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1916","5","ACCU 6 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1916","6","ACCU 6 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1916","","ACCU 6 E2PROM ERROR","","FF8080",""],["1926","0","ACCU 6 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1926","1","ACCU 6 E2PROM TYPE","Battery","C0C0C0",""],["1926","2","ACCU 6 E2PROM TYPE","AccuPack","C0C0C0",""],["1926","255","ACCU 6 E2PROM TYPE","Undefined","C0C0C0",""],["1907","","ACCU 7 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1917","0","ACCU 7 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1917","1","ACCU 7 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1917","2","ACCU 7 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1917","3","ACCU 7 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1917","4","ACCU 7 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1917","5","ACCU 7 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1917","6","ACCU 7 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1917","","ACCU 7 E2PROM ERROR","","FF8080",""],["1927","0","ACCU 7 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1927","1","ACCU 7 E2PROM TYPE","Battery","C0C0C0",""],["1927","2","ACCU 7 E2PROM TYPE","AccuPack","C0C0C0",""],["1927","255","ACCU 7 E2PROM TYPE","Undefined","C0C0C0",""],["1908","","ACCU 8 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1918","0","ACCU 8 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1918","1","ACCU 8 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1918","2","ACCU 8 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1918","3","ACCU 8 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1918","4","ACCU 8 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1918","5","ACCU 8 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1918","6","ACCU 8 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1918","","ACCU 8 E2PROM ERROR","","FF8080",""],["1928","0","ACCU 8 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1928","1","ACCU 8 E2PROM TYPE","Battery","C0C0C0",""],["1928","2","ACCU 8 E2PROM TYPE","AccuPack","C0C0C0",""],["1928","255","ACCU 8 E2PROM TYPE","Undefined","C0C0C0",""],["1909","","ACCU 9 E2PROM SERNUM","$x1 $x2","C0C0C0","Serial number of accu pack: $x1 $x2",1],["1919","0","ACCU 9 E2PROM ERROR","NO BATTERY","FF8080","Battery not available."],["1919","1","ACCU 9 E2PROM ERROR","DATA LENGTH","FF8080","Invalid data length in EEPROM of battery."],["1919","2","ACCU 9 E2PROM ERROR","NO PROFILE","FF8080","No charging profile stored in battery."],["1919","3","ACCU 9 E2PROM ERROR","READ SOC","FF8080","Error reading SoC from battery."],["1919","4","ACCU 9 E2PROM ERROR","WRITE SOC","FF8080","Error writeing SoC to battery."],["1919","5","ACCU 9 E2PROM ERROR","DIFFERENT CHARGING PROFILES","FF8080","Charging profiles of batteries are differnt."],["1919","6","ACCU 9 E2PROM ERROR","CHARGING TIME EXCEEDED","FF8080","The allowable charing time was exceeded. Battery should by inspected by the manufacturer."],["1919","","ACCU 9 E2PROM ERROR","","FF8080",""],["1929","0","ACCU 9 E2PROM TYPE","None/Ext.Power","C0C0C0",""],["1929","1","ACCU 9 E2PROM TYPE","Battery","C0C0C0",""],["1929","2","ACCU 9 E2PROM TYPE","AccuPack","C0C0C0",""],["1929","255","ACCU 9 E2PROM TYPE","Undefined","C0C0C0",""],["1950","","CHARGE START","","C0C0C0",""],["1951","0","CHARGE STOP","","C0C0C0",""],["1951","1","CHARGE STOP","Maximal charging time elapsed","FF8080",""],["1960","","SOC","","","[%] State of charge. Value to be divided by 100."],["1961","","VBATT","","","[mV] Battery/Accu voltage."],["1962","","VIN","","","[mV] Input voltage."],["1963","","IACCU","","","[mA] Charging or discharging current."],["1964","","TEMP","","","[\xB0C] Temperature. Value to be divided by 100."],["1965","","RH","","","[%] Air humidity. Value to be divided by 10."],["1966","","VDD","","","[mV] VDD System Voltage."],["1967","","Sys Button Interrupts","","","Number of Interrupts on Sys Button IO since Power On"],["20??","","MODULE ERROR ($e)","","FF8080",""],["21??","","MODULE ERROR ($e)","","FF8080",""],["22??","","MODULE WARNING ($e)","","FFFF80",""],["23??","","MODULE WARNING ($e)","","FFFF80",""],["24??","","MODULE INFO ($e)","","C0C0C0",""],["25??","","MODULE INFO ($e)","","C0C0C0",""],["26??","","MODULE DEBUG ($e)","","",""],["27??","","MODULE DEBUG ($e)","","",""],["3000","0","NO SCRIPT","","FF8080",""],["3000","1","SCRIPT UPDATE","","C0C0C0",""],["3000","2","SCRIPT EXCEPT LOOP","Script exception loop - script is now deactivated to be able to replace it","FF8080",""],["3000","3","SCRIPT SOFT ERROR 1","detected script error number 1 - restarting script","FFFF80",""],["3000","4","SCRIPT SOFT ERROR 2","detected script error number 2 - restarting script","FFFF80",""],["3000","5","SCRIPT SOFT ERROR 3","detected script error number 3 - restarting script","FFFF80",""],["3000","6","SCRIPT UPDATE ERROR","","FF8080",""],["3000","7","SCRIPT SYSTEM SHUTDOWN","System shutdown forced by script","C0C0C0",""],["3000","8","SCRIPT DOWNLOAD ERROR","","C0C0C0",""],["3000","9","SCRIPT DELETED","","FF8080",""],["3001","","SCRIPT aborted","","FF8080",""],["3002","","SCRIPT Assertion failed","","FF8080",""],["3003","","SCRIPT Stack/heap collision (insufficient stack size)","","FF8080",""],["3004","","SCRIPT Array index outside the valid area","","FF8080",""],["3005","","SCRIPT Invalid memory access","","FF8080","$x1"],["3006","","SCRIPT Invalid statement","","FF8080",""],["3007","","SCRIPT Stack underflow","","FF8080",""],["3008","","SCRIPT Heap underflow","","FF8080",""],["3009","","SCRIPT No (invalid) native callback function","","FF8080",""],["3010","","SCRIPT Native function failed","","FF8080",""],["3011","","SCRIPT Divide by zero","","FF8080",""],["3012","","SCRIPT Sleep mode","","FF8080",""],["3013","","SCRIPT Invalid state","","FF8080",""],["3014","","SCRIPT ERROR (14)","","FF8080",""],["3015","","SCRIPT ERROR (15)","","FF8080",""],["3016","","SCRIPT Out of memory","","FF8080",""],["3017","","SCRIPT P-code file format is invalid/not supported","","FF8080",""],["3018","","SCRIPT File is for a newer version of AMX","","FF8080",""],["3019","","SCRIPT File or function not found","","FF8080",""],["3020","","SCRIPT Invalid index parameter (invalid entry point)","","FF8080",""],["3021","","SCRIPT Debugger cannot be executed","","FF8080",""],["3022","","SCRIPT AMX not initialized (or initialized twice)","","FF8080",""],["3023","","SCRIPT User data field cannot be set (table full)","","FF8080",""],["3024","","SCRIPT JIT cannot be initialised","","FF8080",""],["3025","","SCRIPT Faulty parameter","","FF8080",""],["3026","","SCRIPT Domain error. The result of the expression is not in the valid area","","FF8080",""],["3027","","SCRIPT General error (invalid or non-specific error)","","FF8080",""],["3028","","SCRIPT Overlays are not supported (JIT) or are not initialised","","FF8080",""],["3050","1","SCRIPT File not available","","FF8080",""],["3050","2","SCRIPT File not fully downloaded","","FF8080",""],["3050","3","SCRIPT Error reading file","","FF8080",""],["3050","4","SCRIPT Marked faulty","","FF8080",""],["3050","5","SCRIPT Invalid type","","FF8080",""],["3050","6","SCRIPT Error loading program","","FF8080",""],["3050","7","SCRIPT Exception loop detected","","",""],["3050","8","SCRIPT Invalid filesize","","FF8080",""],["3???","","SCRIPT ERROR ($e)","","FF8080",""],["5555","","TEST 1","","0080FF",""]],j6=" (aggregation error)";function Tf(x){return(x<0?65535+x+1:x).toString(16).padStart(4,"0")}function ga(x){let e=String(x);return e.charAt(0)==="-"?e.slice(1):e}function Rf(x,e,A){let r=e.slice(0,1)+"???",t=e.slice(0,2)+"??";for(let s of x)if((s[0]===e||s[0]===r||s[0]===t)&&(s[1]===""||s[1]===A))return s;return null}function Pf(x,e,A){let r=null;for(let t of x)if(t[0]===e){if(t[1]==="")return[e,A,t[2],t[3],t[4],t[5],t[6]];t[1]===A&&!r&&(r=[e,A,t[2],t[3],t[4],t[5],t[6]])}return r}function h6(x,e,A=ha,r){let t=ga(x),s=String(e);return(r?Pf(r,t,s):null)??Rf(A,t,s)}function g6(x,e){let A=e.table??ha,r=ga(x.code),t=String(x.param),s=r.slice(0,1)+"???",i=r.slice(0,2)+"??",v=e.overrides?Pf(e.overrides,r,t):null,c=Rf(A,r,t),B=v??c,p={stamp40:x.stamp40,stampMs:x.stampMs,code:x.code,params:[x.param],text:r,detail:t,color:null,help:"",verbose:!0,matchedCode:null};if(!B)return{entry:p,xparams:0};let b=(B[4]===""&&c?c[4]:B[4])||"",h=B[2].toUpperCase();(B[0]===s||B[0]===i)&&(h=h.replace(/\$e/gi,r.slice(1)));let w=B[1]!==""||B[3]?B[3]:t,k=Tf(x.param),P=R=>R.replace(/\$1/g,t).replace(/\$x1/g,k);return p.matchedCode=B[0],p.text=h,p.detail=P(w),p.help=P(B[5]),p.color=b===""?null:b,p.verbose=p.color===null,{entry:p,xparams:B.length>=7?B[6]??0:0}}function C8(x){return x.replace(/\$x?[0-9]/g,"??")}function B8(x){return x.help=C8(x.help+j6),x.detail=C8(x.detail),x.aggregationError=!0,x}function If(x={}){let e=null,A="",r=0,t=0;return{push(s){let i=[],v=ga(s.code),c=String(s.param);if(r&&e)if(A!==v)i.push(B8(e)),e=null,r=0;else{r--,t++;let p=new RegExp("\\$"+t,"g"),b=new RegExp("\\$x"+t,"gi"),h=Tf(s.param);return e.detail=e.detail.replace(p,c).replace(b,h),e.help=e.help.replace(p,c).replace(b,h),e.params.push(s.param),r||(i.push(e),e=null),i}A=v;let B=g6(s,x);return B.xparams>0?(e=B.entry,r=B.xparams,t=1):i.push(B.entry),i},finish(){if(!e)return[];let s=B8(e);return e=null,r=0,[s]}}}function Of(x,e={}){let A=If(e),r=[];for(let t of x)r.push(...A.push(t));return r.push(...A.finish()),r}var Js="devicelog_",y6=6;function k6(x){let e=[];for(let[A,r]of Object.entries(x)){if(!A.startsWith(Js)||typeof r!="string")continue;let t=A.slice(Js.length),s=t.indexOf("_"),i=s<0?t:t.slice(0,s),v=s<0?"":t.slice(s+1);if(!i)continue;let c=r.split(";");for(;c.length<y6-2;)c.push("");let[B,p,b,h,w]=c,k=Number(w);e.push(Number.isInteger(k)&&k>0?[i,v,B,p,b,h,k]:[i,v,B,p,b,h])}return e}var w6=256;function d8(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function _6(x){return Math.round(x*w6/1e3)}function S6(x){if(x.sinceStamp40!==void 0)return x.sinceStamp40;if(x.sinceMs!==void 0)return Math.max(0,W0.msToStamp40(x.sinceMs));throw new Error("readDeviceLog: one of sinceMs or sinceStamp40 is required")}async function Nf(x,e){let A=S6(e),r=d8(),t=await x.requestHistoricUtos(26375,A,e.onProgress,e.timeoutMs),s=Sf(t);return{entries:Of(s,{table:e.table,overrides:e.overrides}),records:s,oldestStamp40:s.length?s[0].stamp40:null,youngestStamp40:s.length?s[s.length-1].stamp40:null,sinceStamp40:A,truncated:!1,durationMs:d8()-r}}var T6=class{constructor(x,e={}){X(this,"utoMaster"),X(this,"options"),X(this,"heldEntries",[]),X(this,"heldRecords",[]),X(this,"anchorStamp40",null),X(this,"busy",!1),X(this,"generation",0),this.utoMaster=x,this.options=e}get entries(){return this.heldEntries}get records(){return this.heldRecords}get oldestStamp40(){return this.heldRecords.length?this.heldRecords[0].stamp40:null}get youngestStamp40(){return this.heldRecords.length?this.heldRecords[this.heldRecords.length-1].stamp40:null}get sinceStamp40(){return this.anchorStamp40}async load(x){if(this.busy)throw new Error("DeviceLogReader: a load is already running (the UTO port lock is held)");this.busy=!0;let e=this.generation;try{let A=await Nf(this.utoMaster,{...this.options,...x});return e===this.generation&&(this.heldEntries=A.entries,this.heldRecords=A.records,this.anchorStamp40=A.sinceStamp40),A}finally{this.busy=!1}}async extendBack(x){if(this.anchorStamp40===null)throw new Error("DeviceLogReader: extendBack() requires a previous load()");return this.load({sinceStamp40:Math.max(0,this.anchorStamp40-_6(x))})}clear(){this.generation++,this.heldEntries=[],this.heldRecords=[],this.anchorStamp40=null}};});var uj={};RE(uj,{default:()=>Ic,deviceExitCode:()=>Pc,program:()=>ge});module.exports=PE(uj);var tx=require("commander"),Bn=Q0(require("chalk"));var Ji={name:"@microtronics/studio-cli",version:"1.3.0-alpha.8",description:"Microtronics Studio CLI Tool",main:"./out/api.js",typings:"./out/studio-cli.d.ts",bin:{"studio-cli":"studio-cli"},publishConfig:{access:"public"},scripts:{compile:"npm run build:registryApiTypings && tsc","build:cli":"node build.mjs","build:exe":"node build-exe.mjs",api:"api-extractor run --local --verbose",build:"npm run compile && npm run api && npm run build:cli","watch:build":"npm run compile -- --watch",test:"cross-env STUDIO_ENV=lucky mocha","test-ci":"cross-env STUDIO_ENV=lucky mocha --reporter mocha-junit-reporter","watch:test":"npm run test -- --watch",prepublishOnly:"npm run build","build:registryApiTypings":"npx openapi-typescript https://api.registry.lucky.ci.microtronics.com/v1/openapi.yaml -o ./src/typings/registry.ts"},author:"Microtronics",license:"ISC",dependencies:{"@gera2ld/tarjs":"^0.3.1",ajv:"^8.17.1","ajv-formats":"^3.0.1","ajv-keywords":"^5.1.0",chalk:"^5.4.1",commander:"^12.1.0","cross-fetch":"^4.0.0","deepmerge-ts":"^7.1.5",dotenv:"^16.4.7","file-type-checker":"^1.1.2",glob:"^11.0.1","iconv-lite":"^0.6.3","image-dimensions":"^2.3.0",ini:"^5.0.0",minimatch:"^10.0.1","openapi-fetch":"^0.13.0",pako:"^2.1.0",semver:"^7.7.2","sql.js":"^1.14.2","tinytar-fix":"^0.1.1","update-notifier":"^7.3.1",usb:"^2.14.0",uuid:"^9.0.1","vscode-uri":"^3.0.8",yaml:"^2.6.1"},engines:{node:">= 22"},devDependencies:{"@microsoft/api-extractor":"^7.47.11","@microtronics/device-master":"bitbucket:microtronics-core/device-master#v4.3.1","@types/chai":"^4.3.6","@types/chai-as-promised":"^7.1.5","@types/ini":"^4.1.1","@types/mocha":"^10.0.9","@types/node":"^22.9.1","@types/semver":"^7.5.6","@types/sql.js":"^1.4.11","@types/update-notifier":"^6.0.8","@types/vscode":"^1.86.2","@yao-pkg/pkg":"^6.22.0",chai:"^4.3.8","chai-as-promised":"^7.1.2","cross-env":"^7.0.3",esbuild:"^0.27.3","extract-zip":"^2.0.1",mocha:"^10.8.2","mocha-junit-reporter":"^2.2.1","openapi-typescript":"^7.6.0","pawncc-wasm":"bitbucket:microtronics-core/pawncc-wasm#v1.2.0",resedit:"^3.0.2",tar:"^7.5.7","ts-node":"^10.9.2",typescript:"^5.6.3"},mocha:{require:["ts-node/register"],"watch-files":"src/**",spec:"./test/**/*.spec.ts",recursive:!0},files:["out/api.js","out/studio-cli.d.ts","dist/main.js","dist/studio-cli.d.ts","studio-cli","CHANGELOG.md"]};var Ze=Q0(require("node:fs/promises"));var Nt=require("vscode-uri"),ko=require("glob"),xA={readFile(x){return Ze.default.readFile(x.fsPath)},async rm(x){if(await this.stat(x))return Ze.default.rm(x.fsPath,{recursive:!0})},async stat(x){try{let e=await Ze.default.stat(x.fsPath),A=(e.isDirectory()?2:0)|(e.isFile()?1:0)|(e.isSymbolicLink()?64:0);return{ctime:e.ctimeMs,mtime:e.mtimeMs,permissions:void 0,size:e.size,type:A}}catch{return null}},async writeFile(x,e){typeof e=="string"&&(e=new TextEncoder().encode(e));let A=Nt.Utils.dirname(x);return await Ze.default.mkdir(A.fsPath,{recursive:!0}),Ze.default.writeFile(x.fsPath,e,{flag:"w"})},async findFiles(x,e,A){let r={ignore:A,nodir:!0,absolute:!0,dot:!0,cwd:x.fsPath};return(await(0,ko.glob)(e,r)).map(s=>{let i=s.replace(/\\/g,"/");return Nt.URI.parse(`file:///${i}`)})},async copy(x,e){let A=await Ze.default.stat(x.fsPath);return await Ze.default.mkdir(Nt.Utils.dirname(e).fsPath,{recursive:!0}),A.isDirectory()?Ze.default.cp(x.fsPath,e.fsPath,{force:!0,recursive:!0}):Ze.default.copyFile(x.fsPath,e.fsPath)},async mkdir(x){await Ze.default.mkdir(x.fsPath,{recursive:!0})}};var Tt=require("vscode-uri");var KA=require("vscode-uri");var lt=require("vscode-uri");var OE=new Uint32Array([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117]);function bn(x,e=0){let A=~~e^-1;for(let r=0;r<x.length;r++)A=A>>>8^OE[(A^x[r])&255];return(A^-1)>>>0}var Sj=new Uint8Array([0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64]),Tj=new Uint8Array([0,192,193,1,195,3,2,194,198,6,7,199,5,197,196,4,204,12,13,205,15,207,206,14,10,202,203,11,201,9,8,200,216,24,25,217,27,219,218,26,30,222,223,31,221,29,28,220,20,212,213,21,215,23,22,214,210,18,19,211,17,209,208,16,240,48,49,241,51,243,242,50,54,246,247,55,245,53,52,244,60,252,253,61,255,63,62,254,250,58,59,251,57,249,248,56,40,232,233,41,235,43,42,234,238,46,47,239,45,237,236,44,228,36,37,229,39,231,230,38,34,226,227,35,225,33,32,224,160,96,97,161,99,163,162,98,102,166,167,103,165,101,100,164,108,172,173,109,175,111,110,174,170,106,107,171,105,169,168,104,120,184,185,121,187,123,122,186,190,126,127,191,125,189,188,124,180,116,117,181,119,183,182,118,114,178,179,115,177,113,112,176,80,144,145,81,147,83,82,146,150,86,87,151,85,149,148,84,156,92,93,157,95,159,158,94,90,154,155,91,153,89,88,152,136,72,73,137,75,139,138,74,78,142,143,79,141,77,76,140,68,132,133,69,135,71,70,134,130,66,67,131,65,129,128,64]);var R0;(w=>{function x(k,P){let[R,N]=P,{line:O,col:W}=k.linePos(R);return{line:Number(O)-1,startCharacter:W-1,endCharacter:W+(N-R)}}w.yamlRangeToLineInformation=x;let e=new TextEncoder;function A(k){return bn(e.encode(k)).toString(16)}w.generateHashForLibraryName=A;function r(k){return bn(e.encode(k)).toString(16)}w.generateHashForFilePath=r;function t(k){return bn(k).toString(16).toUpperCase().padStart(8,"0")}w.generateCRC32ForFileContent=t;function s(k){try{let P=null;return k?.type==="Buffer"?P=Uint8Array.from(k.data):P=k,new TextDecoder("utf8").decode(P)}catch{return""}}w.convertBlobToString=s;function i(k=""){return k.replace(/\r\n|\n\r|\r/g,`
2643
2643
  `)}w.normalizeLF=i;function v(k){try{let P=s(k);return i(P).split(`
2644
2644
  `)}catch{return[]}}w.convertBlobToStringArray=v,w.isNumeric=k=>!Array.isArray(k)&&k-parseFloat(k)+1>=0;function B(k){let P="",R=k.byteLength;for(let N=0;N<R;N++)P+=String.fromCharCode(k[N]);return btoa(P)}w.bufferToBase64=B;function p(k,P){let R=`${k}`.match(/\{\d*(index)(\+\d*)?}/g);if(R){let N=k;return R.forEach(O=>{let W=O.replace(/\+0$/,""),s0=W.match(/index/)?.[0];if(s0){let M=W.slice(1,-1).split(s0)[1],y=parseInt(M)||0;N=N.replace(O,`${P+y}`)}}),N}else return k}w.patchValueWithArrayInfo=p;let b={};function h(k,P,R){let N=b[k];N&&clearTimeout(N.timer),b[k]={timer:setTimeout(()=>{delete b[k],R()},P),handler:R}}w.defer=h})(R0||={});var Jo=require("image-dimensions"),zo=require("file-type-checker");var rh=require("cross-fetch/polyfill"),Ho=Q0(require("openapi-fetch"));var fr=require("vscode-uri");var wx=require("vscode-uri");var pA=Q0(require("semver"));var te="dist/",wo="dde/",zi="dlo/",Vi=".studio/",_o="dfiles/",o0;(c=>{c.fileNames={projectSettings:"studio.json",mainAmx:"main.amx",mainAmxReport:"main.xml",ddeXml:"dde.xml",ddeOpenApi:"main.yaml",historyJson:"history.json",mainDDE:"main.dde",autoInc:"auto.inc",defaultInc:"default.inc",autoUplinkInc:"app-uplink.inc",autoDdeInc:"X-dde.inc",mainDdeInc:"main-dde.inc",autoLocalDataInc:"auto-local-data.inc",legacyAutoInc:"legacy-auto.inc",legacyAutoDdeInc:"legacy-auto-dde.inc",legacyAutoUplinkInc:"legacy-auto-uplink.inc",reportTemplate:"mdn_report_template.json",dloCfg:"dlo.cfg",devMirror:"mirror.json",devDeviceLog:"device.jsonl"};let e=`${Vi}auto/`,A=`${Vi}dev/`,r=`${e}dlo/`,t=`${e}dde/`;c.filePaths={studio:{initFile:`${e}.init`,auto:{path:e,dlo:{path:r,autoInc:`${r}${c.fileNames.autoInc}`,defaultInc:`${r}${c.fileNames.defaultInc}`,autoUplinkInc:`${r}${c.fileNames.autoUplinkInc}`,autoLocalDataInc:`${r}${c.fileNames.autoLocalDataInc}`,autoDdeInc:`${r}${c.fileNames.autoDdeInc}`,mainDdeInc:`${r}${c.fileNames.mainDdeInc}`,legacyAutoInc:`${r}${c.fileNames.legacyAutoInc}`,legacyAutoDdeInc:`${r}${c.fileNames.legacyAutoDdeInc}`,legacyAutoUplinkInc:`${r}${c.fileNames.legacyAutoUplinkInc}`,cfg:`${r}${c.fileNames.dloCfg}`},dde:{path:t,historyJson:`${t}${c.fileNames.historyJson}`}},libdeps:`${Vi}libdeps/`,dev:{path:A,mirror:`${A}${c.fileNames.devMirror}`,deviceLog:`${A}${c.fileNames.devDeviceLog}`}},dist:{path:te,dloPath:`${te}dlo/`,mainAmxPath:`${te}dlo/${c.fileNames.mainAmx}`,mainAmxReportPath:`${te}dlo/${c.fileNames.mainAmxReport}`,ddeXmlPath:`${te}dde/${c.fileNames.ddeXml}`,ddeApiPath:`${te}api/`,ddeApi:`${te}api/${c.fileNames.ddeOpenApi}`,historyJson:`${te}dde/${c.fileNames.historyJson}`,povPath:`${te}pov`,povDetailsPath:`${te}pov/details`,dfilesPath:`${te}dfiles`,dfilesProperties:`${te}dfiles/properties.json`,bloPath:`${te}blo`,reportTemplate:`${te}/${c.fileNames.reportTemplate}`,definesTs:`${te}defines.ts`,definesAppTs:`${te}defines.app.ts`},dlo:{path:zi,mainDLO:`${zi}main.dlo`,mainINI:`${zi}main.ini`},dde:{path:wo,mainDDE:`${wo}main.dde`},dfiles:{path:_o,mainDFILES:`${_o}/main.dfiles`},appIni:"app.ini",defaultsIni:"defaults.ini"},c.readme=B=>`# ${B} README
2645
2645
 
@@ -2758,7 +2758,7 @@ Accepts a number (\u2265 0) or a relation link (\`@container.field\`).`,minimum:
2758
2758
 
2759
2759
  \u26A0\uFE0F **Important:** This does not activate any alarming. Alarming must be implemented in the DLO.
2760
2760
 
2761
- Accepts a number or a relation link (\`@container.field\`).`,$ref:"#/$defs/relationLinkPattern"}}};var Ii=require("yaml");var Dr=require("yaml");var yn;(e=>e.CODE={ddeFieldLength:"field_name_length"})(yn||={});var Ax;(L=>{let x;(p0=>(p0.state="state",p0.result="result",p0.aloha="aloha",p0.volatile="volatile",p0.setting="setting",p0.command="command",p0.storage="storage",p0.relations="relations"))(x=L.DDEContainerName||={});let e;(B0=>(B0.configA="configA",B0.configB="configB",B0.configC="configC",B0.config0="config0",B0.config1="config1",B0.config2="config2",B0.config3="config3",B0.config4="config4",B0.config5="config5",B0.config6="config6",B0.config7="config7",B0.config8="config8",B0.config9="config9",B0.histdata0="histdata0",B0.histdata1="histdata1",B0.histdata2="histdata2",B0.histdata3="histdata3",B0.histdata4="histdata4",B0.histdata5="histdata5",B0.histdata6="histdata6",B0.histdata7="histdata7",B0.histdata8="histdata8",B0.histdata9="histdata9",B0.aloha="aloha",B0.alerts="alerts",B0.applog="applog"))(e=L.ContainerName||={});let A;(K=>(K.cx="cx",K.hx="hx",K.cb="cb",K.aloha="aloha",K.applog="applog"))(A=L.ContainerType||={});let r;(N0=>(N0.up="up",N0.down="down",N0.upPlus="up+",N0.downPlus="down+",N0.none="none",N0.backendOnly="backend-only",N0.deviceOnly="device-only",N0.both="both",N0.bothPlus="both+",N0.noneBackend="none-be"))(r=L.TransferDirection||={});function t(U,r0){return U==="cx"&&!["backend-only"].includes(r0)?"DDE_CID_CONFIG":U==="hx"?"DDE_CID_HISTDATA":U==="aloha"?"DDE_CID_ALOHA":null}L.CONTAINER_DEF_DLO_CID_BASE=t;let s=["up","up+","down","down+","both","none","both+","backend-only","device-only"],i=["up","up+","backend-only"];L.CONTAINER_DEFS={configA:{ctype:"cb",cnum:"a",alias:"",flds:"field",xmits:["backend-only"]},configB:{ctype:"cb",cnum:"b",alias:"",flds:"field",xmits:["backend-only"]},configC:{ctype:"cb",cnum:"c",alias:"",flds:"field",xmits:["backend-only"]},config0:{ctype:"cx",cnum:0,alias:"",flds:"field",xmits:s},config1:{ctype:"cx",cnum:1,alias:"",flds:"field",xmits:s},config2:{ctype:"cx",cnum:2,alias:"",flds:"field",xmits:s},config3:{ctype:"cx",cnum:3,alias:"",flds:"field",xmits:s},config4:{ctype:"cx",cnum:4,alias:"",flds:"field",xmits:s},config5:{ctype:"cx",cnum:5,alias:"",flds:"field",xmits:s},config6:{ctype:"cx",cnum:6,alias:"",flds:"field",xmits:s},config7:{ctype:"cx",cnum:7,alias:"",flds:"field",xmits:s},config8:{ctype:"cx",cnum:8,alias:"",flds:"field",xmits:s},config9:{ctype:"cx",cnum:9,alias:"",flds:"field",xmits:s},histdata0:{ctype:"hx",cnum:0,alias:"",flds:"ch",xmits:i},histdata1:{ctype:"hx",cnum:1,alias:"",flds:"ch",xmits:i},histdata2:{ctype:"hx",cnum:2,alias:"",flds:"ch",xmits:i},histdata3:{ctype:"hx",cnum:3,alias:"",flds:"ch",xmits:i},histdata4:{ctype:"hx",cnum:4,alias:"",flds:"ch",xmits:i},histdata5:{ctype:"hx",cnum:5,alias:"",flds:"ch",xmits:i},histdata6:{ctype:"hx",cnum:6,alias:"",flds:"ch",xmits:i},histdata7:{ctype:"hx",cnum:7,alias:"",flds:"ch",xmits:i},histdata8:{ctype:"hx",cnum:8,alias:"",flds:"ch",xmits:i},histdata9:{ctype:"hx",cnum:9,alias:"",flds:"ch",xmits:i},aloha:{ctype:"aloha",cnum:void 0,alias:"aloha",flds:null,xmits:["up","up+"]},alerts:{ctype:void 0,cnum:void 0,alias:"alerts",flds:null,xmits:["up"]},applog:{ctype:"applog",cnum:void 0,alias:"applog",flds:null,xmits:["up+"]}},L.HISTDATA_CONTAINER=["histdata0","histdata1","histdata2","histdata3","histdata4","histdata5","histdata6","histdata7","histdata8","histdata9"],L.CONFIG_CONTAINER=["config0","config1","config2","config3","config4","config5","config6","config7","config8","config9"],L.SERVER_CONTAINER=["configA","configB","configC"],L.regexRelation=/^(@[a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*(\[[^\]]+\])?(\.[a-zA-Z_][a-zA-Z0-9_]*)*|lib:[a-zA-Z0-9_-]+@[a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*(\[[^\]]+\])?(\.[a-zA-Z_][a-zA-Z0-9_]*)*)$/;let h=["astring","nstring","cstring","wstring","ustring"],w=["int8","int16","int32","int64","uint8","uint16","uint32","float16","float32","float64"];L.allowedRelationTypes={title:h,unit:h,chartMinimum:w,chartMaximum:w,scale:w,offset:w,decimalPlaces:["uint8","uint16","uint32","int8","int16","int32","int64"],channelMode:["uint8","uint16","uint32"],chartAlarmLow:w,chartAlarmHigh:w,chartWarningLow:w,chartWarningHigh:w,chartHysteresis:w,chartTriggerThreshold:w,chartTriggerRelation:w,chartSetPoint:w};function P(U,r0,Q){let x0=r0[U];if(x0!==void 0)if(L.regexRelation.exec(`${x0}`)){let f0=U==="chartSetPoint",[K,...a0]=x0.split("."),[,c0]=K.split("@"),p0=Object.values(Q.containers).find(dx=>dx.title===c0),b0=a0.join("."),N0=f0?";":"%",$0=(f0?"":"%")+(p0?.name||c0)+N0;if($0=$0+`${b0}`,f0){let dx=Q.setPointList[r0.name];$0=$0+`;actual_output_value_${dx}`}return $0}else return x0}L.parseXMLValueWithRelation=P;function R(U){let{bitmask:r0}=U;if(!r0)return;let Q="$",x0=r0.replaceAll(" ","");if(r0.startsWith("0x"))Q+=x0.substring(2);else if(x0.startsWith("0b")){let f0=x0.substring(2).replaceAll(" ","");Q+=parseInt(f0,2).toString(16).toUpperCase()}return Q}L.parseXMLBitmask=R;function N(U){return U.type==="binary"?U.defaultValue.substring(2):U.defaultValue==="NaN"?"NAN":U.defaultValue}L.parseXMLDefaultValue=N,L.TDEF_NUMBER={xmlOut(U,r0,Q){U.decpl=P("decimalPlaces",r0,Q),U.decpl===void 0&&(U.decpl=0),U.vscale=P("scale",r0,Q),U.vofs=P("offset",r0,Q),U.min=P("chartMinimum",r0,Q),U.max=P("chartMaximum",r0,Q)}};let W={isBlob:1,xmlOut(U,r0){U.max=r0.byteSize}},s0={xmlOut(U){U.decpl=-1,U.param0="local",U.units="UTC"}};L.TYPE_DEFS={u8:{dde:"uint8",dim:1,len:1,...L.TDEF_NUMBER,rdef:1,xml:{type:"u8"},pwn:{rwfunc:"u8",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},u16:{dde:"uint16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"u16"},pwn:{rwfunc:"u16",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},u32:{dde:"uint32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"u32"},pwn:{rwfunc:"u32",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},s8:{dde:"int8",dim:1,len:1,...L.TDEF_NUMBER,rdef:1,xml:{type:"s8"},pwn:{rwfunc:"s8",htype:"s32",printf:"%d"},openApi:{type:"number"}},s16:{dde:"int16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"s16"},pwn:{rwfunc:"s16",htype:"s32",printf:"%d"},openApi:{type:"number"}},s32:{dde:"int32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"s32"},pwn:{rwfunc:"s32",printf:"%d"},openApi:{type:"number"}},s64:{dde:"int64",dim:0,len:8,...L.TDEF_NUMBER,rdef:1,xml:{type:"s64"},pwn:{rwfunc:"s64",rwp:"%n{%l}",htype:"{%l}",printf:"%d"},openApi:{type:"number"}},f16:{dde:"float16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"floatm16"},pwn:{rwfunc:"f16",rwp:"Float:%n",htype:"f32",printf:"%f"},openApi:{type:"number"}},f32:{dde:"float32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"f32"},pwn:{rwfunc:"f32",rwp:"Float:%n",printf:"%f"},openApi:{type:"number"}},f64:{dde:"float64",dim:0,len:8,...L.TDEF_NUMBER,rdef:0,xml:{type:"f64"},pwn:{rwfunc:"f64",rwp:"%n{%l}",htype:"{%l}",printf:"%f"},openApi:{type:"number"}},stamp32:{dde:"stamp32",dim:1,len:4,...s0,rdef:0,xml:{type:"stamp4"},pwn:{rwfunc:"stamp32",printf:"%s",printfFormat:"stampToISOString"},openApi:{type:"string",format:"YYYYMMDDhhmmssSSS",description:"UTC"}},stamp40:{dde:"stamp40",dim:0,len:5,...s0,rdef:0,xml:{type:"stamp"},pwn:{rwfunc:"stamp40",rwp:"%n{%l}",htype:"{%l}",printf:"%s",printfFormat:"stampToISOString"},openApi:{type:"string",format:"YYYYMMDDhhmmssSSS",description:"UTC"}},bin:{dde:"binary",dim:0,...W,rdef:0,lenUnits:"byte",xml:{type:"string",editmask:"%HEX%"},pwn:{rwfunc:"bin",rwlen:1,rwp:"%n{%l}",htype:"{%l}",printf:null,printfFormat:"memtostr"},openApi:{type:"string",description:"HEX string"}},astr:{dde:"astring",dim:0,...W,rdef:1,lenUnits:"char",xml:{type:"string",param1:"nocodepage"},pwn:{rwfunc:"astr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},nstr:{dde:"nstring",dim:0,...W,rdef:1,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"nstr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},wstr:{dde:"wstring",dim:0,...W,rdef:1,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"wstr",rwlen:1,rwp:"%n[%l+1]",htype:"[%l+1]",printf:"%s"},openApi:{type:"string"}},ustr:{dde:"ustring",dim:0,...W,rdef:0,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"ustr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},cstr:{dde:"cstring",dim:0,...W,rdef:1,lenUnits:"char",xml:{type:"string",editmask:"%HEX%"},pwn:{rwfunc:"cstr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},_siteref:{dim:0,len:80,rdef:0,xml:{type:"string",max:"80",editmask:"%QUERY%all_sites;-name;!id;class;name;%EMPTY%"},pwn:{rwfunc:"astr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}"},js:{rwfunc:"String"}}},L.fieldTypeDefinitions={uint8:L.TYPE_DEFS.u8,uint16:L.TYPE_DEFS.u16,uint32:L.TYPE_DEFS.u32,int8:L.TYPE_DEFS.s8,int16:L.TYPE_DEFS.s16,int32:L.TYPE_DEFS.s32,int64:L.TYPE_DEFS.s64,float16:L.TYPE_DEFS.f16,float32:L.TYPE_DEFS.f32,float64:L.TYPE_DEFS.f64,stamp32:L.TYPE_DEFS.stamp32,stamp40:L.TYPE_DEFS.stamp40,binary:L.TYPE_DEFS.bin,astring:L.TYPE_DEFS.astr,nstring:L.TYPE_DEFS.nstr,wstring:L.TYPE_DEFS.wstr,ustring:L.TYPE_DEFS.ustr,cstring:L.TYPE_DEFS.cstr};let G=["_id","id","_stamp","stamp","tag","_uid","customer_id","site_id","_rec_flags__","applog"];function V(U){let r0=U.toLowerCase();return G.includes(r0)||/^field\d+$/.test(r0)||/^ch\d+$/.test(r0)}L.checkForReservedFieldName=V;function Y(U){return!!U.fields.find(r0=>r0.library===null&&r0.type!=="shadow")}L.hasContainerAppFields=Y})(Ax||={});var ct={DP_registry_sz:1024,DP_config_sz:4e3,DP_histdata_sz:1024,DP_DISPLAY_CNT:0,DP_LED_CNT:0,DP_BUTTON_CNT:0,DP_GPIO_CNT:0,DP_IRQ_CNT:0,DP_DIGOUT_CNT:0,DP_UIN_CNT:0,DP_TEMP_CNT:0,DP_I2C_CNT:0,DP_SPI_CNT:0,DP_UART_CNT:0,DP_RS485_CNT:0,DP_RS232_CNT:0,DP_WIFI_CNT:0,DP_BLE_CNT:0,DP_LORA_CNT:0,DP_NBIOT_CNT:0},As={max_size:1e5,max_fields:1e3},bA={max_size:4e3,max_fields:1e3},eA={max_size:1024,max_fields:1e3},Et={configA:As,configB:As,configC:As,config0:bA,config1:bA,config2:bA,config3:bA,config4:bA,config5:bA,config6:bA,config7:bA,config8:bA,config9:bA,histdata0:eA,histdata1:eA,histdata2:eA,histdata3:eA,histdata4:eA,histdata5:eA,histdata6:eA,histdata7:eA,histdata8:eA,histdata9:eA,aloha:{...eA,warn_fields:10},alerts:{max_size:13,max_fields:0,exact_match:!0},applog:{max_size:125,max_fields:0,exact_match:!1}},rs={m22x:{name:"M22x",dpid:"m22x",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M M2 HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:64*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:6,DP_IRQ_CNT:2,DP_I2C_CNT:1,DP_SPI_CNT:1,DP_UART_CNT:2,DP_WIFI_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m23x:{name:"M23x",dpid:"m23x",interface:{type:"usb",filter:{vendorId:1155},fileChunk:4096},usb_ids:["rapidM2M M23 HW2.0","rapidM2M M23 HW1.0"],alt_ids:[],generation:"M23",prog_mem:8*1024*1024,data_mem:8*1024*1024,total_mem:8*1024*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:6,DP_IRQ_CNT:2,DP_I2C_CNT:1,DP_SPI_CNT:1,DP_UART_CNT:1,DP_WIFI_CNT:1},usbcaps:{dbgItfMayHangFixed:"99v999"},dlo:{compileRestrictions:{}}},nrf91:{name:"NRF91",dpid:"nrf91",interface:{type:"usb",filter:{vendorId:9540},fileChunk:2048},usb_ids:["rapidM2M NRF91 HW1.0","ONE NRF91 HW1.0","rapidM2M Evolve HW1.0"],alt_ids:[],generation:"NRF91",prog_mem:256*1024,data_mem:64*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:32,DP_IRQ_CNT:6,DP_I2C_CNT:2,DP_SPI_CNT:2,DP_UART_CNT:2,DP_AIN_CNT:8,DP_PWM_CNT:3},usbcaps:{}},m2blegw:{name:"BLE Gateway",dpid:"m2blegw",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M BLEGW HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_DISPLAY_CNT:1,DP_DISPLAY_TYPE:"xc",DP_BUTTON_CNT:1,DP_BLE_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m2easyv3:{name:"myDatalogEasy V3",dpid:"m2easyv3",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M Easy HW3.0"],alt_ids:["rapidM2M EasyIoT HW1.0","rapidM2M M220 HW1.0"],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_BUTTON_CNT:1,DP_DIGOUT_CNT:1,DP_UIN_CNT:4,DP_TEMP_CNT:1,DP_RS485_CNT:1,DP_RS232_CNT:1,DP_BLE_CNT:1,DP_LORA_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m2easyiot:{name:"myDatalogEasy IoT",dpid:"m2easyiot",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M EasyIoT HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_BUTTON_CNT:1,DP_DIGOUT_CNT:1,DP_UIN_CNT:4,DP_TEMP_CNT:1,DP_RS485_CNT:1,DP_RS232_CNT:1,DP_BLE_CNT:1,DP_LORA_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}}};var ts=require("vscode-uri");var Ct=class{dloFileMap={};rootUri=ts.URI.parse("");constructor(){}set workspacePath(e){this.rootUri=e}getSequenceForFile(e){let A=e.substring(this.rootUri.path.length||0);if(this.rootUri.scheme!=="file"){let t=this.rootUri.toString();A=e.substring(t.length+1)}if(Object.hasOwn(this.dloFileMap,A))return this.dloFileMap[A];let r=R0.generateHashForFilePath(A);return this.dloFileMap[A]=r,r}getFilePathForSequence(e){let A=Object.entries(this.dloFileMap).find(([,r])=>r===e);return A?ts.URI.parse(`${this.rootUri.path}${A[0]}`).path:null}};var aF=require("vscode-uri");function ns(x){return x.replace(/\\/g,"/").split("/").pop()??""}function lr(x){return/\.spec\.dlo$/i.test(ns(x))}function qt(x,e){let A=ns(x);if(!A)return!1;if(lr(A))return!0;let r=e?.dlo?.mainFile;return r?ns(r)===A:A==="main.dlo"}var jC=/^\s*#define\s+TEST_OWN_MAIN\b/m;function hC(x){return jC.test(x)}function kn(x,e){if(!lr(x))return[];let A=["DLO_TEST_SPEC=1"];return e!==void 0&&hC(e)&&A.push("TEST_OWN_MAIN=1"),A}var Mt="__it_";var _n=31-Mt.length-4;function Qo(x){return x.replace(/^_+/,"").replace(/_+$/,"")}function wn(x,e=_n){let A=Qo(x.toLowerCase().replace(/[^a-zA-Z0-9_]+/g,"_"));return Qo(A.substring(0,Math.max(0,e)))}function Sn(x,e){let A=wn(x);if(!A||!e.has(A))return A;for(let r=2;;r++){let t=`_${r}`,s=`${wn(x,_n-t.length)}${t}`;if(!e.has(s))return s}}function Tn(x){return`${Mt}${x}`}function $t(x,e){return`${Mt}${x}__${e}`}function Rn(x,e){return`// @it ${x} "${e}"`}var Zo=/\/\/\s*@it\s+([A-Za-z0-9_]+)\s+"((?:[^"\\]|\\.)*)"/;var Pn=class{quote="";step(e,A){let r=e[A];return this.quote?r==="\\"&&A+1<e.length?{insideString:!0,nextIndex:A+2}:(this.quote=r===this.quote?"":this.quote,{insideString:!0,nextIndex:A+1}):r==='"'||r==="'"?(this.quote=r,{insideString:!0,nextIndex:A+1}):{insideString:!1,nextIndex:A+1}}};function xF(x,e){let A=new Pn,r=0;for(let t=e;t<x.length;){let{insideString:s,nextIndex:i}=A.step(x,t);if(!s){if(x[t]==="(")r++;else if(x[t]===")"&&--r===0)return t}t=i}return-1}function In(x){let e=new Pn,A=[],r=0,t="";for(let s=0;s<x.length;){let{insideString:i,nextIndex:v}=e.step(x,s),c=x[s];!i&&c===","&&r===0?(A.push(t),t=""):(!i&&(c==="("||c==="{")?r++:!i&&(c===")"||c==="}")&&r--,t+=x.slice(s,v)),s=v}return A.push(t),A}var yC=/^[A-Za-z_@][A-Za-z0-9_@]*$/;function eF(x){return yC.test(x.trim())}function AF(x){return/^\{[\s\S]*\}$/.test(x.trim())}var kC=/^(?:0[xX][0-9a-fA-F]+|\d+|xx)$/;function rF(x){let e=x.trim().slice(1,-1).trim();if(!e)return{error:"an empty byte list {} is not valid"};let A=[];for(let r of In(e)){let t=r.trim();if(!kC.test(t))return{error:`"${t}" is not a byte literal (decimal, 0x hex, or xx)`};if(t==="xx"){A.push("xx");continue}let s=t.startsWith("0x")||t.startsWith("0X")?parseInt(t,16):parseInt(t,10);if(s>255)return{error:`${t} is out of range 0..255 for a byte list`};A.push(s.toString(16).toUpperCase().padStart(2,"0"))}return{packed:A.join("")}}function tF(x){let e=x.trim().slice(1,-1).trim();if(!e)return{error:"an empty list {} is not valid"};let A=[];for(let r of In(e)){let t=r.trim();if(!/^-?(?:0[xX][0-9a-fA-F]+|\d+)$/.test(t))return{error:`"${t}" is not an integer literal`};let s=t.startsWith("-"),i=s?t.substring(1):t,v=(i.startsWith("0x")||i.startsWith("0X")?parseInt(i,16):parseInt(i,10))*(s?-1:1);A.push(v.toString(10))}return{packed:A.join("|")}}var wC=/^(?:\s*#options\s+)(.*)(?:\s*)$/,_C=/^(?:\s*#preinclude\s+)(.*)(?:\s*)$/,SC=/^(?:\s*#ifdef\s+)(.*)$/,TC=/^(?:\s*#ifndef\s+)(.*)$/,RC=/^(?:\s*#elseifdef\s+)(.*)$/,PC=/^(?:\s*#elseifndef\s+)(.*)$/,oF=/^(\s*)(?:#callback\s+)(\w*)(?:\s*\(\s*)(.*?)(?:\s*\)\s*)(\{*){1}(?:\s*)$/,FF=/^(.*)(^|\s+)(?:assert\s*\(\s*)(.*?)(?:\s*,\s*)(.*?)(?:\s*\)\s*;*\s*)$/,vF=/^(.*)(^|\s+)(?:assert\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,fF=/^(.*)(^|\s+)(?:assert\s*\(\s*\);*\s*)$/,lF=/^(.*)(^|\s+)(?:catch\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,IC=/^\s*#include\s*</,OC=/^\s*#endinput\s*/,NC=/^\s*#pragma\s+dynamic\s+(\S+)\s*(\/\/.*|\/\*.*|)$/,cF=/^(.*)(^|\s+)(?:applog(|_ok|_warning|_alarm|_debug|_fatal)\s*\(\s*)(.*?)(?:\s*,\s*)(.*?)(?:\s*\)\s*;*\s*)$/,EF=/^(.*)(^|\s*)(?:applog(|_ok|_warning|_alarm|_debug|_fatal)\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/;function nF(x,e=""){let A=" ",r=x;return e.length?A={fatal:"\xA7",alarm:"!",warning:"?",debug:"~",ok:"$"}[e]||null:["!","?","~","$","\xA7"].includes(x.substring(1,1))&&(A=x.substring(1,1),r=`"${x.substring(2,x.length-1)}"`),{priority:`'${A}'`,code:r}}var CF=/^(.*)(^|\s+)(?:log(|_debug|_info|_warn|_error)\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,BF=(t=>(t[t.debug=0]="debug",t[t.info=1]="info",t[t.warn=2]="warn",t[t.error=3]="error",t))(BF||{}),qC=/^(.*)(^|\s*)DDE_(state|result|aloha|volatile|setting|command)_/,MC=/^(.*)(^|\s*)onUplink(Restore|Apply)_(state|result|aloha|volatile|setting|command)/,$C=/^(.*)(^|\s*)onUplinkEvent/,LC=/(?:^|\s)(?:assert|catch|applog(?:_ok|_warning|_alarm|_debug|_fatal)?|log(?:_debug|_info|_warn|_error)?)\s*\(/,GC=/^\s*#callback\s+\w+\s*\(/;function iF(x){let e=0,A=!1,r="";for(let t=0;t<x.length;t++){let s=x[t];if(A){if(s==="\\"){t++;continue}s===r&&(A=!1);continue}if(s==='"'||s==="'"){A=!0,r=s;continue}s==="("?e++:s===")"&&e--}return e}function dF(x){return oF.test(x)||fF.test(x)||FF.test(x)||vF.test(x)||lF.test(x)||cF.test(x)||EF.test(x)||CF.test(x)}function UC(x,e,A){if(!(LC.test(A)||GC.test(A)))return null;let t=iF(A);if(t<=0)return null;let s=t,i=[x[e]],v=[A],c=e+1,B=100;for(;s>0&&c<x.length&&c-e<B;){let h=x[c],w=h.split("//",1)[0];i.push(h),v.push(w),s+=iF(w),c++}if(i.length<=1||s>0)return null;let p=i.map((h,w)=>w===0?h:h.trim()).join(" "),b=v.map((h,w)=>w===0?h:h.trim()).join(" ");return dF(b)?{joinedOriginal:p,joinedStripped:b,extraLineCount:i.length-1}:null}var uF=String.raw`[A-Za-z_@][A-Za-z0-9_@]*`,DF=String.raw`"((?:[^"\\]|\\.)*)"`,HC=new RegExp(String.raw`^(\s*)IT\s*\(\s*${DF}\s*\)(.*)$`),KC=new RegExp(String.raw`^\s*IT\s*\(\s*${uF}\s*,\s*${DF}\s*\)`),WC=/^(\s*)STEP\s*\(\s*(\d+)\s*\)(.*)$/,JC=new RegExp(String.raw`^\s*STEP\s*\(\s*${uF}\s*,(\s*)\d+\s*\)`),zC=/^(\s*)AFTER_LOOP\b(.*)$/,VC=/\b(?:RUN_LOOP|MOCK_DELIVER|MOCK_DELIVER_SEC|MOCK_DELIVER_IMMEDIATES)\s*\(/,XC=/^\s*DESCRIBE\s*\(/,YC=/^(\s*)TEST_SETUP\s*\(\s*\)(.*)$/,QC=/^(\s*)TEST_TEARDOWN\s*\(\s*\)(.*)$/,ZC={MOCK_RETURN:{nativeNameArgs:[1]},MOCK_RETURN_SEQ:{nativeNameArgs:[1],listArgs:{2:"ints"}},MOCK_RETURN_SEQ_STRICT:{nativeNameArgs:[1],listArgs:{2:"ints"}},MOCK_BYTES:{nativeNameArgs:[1],listArgs:{3:"bytes"}},MOCK_BYTES_RET:{nativeNameArgs:[1],listArgs:{3:"bytes"}},MOCK_SEQ:{nativeNameArgs:[1]},MOCK_SEQ_STRICT:{nativeNameArgs:[1]},MOCK_REG:{nativeNameArgs:[1],listArgs:{4:"bytes"}},MOCK_REG_MASKED:{nativeNameArgs:[1],listArgs:{5:"bytes"}},MOCK_REG_RW:{nativeNameArgs:[1]},MOCK_RESET:{nativeNameArgs:[1]},EXPECT_CALLED:{nativeNameArgs:[1]},EXPECT_ARG_INT:{nativeNameArgs:[1]},EXPECT_ARG_BYTES:{nativeNameArgs:[1],listArgs:{4:"bytes"}},EXPECT_REG:{nativeNameArgs:[1]},EXPECT_REG_WRITES:{nativeNameArgs:[1]},EXPECT_CALL_ORDER:{nativeNameArgs:[1,3]},EXPECT_RECORD_BYTES:{listArgs:{2:"bytes"}}},is=class{slugs=new Set;stepsOfCurrent=new Set;currentSlug=null;currentIsMacroForm=!1;sawLoopAdvance=!1;describeCount=0;sawFileWideSetup=!1;sawFileWideTeardown=!1;setupSeenForGroup=new Set;teardownSeenForGroup=new Set;rewrite(e){let A=xB(e),r=e.substring(A.length);return VC.test(A)&&(this.sawLoopAdvance=!0),XC.test(A)&&this.describeCount++,this.rewriteIt(A,r)??this.rewriteAfterLoop(A,r)??this.rewriteStep(A,r)??this.rewriteTestSetup(A,r)??this.rewriteTestTeardown(A,r)??this.rewriteMacroArgs(A,r)}finishDeclaration(e,A,r,t,s,i){let{text:v,diagnostics:c}=this.applyMacroArgRewrite(r),B=t?`${sF(e,A,v)} ${t}`:sF(e,A,v);return{line:s?`${B} ${s}`:B,diagnostics:[...i,...c]}}rewriteIt(e,A){let r=HC.exec(e);if(!r)return this.checkItTwoArg(e);let[,t,s,i]=r,v=Sn(s,this.slugs);return v?(this.slugs.add(v),this.currentSlug=v,this.currentIsMacroForm=!1,this.stepsOfCurrent.clear(),this.sawLoopAdvance=!1,this.finishDeclaration(t,Tn(v),i,Rn(v,s),A,[])):{line:null,diagnostics:[{level:"error",message:`IT("${s}") has no name to generate: a title needs at least one letter, digit or underscore, or use the IT(id, "title") form.`}]}}checkItTwoArg(e){let A=KC.exec(e);return!A||(this.currentSlug=null,this.currentIsMacroForm=!0,this.stepsOfCurrent.clear(),this.sawLoopAdvance=!1,!A[1].includes(","))?null:{line:null,diagnostics:[{level:"warning",message:`A comma in an IT() title splits the macro argument - write it as IT("${A[1]}") without an id, or drop the comma.`}]}}rewriteStep(e,A){let r=WC.exec(e);if(!r)return this.checkStepTwoArg(e);let[,t,s,i]=r,v=Number(s),c=this.stepError(v);return c?{line:null,diagnostics:[{level:"error",message:c}]}:(this.stepsOfCurrent.add(v),this.sawLoopAdvance=!1,this.finishDeclaration(t,$t(this.currentSlug,v),i,null,A,[]))}rewriteAfterLoop(e,A){let r=zC.exec(e);if(!r)return null;let[,t,s]=r;if(this.currentIsMacroForm)return{line:null,diagnostics:[{level:"error",message:'AFTER_LOOP continues an IT("title"); an IT(id, "title") is continued by STEP(id,n).'}]};if(!this.currentSlug)return{line:null,diagnostics:[{level:"error",message:'AFTER_LOOP has no IT() before it - it continues the most recent IT("title") after the firmware main loop ran.'}]};let i=this.sawLoopAdvance,v=this.stepsOfCurrent.size?Math.max(...this.stepsOfCurrent)+1:2;this.stepsOfCurrent.add(v),this.sawLoopAdvance=!1;let c=[];return i||c.push({level:"warning",message:"AFTER_LOOP splits the test but the block before it never let the main loop run - add RUN_LOOP(ms) at its end, or merge the blocks"}),this.finishDeclaration(t,$t(this.currentSlug,v),s,null,A,c)}rewriteTestSetup(e,A){let r=YC.exec(e);if(!r)return null;let[,t,s]=r;if(this.describeCount===0)return this.sawFileWideSetup?{line:null,diagnostics:[{level:"error",message:"TEST_SETUP() is already declared for this spec."}]}:(this.sawFileWideSetup=!0,null);let i=this.describeCount;if(this.setupSeenForGroup.has(i))return{line:null,diagnostics:[{level:"error",message:"TEST_SETUP() is already declared for this DESCRIBE group."}]};this.setupSeenForGroup.add(i);let v=`__tsetup_${i}`;return this.finishDeclaration(t,v,s,`// @setup ${i}`,A,[])}rewriteTestTeardown(e,A){let r=QC.exec(e);if(!r)return null;let[,t,s]=r;if(this.describeCount===0)return this.sawFileWideTeardown?{line:null,diagnostics:[{level:"error",message:"TEST_TEARDOWN() is already declared for this spec."}]}:(this.sawFileWideTeardown=!0,null);let i=this.describeCount;if(this.teardownSeenForGroup.has(i))return{line:null,diagnostics:[{level:"error",message:"TEST_TEARDOWN() is already declared for this DESCRIBE group."}]};this.teardownSeenForGroup.add(i);let v=`__tteardown_${i}`;return this.finishDeclaration(t,v,s,`// @teardown ${i}`,A,[])}rewriteMacroArgs(e,A){let{text:r,diagnostics:t,changed:s}=this.applyMacroArgRewrite(e);return s?{line:r+A,diagnostics:t}:t.length?{line:null,diagnostics:t}:null}applyMacroArgRewrite(e){let A=e,r=!1,t=[];for(let[s,i]of Object.entries(ZC))A=this.rewriteMacroCallsOf(A,s,i,t,()=>r=!0);return{text:A,diagnostics:t,changed:r}}rewriteMacroCallsOf(e,A,r,t,s){let i=new RegExp(String.raw`\b${A}\b\s*\(`,"g"),v="",c=0,B=null;for(;B=i.exec(e);){let p=B.index+B[0].length-1,b=xF(e,p);if(b<0)continue;let h=AB(e.slice(p+1,b),A,r,t);h&&(v+=e.slice(c,p+1)+h+")",c=b+1,s()),i.lastIndex=b+1}return v+=e.slice(c),v}stepError(e){return e<2?`STEP(${e}) is not a continuation step - step 1 is the IT() body itself, steps start at 2.`:this.currentIsMacroForm?`STEP(${e}) continues an IT("title"); an IT(id, "title") is continued by STEP(id,${e}).`:this.currentSlug?this.stepsOfCurrent.has(e)?`STEP(${e}) is already declared for this IT().`:null:`STEP(${e}) has no IT() before it - a step continues the most recent IT("title").`}checkStepTwoArg(e){let A=JC.exec(e);return!A||!A[1]?null:{line:null,diagnostics:[{level:"warning",message:"Remove the space after the comma in STEP(id, n) - pawncc pastes it into the public name."}]}}};function xB(x){let e="";for(let A=0;A<x.length;A++){let r=x[A];if(e)r==="\\"?A++:r===e&&(e="");else if(r==='"'||r==="'")e=r;else if(r==="/"&&x[A+1]==="/")return x.substring(0,A)}return x}function eB(x,e,A,r,t){let s=x.match(/^\s*/)?.[0]??"",i=x.trim();if(r.nativeNameArgs?.includes(e)&&eF(i))return{text:`${s}"${i}"`,changed:!0};let v=r.listArgs?.[e];if(v&&AF(i)){let c=v==="bytes"?rF(i):tF(i);return c.error?(t.push({level:"error",message:`${A}(): argument ${e} - ${c.error}`}),{text:x,changed:!1}):{text:`${s}"${c.packed}"`,changed:!0}}return{text:x,changed:!1}}function AB(x,e,A,r){let t=x.length?In(x):[],s=!1,i=t.map((v,c)=>{let B=eB(v,c+1,e,A,r);return s=s||B.changed,B.text});return s?i.join(","):null}function sF(x,e,A){let r=A.trim(),t=r?" "+r:"";return`${x}public ${e}()${t}`}var Bt=class{pragmaDynamic=null;dloFileSequencer=new Ct;constructor(){}get pragmaDynamicFlag(){return this.pragmaDynamic?`-S${this.pragmaDynamic}`:null}preCompileDloFile(e,A,r,t,s){this.dloFileSequencer.workspacePath=e;let i=[],v=t.path,c=!1,B=aF.Utils.basename(t);if(v.includes(o0.filePaths.studio.auto.dlo.path)){let P=B.substring(0,B.length-8);!["app","main"].includes(P)&&B.endsWith("-dde.inc")&&(c=R0.generateHashForLibraryName(P))}else if(v.includes(o0.filePaths.studio.libdeps)){let P=v.split("libdeps/")[1],[R]=P.split("/");["dlo-core"].includes(R)||(c=R0.generateHashForLibraryName(R))}else Z.isLibrary(r)&&(B.endsWith(".dlo")||v.includes("/dlo/examples/")||v.includes("/dlo/test/")?A.log("Skipping dde mangling for project file",B):c=R0.generateHashForLibraryName(r.name));if(v.endsWith(".auto/default.inc"))return{data:s.join(`
2761
+ Accepts a number or a relation link (\`@container.field\`).`,$ref:"#/$defs/relationLinkPattern"}}};var Ii=require("yaml");var Dr=require("yaml");var yn;(e=>e.CODE={ddeFieldLength:"field_name_length"})(yn||={});var Ax;(L=>{let x;(p0=>(p0.state="state",p0.result="result",p0.aloha="aloha",p0.volatile="volatile",p0.setting="setting",p0.command="command",p0.storage="storage",p0.relations="relations"))(x=L.DDEContainerName||={});let e;(B0=>(B0.configA="configA",B0.configB="configB",B0.configC="configC",B0.config0="config0",B0.config1="config1",B0.config2="config2",B0.config3="config3",B0.config4="config4",B0.config5="config5",B0.config6="config6",B0.config7="config7",B0.config8="config8",B0.config9="config9",B0.histdata0="histdata0",B0.histdata1="histdata1",B0.histdata2="histdata2",B0.histdata3="histdata3",B0.histdata4="histdata4",B0.histdata5="histdata5",B0.histdata6="histdata6",B0.histdata7="histdata7",B0.histdata8="histdata8",B0.histdata9="histdata9",B0.aloha="aloha",B0.alerts="alerts",B0.applog="applog"))(e=L.ContainerName||={});let A;(K=>(K.cx="cx",K.hx="hx",K.cb="cb",K.aloha="aloha",K.applog="applog"))(A=L.ContainerType||={});let r;(N0=>(N0.up="up",N0.down="down",N0.upPlus="up+",N0.downPlus="down+",N0.none="none",N0.backendOnly="backend-only",N0.deviceOnly="device-only",N0.both="both",N0.bothPlus="both+",N0.noneBackend="none-be"))(r=L.TransferDirection||={});function t(U,r0){return U==="cx"&&!["backend-only"].includes(r0)?"DDE_CID_CONFIG":U==="hx"?"DDE_CID_HISTDATA":U==="aloha"?"DDE_CID_ALOHA":null}L.CONTAINER_DEF_DLO_CID_BASE=t;let s=["up","up+","down","down+","both","none","both+","backend-only","device-only"],i=["up","up+","backend-only"];L.CONTAINER_DEFS={configA:{ctype:"cb",cnum:"a",alias:"",flds:"field",xmits:["backend-only"]},configB:{ctype:"cb",cnum:"b",alias:"",flds:"field",xmits:["backend-only"]},configC:{ctype:"cb",cnum:"c",alias:"",flds:"field",xmits:["backend-only"]},config0:{ctype:"cx",cnum:0,alias:"",flds:"field",xmits:s},config1:{ctype:"cx",cnum:1,alias:"",flds:"field",xmits:s},config2:{ctype:"cx",cnum:2,alias:"",flds:"field",xmits:s},config3:{ctype:"cx",cnum:3,alias:"",flds:"field",xmits:s},config4:{ctype:"cx",cnum:4,alias:"",flds:"field",xmits:s},config5:{ctype:"cx",cnum:5,alias:"",flds:"field",xmits:s},config6:{ctype:"cx",cnum:6,alias:"",flds:"field",xmits:s},config7:{ctype:"cx",cnum:7,alias:"",flds:"field",xmits:s},config8:{ctype:"cx",cnum:8,alias:"",flds:"field",xmits:s},config9:{ctype:"cx",cnum:9,alias:"",flds:"field",xmits:s},histdata0:{ctype:"hx",cnum:0,alias:"",flds:"ch",xmits:i},histdata1:{ctype:"hx",cnum:1,alias:"",flds:"ch",xmits:i},histdata2:{ctype:"hx",cnum:2,alias:"",flds:"ch",xmits:i},histdata3:{ctype:"hx",cnum:3,alias:"",flds:"ch",xmits:i},histdata4:{ctype:"hx",cnum:4,alias:"",flds:"ch",xmits:i},histdata5:{ctype:"hx",cnum:5,alias:"",flds:"ch",xmits:i},histdata6:{ctype:"hx",cnum:6,alias:"",flds:"ch",xmits:i},histdata7:{ctype:"hx",cnum:7,alias:"",flds:"ch",xmits:i},histdata8:{ctype:"hx",cnum:8,alias:"",flds:"ch",xmits:i},histdata9:{ctype:"hx",cnum:9,alias:"",flds:"ch",xmits:i},aloha:{ctype:"aloha",cnum:void 0,alias:"aloha",flds:null,xmits:["up","up+"]},alerts:{ctype:void 0,cnum:void 0,alias:"alerts",flds:null,xmits:["up"]},applog:{ctype:"applog",cnum:void 0,alias:"applog",flds:null,xmits:["up+"]}},L.HISTDATA_CONTAINER=["histdata0","histdata1","histdata2","histdata3","histdata4","histdata5","histdata6","histdata7","histdata8","histdata9"],L.CONFIG_CONTAINER=["config0","config1","config2","config3","config4","config5","config6","config7","config8","config9"],L.SERVER_CONTAINER=["configA","configB","configC"],L.regexRelation=/^(@[a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*(\[[^\]]+\])?(\.[a-zA-Z_][a-zA-Z0-9_]*)*|lib:[a-zA-Z0-9_-]+@[a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*(\[[^\]]+\])?(\.[a-zA-Z_][a-zA-Z0-9_]*)*)$/;let h=["astring","nstring","cstring","wstring","ustring"],w=["int8","int16","int32","int64","uint8","uint16","uint32","float16","float32","float64"];L.allowedRelationTypes={title:h,unit:h,chartMinimum:w,chartMaximum:w,scale:w,offset:w,decimalPlaces:["uint8","uint16","uint32","int8","int16","int32","int64"],channelMode:["uint8","uint16","uint32"],chartAlarmLow:w,chartAlarmHigh:w,chartWarningLow:w,chartWarningHigh:w,chartHysteresis:w,chartTriggerThreshold:w,chartTriggerRelation:w,chartSetPoint:w};function P(U,r0,Q){let x0=r0[U];if(x0!==void 0)if(L.regexRelation.exec(`${x0}`)){let f0=U==="chartSetPoint",[K,...a0]=x0.split("."),[,c0]=K.split("@"),p0=Object.values(Q.containers).find(dx=>dx.title===c0),b0=a0.join("."),N0=f0?";":"%",$0=(f0?"":"%")+(p0?.name||c0)+N0;if($0=$0+`${b0}`,f0){let dx=Q.setPointList[r0.name];$0=$0+`;actual_output_value_${dx}`}return $0}else return x0}L.parseXMLValueWithRelation=P;function R(U){let{bitmask:r0}=U;if(!r0)return;let Q="$",x0=r0.replaceAll(" ","");if(r0.startsWith("0x"))Q+=x0.substring(2);else if(x0.startsWith("0b")){let f0=x0.substring(2).replaceAll(" ","");Q+=parseInt(f0,2).toString(16).toUpperCase()}return Q}L.parseXMLBitmask=R;function N(U){return U.type==="binary"?U.defaultValue.substring(2):U.defaultValue==="NaN"?"NAN":U.defaultValue}L.parseXMLDefaultValue=N,L.TDEF_NUMBER={xmlOut(U,r0,Q){U.decpl=P("decimalPlaces",r0,Q),U.decpl===void 0&&(U.decpl=0),U.vscale=P("scale",r0,Q),U.vofs=P("offset",r0,Q),U.min=P("chartMinimum",r0,Q),U.max=P("chartMaximum",r0,Q)}};let W={isBlob:1,xmlOut(U,r0){U.max=r0.byteSize}},s0={xmlOut(U){U.decpl=-1,U.param0="local",U.units="UTC"}};L.TYPE_DEFS={u8:{dde:"uint8",dim:1,len:1,...L.TDEF_NUMBER,rdef:1,xml:{type:"u8"},pwn:{rwfunc:"u8",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},u16:{dde:"uint16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"u16"},pwn:{rwfunc:"u16",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},u32:{dde:"uint32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"u32"},pwn:{rwfunc:"u32",htype:"s32",printf:"%d"},openApi:{type:"number",minimum:0}},s8:{dde:"int8",dim:1,len:1,...L.TDEF_NUMBER,rdef:1,xml:{type:"s8"},pwn:{rwfunc:"s8",htype:"s32",printf:"%d"},openApi:{type:"number"}},s16:{dde:"int16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"s16"},pwn:{rwfunc:"s16",htype:"s32",printf:"%d"},openApi:{type:"number"}},s32:{dde:"int32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"s32"},pwn:{rwfunc:"s32",printf:"%d"},openApi:{type:"number"}},s64:{dde:"int64",dim:0,len:8,...L.TDEF_NUMBER,rdef:1,xml:{type:"s64"},pwn:{rwfunc:"s64",rwp:"%n{%l}",htype:"{%l}",printf:"%d"},openApi:{type:"number"}},f16:{dde:"float16",dim:1,len:2,...L.TDEF_NUMBER,rdef:1,xml:{type:"floatm16"},pwn:{rwfunc:"f16",rwp:"Float:%n",htype:"f32",printf:"%f"},openApi:{type:"number"}},f32:{dde:"float32",dim:1,len:4,...L.TDEF_NUMBER,rdef:1,xml:{type:"f32"},pwn:{rwfunc:"f32",rwp:"Float:%n",printf:"%f"},openApi:{type:"number"}},f64:{dde:"float64",dim:0,len:8,...L.TDEF_NUMBER,rdef:0,xml:{type:"f64"},pwn:{rwfunc:"f64",rwp:"%n{%l}",htype:"{%l}",printf:"%f"},openApi:{type:"number"}},stamp32:{dde:"stamp32",dim:1,len:4,...s0,rdef:0,xml:{type:"stamp4"},pwn:{rwfunc:"stamp32",printf:"%s",printfFormat:"stampToISOString"},openApi:{type:"string",format:"YYYYMMDDhhmmssSSS",description:"UTC"}},stamp40:{dde:"stamp40",dim:0,len:5,...s0,rdef:0,xml:{type:"stamp"},pwn:{rwfunc:"stamp40",rwp:"%n{%l}",htype:"{%l}",printf:"%s",printfFormat:"stampToISOString"},openApi:{type:"string",format:"YYYYMMDDhhmmssSSS",description:"UTC"}},bin:{dde:"binary",dim:0,...W,rdef:0,lenUnits:"byte",xml:{type:"string",editmask:"%HEX%"},pwn:{rwfunc:"bin",rwlen:1,rwp:"%n{%l}",htype:"{%l}",printf:null,printfFormat:"memtostr"},openApi:{type:"string",description:"HEX string"}},astr:{dde:"astring",dim:0,...W,rdef:1,lenUnits:"char",xml:{type:"string",param1:"nocodepage"},pwn:{rwfunc:"astr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},nstr:{dde:"nstring",dim:0,...W,rdef:1,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"nstr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},wstr:{dde:"wstring",dim:0,...W,rdef:1,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"wstr",rwlen:1,rwp:"%n[%l+1]",htype:"[%l+1]",printf:"%s"},openApi:{type:"string"}},ustr:{dde:"ustring",dim:0,...W,rdef:0,lenUnits:"byte",xml:{type:"string"},pwn:{rwfunc:"ustr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},cstr:{dde:"cstring",dim:0,...W,rdef:1,lenUnits:"char",xml:{type:"string",editmask:"%HEX%"},pwn:{rwfunc:"cstr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}",printf:"%s"},openApi:{type:"string"}},_siteref:{dim:0,len:80,rdef:0,xml:{type:"string",max:"80",editmask:"%QUERY%all_sites;-name;!id;class;name;%EMPTY%"},pwn:{rwfunc:"astr",rwlen:1,rwp:"%n{%l+1}",htype:"{%l+1}"},js:{rwfunc:"String"}}},L.fieldTypeDefinitions={uint8:L.TYPE_DEFS.u8,uint16:L.TYPE_DEFS.u16,uint32:L.TYPE_DEFS.u32,int8:L.TYPE_DEFS.s8,int16:L.TYPE_DEFS.s16,int32:L.TYPE_DEFS.s32,int64:L.TYPE_DEFS.s64,float16:L.TYPE_DEFS.f16,float32:L.TYPE_DEFS.f32,float64:L.TYPE_DEFS.f64,stamp32:L.TYPE_DEFS.stamp32,stamp40:L.TYPE_DEFS.stamp40,binary:L.TYPE_DEFS.bin,astring:L.TYPE_DEFS.astr,nstring:L.TYPE_DEFS.nstr,wstring:L.TYPE_DEFS.wstr,ustring:L.TYPE_DEFS.ustr,cstring:L.TYPE_DEFS.cstr};let G=["_id","id","_stamp","stamp","tag","_uid","customer_id","site_id","_rec_flags__","applog"];function V(U){let r0=U.toLowerCase();return G.includes(r0)||/^field\d+$/.test(r0)||/^ch\d+$/.test(r0)}L.checkForReservedFieldName=V;function Y(U){return!!U.fields.find(r0=>r0.library===null&&r0.type!=="shadow")}L.hasContainerAppFields=Y})(Ax||={});var ct={DP_registry_sz:1024,DP_config_sz:4e3,DP_histdata_sz:1024,DP_DISPLAY_CNT:0,DP_LED_CNT:0,DP_BUTTON_CNT:0,DP_GPIO_CNT:0,DP_IRQ_CNT:0,DP_DIGOUT_CNT:0,DP_UIN_CNT:0,DP_TEMP_CNT:0,DP_I2C_CNT:0,DP_SPI_CNT:0,DP_UART_CNT:0,DP_RS485_CNT:0,DP_RS232_CNT:0,DP_WIFI_CNT:0,DP_BLE_CNT:0,DP_LORA_CNT:0,DP_NBIOT_CNT:0},As={max_size:1e5,max_fields:1e3},bA={max_size:4e3,max_fields:1e3},eA={max_size:1024,max_fields:1e3},Et={configA:As,configB:As,configC:As,config0:bA,config1:bA,config2:bA,config3:bA,config4:bA,config5:bA,config6:bA,config7:bA,config8:bA,config9:bA,histdata0:eA,histdata1:eA,histdata2:eA,histdata3:eA,histdata4:eA,histdata5:eA,histdata6:eA,histdata7:eA,histdata8:eA,histdata9:eA,aloha:{...eA,warn_fields:10},alerts:{max_size:13,max_fields:0,exact_match:!0},applog:{max_size:125,max_fields:0,exact_match:!1}},rs={m22x:{name:"M22x",dpid:"m22x",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M M2 HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:64*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:6,DP_IRQ_CNT:2,DP_I2C_CNT:1,DP_SPI_CNT:1,DP_UART_CNT:2,DP_WIFI_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m23x:{name:"M23x",dpid:"m23x",interface:{type:"usb",filter:{vendorId:1155},fileChunk:4096},usb_ids:["rapidM2M M23 HW2.0","rapidM2M M23 HW1.0"],alt_ids:[],generation:"M23",prog_mem:8*1024*1024,data_mem:8*1024*1024,total_mem:8*1024*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:6,DP_IRQ_CNT:2,DP_I2C_CNT:1,DP_SPI_CNT:1,DP_UART_CNT:1,DP_WIFI_CNT:1},usbcaps:{dbgItfMayHangFixed:"99v999"},dlo:{compileRestrictions:{}}},nrf91:{name:"NRF91",dpid:"nrf91",interface:{type:"usb",filter:{vendorId:9540},fileChunk:2048},usb_ids:["rapidM2M NRF91 HW1.0","ONE NRF91 HW1.0","rapidM2M Evolve HW1.0"],alt_ids:[],generation:"NRF91",prog_mem:256*1024,data_mem:64*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_GPIO_CNT:32,DP_IRQ_CNT:6,DP_I2C_CNT:2,DP_SPI_CNT:2,DP_UART_CNT:2,DP_AIN_CNT:8,DP_PWM_CNT:3},usbcaps:{}},m2blegw:{name:"BLE Gateway",dpid:"m2blegw",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M BLEGW HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_DISPLAY_CNT:1,DP_DISPLAY_TYPE:"xc",DP_BUTTON_CNT:1,DP_BLE_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m2easyv3:{name:"myDatalogEasy V3",dpid:"m2easyv3",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M Easy HW3.0"],alt_ids:["rapidM2M EasyIoT HW1.0","rapidM2M M220 HW1.0"],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_BUTTON_CNT:1,DP_DIGOUT_CNT:1,DP_UIN_CNT:4,DP_TEMP_CNT:1,DP_RS485_CNT:1,DP_RS232_CNT:1,DP_BLE_CNT:1,DP_LORA_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}},m2easyiot:{name:"myDatalogEasy IoT",dpid:"m2easyiot",interface:{type:"usb",filter:{vendorId:9540},fileChunk:4096},usb_ids:["rapidM2M EasyIoT HW1.0"],alt_ids:[],generation:"M2",prog_mem:256*1024,data_mem:256*1024,total_mem:256*1024,hw_reqd:!1,dde:Et,auto_inc:{...ct,DP_LED_CNT:1,DP_BUTTON_CNT:1,DP_DIGOUT_CNT:1,DP_UIN_CNT:4,DP_TEMP_CNT:1,DP_RS485_CNT:1,DP_RS232_CNT:1,DP_BLE_CNT:1,DP_LORA_CNT:1},usbcaps:{},dlo:{compileRestrictions:{"-z":0}}}};var ts=require("vscode-uri");var Ct=class{dloFileMap={};rootUri=ts.URI.parse("");constructor(){}set workspacePath(e){this.rootUri=e}getSequenceForFile(e){let A=e.substring(this.rootUri.path.length||0);if(this.rootUri.scheme!=="file"){let t=this.rootUri.toString();A=e.substring(t.length+1)}if(Object.hasOwn(this.dloFileMap,A))return this.dloFileMap[A];let r=R0.generateHashForFilePath(A);return this.dloFileMap[A]=r,r}getFilePathForSequence(e){let A=Object.entries(this.dloFileMap).find(([,r])=>r===e);return A?ts.URI.parse(`${this.rootUri.path}${A[0]}`).path:null}};var aF=require("vscode-uri");function ns(x){return x.replace(/\\/g,"/").split("/").pop()??""}function lr(x){return/\.spec\.dlo$/i.test(ns(x))}function qt(x,e){let A=ns(x);if(!A)return!1;if(lr(A))return!0;let r=e?.dlo?.mainFile;return r?ns(r)===A:A==="main.dlo"}var jC=/^\s*#define\s+TEST_OWN_MAIN\b/m;function hC(x){return jC.test(x)}function kn(x,e){if(!lr(x))return[];let A=["DLO_TEST_SPEC=1"];return e!==void 0&&hC(e)&&A.push("TEST_OWN_MAIN=1"),A}var Mt="__it_";var _n=31-Mt.length-4;function Qo(x){return x.replace(/^_+/,"").replace(/_+$/,"")}function wn(x,e=_n){let A=Qo(x.toLowerCase().replace(/[^a-zA-Z0-9_]+/g,"_"));return Qo(A.substring(0,Math.max(0,e)))}function Sn(x,e){let A=wn(x);if(!A||!e.has(A))return A;for(let r=2;;r++){let t=`_${r}`,s=`${wn(x,_n-t.length)}${t}`;if(!e.has(s))return s}}function Tn(x){return`${Mt}${x}`}function $t(x,e){return`${Mt}${x}__${e}`}function Rn(x,e){return`// @it ${x} "${e}"`}var Zo=/\/\/\s*@it\s+([A-Za-z0-9_]+)\s+"((?:[^"\\]|\\.)*)"/;var Pn=class{quote="";step(e,A){let r=e[A];return this.quote?r==="\\"&&A+1<e.length?{insideString:!0,nextIndex:A+2}:(this.quote=r===this.quote?"":this.quote,{insideString:!0,nextIndex:A+1}):r==='"'||r==="'"?(this.quote=r,{insideString:!0,nextIndex:A+1}):{insideString:!1,nextIndex:A+1}}};function xF(x,e){let A=new Pn,r=0;for(let t=e;t<x.length;){let{insideString:s,nextIndex:i}=A.step(x,t);if(!s){if(x[t]==="(")r++;else if(x[t]===")"&&--r===0)return t}t=i}return-1}function In(x){let e=new Pn,A=[],r=0,t="";for(let s=0;s<x.length;){let{insideString:i,nextIndex:v}=e.step(x,s),c=x[s];!i&&c===","&&r===0?(A.push(t),t=""):(!i&&(c==="("||c==="{")?r++:!i&&(c===")"||c==="}")&&r--,t+=x.slice(s,v)),s=v}return A.push(t),A}var yC=/^[A-Za-z_@][A-Za-z0-9_@]*$/;function eF(x){return yC.test(x.trim())}function AF(x){return/^\{[\s\S]*\}$/.test(x.trim())}var kC=/^(?:0[xX][0-9a-fA-F]+|\d+|xx)$/;function rF(x){let e=x.trim().slice(1,-1).trim();if(!e)return{error:"an empty byte list {} is not valid"};let A=[];for(let r of In(e)){let t=r.trim();if(!kC.test(t))return{error:`"${t}" is not a byte literal (decimal, 0x hex, or xx)`};if(t==="xx"){A.push("xx");continue}let s=t.startsWith("0x")||t.startsWith("0X")?parseInt(t,16):parseInt(t,10);if(s>255)return{error:`${t} is out of range 0..255 for a byte list`};A.push(s.toString(16).toUpperCase().padStart(2,"0"))}return{packed:A.join("")}}function tF(x){let e=x.trim().slice(1,-1).trim();if(!e)return{error:"an empty list {} is not valid"};let A=[];for(let r of In(e)){let t=r.trim();if(!/^-?(?:0[xX][0-9a-fA-F]+|\d+)$/.test(t))return{error:`"${t}" is not an integer literal`};let s=t.startsWith("-"),i=s?t.substring(1):t,v=(i.startsWith("0x")||i.startsWith("0X")?parseInt(i,16):parseInt(i,10))*(s?-1:1);A.push(v.toString(10))}return{packed:A.join("|")}}var wC=/^(?:\s*#options\s+)(.*)(?:\s*)$/,_C=/^(?:\s*#preinclude\s+)(.*)(?:\s*)$/,SC=/^(?:\s*#ifdef\s+)(.*)$/,TC=/^(?:\s*#ifndef\s+)(.*)$/,RC=/^(?:\s*#elseifdef\s+)(.*)$/,PC=/^(?:\s*#elseifndef\s+)(.*)$/,oF=/^(\s*)(?:#callback\s+)(\w*)(?:\s*\(\s*)(.*?)(?:\s*\)\s*)(\{*){1}(?:\s*)$/,FF=/^(.*)(^|\s+)(?:assert\s*\(\s*)(.*?)(?:\s*,\s*)(.*?)(?:\s*\)\s*;*\s*)$/,vF=/^(.*)(^|\s+)(?:assert\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,fF=/^(.*)(^|\s+)(?:assert\s*\(\s*\);*\s*)$/,lF=/^(.*)(^|\s+)(?:catch\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,IC=/^\s*#include\s*</,OC=/^\s*#endinput\s*/,NC=/^\s*#pragma\s+dynamic\s+(\S+)\s*(\/\/.*|\/\*.*|)$/,cF=/^(.*)(^|\s+)(?:applog(|_ok|_warning|_alarm|_debug|_fatal)\s*\(\s*)(.*?)(?:\s*,\s*)(.*?)(?:\s*\)\s*;*\s*)$/,EF=/^(.*)(^|\s*)(?:applog(|_ok|_warning|_alarm|_debug|_fatal)\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/;function nF(x,e=""){let A=" ",r=x;return e.length?A={fatal:"\xA7",alarm:"!",warning:"?",debug:"~",ok:"$"}[e]||null:["!","?","~","$","\xA7"].includes(x.substring(1,1))&&(A=x.substring(1,1),r=`"${x.substring(2,x.length-1)}"`),{priority:`'${A}'`,code:r}}var CF=/^(.*)(^|\s+)(?:log(|_debug|_info|_warn|_error)\s*\(\s*)(.*?)(?:\s*\)\s*;*\s*)$/,BF=(t=>(t[t.debug=0]="debug",t[t.info=1]="info",t[t.warn=2]="warn",t[t.error=3]="error",t))(BF||{}),qC=/^(.*)(^|\s*)DDE_(state|result|aloha|volatile|setting|command)_/,MC=/^(.*)(^|\s*)onUplink(Restore|Apply)_(state|result|aloha|volatile|setting|command)/,$C=/^(.*)(^|\s*)onUplinkEvent/,LC=/(?:^|\s)(?:assert|catch|applog(?:_ok|_warning|_alarm|_debug|_fatal)?|log(?:_debug|_info|_warn|_error)?)\s*\(/,GC=/^\s*#callback\s+\w+\s*\(/;function iF(x){let e=0,A=!1,r="";for(let t=0;t<x.length;t++){let s=x[t];if(A){if(s==="\\"){t++;continue}s===r&&(A=!1);continue}if(s==='"'||s==="'"){A=!0,r=s;continue}s==="("?e++:s===")"&&e--}return e}function dF(x){return oF.test(x)||fF.test(x)||FF.test(x)||vF.test(x)||lF.test(x)||cF.test(x)||EF.test(x)||CF.test(x)}function UC(x,e,A){if(!(LC.test(A)||GC.test(A)))return null;let t=iF(A);if(t<=0)return null;let s=t,i=[x[e]],v=[A],c=e+1,B=100;for(;s>0&&c<x.length&&c-e<B;){let h=x[c],w=h.split("//",1)[0];i.push(h),v.push(w),s+=iF(w),c++}if(i.length<=1||s>0)return null;let p=i.map((h,w)=>w===0?h:h.trim()).join(" "),b=v.map((h,w)=>w===0?h:h.trim()).join(" ");return dF(b)?{joinedOriginal:p,joinedStripped:b,extraLineCount:i.length-1}:null}var uF=String.raw`[A-Za-z_@][A-Za-z0-9_@]*`,DF=String.raw`"((?:[^"\\]|\\.)*)"`,HC=new RegExp(String.raw`^(\s*)IT\s*\(\s*${DF}\s*\)(.*)$`),KC=new RegExp(String.raw`^\s*IT\s*\(\s*${uF}\s*,\s*${DF}\s*\)`),WC=/^(\s*)STEP\s*\(\s*(\d+)\s*\)(.*)$/,JC=new RegExp(String.raw`^\s*STEP\s*\(\s*${uF}\s*,(\s*)\d+\s*\)`),zC=/^(\s*)AFTER_LOOP\b(.*)$/,VC=/\b(?:RUN_LOOP|RUN_LOOP_SEC|MOCK_DELIVER|MOCK_DELIVER_SEC|MOCK_DELIVER_IMMEDIATES)\s*\(/,XC=/^\s*DESCRIBE\s*\(/,YC=/^(\s*)TEST_SETUP\s*\(\s*\)(.*)$/,QC=/^(\s*)TEST_TEARDOWN\s*\(\s*\)(.*)$/,ZC={MOCK_RETURN:{nativeNameArgs:[1]},MOCK_RETURN_SEQ:{nativeNameArgs:[1],listArgs:{2:"ints"}},MOCK_RETURN_SEQ_STRICT:{nativeNameArgs:[1],listArgs:{2:"ints"}},MOCK_BYTES:{nativeNameArgs:[1],listArgs:{3:"bytes"}},MOCK_BYTES_RET:{nativeNameArgs:[1],listArgs:{3:"bytes"}},MOCK_SEQ:{nativeNameArgs:[1]},MOCK_SEQ_STRICT:{nativeNameArgs:[1]},MOCK_REG:{nativeNameArgs:[1],listArgs:{4:"bytes"}},MOCK_REG_MASKED:{nativeNameArgs:[1],listArgs:{5:"bytes"}},MOCK_REG_RW:{nativeNameArgs:[1]},MOCK_RESET:{nativeNameArgs:[1]},EXPECT_CALLED:{nativeNameArgs:[1]},EXPECT_ARG_INT:{nativeNameArgs:[1]},EXPECT_ARG_BYTES:{nativeNameArgs:[1],listArgs:{4:"bytes"}},EXPECT_REG:{nativeNameArgs:[1]},EXPECT_REG_WRITES:{nativeNameArgs:[1]},EXPECT_CALL_ORDER:{nativeNameArgs:[1,3]},EXPECT_RECORD_BYTES:{listArgs:{2:"bytes"}}},is=class{slugs=new Set;stepsOfCurrent=new Set;currentSlug=null;currentIsMacroForm=!1;sawLoopAdvance=!1;describeCount=0;sawFileWideSetup=!1;sawFileWideTeardown=!1;setupSeenForGroup=new Set;teardownSeenForGroup=new Set;rewrite(e){let A=xB(e),r=e.substring(A.length);return VC.test(A)&&(this.sawLoopAdvance=!0),XC.test(A)&&this.describeCount++,this.rewriteIt(A,r)??this.rewriteAfterLoop(A,r)??this.rewriteStep(A,r)??this.rewriteTestSetup(A,r)??this.rewriteTestTeardown(A,r)??this.rewriteMacroArgs(A,r)}finishDeclaration(e,A,r,t,s,i){let{text:v,diagnostics:c}=this.applyMacroArgRewrite(r),B=t?`${sF(e,A,v)} ${t}`:sF(e,A,v);return{line:s?`${B} ${s}`:B,diagnostics:[...i,...c]}}rewriteIt(e,A){let r=HC.exec(e);if(!r)return this.checkItTwoArg(e);let[,t,s,i]=r,v=Sn(s,this.slugs);return v?(this.slugs.add(v),this.currentSlug=v,this.currentIsMacroForm=!1,this.stepsOfCurrent.clear(),this.sawLoopAdvance=!1,this.finishDeclaration(t,Tn(v),i,Rn(v,s),A,[])):{line:null,diagnostics:[{level:"error",message:`IT("${s}") has no name to generate: a title needs at least one letter, digit or underscore, or use the IT(id, "title") form.`}]}}checkItTwoArg(e){let A=KC.exec(e);return!A||(this.currentSlug=null,this.currentIsMacroForm=!0,this.stepsOfCurrent.clear(),this.sawLoopAdvance=!1,!A[1].includes(","))?null:{line:null,diagnostics:[{level:"warning",message:`A comma in an IT() title splits the macro argument - write it as IT("${A[1]}") without an id, or drop the comma.`}]}}rewriteStep(e,A){let r=WC.exec(e);if(!r)return this.checkStepTwoArg(e);let[,t,s,i]=r,v=Number(s),c=this.stepError(v);return c?{line:null,diagnostics:[{level:"error",message:c}]}:(this.stepsOfCurrent.add(v),this.sawLoopAdvance=!1,this.finishDeclaration(t,$t(this.currentSlug,v),i,null,A,[]))}rewriteAfterLoop(e,A){let r=zC.exec(e);if(!r)return null;let[,t,s]=r;if(this.currentIsMacroForm)return{line:null,diagnostics:[{level:"error",message:'AFTER_LOOP continues an IT("title"); an IT(id, "title") is continued by STEP(id,n).'}]};if(!this.currentSlug)return{line:null,diagnostics:[{level:"error",message:'AFTER_LOOP has no IT() before it - it continues the most recent IT("title") after the firmware main loop ran.'}]};let i=this.sawLoopAdvance,v=this.stepsOfCurrent.size?Math.max(...this.stepsOfCurrent)+1:2;this.stepsOfCurrent.add(v),this.sawLoopAdvance=!1;let c=[];return i||c.push({level:"warning",message:"AFTER_LOOP splits the test but the block before it never let the main loop run - add RUN_LOOP(ms) at its end, or merge the blocks"}),this.finishDeclaration(t,$t(this.currentSlug,v),s,null,A,c)}rewriteTestSetup(e,A){let r=YC.exec(e);if(!r)return null;let[,t,s]=r;if(this.describeCount===0)return this.sawFileWideSetup?{line:null,diagnostics:[{level:"error",message:"TEST_SETUP() is already declared for this spec."}]}:(this.sawFileWideSetup=!0,null);let i=this.describeCount;if(this.setupSeenForGroup.has(i))return{line:null,diagnostics:[{level:"error",message:"TEST_SETUP() is already declared for this DESCRIBE group."}]};this.setupSeenForGroup.add(i);let v=`__tsetup_${i}`;return this.finishDeclaration(t,v,s,`// @setup ${i}`,A,[])}rewriteTestTeardown(e,A){let r=QC.exec(e);if(!r)return null;let[,t,s]=r;if(this.describeCount===0)return this.sawFileWideTeardown?{line:null,diagnostics:[{level:"error",message:"TEST_TEARDOWN() is already declared for this spec."}]}:(this.sawFileWideTeardown=!0,null);let i=this.describeCount;if(this.teardownSeenForGroup.has(i))return{line:null,diagnostics:[{level:"error",message:"TEST_TEARDOWN() is already declared for this DESCRIBE group."}]};this.teardownSeenForGroup.add(i);let v=`__tteardown_${i}`;return this.finishDeclaration(t,v,s,`// @teardown ${i}`,A,[])}rewriteMacroArgs(e,A){let{text:r,diagnostics:t,changed:s}=this.applyMacroArgRewrite(e);return s?{line:r+A,diagnostics:t}:t.length?{line:null,diagnostics:t}:null}applyMacroArgRewrite(e){let A=e,r=!1,t=[];for(let[s,i]of Object.entries(ZC))A=this.rewriteMacroCallsOf(A,s,i,t,()=>r=!0);return{text:A,diagnostics:t,changed:r}}rewriteMacroCallsOf(e,A,r,t,s){let i=new RegExp(String.raw`\b${A}\b\s*\(`,"g"),v="",c=0,B=null;for(;B=i.exec(e);){let p=B.index+B[0].length-1,b=xF(e,p);if(b<0)continue;let h=AB(e.slice(p+1,b),A,r,t);h&&(v+=e.slice(c,p+1)+h+")",c=b+1,s()),i.lastIndex=b+1}return v+=e.slice(c),v}stepError(e){return e<2?`STEP(${e}) is not a continuation step - step 1 is the IT() body itself, steps start at 2.`:this.currentIsMacroForm?`STEP(${e}) continues an IT("title"); an IT(id, "title") is continued by STEP(id,${e}).`:this.currentSlug?this.stepsOfCurrent.has(e)?`STEP(${e}) is already declared for this IT().`:null:`STEP(${e}) has no IT() before it - a step continues the most recent IT("title").`}checkStepTwoArg(e){let A=JC.exec(e);return!A||!A[1]?null:{line:null,diagnostics:[{level:"warning",message:"Remove the space after the comma in STEP(id, n) - pawncc pastes it into the public name."}]}}};function xB(x){let e="";for(let A=0;A<x.length;A++){let r=x[A];if(e)r==="\\"?A++:r===e&&(e="");else if(r==='"'||r==="'")e=r;else if(r==="/"&&x[A+1]==="/")return x.substring(0,A)}return x}function eB(x,e,A,r,t){let s=x.match(/^\s*/)?.[0]??"",i=x.trim();if(r.nativeNameArgs?.includes(e)&&eF(i))return{text:`${s}"${i}"`,changed:!0};let v=r.listArgs?.[e];if(v&&AF(i)){let c=v==="bytes"?rF(i):tF(i);return c.error?(t.push({level:"error",message:`${A}(): argument ${e} - ${c.error}`}),{text:x,changed:!1}):{text:`${s}"${c.packed}"`,changed:!0}}return{text:x,changed:!1}}function AB(x,e,A,r){let t=x.length?In(x):[],s=!1,i=t.map((v,c)=>{let B=eB(v,c+1,e,A,r);return s=s||B.changed,B.text});return s?i.join(","):null}function sF(x,e,A){let r=A.trim(),t=r?" "+r:"";return`${x}public ${e}()${t}`}var Bt=class{pragmaDynamic=null;dloFileSequencer=new Ct;constructor(){}get pragmaDynamicFlag(){return this.pragmaDynamic?`-S${this.pragmaDynamic}`:null}preCompileDloFile(e,A,r,t,s){this.dloFileSequencer.workspacePath=e;let i=[],v=t.path,c=!1,B=aF.Utils.basename(t);if(v.includes(o0.filePaths.studio.auto.dlo.path)){let P=B.substring(0,B.length-8);!["app","main"].includes(P)&&B.endsWith("-dde.inc")&&(c=R0.generateHashForLibraryName(P))}else if(v.includes(o0.filePaths.studio.libdeps)){let P=v.split("libdeps/")[1],[R]=P.split("/");["dlo-core"].includes(R)||(c=R0.generateHashForLibraryName(R))}else Z.isLibrary(r)&&(B.endsWith(".dlo")||v.includes("/dlo/examples/")||v.includes("/dlo/test/")?A.log("Skipping dde mangling for project file",B):c=R0.generateHashForLibraryName(r.name));if(v.endsWith(".auto/default.inc"))return{data:s.join(`
2762
2762
  `),diagnostics:i};let p=[],b=lr(v)?new is:null,h=this.dloFileSequencer.getSequenceForFile(v);p.push(`stock static __file{} = "${h}";`),p.push(`stock static __refid{} = "${h}";`),p.push('stock static __applog_src_id{} = "A\\0\\0\\0\\0\\0\\0\\0";'),p.push("#line 0");let k=0;for(let P=0;P<s.length;P++){let R=s[P],N=R.split("//",1)[0],O=null,W=0;if(!dF(N)){let M=UC(s,P,N);M&&(R=M.joinedOriginal,N=M.joinedStripped,W=M.extraLineCount)}let s0=b?.rewrite(R)??null;for(let M of s0?.diagnostics??[])i.push({file:t,level:M.level,line:P,message:M.message});if(s0?.line!==null&&s0?.line!==void 0)R=s0.line;else if(O=wC.exec(N))R="// "+R,i.push({file:t,level:"error",line:P,message:"#options is not supported here. Use the DLO settings instead."});else if(O=_C.exec(N))R="// "+R,i.push({file:t,level:"error",line:P,message:"#preinclude is not supported here. Use the DLO settings instead."});else if(O=NC.exec(N)){let M=Number(O[1].startsWith("(")?O[1].substring(1,O[1].length-1):O[1]);!Number.isInteger(M)||M<64?i.push({file:t,level:"error",line:P,message:"#pragma dynamic only supports integer values and must be greater than 63"}):(!this.pragmaDynamic||M>this.pragmaDynamic)&&(this.pragmaDynamic=M)}else if(O=SC.exec(N))R=R.replace("#ifdef ","#if defined ");else if(O=TC.exec(N))R=R.replace("#ifndef ","#if !defined ");else if(O=RC.exec(N))R=R.replace("#elseifdef ","#elseif defined ");else if(O=PC.exec(N))R=R.replace("#elseifndef ","#elseif !defined ");else if(O=oF.exec(N)){let[,M,y,G,V]=O;R=`${M}#define ${y} _catch_funcidx( "___${y}")
2763
2763
  forward ___${y}( ${G});
2764
2764
  #line