opensteer 0.9.6 → 0.9.7
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/{chunk-BVRIPCWA.js → chunk-3OHKIPBD.js} +316 -465
- package/dist/chunk-3OHKIPBD.js.map +1 -0
- package/dist/{chunk-L4NF74KI.js → chunk-52UNH5UW.js} +5 -5
- package/dist/{chunk-L4NF74KI.js.map → chunk-52UNH5UW.js.map} +1 -1
- package/dist/{chunk-3XBQRZZC.js → chunk-PJXN7HED.js} +115 -14
- package/dist/chunk-PJXN7HED.js.map +1 -0
- package/dist/{chunk-3I3A5OLB.js → chunk-R33BXCMQ.js} +16 -7
- package/dist/chunk-R33BXCMQ.js.map +1 -0
- package/dist/{chunk-T5P2QGZ3.js → chunk-U4BUCIZ4.js} +153 -12
- package/dist/chunk-U4BUCIZ4.js.map +1 -0
- package/dist/cli/bin.cjs +663 -544
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.js +66 -50
- package/dist/cli/bin.js.map +1 -1
- package/dist/index.cjs +584 -495
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -50
- package/dist/index.d.ts +26 -50
- package/dist/index.js +4 -4
- package/dist/local-view/public/assets/app.js +10 -1
- package/dist/local-view/serve-entry.cjs +687 -494
- package/dist/local-view/serve-entry.cjs.map +1 -1
- package/dist/local-view/serve-entry.js +2 -2
- package/dist/opensteer-CY2QUJEG.js +6 -0
- package/dist/{opensteer-UGA6YBRN.js.map → opensteer-CY2QUJEG.js.map} +1 -1
- package/dist/{session-control-U3L5H2ZI.js → session-control-FIP6ZJLH.js} +4 -4
- package/dist/{session-control-U3L5H2ZI.js.map → session-control-FIP6ZJLH.js.map} +1 -1
- package/package.json +7 -7
- package/dist/chunk-3I3A5OLB.js.map +0 -1
- package/dist/chunk-3XBQRZZC.js.map +0 -1
- package/dist/chunk-BVRIPCWA.js.map +0 -1
- package/dist/chunk-T5P2QGZ3.js.map +0 -1
- package/dist/opensteer-UGA6YBRN.js +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/local-browser/browser-brands.ts","../src/local-browser/chrome-discovery.ts","../src/local-browser/cdp-discovery.ts","../../runtime-core/src/json.ts","../../runtime-core/src/internal/filesystem.ts","../src/live-session.ts","../src/local-view/runtime-dir.ts","../src/local-view/session-manifest.ts","../src/local-browser/process-owner.ts","../src/local-view/service-state.ts"],"names":["join","existsSync","resolve","execFileSync","path","rm","homedir","createHash","PROCESS_LIST_MAX_BUFFER_BYTES","PS_COMMAND_ENV","isProcessRunning","readFile"],"mappings":";;;;;;;;;;;;;;;CAOuB,EAAE,GAAG,OAAA,CAAQ,GAAiB;AACrD,IAAM,qBAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,mBAAA;AAC1D,IAAM,yBAAA,GAA4B,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,yBAAA;AAkCtE,IAAM,cAAA,GAAgD;AAAA,EACpD;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,8DAA8D,CAAA;AAAA,MACrF,WAAA,EAAa,6CAAA;AAAA,MACb,QAAA,EAAU,mBAAA;AAAA,MACV,YAAA,EAAc,CAAC,8DAA8D;AAAA,KAC/E;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,CAAK,qBAAA,EAAuB,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY,CAAA;AAAA,QAC3E,IAAA,CAAK,yBAAA,EAA2B,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY,CAAA;AAAA,QAC/E,KAAK,GAAA,EAAK,SAAA,EAAW,SAAS,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY;AAAA,OAC/E;AAAA,MACA,WAAA,EAAa,yCAAA;AAAA,MACb,YAAA,EAAc,CAAC,uCAAuC;AAAA,KACxD;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,wBAAA;AAAA,QACA,+BAAA;AAAA,QACA,2BAAA;AAAA,QACA,sBAAsB,eAAe,CAAA;AAAA,QACrC,sBAAsB,sBAAsB;AAAA,OAC9C;AAAA,MACA,WAAA,EAAa,yBAAA;AAAA,MACb,YAAA,EAAc,CAAC,gBAAA,EAAkB,uBAAA,EAAyB,2BAA2B;AAAA;AACvF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,WAAA,EAAa,sBAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB;AAAA,QACpB;AAAA,OACF;AAAA,MACA,WAAA,EAAa,oDAAA;AAAA,MACb,QAAA,EAAU,0BAAA;AAAA,MACV,YAAA,EAAc,CAAC,4EAA4E;AAAA,KAC7F;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,KAAK,GAAA,EAAK,SAAA,EAAW,SAAS,QAAA,EAAU,YAAA,EAAc,eAAe,YAAY;AAAA,OACnF;AAAA,MACA,WAAA,EAAa,6CAAA;AAAA,MACb,YAAA,EAAc,CAAC,2CAA2C;AAAA;AAC5D,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,gEAAgE,CAAA;AAAA,MACvF,WAAA,EAAa,8CAAA;AAAA,MACb,QAAA,EAAU,uBAAA;AAAA,MACV,YAAA,EAAc,CAAC,gEAAgE;AAAA,KACjF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,CAAK,qBAAA,EAAuB,WAAA,EAAa,MAAA,EAAQ,eAAe,YAAY,CAAA;AAAA,QAC5E,IAAA,CAAK,yBAAA,EAA2B,WAAA,EAAa,MAAA,EAAQ,eAAe,YAAY,CAAA;AAAA,QAChF,KAAK,GAAA,EAAK,SAAA,EAAW,SAAS,WAAA,EAAa,MAAA,EAAQ,eAAe,YAAY;AAAA,OAChF;AAAA,MACA,WAAA,EAAa,0CAAA;AAAA,MACb,YAAA,EAAc,CAAC,wCAAwC;AAAA,KACzD;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,yBAAA;AAAA,QACA,gCAAA;AAAA,QACA,8BAAA;AAAA,QACA,sBAAsB,gBAAgB,CAAA;AAAA,QACtC,sBAAsB,uBAAuB;AAAA,OAC/C;AAAA,MACA,WAAA,EAAa,0BAAA;AAAA,MACb,YAAA,EAAc,CAAC,iBAAA,EAAmB,wBAAA,EAA0B,8BAA8B;AAAA;AAC5F,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,WAAA,EAAa,eAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,8DAA8D,CAAA;AAAA,MACrF,WAAA,EAAa,2DAAA;AAAA,MACb,QAAA,EAAU,mBAAA;AAAA,MACV,YAAA,EAAc,CAAC,8DAA8D;AAAA,KAC/E;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,CAAK,qBAAA,EAAuB,eAAA,EAAiB,eAAA,EAAiB,eAAe,WAAW,CAAA;AAAA,QACxF,IAAA;AAAA,UACE,yBAAA;AAAA,UACA,eAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAK,GAAA,EAAK,SAAA,EAAW,SAAS,eAAA,EAAiB,eAAA,EAAiB,eAAe,WAAW;AAAA,OAC5F;AAAA,MACA,WAAA,EAAa,uDAAA;AAAA,MACb,YAAA,EAAc,CAAC,oDAAoD;AAAA,KACrE;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,wBAAA;AAAA,QACA,oCAAA;AAAA,QACA,sBAAsB,eAAe;AAAA,OACvC;AAAA,MACA,WAAA,EAAa,uCAAA;AAAA,MACb,YAAA,EAAc,CAAC,gBAAA,EAAkB,oCAAoC;AAAA;AACvE,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,WAAA,EAAa,SAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,kDAAkD,CAAA;AAAA,MACzE,WAAA,EAAa,uCAAA;AAAA,MACb,QAAA,EAAU,qBAAA;AAAA,MACV,YAAA,EAAc,CAAC,kDAAkD;AAAA,KACnE;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,CAAK,qBAAA,EAAuB,SAAA,EAAW,aAAA,EAAe,aAAa,CAAA;AAAA,QACnE,IAAA,CAAK,yBAAA,EAA2B,SAAA,EAAW,aAAA,EAAe,aAAa,CAAA;AAAA,QACvE,KAAK,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,eAAe,aAAa;AAAA,OACvE;AAAA,MACA,WAAA,EAAa,mCAAA;AAAA,MACb,YAAA,EAAc,CAAC,kCAAkC;AAAA,KACnD;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,kBAAA;AAAA,QACA,yBAAA;AAAA,QACA,sBAAA;AAAA,QACA,sBAAsB,SAAS,CAAA;AAAA,QAC/B,sBAAsB,gBAAgB;AAAA,OACxC;AAAA,MACA,WAAA,EAAa,mBAAA;AAAA,MACb,YAAA,EAAc,CAAC,UAAA,EAAY,iBAAA,EAAmB,sBAAsB;AAAA;AACtE,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,gDAAgD,CAAA;AAAA,MACvE,WAAA,EAAa,gDAAA;AAAA,MACb,YAAA,EAAc,CAAC,gDAAgD;AAAA;AACjE,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,oBAAA,EAAsB,CAAC,oDAAoD,CAAA;AAAA,MAC3E,WAAA,EAAa,wCAAA;AAAA,MACb,QAAA,EAAU,uBAAA;AAAA,MACV,YAAA,EAAc,CAAC,oDAAoD;AAAA,KACrE;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,CAAK,qBAAA,EAAuB,UAAA,EAAY,aAAA,EAAe,YAAY,CAAA;AAAA,QACnE,IAAA,CAAK,yBAAA,EAA2B,UAAA,EAAY,aAAA,EAAe,YAAY,CAAA;AAAA,QACvE,KAAK,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,eAAe,YAAY;AAAA,OACvE;AAAA,MACA,WAAA,EAAa,oCAAA;AAAA,MACb,YAAA,EAAc,CAAC,kCAAkC;AAAA,KACnD;AAAA,IACA,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,mBAAA;AAAA,QACA,2BAAA;AAAA,QACA,sBAAsB,UAAU,CAAA;AAAA,QAChC,sBAAsB,kBAAkB;AAAA,OAC1C;AAAA,MACA,WAAA,EAAa,oBAAA;AAAA,MACb,YAAA,EAAc,CAAC,WAAA,EAAa,mBAAmB;AAAA;AACjD;AAEJ,CAAA;AAMO,SAAS,gBAAgB,EAAA,EAAwC;AACtE,EAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,OAAO,EAAE,CAAA;AACpE,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,EAAE,CAAA,EAAA,CAAI,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,0BAAA,CACd,KAAA,EACA,QAAA,GAA4B,OAAA,CAAQ,QAAA,EACI;AACxC,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AACA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,4BAAA,GAAiE;AAC/E,EAAA,MAAM,gBAAyC,EAAC;AAEhD,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,MAAM,cAAA,GAAiB,2BAA2B,KAAK,CAAA;AACvD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,iBAAA;AAAA,MACrB,2BAAA,CAA4B,eAAe,oBAAoB;AAAA,KACjE;AACA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,KAAA;AAAA,MACA,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,cAAA;AAAA,MACA,WAAA,EAAa,OAAA,CAAQ,UAAA,CAAW,cAAA,CAAe,WAAW,CAAC;AAAA,KAC5D,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,aAAA;AACT;AA8BO,SAAS,uBAAA,CAAwB,OAA2B,WAAA,EAA8B;AAC/F,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,cAAA,GAAiB,2BAA2B,KAAK,CAAA;AACvD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,MAAM,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,qBAAA,EAAwB,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EACjF;AAEA,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,cAAA,CAAe,WAAW,CAAC,CAAA;AACvD;AA2DA,SAAS,4BACP,UAAA,EAC4B;AAC5B,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAe,SAAA,GAAY,QAAQ,UAAA,CAAW,SAAS,CAAC,CAAA,GAAI,IAAK,CAAA;AAC1F;;;ACrXO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,IAAI,KAAA,KAAU,GAAA,IAAO,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3C,IAAA,OAAOA,KAAK,OAAA,EAAQ,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,yBAAyB,WAAA,EAAyC;AAKhF,EAAA,MAAM,YAAA,GAAe,gCAA+B,CAAE,IAAA;AAAA,IACpD,CAAC,SAAA,KACCC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,CAAU,aAAa,aAAa,CAAC,CAAA,IAAK,SAAA,CAAU,cAAA,KAAmB;AAAA,GAC3F;AACA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,YAAA,CAAa,WAAA;AACtB;AAEO,SAAS,4BAA4B,cAAA,EAA4C;AACtF,EAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,IAAA,MAAM,YAAA,GAAeE,OAAAA,CAAQ,UAAA,CAAW,cAAc,CAAC,CAAA;AACvD,IAAA,IAAI,CAACD,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,YAAY,CAAA,EAAA,CAAI,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAA,GAAqB,gCAA+B,CAAE,IAAA;AAAA,IAC1D,CAAC,YAAA,KAAiB,YAAA,CAAa,KAAA,KAAU,QAAA,IAAY,aAAa,cAAA,KAAmB;AAAA,GACvF;AACA,EAAA,IAAI,oBAAoB,cAAA,EAAgB;AACtC,IAAA,OAAO,kBAAA,CAAmB,cAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,mBAAA,GAAsB,4BAAA,EAA6B,CAAE,CAAC,CAAA;AAC5D,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,OAAO,mBAAA,CAAoB,cAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,SAAS,8BAAA,GAAqE;AAC5E,EAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,QAAA;AAAA,QACP,gBAAgB,iBAAA,CAAkB;AAAA,UAChC,8DAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACD,aAAaD,IAAAA,CAAK,OAAA,IAAW,SAAA,EAAW,qBAAA,EAAuB,UAAU,QAAQ;AAAA,OACnF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,UAAA;AAAA,QACP,cAAA,EAAgB,iBAAA,CAAkB,CAAC,oDAAoD,CAAC,CAAA;AAAA,QACxF,aAAaA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,uBAAuB,UAAU;AAAA;AAC3E,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,mBAAA;AACjD,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,yBAAA;AAC5D,IAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,CAAI,YAAA,IAAgBA,KAAK,OAAA,EAAQ,EAAG,WAAW,OAAO,CAAA;AACnF,IAAA,OAAO;AAAA,MACL;AAAA,QACE,KAAA,EAAO,QAAA;AAAA,QACP,gBAAgB,iBAAA,CAAkB;AAAA,UAChCA,IAAAA,CAAK,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY,CAAA;AAAA,UAClEA,IAAAA,CAAK,eAAA,EAAiB,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY,CAAA;AAAA,UACrEA,IAAAA,CAAK,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,eAAe,YAAY;AAAA,SACnE,CAAA;AAAA,QACD,WAAA,EAAaA,IAAAA,CAAK,YAAA,EAAc,QAAA,EAAU,UAAU,WAAW;AAAA,OACjE;AAAA,MACA;AAAA,QACE,KAAA,EAAO,UAAA;AAAA,QACP,gBAAgB,iBAAA,CAAkB;AAAA,UAChCA,IAAAA,CAAK,YAAA,EAAc,UAAA,EAAY,aAAA,EAAe,YAAY,CAAA;AAAA,UAC1DA,IAAAA,CAAK,eAAA,EAAiB,UAAA,EAAY,aAAA,EAAe,YAAY,CAAA;AAAA,UAC7DA,IAAAA,CAAK,YAAA,EAAc,UAAA,EAAY,aAAA,EAAe,YAAY;AAAA,SAC3D,CAAA;AAAA,QACD,WAAA,EAAaA,IAAAA,CAAK,YAAA,EAAc,UAAA,EAAY,WAAW;AAAA;AACzD,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,QAAA;AAAA,MACP,gBAAgB,iBAAA,CAAkB;AAAA,QAChC,wBAAA;AAAA,QACA,+BAAA;AAAA,QACA,sBAAsB,eAAe,CAAA;AAAA,QACrC,sBAAsB,sBAAsB;AAAA,OAC7C,CAAA;AAAA,MACD,WAAA,EAAaA,IAAAA,CAAK,OAAA,EAAQ,EAAG,WAAW,eAAe;AAAA,KACzD;AAAA,IACA;AAAA,MACE,KAAA,EAAO,UAAA;AAAA,MACP,gBAAgB,iBAAA,CAAkB;AAAA,QAChC,mBAAA;AAAA,QACA,2BAAA;AAAA,QACA,sBAAsB,UAAU,CAAA;AAAA,QAChC,sBAAsB,kBAAkB;AAAA,OACzC,CAAA;AAAA,MACD,WAAA,EAAaA,IAAAA,CAAK,OAAA,EAAQ,EAAG,WAAW,UAAU;AAAA;AACpD,GACF;AACF;AAEO,SAAS,+BAAA,GAAuE;AACrF,EAAA,OAAO,4BAAA,EAA6B,CAAE,GAAA,CAAI,CAAC,YAAA,MAAkB;AAAA,IAC3D,OAAO,YAAA,CAAa,OAAA;AAAA,IACpB,gBAAgB,YAAA,CAAa,cAAA;AAAA,IAC7B,aAAa,YAAA,CAAa;AAAA,GAC5B,CAAE,CAAA;AACJ;AAEO,SAAS,uBAAA,CACd,WAAA,GAAc,wBAAA,CAAkC,CAAA,EACP;AACzC,EAAA,MAAM,mBAAA,GAAsBE,OAAAA,CAAQ,UAAA,CAAW,WAAW,CAAC,CAAA;AAC3D,EAAA,MAAM,cAAA,GAAiBF,IAAAA,CAAK,mBAAA,EAAqB,aAAa,CAAA;AAC9D,EAAA,IAAI,CAACC,UAAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,cAAA,EAAgB,MAAM,CAAC,CAAA;AAK3D,IAAA,MAAM,SAAA,GAAY,IAAI,OAAA,EAAS,UAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA,CAC5B,IAAI,CAAC,CAAC,SAAA,EAAW,IAAI,CAAA,KAAM;AAC1B,MAAA,MAAM,MAAA,GACJ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAClD,IAAA,GACD,EAAC;AACP,MAAA,MAAM,OACJ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,IAC3D,MAAA,CAAO,IAAA,CAAK,MAAK,GACjB,SAAA,IAAa,SAAS,SAAS,CAAA;AACrC,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,IACF,CAAC,EACA,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,SAAA,CAAU,MAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CACvD,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,KAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EACxE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,uBAAuB,WAAA,EAG9B;AACP,EAAA,MAAM,YAAA,GAAeD,IAAAA,CAAK,WAAA,EAAa,oBAAoB,CAAA;AAC3D,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,aAAa,YAAA,EAAc,MAAM,EAC5C,KAAA,CAAM,OAAO,EACb,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AACnC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AAC/C,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IAAK,QAAQ,CAAA,EAAG;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,aAAA,EAAe,KAAA,CAAM,CAAC,CAAA,IAAK;AAAA,KAC7B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,kBACd,UAAA,EACe;AACf,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,SAAA,IAAaA,UAAAA,CAAW,SAAS,CAAA,EAAG;AACtC,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAsB,IAAA,EAA6B;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASE,YAAAA,CAAa,OAAA,EAAS,CAAC,IAAI,CAAA,EAAG;AAAA,MAC3C,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,EAAE,IAAA,EAAK;AACR,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AClOA,IAAM,4BAAA,GAA+B,GAAA;AACrC,IAAM,uBAAA,GAA0B,IAAA;AAuBzB,IAAM,6BAAA,GAAN,cAA4C,KAAA,CAAM;AAAA,EAGvD,YAAqB,UAAA,EAAiD;AACpE,IAAA,KAAA;AAAA,MACE;AAAA,KACF;AAHmB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAInB,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AAAA,EACd;AAAA,EAPS,IAAA,GAAO,kBAAA;AAQlB;AAEA,eAAsB,mBACpB,KAAA,EAC+B;AAC/B,EAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAC9C,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,SAAA;AACT;AAEA,eAAsB,wBAAA,CACpB,KAAA,GAEI,EAAC,EACyC;AAC9C,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,4BAAA;AACrC,EAAA,MAAM,aAAyC,EAAC;AAEhD,EAAA,KAAA,MAAW,YAAA,IAAgB,iCAAgC,EAAG;AAC5D,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,YAAA,CAAa,WAAW,CAAA;AAClE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB;AAAA,MACvC,QAAA,EAAU,CAAA,iBAAA,EAAoB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAAA,MACrD,SAAA;AAAA,MACA,8BAA8B,UAAA,CAAW;AAAA,KAC1C,CAAA;AACD,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,GAAG,SAAA;AAAA,MACH,MAAA,EAAQ,sBAAA;AAAA,MACR,mBAAmB,YAAA,CAAa,KAAA;AAAA,MAChC,aAAa,YAAA,CAAa;AAAA,KAC3B,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAM,gBAAA,CAAiB;AAAA,IAC/C,QAAA,EAAU,OAAO,uBAAuB,CAAA;AAAA,IACxC;AAAA,GACD,CAAA;AACD,EAAA,IAAI,sBAAsB,IAAA,EAAM;AAC9B,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,GAAG,iBAAA;AAAA,MACH,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,wBAAwB,UAAU,CAAA;AAC3C;AAEA,eAAsB,4BAAA,CACpB,KAAA,GAEI,EAAC,EAC8B;AACnC,EAAA,MAAM,UAAA,GAAa,MAAM,wBAAA,CAAyB,KAAK,CAAA;AACvD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,GAAA,CAAI,0BAA0B,CAAC,CAAA;AAC9E,EAAA,MAAM,UAAU,UAAA,CAAW,MAAA;AAAA,IACzB,CAAC,SAAA,KAAc,0BAAA,CAA2B,SAAS,CAAA,KAAM;AAAA,GAC3D;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,IAAI,8BAA8B,UAAU,CAAA;AACpD;AAEA,eAAe,iBACb,KAAA,EACsC;AACtC,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AAC5C,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,qBAAqB,eAAe,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,4BAAA;AAErC,EAAA,MAAM,iBAAiB,MAAM,SAAA;AAAA,IAC3B,IAAI,GAAA,CAAI,eAAA,EAAiB,MAAA,CAAO,OAAO,CAAA;AAAA,IACvC,KAAA,CAAM,OAAA;AAAA,IACN;AAAA,GACF;AACA,EAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,IAAA,MAAM,OAAA,GAAU,cAAA;AAChB,IAAA,IACE,OAAO,OAAA,CAAQ,oBAAA,KAAyB,YACxC,OAAA,CAAQ,oBAAA,CAAqB,SAAS,CAAA,EACtC;AACA,MAAA,OAAO,0BAAA,CAA2B;AAAA,QAChC,mBAAA,EAAqB,2BAAA;AAAA,UACnB,OAAA,CAAQ,oBAAA;AAAA,UACR,MAAA,CAAO;AAAA,SACT;AAAA,QACA,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ;AAAA,QACpE,GAAI,OAAA,CAAQ,kBAAkB,CAAA,KAAM,MAAA,GAChC,EAAC,GACD,EAAE,eAAA,EAAiB,OAAA,CAAQ,kBAAkB,CAAA;AAAE,OACpD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAKxB,IAAI,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,OAAO,CAAA,EAAG,KAAA,CAAM,OAAA,EAAS,SAAS,CAAA;AACjE,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,MAAM,gBACJ,WAAA,CAAY,IAAA,CAAK,CAAC,SAAA,KAAc,UAAU,IAAA,KAAS,SAAS,CAAA,IAC5D,WAAA,CAAY,KAAK,CAAC,SAAA,KAAc,OAAO,SAAA,CAAU,yBAAyB,QAAQ,CAAA;AACpF,IAAA,IAAI,OAAO,aAAA,EAAe,oBAAA,KAAyB,QAAA,EAAU;AAC3D,MAAA,OAAO,0BAAA,CAA2B;AAAA,QAChC,mBAAA,EAAqB,2BAAA;AAAA,UACnB,aAAA,CAAc,oBAAA;AAAA,UACd,MAAA,CAAO;AAAA,SACT;AAAA,QACA,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IACE,KAAA,CAAM,iCAAiC,MAAA,IACtC,MAAM,wBAAwB,MAAA,CAAO,OAAA,EAAS,SAAS,CAAA,EACxD;AACA,IAAA,OAAO,0BAAA,CAA2B;AAAA,MAChC,mBAAA,EAAqB,wBAAA;AAAA,QACnB,MAAA,CAAO,OAAA;AAAA,QACP,KAAA,CAAM;AAAA,OACR;AAAA,MACA,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH;AAEA,EAAA,IACE,MAAA,CAAO,gCAAgC,MAAA,IACtC,MAAM,wBAAwB,MAAA,CAAO,OAAA,EAAS,SAAS,CAAA,EACxD;AACA,IAAA,OAAO,0BAAA,CAA2B;AAAA,MAChC,qBAAqB,MAAA,CAAO,2BAAA;AAAA,MAC5B,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,wBACP,UAAA,EACqC;AACrC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsC;AAE1D,EAAA,KAAA,MAAW,aAAa,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC/D,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,iBAAA,CAAkB,SAAA,EAAW,QAAQ,IAAI,CAAA,EAAG;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,SAAS,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAK,iBAAiB,CAAA;AACrD;AAEA,SAAS,iBAAA,CACP,MACA,KAAA,EACQ;AACR,EAAA,OACE,2BAA2B,KAAK,CAAA,GAAI,2BAA2B,IAAI,CAAA,IACnE,KAAK,QAAA,CAAS,aAAA,CAAc,KAAA,CAAM,QAAQ,MACzC,IAAA,CAAK,WAAA,IAAe,IAAI,aAAA,CAAc,KAAA,CAAM,eAAe,EAAE,CAAA;AAElE;AAEA,SAAS,2BAA2B,SAAA,EAA6C;AAC/E,EAAA,OAAO,SAAA,CAAU,MAAA,KAAW,sBAAA,GAAyB,CAAA,GAAI,CAAA;AAC3D;AAEA,SAAS,2BAA2B,KAAA,EAKX;AACvB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,mBAAA;AAAA,IAChB,GAAI,MAAM,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ;AAAA,IAChE,GAAI,MAAM,eAAA,KAAoB,MAAA,GAAY,EAAC,GAAI,EAAE,eAAA,EAAiB,KAAA,CAAM,eAAA,EAAgB;AAAA,IACxF,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAS;AAAA,IAChC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA;AAAK,GACvC;AACF;AAEA,SAAS,qBAAqB,QAAA,EAAyC;AACrE,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAI,GAAA,CAAI,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAE;AAAA,KACjD;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,UAAA,CAAW,OAAO,KAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO;AAAA,MACL,2BAAA,EAA6B,IAAI,QAAA,EAAS;AAAA,MAC1C,OAAA,EAAS,IAAI,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,QAAA,KAAa,MAAA,GAAS,QAAA,GAAW,OAAO,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,CAAE;AAAA,KACjF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MACJ,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAAK,SAAS,UAAA,CAAW,UAAU,CAAA,GAC5D,IAAI,IAAI,QAAQ,CAAA,GAChB,IAAI,GAAA,CAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AAClC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAI,GAAA,CAAI,CAAA,EAAG,IAAI,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,CAAE;AAAA,KACjD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EACvD;AACF;AAEA,eAAe,SAAA,CACb,GAAA,EACA,OAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,IAC3C,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,SAAS;AAAA,GACtC,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACnB,EAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC9B;AAEA,eAAe,uBAAA,CAAwB,KAAU,SAAA,EAAqC;AACpF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,SAAS;AAAA,GACtC,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACnB,EAAA,OAAO,QAAA,KAAa,IAAA;AACtB;AAEA,SAAS,wBAAA,CAAyB,SAAc,aAAA,EAA+B;AAC7E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,KAAa,QAAA,GAAW,MAAA,GAAS,KAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,sBAAA,CAAuB,aAAa,CAAC,CAAA,CAAA;AAC7E;AAEA,SAAS,uBAAuBC,KAAAA,EAAsB;AACpD,EAAA,OAAOA,MAAK,UAAA,CAAW,GAAG,CAAA,GAAIA,KAAAA,GAAO,IAAIA,KAAI,CAAA,CAAA;AAC/C;AAEA,SAAS,2BAAA,CAA4B,cAAsB,YAAA,EAA2B;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,YAAY,CAAA;AACnC,IAAA,MAAA,CAAO,QAAA,GAAW,YAAA,CAAa,QAAA,KAAa,QAAA,GAAW,MAAA,GAAS,KAAA;AAChE,IAAA,MAAA,CAAO,WAAW,YAAA,CAAa,QAAA;AAC/B,IAAA,MAAA,CAAO,OAAO,YAAA,CAAa,IAAA;AAC3B,IAAA,OAAO,OAAO,QAAA,EAAS;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAS,GAAA,EAA8B;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,MAAM,EAAE,CAAA;AACzC,EAAA,OAAO,OAAO,SAAA,CAAU,IAAI,CAAA,IAAK,IAAA,GAAO,IAAI,IAAA,GAAO,MAAA;AACrD;;;ACtTA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,EAAA,OAAO,SAAA,KAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA;AACzD;AAEA,SAAS,qBAAA,CAAsB,OAAgBA,KAAAA,EAAyB;AACtE,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAGA,KAAI,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU,qBAAA,CAAsB,KAAA,EAAO,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,EACtF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAGA,KAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACjF,EAAA,MAAM,SAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,GAAG,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAA,CAAO,GAAG,IAAI,qBAAA,CAAsB,KAAA,EAAO,GAAGA,KAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,qBAAqB,KAAA,EAA2B;AAC9D,EAAA,OAAO,qBAAA,CAAsB,OAAO,OAAO,CAAA;AAC7C;AAEO,SAAS,oBAAoB,KAAA,EAAwB;AAC1D,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,KAAK,CAAC,CAAA;AACnD;AAEO,SAAS,iBAAiB,KAAA,EAAwB;AACvD,EAAA,OAAO,CAAA,EAAG,KAAK,SAAA,CAAU,oBAAA,CAAqB,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAChE;;;AChDA,IAAM,uBAAuB,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAE,CAAA;AACjD,IAAM,sBAAA,GAAyB,YAAA;AAC/B,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,0BAAA,GAA6B,GAAA;AAU5B,SAAS,uBAAA,CAAwB,MAAc,KAAA,EAAuB;AAC3E,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAAuB;AACtE,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,OAAO,kBAAA,CAAmB,uBAAA,CAAwB,cAAA,EAAgB,KAAK,CAAC,CAAA;AAC1E;AAEO,SAAS,mBAAmB,QAAA,EAAqC;AACtE,EAAA,OAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAC1B;AAEO,SAAS,kBAAA,CAAmB,UAAkB,YAAA,EAA8B;AACjF,EAAA,IAAIA,KAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,aAAA,EAAgB,YAAY,CAAA,iBAAA,CAAmB,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACvC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,KAAW,CAAC,CAAA,EAAG;AAC7E,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,aAAA,EAAgB,YAAY,CAAA,WAAA,CAAa,CAAA;AAAA,EAC/D;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,IAAA,EAAM;AACvC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,aAAA,EAAgB,YAAY,CAAA,gCAAA,CAAkC,CAAA;AAAA,IACpF;AAAA,EACF;AAEA,EAAA,OAAOA,KAAA,CAAK,IAAA,CAAK,QAAA,EAAU,GAAG,QAAQ,CAAA;AACxC;AAEA,eAAsB,gBAAgB,aAAA,EAAsC;AAC1E,EAAA,MAAM,KAAA,CAAM,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD;AAEA,eAAsB,WAAW,UAAA,EAAsC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,UAAU,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAsB,aAAgB,QAAA,EAA8B;AAClE,EAAA,OAAO,KAAK,KAAA,CAAM,MAAM,QAAA,CAAS,QAAA,EAAU,MAAM,CAAC,CAAA;AACpD;AAEA,eAAsB,mBAAA,CAAoB,UAAkB,KAAA,EAA+B;AACzF,EAAA,MAAM,mBAAA,CAAoB,QAAA,EAAU,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAC7D;AAEA,eAAe,mBAAA,CAAoB,UAAkB,KAAA,EAA8B;AACjF,EAAA,MAAM,eAAA,CAAgBA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,CAAA,IAAA,CAAA;AAEjD,EAAA,MAAM,SAAA,CAAU,aAAA,EAAe,KAAA,EAAO,MAAM,CAAA;AAC5C,EAAA,MAAM,MAAA,CAAO,eAAe,QAAQ,CAAA;AACtC;AAEA,eAAsB,sBAAA,CAAuB,UAAkB,KAAA,EAA+B;AAC5F,EAAA,MAAM,sBAAA,CAAuB,QAAA,EAAU,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAChE;AAEA,eAAe,sBAAA,CAAuB,UAAkB,KAAA,EAA8B;AACpF,EAAA,MAAM,eAAA,CAAgBA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAExC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACtC,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,KAAA,EAAM;AAAA,EACrB;AACF;AAEA,eAAsB,oBAAA,CAAqB,UAAkB,KAAA,EAAkC;AAC7F,EAAA,MAAM,eAAA,CAAgBA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC9B,CAAA,SAAE;AACA,MAAA,MAAM,OAAO,KAAA,EAAM;AAAA,IACrB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAsB,eAAe,QAAA,EAAuC;AAC1E,EAAA,OAAO,IAAI,UAAA,CAAW,MAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAChD;AAEA,eAAsB,cAAc,aAAA,EAAmD;AACrF,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,aAAa,CAAA,EAAI;AACtC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAA,CAAQ,MAAM,OAAA,CAAQ,aAAa,GAChC,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,QAAA,CAAS,OAAO,CAAC,CAAA,CACzC,KAAK,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACpD;AAEO,SAAS,UAAU,KAAA,EAA2B;AACnD,EAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AACxD;AAEO,SAAS,cAAc,QAAA,EAA0B;AACtD,EAAA,OAAO,aAAA,CAAc,QAAQ,CAAA,CAAE,QAAA,EAAS;AAC1C;AAMO,SAAS,qBAAqB,KAAA,EAAgD;AACnF,EAAA,OAAQ,OAA6C,IAAA,KAAS,QAAA;AAChE;AAEA,eAAsB,kBAAA,CAAsB,UAAkB,IAAA,EAAoC;AAChG,EAAA,MAAM,eAAA,CAAgBA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAE5C,EAAA,MAAM,aAAa,UAAA,EAAW;AAC9B,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,QAAQ,CAAA;AACpB,MAAA,MAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,MAAA,MAAM,kBAAkB,QAAA,EAAU;AAAA,QAChC,OAAA,EAAS,qBAAA;AAAA,QACT,UAAA;AAAA,QACA,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,UAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACd,CAAA;AACD,MAAA;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAChC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,MAAM,wBAAA,CAAyB,QAAQ,CAAA,EAAG;AAC5C,QAAA,OAAA,GAAU,CAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,qBAAqB,IAAA,CAAK,GAAA,CAAI,SAAS,oBAAA,CAAqB,MAAA,GAAS,CAAC,CAAC,CAAA;AACvF,MAAA,OAAA,IAAW,CAAA;AACX,MAAA,MAAM,IAAI,OAAA,CAAQ,CAACF,aAAY,UAAA,CAAWA,QAAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,KAAK,iBAAA,CAAkB,UAAU,UAAU,CAAA;AAAA,EAC7C,GAAG,0BAA0B,CAAA;AAC7B,EAAA,cAAA,CAAe,KAAA,IAAQ;AAEvB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,CAAA,SAAE;AACA,IAAA,aAAA,CAAc,cAAc,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AAChD,IAAA,IAAI,QAAA,EAAU,eAAe,UAAA,EAAY;AACvC,MAAA,MAAM,GAAG,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACrD;AAAA,EACF;AACF;AAEA,eAAe,yBAAyB,QAAA,EAAoC;AAC1E,EAAA,IAAI,CAAE,MAAM,2BAAA,CAA4B,QAAQ,CAAA,EAAI;AAClD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAG,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACnD,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,4BAA4B,QAAA,EAAoC;AAC7E,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AAChD,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,WAAA,IAAe,oBAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC3D,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,OAAA,IAAW,0BAAA;AAC1C;AAEA,eAAe,iBAAiB,QAAA,EAA+D;AAC7F,EAAA,MAAM,YAAA,GAAeE,KAAA,CAAK,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA;AAC/D,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,YAAY,CAAA,EAAI;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAA8C,YAAY,CAAA;AAC/E,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAC1B,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,IACE,OAAO,OAAA,KAAY,qBAAA,IACnB,OAAO,MAAA,CAAO,eAAe,QAAA,IAC7B,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,KAC7B,OAAO,GAAA,KAAQ,QAAA,IACf,CAAC,OAAO,SAAA,CAAU,GAAG,CAAA,IACrB,GAAA,IAAO,KACP,OAAO,UAAA,KAAe,QAAA,IACtB,CAAC,OAAO,QAAA,CAAS,UAAU,CAAA,IAC3B,OAAO,gBAAgB,QAAA,IACvB,CAAC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAC5B;AACA,MAAA,OAAO,KAAA,CAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,qBAAA;AAAA,MACT,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,GAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,eAAe,iBAAA,CACb,UACA,QAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,oBAAoBA,KAAA,CAAK,IAAA,CAAK,QAAA,EAAU,sBAAsB,GAAG,QAAQ,CAAA;AAAA,EACjF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,EAAA,CAAG,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC1E,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAe,iBAAA,CAAkB,UAAkB,UAAA,EAAmC;AACpF,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AAChD,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,UAAA,KAAe,UAAA,EAAY;AAChE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,CAAoBA,KAAA,CAAK,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA,EAAG;AAAA,IACrE,GAAG,QAAA;AAAA,IACH,WAAA,EAAa,KAAK,GAAA;AAAI,GACvB,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC1B;AAEA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAQ,OAA6C,IAAA,KAAS,OAAA;AAAA,EAChE;AACF;;;ACnTO,IAAM,6BAAA,GAAgC,mBAAA;AACtC,IAAM,8BAAA,GAAiC,CAAA;AAuCvC,SAAS,4BAAA,CACd,UACA,QAAA,EACQ;AACR,EAAA,OAAOA,MAAK,IAAA,CAAK,QAAA,EAAU,QAAQ,QAAA,KAAa,OAAA,GAAU,eAAe,YAAY,CAAA;AACvF;AAEO,SAAS,8BAA8B,QAAA,EAA0B;AACtE,EAAA,OAAO,4BAAA,CAA6B,UAAU,OAAO,CAAA;AACvD;AAEO,SAAS,8BAA8B,QAAA,EAA0B;AACtE,EAAA,OAAO,4BAAA,CAA6B,UAAU,OAAO,CAAA;AACvD;AAEA,eAAsB,0BAAA,CACpB,UACA,QAAA,EAC6C;AAC7C,EAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,QAAA,EAAU,QAAQ,CAAA;AACnE,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,WAAW,CAAA,EAAI;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAA8C,WAAW,CAAA;AAC9E,EAAA,IAAI,QAAA,KAAa,OAAA,IAAW,oCAAA,CAAqC,MAAM,CAAA,EAAG;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,KAAa,OAAA,IAAW,6BAAA,CAA8B,MAAM,CAAA,EAAG;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,gCACpB,QAAA,EACkD;AAClD,EAAA,MAAM,MAAA,GAAS,MAAM,0BAAA,CAA2B,QAAA,EAAU,OAAO,CAAA;AACjE,EAAA,OAAO,MAAA,EAAQ,QAAA,KAAa,OAAA,GAAU,MAAA,GAAS,MAAA;AACjD;AAEA,eAAsB,uCACpB,QAAA,EACyD;AACzD,EAAA,MAAM,MAAA,GAAS,MAAM,0BAAA,CAA2B,QAAA,EAAU,OAAO,CAAA;AACjE,EAAA,OAAO,MAAA,EAAQ,QAAA,KAAa,OAAA,GAAU,MAAA,GAAS,MAAA;AACjD;AAEA,eAAsB,2BAAA,CACpB,UACA,MAAA,EACe;AACf,EAAA,MAAM,oBAAoB,4BAAA,CAA6B,QAAA,EAAU,MAAA,CAAO,QAAQ,GAAG,MAAM,CAAA;AAC3F;AAEA,eAAsB,2BAAA,CACpB,UACA,QAAA,EACe;AACf,EAAA,MAAMC,EAAAA,CAAG,6BAA6B,QAAA,EAAU,QAAQ,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAC5E;AAEO,SAAS,yCACd,MAAA,EAC+C;AAC/C,EAAA,OAAO,MAAA,CAAO,SAAA,KAAc,UAAA,GAAa,UAAA,GAAa,OAAA;AACxD;AAEA,eAAsB,uCACpB,MAAA,EACkB;AAClB,EAAA,IAAI,wCAAA,CAAyC,MAAM,CAAA,KAAM,UAAA,EAAY;AACnE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,YAAA,IAAgB,MAAA,CAAO,aAAa,MAAA,EAAW;AACnE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,8BACP,KAAA,EACsC;AACtC,EAAA,OACE,KAAA,CAAM,MAAA,KAAW,6BAAA,IACjB,KAAA,CAAM,YAAY,8BAAA,IAClB,KAAA,CAAM,QAAA,KAAa,OAAA,IACnB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAM,SAAA,CAAU,MAAA,GAAS,CAAA,IACzB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,SAAS,KAAA,CAAM,SAAS,CAAA,IAC/B,OAAO,MAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,QAAA,CAAS,MAAM,SAAS,CAAA;AAEnC;AAEA,SAAS,qCACP,KAAA,EAC6C;AAC7C,EAAA,OACE,KAAA,CAAM,MAAA,KAAW,6BAAA,IACjB,KAAA,CAAM,OAAA,KAAY,8BAAA,IAClB,KAAA,CAAM,QAAA,KAAa,OAAA,KAClB,KAAA,CAAM,MAAA,KAAW,YAAA,IAAgB,KAAA,CAAM,WAAW,KAAA,CAAA,KAClD,KAAA,CAAM,SAAA,KAAc,MAAA,IACnB,KAAA,CAAM,SAAA,KAAc,OAAA,IACpB,KAAA,CAAM,SAAA,KAAc,UAAA,CAAA,IACtB,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IACrB,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,IACzB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAC/B,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAC/B,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,IAC7B,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,CAAA;AAE/B;ACzKO,SAAS,wBAAA,GAAmC;AACjD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB,IAAA,EAAK;AAClD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAOD,KAAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAOA,KAAAA,CAAK,IAAA;AAAA,MACV,OAAA,CAAQ,IAAI,YAAA,IAAgBA,KAAAA,CAAK,KAAKE,OAAAA,EAAQ,EAAG,WAAW,OAAO,CAAA;AAAA,MACnE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,IAAA,OAAOF,MAAK,IAAA,CAAKE,OAAAA,EAAQ,EAAG,SAAA,EAAW,uBAAuB,WAAW,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAOF,KAAAA,CAAK,IAAA;AAAA,IACV,OAAA,CAAQ,IAAI,cAAA,IAAkBA,KAAAA,CAAK,KAAKE,OAAAA,EAAQ,EAAG,UAAU,OAAO,CAAA;AAAA,IACpE;AAAA,GACF;AACF;AAEO,SAAS,uBAAA,GAAkC;AAChD,EAAA,OAAOF,KAAAA,CAAK,IAAA,CAAK,wBAAA,EAAyB,EAAG,YAAY,CAAA;AAC3D;AAEO,SAAS,+BAAA,GAA0C;AACxD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,uBAAA,EAAwB,EAAG,kBAAkB,CAAA;AAChE;AAEO,SAAS,0BAAA,GAAqC;AACnD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,uBAAA,EAAwB,EAAG,SAAS,CAAA;AACvD;AAEO,SAAS,2BAAA,GAAsC;AACpD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,uBAAA,EAAwB,EAAG,UAAU,CAAA;AACxD;AAEO,SAAS,8BAAA,GAAyC;AACvD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,0BAAA,EAA2B,EAAG,cAAc,CAAA;AAC/D;AAEO,SAAS,gCAAA,GAA2C;AACzD,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,0BAAA,EAA2B,EAAG,YAAY,CAAA;AAC7D;;;AC7BO,IAAM,mCAAA,GAAsC,8BAAA;AAC5C,IAAM,oCAAA,GAAuC,CAAA;AAe7C,SAAS,wBAAwB,KAAA,EAQ7B;AACT,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,OAAA;AACrC,EAAA,MAAM,QAAA,GACJ,SAAA,KAAc,UAAA,GACT,KAAA,CAAM,YAAY,KAAA,CAAM,kBAAA,IAAsB,KAAA,CAAM,OAAA,IAAW,aAChE,CAAA,IAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,IAAO,CAAC,CAAC,CAAA,CAAA;AACnC,EAAA,MAAM,OAAOG,UAAAA,CAAW,QAAQ,EAC7B,MAAA,CAAO,CAAA,EAAG,MAAM,QAAQ;AAAA,EAAK,SAAS;AAAA,EAAK,QAAQ;AAAA,EAAK,OAAO,KAAA,CAAM,SAAS,CAAC,CAAA,CAAE,CAAA,CACjF,OAAO,KAAK,CAAA;AACf,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACnC;AAEO,SAAS,iCAAiC,KAAA,EAGtC;AACT,EAAA,MAAM,SAAA,GAAY,wCAAA,CAAyC,KAAA,CAAM,IAAI,CAAA;AACrE,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,OAAO,uBAAA,CAAwB;AAAA,MAC7B,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAA;AAAA,MACA,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA;AAAA,MACtB,GAAI,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,MAAA,GAAY,EAAC,GAAI,EAAE,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAA,EAAS;AAAA,MAC7E,GAAI,KAAA,CAAM,IAAA,CAAK,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,EAAQ;AAAA,MAC1E,GAAI,KAAA,CAAM,IAAA,CAAK,kBAAA,KAAuB,MAAA,GAClC,EAAC,GACD,EAAE,kBAAA,EAAoB,KAAA,CAAM,IAAA,CAAK,kBAAA;AAAmB,KACzD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,uBAAA,CAAwB;AAAA,IAC7B,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,SAAA;AAAA,IACA,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA;AAAA,IACtB,GAAA,EAAK,MAAM,IAAA,CAAK;AAAA,GACjB,CAAA;AACH;AAEO,SAAS,+BAA+B,KAAA,EAKT;AACpC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,mCAAA;AAAA,IACR,OAAA,EAAS,oCAAA;AAAA,IACT,WAAW,gCAAA,CAAiC;AAAA,MAC1C,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,MAAM,KAAA,CAAM;AAAA,KACb,CAAA;AAAA,IACD,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,GAAI,MAAM,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU;AAAA,IACtE,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,IACnB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA;AAAA,IAChB,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA;AAAA,IACtB,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAEA,eAAsB,8BACpB,QAAA,EACe;AACf,EAAA,MAAM,eAAA,CAAgB,6BAA6B,CAAA;AACnD,EAAA,MAAM,mBAAA,CAAoB,mCAAA,CAAoC,QAAA,CAAS,SAAS,GAAG,QAAQ,CAAA;AAC7F;AAEA,eAAsB,+BAA+B,SAAA,EAAkC;AACrF,EAAA,MAAMF,EAAAA,CAAG,mCAAA,CAAoC,SAAS,CAAA,EAAG,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACjG;AAEA,eAAsB,6BACpB,SAAA,EACwD;AACxD,EAAA,MAAM,YAAA,GAAe,oCAAoC,SAAS,CAAA;AAClE,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,YAAY,CAAA,EAAI;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAyD,YAAY,CAAA;AAC1F,EAAA,OAAO,mCAAA,CAAoC,MAAM,CAAA,GAAI,MAAA,GAAS,MAAA;AAChE;AAEA,eAAsB,6BAAA,GAEpB;AACA,EAAA,MAAM,gBAAgB,2BAAA,EAA4B;AAClD,EAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,aAAa,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,SAAA,CAAU,GAAA,CAAI,OAAO,QAAA,KAAa;AAChC,MAAA,MAAM,SAAS,MAAM,YAAA;AAAA,QACnBD,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,QAAQ;AAAA,OACnC,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACvB,MAAA,OAAO,mCAAA,CAAoC,MAAM,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,IAChE,CAAC;AAAA,GACH;AACA,EAAA,OAAO,UACJ,MAAA,CAAO,CAAC,QAAA,KAA4D,QAAA,KAAa,MAAS,CAAA,CAC1F,IAAA;AAAA,IACC,CAAC,IAAA,EAAM,KAAA,KACL,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,SAAS;AAAA,GACpF;AACJ;AAEO,SAAS,oCAAoC,SAAA,EAA2B;AAC7E,EAAA,OAAOA,MAAK,IAAA,CAAK,2BAAA,EAA4B,EAAG,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AACrE;AAEA,SAAS,oCACP,KAAA,EAC4C;AAC5C,EAAA,OACE,KAAA,EAAO,MAAA,KAAW,mCAAA,IAClB,KAAA,CAAM,OAAA,KAAY,oCAAA,IAClB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAA,IACzB,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,IAC1B,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAA,KACvB,KAAA,CAAM,MAAA,KAAW,YAAA,IAAgB,KAAA,CAAM,MAAA,KAAW,KAAA,CAAA,KAClD,MAAM,SAAA,KAAc,OAAA,IACnB,KAAA,CAAM,SAAA,KAAc,UAAA,IACpB,KAAA,CAAM,SAAA,KAAc,SAAA,CAAA,IACtB,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IACrB,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,IACzB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAC/B,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,MAAA,CAAO,QAAA,CAAS,MAAM,SAAS,CAAA;AAEnC;ACxKA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AACxC,IAAM,qBAAA,GAAwB,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,OAAA,CAAQ,MAAA,EAAO,GAAI,GAAK,CAAA;AAC9E,IAAM,+BAAA,GAAkC,GAAA;AACxC,IAAMI,8BAAAA,GAAgC,KAAK,IAAA,GAAO,IAAA;AAClD,IAAMC,kBAAiB,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAA,EAAI;AACrD,IAAM,iCAAA,GAAoC,EAAA;AASnC,IAAM,qBAAA,GAAsC;AAAA,EACjD,KAAK,OAAA,CAAQ,GAAA;AAAA,EACb,kBAAA,EAAoB;AACtB;AAEA,IAAI,+BAAA,GAAiE,IAAA;AAE9D,SAAS,kBAAkB,KAAA,EAAqC;AACrE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA;AAC7B,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAA;AAC3D,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,kBAAkB,CAAA,IAAK,sBAAsB,CAAA,EAAG;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,kBAAA,CAAmB,MAA2B,KAAA,EAAqC;AACjG,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACnB,IAAA,OAAO,IAAA,KAAS,KAAA;AAAA,EAClB;AAEA,EAAA,OAAO,KAAK,GAAA,KAAQ,KAAA,CAAM,GAAA,IAAO,IAAA,CAAK,uBAAuB,KAAA,CAAM,kBAAA;AACrE;AAEA,eAAsB,mBAAmB,KAAA,EAA+C;AACtF,EAAA,IACE,KAAA,CAAM,QAAQ,OAAA,CAAQ,GAAA,IACtB,4BAA4B,KAAA,CAAM,kBAAA,EAAoB,qBAAqB,CAAA,EAC3E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,sBAAA,CAAuB,KAAA,CAAM,GAAG,CAAA;AAC1D,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,OAAO,2BAAA,CAA4B,KAAA,CAAM,kBAAA,EAAoB,WAAW,IAAI,MAAA,GAAS,MAAA;AAAA,EACvF;AAEA,EAAA,OAAOC,iBAAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,GAAI,SAAA,GAAY,MAAA;AACnD;AAEO,SAASA,kBAAiB,GAAA,EAAsB;AACrD,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,MAAA,IAAU,KAAA,IACV,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAClB,MAAM,IAAA,GACN,MAAA;AACN,IAAA,OAAO,IAAA,KAAS,OAAA;AAAA,EAClB;AACF;AAcA,SAAS,2BAAA,CACP,qBACA,iBAAA,EACS;AACT,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,mBAAA,GAAsB,iBAAiB,CAAA,IAAK,+BAAA;AAC9D;AAEA,eAAe,uBAAuB,GAAA,EAAqC;AACzE,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAO,4BAA4B,GAAG,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAO,8BAA8B,GAAG,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,yBAAyB,GAAG,CAAA;AACrC;AAEA,eAAe,4BAA4B,GAAA,EAAqC;AAC9E,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMC,QAAAA,CAAS,CAAA,MAAA,EAAS,OAAO,GAAG,CAAC,SAAS,MAAM,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,4BAA4B,OAAO,CAAA;AACtD,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,UAAA,EAAY,mBAAmB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC1D,mBAAA,EAAoB;AAAA,IACpB,4BAAA;AAA6B,GAC9B,CAAA;AACD,EAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,mBAAA,KAAwB,IAAA,EAAM;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAc,UAAA,GAAa,MAAS,mBAAmB,CAAA;AAC3E;AAEA,SAAS,4BAA4B,OAAA,EAAgC;AACnE,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACjD,EAAA,IAAI,sBAAsB,EAAA,EAAI;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,QACZ,KAAA,CAAM,iBAAA,GAAoB,CAAC,CAAA,CAC3B,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA;AACd,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iCAAiC,CAAC,CAAA;AACnE,EAAA,OAAO,OAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,IAAc,IAAI,UAAA,GAAa,IAAA;AACvE;AAEA,eAAe,mBAAA,GAA8C;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMA,QAAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AACjF,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,CAAS,YAAA,CAAa,MAAM,QAAA,CAAS,MAAM,GAAG,EAAE,CAAA;AAC/E,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,eAAe,CAAA,GAAI,kBAAkB,GAAA,GAAQ,IAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,4BAAA,GAAuD;AACpE,EAAA,IAAI,CAAC,+BAAA,EAAiC;AACpC,IAAA,+BAAA,GAAkC,aAAA,CAAc,SAAA,EAAW,CAAC,SAAS,CAAA,EAAG;AAAA,MACtE,QAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAWH;AAAA,KACZ,CAAA,CACE,IAAA,CAAK,CAAC,EAAE,QAAO,KAAM;AACpB,MAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA;AAC/C,MAAA,OAAO,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,IAAI,KAAA,GAAQ,IAAA;AAAA,IACvD,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,+BAAA;AACT;AAEA,eAAe,8BAA8B,GAAA,EAAqC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA;AAAA,MACvB,gBAAA;AAAA,MACA;AAAA,QACE,YAAA;AAAA,QACA,UAAA;AAAA,QACA,CAAA,iBAAA,EAAoB,MAAA,CAAO,GAAG,CAAC,CAAA,2CAAA;AAAA,OACjC;AAAA,MACA;AAAA,QACE,QAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAWA;AAAA;AACb,KACF;AACA,IAAA,MAAM,YAAA,GAAe,OAAO,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAC3C,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,GAAI,WAAA,GAAc,IAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,yBAAyB,GAAA,EAAqC;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,IAAA,EAAM,CAAC,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AAAA,MACjF,QAAA,EAAU,MAAA;AAAA,MACV,GAAA,EAAKC,eAAAA;AAAA,MACL,SAAA,EAAWD;AAAA,KACZ,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,UAAU,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC7D,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,GAAI,WAAA,GAAc,IAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AClOO,IAAM,mCAAA,GAAsC;AAC5C,IAAM,oCAAA,GAAuC;AAapD,eAAsB,yBAAA,GAEpB;AACA,EAAA,MAAM,YAAY,gCAAA,EAAiC;AACnD,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,SAAS,CAAA,EAAI;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAsD,SAAS,CAAA;AACpF,EAAA,IAAI,CAAC,gCAAA,CAAiC,MAAM,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,2BACpB,KAAA,EACe;AACf,EAAA,MAAM,mBAAA,CAAoB,gCAAA,EAAiC,EAAG,KAAK,CAAA;AACrE;AAEA,eAAsB,0BAAA,CACpB,QAKgB,MAAA,EACD;AACf,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,yBAAA,EAA0B;AAChD,IAAA,IAAI,OAAA,KAAY,UAAa,OAAA,CAAQ,GAAA,KAAQ,MAAM,GAAA,IAAO,OAAA,CAAQ,KAAA,KAAU,KAAA,CAAM,KAAA,EAAO;AACvF,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAMH,GAAG,gCAAA,EAAiC,EAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAC9D;AAEA,eAAsB,4BACpB,KAAA,EACkB;AAClB,EAAA,OAAQ,MAAM,gCAAA,CAAiC,KAAK,CAAA,KAAO,MAAA;AAC7D;AAEA,eAAsB,iCACpB,KAAA,EAC0B;AAC1B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,kBAAA,CAAmB;AAAA,IACxB,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,oBAAoB,KAAA,CAAM;AAAA,GAC3B,CAAA;AACH;AAEA,SAAS,iCACP,KAAA,EACyC;AACzC,EAAA,OACE,KAAA,EAAO,MAAA,KAAW,mCAAA,IAClB,KAAA,CAAM,OAAA,KAAY,oCAAA,IAClB,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IACrB,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,IACzB,OAAO,KAAA,CAAM,kBAAA,KAAuB,QAAA,IACpC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,kBAAkB,CAAA,IACxC,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,OAAO,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAC/B,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IACtB,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAC1B,OAAO,MAAM,KAAA,KAAU,QAAA,IACvB,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,IACrB,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IACrB,KAAA,CAAM,GAAA,CAAI,MAAA,GAAS,CAAA;AAEvB","file":"chunk-U4BUCIZ4.js","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nimport { expandHome, firstExistingPath, resolveBinaryFromPath } from \"./chrome-discovery.js\";\n\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst WINDOWS_PROGRAM_FILES = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\nconst WINDOWS_PROGRAM_FILES_X86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n\nexport type BrowserBrandId =\n | \"chrome\"\n | \"chrome-canary\"\n | \"chromium\"\n | \"brave\"\n | \"edge\"\n | \"vivaldi\"\n | \"helium\";\n\nexport interface BrowserBrandPlatformConfig {\n readonly executableCandidates: readonly (string | null)[];\n readonly userDataDir: string;\n readonly bundleId?: string;\n readonly processNames: readonly string[];\n}\n\nexport interface BrowserBrandRecord {\n readonly id: BrowserBrandId;\n readonly displayName: string;\n readonly darwin?: BrowserBrandPlatformConfig;\n readonly win32?: BrowserBrandPlatformConfig;\n readonly linux?: BrowserBrandPlatformConfig;\n}\n\nexport interface InstalledBrowserBrand {\n readonly brand: BrowserBrandRecord;\n readonly brandId: BrowserBrandId;\n readonly displayName: string;\n readonly executablePath: string;\n readonly userDataDir: string;\n}\n\nconst BROWSER_BRANDS: readonly BrowserBrandRecord[] = [\n {\n id: \"chrome\",\n displayName: \"Google Chrome\",\n darwin: {\n executableCandidates: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n userDataDir: \"~/Library/Application Support/Google/Chrome\",\n bundleId: \"com.google.Chrome\",\n processNames: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome/User Data\",\n processNames: [\"/google/chrome/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n \"/opt/google/chrome/chrome\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ],\n userDataDir: \"~/.config/google-chrome\",\n processNames: [\"/google-chrome\", \"/google-chrome-stable\", \"/opt/google/chrome/chrome\"],\n },\n },\n {\n id: \"chrome-canary\",\n displayName: \"Google Chrome Canary\",\n darwin: {\n executableCandidates: [\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ],\n userDataDir: \"~/Library/Application Support/Google/Chrome Canary\",\n bundleId: \"com.google.Chrome.canary\",\n processNames: [\"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"],\n },\n win32: {\n executableCandidates: [\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome SxS\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome SxS/User Data\",\n processNames: [\"/google/chrome sxs/application/chrome.exe\"],\n },\n },\n {\n id: \"edge\",\n displayName: \"Microsoft Edge\",\n darwin: {\n executableCandidates: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n userDataDir: \"~/Library/Application Support/Microsoft Edge\",\n bundleId: \"com.microsoft.edgemac\",\n processNames: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Microsoft/Edge/User Data\",\n processNames: [\"/microsoft/edge/application/msedge.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/microsoft-edge\",\n \"/usr/bin/microsoft-edge-stable\",\n \"/opt/microsoft/msedge/msedge\",\n resolveBinaryFromPath(\"microsoft-edge\"),\n resolveBinaryFromPath(\"microsoft-edge-stable\"),\n ],\n userDataDir: \"~/.config/microsoft-edge\",\n processNames: [\"/microsoft-edge\", \"/microsoft-edge-stable\", \"/opt/microsoft/msedge/msedge\"],\n },\n },\n {\n id: \"brave\",\n displayName: \"Brave Browser\",\n darwin: {\n executableCandidates: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n userDataDir: \"~/Library/Application Support/BraveSoftware/Brave-Browser\",\n bundleId: \"com.brave.Browser\",\n processNames: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n join(\n WINDOWS_PROGRAM_FILES_X86,\n \"BraveSoftware\",\n \"Brave-Browser\",\n \"Application\",\n \"brave.exe\",\n ),\n join(\"~\", \"AppData\", \"Local\", \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n ],\n userDataDir: \"~/AppData/Local/BraveSoftware/Brave-Browser/User Data\",\n processNames: [\"/bravesoftware/brave-browser/application/brave.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/brave-browser\",\n \"/opt/brave.com/brave/brave-browser\",\n resolveBinaryFromPath(\"brave-browser\"),\n ],\n userDataDir: \"~/.config/BraveSoftware/Brave-Browser\",\n processNames: [\"/brave-browser\", \"/opt/brave.com/brave/brave-browser\"],\n },\n },\n {\n id: \"vivaldi\",\n displayName: \"Vivaldi\",\n darwin: {\n executableCandidates: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n userDataDir: \"~/Library/Application Support/Vivaldi\",\n bundleId: \"com.vivaldi.Vivaldi\",\n processNames: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Vivaldi/User Data\",\n processNames: [\"/vivaldi/application/vivaldi.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/vivaldi\",\n \"/usr/bin/vivaldi-stable\",\n \"/opt/vivaldi/vivaldi\",\n resolveBinaryFromPath(\"vivaldi\"),\n resolveBinaryFromPath(\"vivaldi-stable\"),\n ],\n userDataDir: \"~/.config/vivaldi\",\n processNames: [\"/vivaldi\", \"/vivaldi-stable\", \"/opt/vivaldi/vivaldi\"],\n },\n },\n {\n id: \"helium\",\n displayName: \"Helium\",\n darwin: {\n executableCandidates: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n userDataDir: \"~/Library/Application Support/net.imput.helium\",\n processNames: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n },\n },\n {\n id: \"chromium\",\n displayName: \"Chromium\",\n darwin: {\n executableCandidates: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n userDataDir: \"~/Library/Application Support/Chromium\",\n bundleId: \"org.chromium.Chromium\",\n processNames: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Chromium\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Chromium/User Data\",\n processNames: [\"/chromium/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ],\n userDataDir: \"~/.config/chromium\",\n processNames: [\"/chromium\", \"/chromium-browser\"],\n },\n },\n] as const;\n\nexport function getAllBrowserBrands(): readonly BrowserBrandRecord[] {\n return BROWSER_BRANDS;\n}\n\nexport function getBrowserBrand(id: BrowserBrandId): BrowserBrandRecord {\n const brand = BROWSER_BRANDS.find((candidate) => candidate.id === id);\n if (!brand) {\n throw new Error(`Unknown browser brand \"${id}\".`);\n }\n return brand;\n}\n\nexport function resolveBrandPlatformConfig(\n brand: BrowserBrandRecord,\n platform: NodeJS.Platform = process.platform,\n): BrowserBrandPlatformConfig | undefined {\n if (platform === \"darwin\") {\n return brand.darwin;\n }\n if (platform === \"win32\") {\n return brand.win32;\n }\n if (platform === \"linux\") {\n return brand.linux;\n }\n return undefined;\n}\n\nexport function detectInstalledBrowserBrands(): readonly InstalledBrowserBrand[] {\n const installations: InstalledBrowserBrand[] = [];\n\n for (const brand of BROWSER_BRANDS) {\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n continue;\n }\n\n const executablePath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!executablePath) {\n continue;\n }\n\n installations.push({\n brand,\n brandId: brand.id,\n displayName: brand.displayName,\n executablePath,\n userDataDir: resolve(expandHome(platformConfig.userDataDir)),\n });\n }\n\n return installations;\n}\n\nexport function resolveBrandExecutablePath(\n brand: BrowserBrandRecord,\n explicitPath?: string,\n): string {\n if (explicitPath !== undefined) {\n const resolvedPath = resolve(expandHome(explicitPath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`${brand.displayName} executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n const resolvedPath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!resolvedPath) {\n throw new Error(\n `Could not find a ${brand.displayName} executable. Pass --executable-path or browser.executablePath.`,\n );\n }\n return resolvedPath;\n}\n\nexport function resolveBrandUserDataDir(brand: BrowserBrandRecord, explicitDir?: string): string {\n if (explicitDir !== undefined) {\n return resolve(expandHome(explicitDir));\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n return resolve(expandHome(platformConfig.userDataDir));\n}\n\nexport function isBrandProcess(brand: BrowserBrandRecord, commandLine: string): boolean {\n const normalizedCommand = normalizeCommand(commandLine);\n if (!normalizedCommand) {\n return false;\n }\n if (normalizedCommand.includes(\"crashpad_handler\")) {\n return false;\n }\n if (/\\s--type=/.test(normalizedCommand)) {\n return false;\n }\n\n return getBrandProcessMarkers(brand).some((marker) => normalizedCommand.includes(marker));\n}\n\nexport function findBrandProcess(brand: BrowserBrandRecord): {\n readonly pid: number;\n} | null {\n for (const processEntry of listProcesses()) {\n if (isBrandProcess(brand, processEntry.commandLine)) {\n return { pid: processEntry.pid };\n }\n }\n\n return null;\n}\n\nfunction getBrandProcessMarkers(brand: BrowserBrandRecord): readonly string[] {\n const markers = new Set<string>();\n\n for (const config of [brand.darwin, brand.win32, brand.linux]) {\n if (!config) {\n continue;\n }\n\n for (const processName of config.processNames) {\n const normalized = normalizeCommand(processName);\n if (normalized) {\n markers.add(normalized);\n }\n }\n\n for (const candidate of config.executableCandidates) {\n if (!candidate) {\n continue;\n }\n\n const normalized = normalizeCommand(resolve(expandHome(candidate)));\n if (normalized) {\n markers.add(normalized);\n }\n }\n }\n\n return [...markers];\n}\n\nfunction resolveExecutableCandidates(\n candidates: readonly (string | null)[],\n): readonly (string | null)[] {\n return candidates.map((candidate) => (candidate ? resolve(expandHome(candidate)) : null));\n}\n\nfunction listProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n if (process.platform === \"win32\") {\n return listWindowsProcesses();\n }\n return listUnixProcesses();\n}\n\nfunction listUnixProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\"ps\", [\"-A\", \"-o\", \"pid=,command=\"], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => {\n const match = /^(\\d+)\\s+(.*)$/.exec(line);\n if (!match) {\n return null;\n }\n\n const pid = Number.parseInt(match[1] ?? \"\", 10);\n const commandLine = match[2]?.trim() ?? \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction listWindowsProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n \"Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine | ConvertTo-Json -Compress\",\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n if (!output) {\n return [];\n }\n\n const parsed = JSON.parse(output) as\n | {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }\n | readonly {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }[];\n const records = Array.isArray(parsed) ? parsed : [parsed];\n\n return records\n .map((record) => {\n const pid = Number(record.ProcessId);\n const commandLine = typeof record.CommandLine === \"string\" ? record.CommandLine.trim() : \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction normalizeCommand(value: string): string {\n return value.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\n\nimport { detectInstalledBrowserBrands } from \"./browser-brands.js\";\nimport type {\n LocalBrowserInstallation,\n LocalChromeInstallation,\n LocalChromeProfileDescriptor,\n} from \"./types.js\";\n\nexport function expandHome(value: string): string {\n if (value === \"~\" || value.startsWith(\"~/\")) {\n return join(homedir(), value.slice(1));\n }\n return value;\n}\n\nexport function resolveChromeUserDataDir(userDataDir: string | undefined): string {\n if (userDataDir !== undefined) {\n return resolve(expandHome(userDataDir));\n }\n\n const installation = detectLocalChromeInstallations().find(\n (candidate) =>\n existsSync(join(candidate.userDataDir, \"Local State\")) || candidate.executablePath !== null,\n );\n if (!installation) {\n throw new Error(\"Could not find a local Chrome or Chromium profile directory.\");\n }\n return installation.userDataDir;\n}\n\nexport function resolveChromeExecutablePath(executablePath: string | undefined): string {\n if (executablePath !== undefined) {\n const resolvedPath = resolve(expandHome(executablePath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`Chrome executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const chromeInstallation = detectLocalChromeInstallations().find(\n (installation) => installation.brand === \"chrome\" && installation.executablePath !== null,\n );\n if (chromeInstallation?.executablePath) {\n return chromeInstallation.executablePath;\n }\n\n const brandedInstallation = detectInstalledBrowserBrands()[0];\n if (brandedInstallation) {\n return brandedInstallation.executablePath;\n }\n\n throw new Error(\n \"Could not find a Chrome or Chromium executable. Pass browser.executablePath or --executable-path.\",\n );\n}\n\nfunction detectLocalChromeInstallations(): readonly LocalChromeInstallation[] {\n if (process.platform === \"darwin\") {\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\"/Applications/Chromium.app/Contents/MacOS/Chromium\"]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Chromium\"),\n },\n ];\n }\n\n if (process.platform === \"win32\") {\n const programFiles = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\");\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n join(programFiles, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n join(programFiles, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Chromium\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Chromium\", \"User Data\"),\n },\n ];\n }\n\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"google-chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"chromium\"),\n },\n ];\n}\n\nexport function detectLocalBrowserInstallations(): readonly LocalBrowserInstallation[] {\n return detectInstalledBrowserBrands().map((installation) => ({\n brand: installation.brandId,\n executablePath: installation.executablePath,\n userDataDir: installation.userDataDir,\n }));\n}\n\nexport function listLocalChromeProfiles(\n userDataDir = resolveChromeUserDataDir(undefined),\n): readonly LocalChromeProfileDescriptor[] {\n const resolvedUserDataDir = resolve(expandHome(userDataDir));\n const localStatePath = join(resolvedUserDataDir, \"Local State\");\n if (!existsSync(localStatePath)) {\n return [];\n }\n\n try {\n const raw = JSON.parse(readFileSync(localStatePath, \"utf8\")) as {\n readonly profile?: {\n readonly info_cache?: Record<string, unknown>;\n };\n };\n const infoCache = raw.profile?.info_cache;\n if (!infoCache || typeof infoCache !== \"object\") {\n return [];\n }\n\n return Object.entries(infoCache)\n .map(([directory, info]) => {\n const record =\n info && typeof info === \"object\" && !Array.isArray(info)\n ? (info as Record<string, unknown>)\n : {};\n const name =\n typeof record.name === \"string\" && record.name.trim().length > 0\n ? record.name.trim()\n : directory || basename(directory);\n return {\n directory,\n name,\n userDataDir: resolvedUserDataDir,\n };\n })\n .filter((profile) => profile.directory.trim().length > 0)\n .sort((left, right) => left.directory.localeCompare(right.directory));\n } catch {\n return [];\n }\n}\n\nexport function readDevToolsActivePort(userDataDir: string): {\n readonly port: number;\n readonly webSocketPath: string;\n} | null {\n const devToolsPath = join(userDataDir, \"DevToolsActivePort\");\n if (!existsSync(devToolsPath)) {\n return null;\n }\n\n try {\n const lines = readFileSync(devToolsPath, \"utf8\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const port = Number.parseInt(lines[0] ?? \"\", 10);\n if (!Number.isInteger(port) || port <= 0) {\n return null;\n }\n\n return {\n port,\n webSocketPath: lines[1] ?? \"/devtools/browser\",\n };\n } catch {\n return null;\n }\n}\n\nexport function firstExistingPath(\n candidates: readonly (string | null | undefined)[],\n): string | null {\n for (const candidate of candidates) {\n if (candidate && existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport function resolveBinaryFromPath(name: string): string | null {\n try {\n const output = execFileSync(\"which\", [name], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return output.length > 0 ? output : null;\n } catch {\n return null;\n }\n}\n","import { detectLocalBrowserInstallations, readDevToolsActivePort } from \"./chrome-discovery.js\";\nimport type { InspectedCdpEndpoint, LocalCdpBrowserCandidate } from \"./types.js\";\n\nconst DEFAULT_DISCOVERY_TIMEOUT_MS = 2_000;\nconst DISCOVERY_FALLBACK_PORT = 9222;\n\ninterface InspectCdpEndpointInput {\n readonly endpoint: string;\n readonly headers?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n}\n\ninterface ProbeCdpEndpointInput extends InspectCdpEndpointInput {\n readonly fallbackBrowserWebSocketPath?: string;\n}\n\ninterface NormalizedProbeTarget {\n readonly fallbackBrowserWebSocketUrl?: string;\n readonly httpUrl: URL;\n}\n\ninterface CdpVersionResponse {\n readonly Browser?: string;\n readonly \"Protocol-Version\"?: string;\n readonly webSocketDebuggerUrl?: string;\n}\n\nexport class OpensteerAttachAmbiguousError extends Error {\n readonly code = \"attach-ambiguous\";\n\n constructor(readonly candidates: readonly LocalCdpBrowserCandidate[]) {\n super(\n \"Multiple running Chromium DevTools endpoints were discovered. Specify the desired endpoint explicitly.\",\n );\n this.name = \"OpensteerAttachAmbiguousError\";\n }\n}\n\nexport async function inspectCdpEndpoint(\n input: InspectCdpEndpointInput,\n): Promise<InspectedCdpEndpoint> {\n const inspected = await probeCdpEndpoint(input);\n if (inspected === null) {\n throw new Error(`Could not inspect CDP endpoint \"${input.endpoint}\".`);\n }\n return inspected;\n}\n\nexport async function discoverLocalCdpBrowsers(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<readonly LocalCdpBrowserCandidate[]> {\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n const candidates: LocalCdpBrowserCandidate[] = [];\n\n for (const installation of detectLocalBrowserInstallations()) {\n const activePort = readDevToolsActivePort(installation.userDataDir);\n if (!activePort) {\n continue;\n }\n\n const inspected = await probeCdpEndpoint({\n endpoint: `http://127.0.0.1:${String(activePort.port)}`,\n timeoutMs,\n fallbackBrowserWebSocketPath: activePort.webSocketPath,\n });\n if (inspected === null) {\n continue;\n }\n\n candidates.push({\n ...inspected,\n source: \"devtools-active-port\",\n installationBrand: installation.brand,\n userDataDir: installation.userDataDir,\n });\n }\n\n const fallbackCandidate = await probeCdpEndpoint({\n endpoint: String(DISCOVERY_FALLBACK_PORT),\n timeoutMs,\n });\n if (fallbackCandidate !== null) {\n candidates.push({\n ...fallbackCandidate,\n source: \"fallback-port\",\n });\n }\n\n return dedupeAndSortCandidates(candidates);\n}\n\nexport async function selectAttachBrowserCandidate(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<LocalCdpBrowserCandidate> {\n const candidates = await discoverLocalCdpBrowsers(input);\n if (candidates.length === 0) {\n throw new Error(\n \"No running Chromium browser instance found. Enable remote debugging or specify an attach endpoint explicitly.\",\n );\n }\n\n const highestPriority = Math.max(...candidates.map(getAttachCandidatePriority));\n const winners = candidates.filter(\n (candidate) => getAttachCandidatePriority(candidate) === highestPriority,\n );\n if (winners.length === 1) {\n return winners[0]!;\n }\n\n throw new OpensteerAttachAmbiguousError(candidates);\n}\n\nasync function probeCdpEndpoint(\n input: ProbeCdpEndpointInput,\n): Promise<InspectedCdpEndpoint | null> {\n const trimmedEndpoint = input.endpoint.trim();\n if (!trimmedEndpoint) {\n return null;\n }\n\n const target = normalizeProbeTarget(trimmedEndpoint);\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n\n const versionPayload = await fetchJson<CdpVersionResponse>(\n new URL(\"/json/version\", target.httpUrl),\n input.headers,\n timeoutMs,\n );\n if (versionPayload !== null) {\n const payload = versionPayload;\n if (\n typeof payload.webSocketDebuggerUrl === \"string\" &&\n payload.webSocketDebuggerUrl.length > 0\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n payload.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n ...(payload.Browser === undefined ? {} : { browser: payload.Browser }),\n ...(payload[\"Protocol-Version\"] === undefined\n ? {}\n : { protocolVersion: payload[\"Protocol-Version\"] }),\n });\n }\n }\n\n const listPayload = await fetchJson<\n readonly {\n readonly type?: unknown;\n readonly webSocketDebuggerUrl?: unknown;\n }[]\n >(new URL(\"/json/list\", target.httpUrl), input.headers, timeoutMs);\n if (listPayload !== null) {\n const browserTarget =\n listPayload.find((candidate) => candidate.type === \"browser\") ??\n listPayload.find((candidate) => typeof candidate.webSocketDebuggerUrl === \"string\");\n if (typeof browserTarget?.webSocketDebuggerUrl === \"string\") {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n browserTarget.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n });\n }\n }\n\n if (\n input.fallbackBrowserWebSocketPath !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: buildBrowserWebSocketUrl(\n target.httpUrl,\n input.fallbackBrowserWebSocketPath,\n ),\n httpUrl: target.httpUrl,\n });\n }\n\n if (\n target.fallbackBrowserWebSocketUrl !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: target.fallbackBrowserWebSocketUrl,\n httpUrl: target.httpUrl,\n });\n }\n\n return null;\n}\n\nfunction dedupeAndSortCandidates(\n candidates: readonly LocalCdpBrowserCandidate[],\n): readonly LocalCdpBrowserCandidate[] {\n const deduped = new Map<string, LocalCdpBrowserCandidate>();\n\n for (const candidate of [...candidates].sort(compareCandidates)) {\n const existing = deduped.get(candidate.endpoint);\n if (!existing || compareCandidates(candidate, existing) < 0) {\n deduped.set(candidate.endpoint, candidate);\n }\n }\n\n return [...deduped.values()].sort(compareCandidates);\n}\n\nfunction compareCandidates(\n left: LocalCdpBrowserCandidate,\n right: LocalCdpBrowserCandidate,\n): number {\n return (\n getAttachCandidatePriority(right) - getAttachCandidatePriority(left) ||\n left.endpoint.localeCompare(right.endpoint) ||\n (left.userDataDir ?? \"\").localeCompare(right.userDataDir ?? \"\")\n );\n}\n\nfunction getAttachCandidatePriority(candidate: LocalCdpBrowserCandidate): number {\n return candidate.source === \"devtools-active-port\" ? 2 : 1;\n}\n\nfunction createInspectedCdpEndpoint(input: {\n readonly browser?: string;\n readonly browserWebSocketUrl: string;\n readonly httpUrl: URL;\n readonly protocolVersion?: string;\n}): InspectedCdpEndpoint {\n const port = readPort(input.httpUrl);\n return {\n endpoint: input.browserWebSocketUrl,\n ...(input.browser === undefined ? {} : { browser: input.browser }),\n ...(input.protocolVersion === undefined ? {} : { protocolVersion: input.protocolVersion }),\n httpUrl: input.httpUrl.toString(),\n ...(port === undefined ? {} : { port }),\n };\n}\n\nfunction normalizeProbeTarget(endpoint: string): NormalizedProbeTarget {\n if (/^\\d+$/.test(endpoint)) {\n return {\n httpUrl: new URL(`http://127.0.0.1:${endpoint}`),\n };\n }\n\n if (endpoint.startsWith(\"ws://\") || endpoint.startsWith(\"wss://\")) {\n const url = new URL(endpoint);\n return {\n fallbackBrowserWebSocketUrl: url.toString(),\n httpUrl: new URL(`${url.protocol === \"wss:\" ? \"https:\" : \"http:\"}//${url.host}`),\n };\n }\n\n try {\n const url =\n endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")\n ? new URL(endpoint)\n : new URL(`http://${endpoint}`);\n return {\n httpUrl: new URL(`${url.protocol}//${url.host}`),\n };\n } catch {\n throw new Error(`Invalid CDP endpoint \"${endpoint}\".`);\n }\n}\n\nasync function fetchJson<T>(\n url: URL,\n headers: Readonly<Record<string, string>> | undefined,\n timeoutMs: number,\n): Promise<T | null> {\n const response = await fetch(url, {\n ...(headers === undefined ? {} : { headers }),\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n if (!response?.ok) {\n return null;\n }\n\n return (await response.json()) as T;\n}\n\nasync function isHttpEndpointReachable(url: URL, timeoutMs: number): Promise<boolean> {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n return response !== null;\n}\n\nfunction buildBrowserWebSocketUrl(httpUrl: URL, webSocketPath: string): string {\n const protocol = httpUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${protocol}//${httpUrl.host}${normalizeWebSocketPath(webSocketPath)}`;\n}\n\nfunction normalizeWebSocketPath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nfunction rewriteBrowserWebSocketHost(browserWsUrl: string, requestedUrl: URL): string {\n try {\n const parsed = new URL(browserWsUrl);\n parsed.protocol = requestedUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n parsed.hostname = requestedUrl.hostname;\n parsed.port = requestedUrl.port;\n return parsed.toString();\n } catch {\n return browserWsUrl;\n }\n}\n\nfunction readPort(url: URL): number | undefined {\n const port = Number.parseInt(url.port, 10);\n return Number.isInteger(port) && port > 0 ? port : undefined;\n}\n","export type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\nexport type JsonArray = readonly JsonValue[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction canonicalizeJsonValue(value: unknown, path: string): JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(`${path} must be a finite JSON number`);\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry, index) => canonicalizeJsonValue(entry, `${path}[${index}]`));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(`${path} must be a plain JSON object`);\n }\n\n const sorted = Object.keys(value).sort((left, right) => left.localeCompare(right));\n const result: Record<string, JsonValue> = {};\n\n for (const key of sorted) {\n const entry = value[key];\n if (entry === undefined) {\n throw new TypeError(`${path}.${key} must not be undefined`);\n }\n\n result[key] = canonicalizeJsonValue(entry, `${path}.${key}`);\n }\n\n return result;\n}\n\nexport function toCanonicalJsonValue(value: unknown): JsonValue {\n return canonicalizeJsonValue(value, \"value\");\n}\n\nexport function canonicalJsonString(value: unknown): string {\n return JSON.stringify(toCanonicalJsonValue(value));\n}\n\nexport function stableJsonString(value: unknown): string {\n return `${JSON.stringify(toCanonicalJsonValue(value), null, 2)}\\n`;\n}\n","import {\n access,\n mkdir,\n open,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { stableJsonString } from \"../json.js\";\n\nconst LOCK_RETRY_DELAYS_MS = [1, 2, 5, 10, 20, 50] as const;\nconst LOCK_METADATA_FILENAME = \"owner.json\";\nconst LOCK_METADATA_VERSION = 1;\nconst LOCK_HEARTBEAT_INTERVAL_MS = 1_000;\nconst LOCK_ORPHAN_GRACE_MS = 2_000;\nconst LOCK_METADATALESS_STALE_MS = 30_000;\n\ninterface FilesystemLockMetadata {\n readonly version: typeof LOCK_METADATA_VERSION;\n readonly ownerToken: string;\n readonly pid: number;\n readonly acquiredAt: number;\n readonly heartbeatAt: number;\n}\n\nexport function normalizeNonEmptyString(name: string, value: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new TypeError(`${name} must not be empty`);\n }\n\n return normalized;\n}\n\nexport function normalizeTimestamp(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n\n return value;\n}\n\nexport function encodePathSegment(value: string): string {\n return encodeURIComponent(normalizeNonEmptyString(\"path segment\", value));\n}\n\nexport function joinStoragePath(...segments: readonly string[]): string {\n return segments.join(\"/\");\n}\n\nexport function resolveStoragePath(rootPath: string, relativePath: string): string {\n if (path.isAbsolute(relativePath)) {\n throw new TypeError(`storage path ${relativePath} must be relative`);\n }\n\n const segments = relativePath.split(\"/\");\n if (segments.length === 0 || segments.some((segment) => segment.length === 0)) {\n throw new TypeError(`storage path ${relativePath} is invalid`);\n }\n\n for (const segment of segments) {\n if (segment === \".\" || segment === \"..\") {\n throw new TypeError(`storage path ${relativePath} must not contain path traversal`);\n }\n }\n\n return path.join(rootPath, ...segments);\n}\n\nexport async function ensureDirectory(directoryPath: string): Promise<void> {\n await mkdir(directoryPath, { recursive: true });\n}\n\nexport async function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n}\n\nexport async function writeJsonFileAtomic(filePath: string, value: unknown): Promise<void> {\n await writeTextFileAtomic(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileAtomic(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const temporaryPath = `${filePath}.${randomUUID()}.tmp`;\n\n await writeFile(temporaryPath, value, \"utf8\");\n await rename(temporaryPath, filePath);\n}\n\nexport async function writeJsonFileExclusive(filePath: string, value: unknown): Promise<void> {\n await writeTextFileExclusive(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileExclusive(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const handle = await open(filePath, \"wx\");\n\n try {\n await handle.writeFile(value, \"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nexport async function writeBufferIfMissing(filePath: string, value: Uint8Array): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n\n try {\n const handle = await open(filePath, \"wx\");\n try {\n await handle.writeFile(value);\n } finally {\n await handle.close();\n }\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nexport async function readBinaryFile(filePath: string): Promise<Uint8Array> {\n return new Uint8Array(await readFile(filePath));\n}\n\nexport async function listJsonFiles(directoryPath: string): Promise<readonly string[]> {\n if (!(await pathExists(directoryPath))) {\n return [];\n }\n\n return (await readdir(directoryPath))\n .filter((entry) => entry.endsWith(\".json\"))\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function sha256Hex(value: Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function filePathToUri(filePath: string): string {\n return pathToFileURL(filePath).toString();\n}\n\nexport function fileUriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return (error as NodeJS.ErrnoException | undefined)?.code === \"EEXIST\";\n}\n\nexport async function withFilesystemLock<T>(lockPath: string, task: () => Promise<T>): Promise<T> {\n await ensureDirectory(path.dirname(lockPath));\n\n const ownerToken = randomUUID();\n let attempt = 0;\n while (true) {\n try {\n await mkdir(lockPath);\n const acquiredAt = Date.now();\n await writeLockMetadata(lockPath, {\n version: LOCK_METADATA_VERSION,\n ownerToken,\n pid: process.pid,\n acquiredAt,\n heartbeatAt: acquiredAt,\n });\n break;\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n throw error;\n }\n\n if (await tryRecoverFilesystemLock(lockPath)) {\n attempt = 0;\n continue;\n }\n\n const delayMs = LOCK_RETRY_DELAYS_MS[Math.min(attempt, LOCK_RETRY_DELAYS_MS.length - 1)];\n attempt += 1;\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n const heartbeatTimer = setInterval(() => {\n void touchLockMetadata(lockPath, ownerToken);\n }, LOCK_HEARTBEAT_INTERVAL_MS);\n heartbeatTimer.unref?.();\n\n try {\n return await task();\n } finally {\n clearInterval(heartbeatTimer);\n const metadata = await readLockMetadata(lockPath);\n if (metadata?.ownerToken === ownerToken) {\n await rm(lockPath, { recursive: true, force: true });\n }\n }\n}\n\nasync function tryRecoverFilesystemLock(lockPath: string): Promise<boolean> {\n if (!(await shouldRecoverFilesystemLock(lockPath))) {\n return false;\n }\n\n await rm(lockPath, { recursive: true, force: true });\n return true;\n}\n\nasync function shouldRecoverFilesystemLock(lockPath: string): Promise<boolean> {\n const metadata = await readLockMetadata(lockPath);\n if (metadata !== undefined) {\n if (isProcessRunning(metadata.pid)) {\n return false;\n }\n return Date.now() - metadata.heartbeatAt >= LOCK_ORPHAN_GRACE_MS;\n }\n\n const lockStat = await stat(lockPath).catch(() => undefined);\n if (lockStat === undefined) {\n return false;\n }\n return Date.now() - lockStat.mtimeMs >= LOCK_METADATALESS_STALE_MS;\n}\n\nasync function readLockMetadata(lockPath: string): Promise<FilesystemLockMetadata | undefined> {\n const metadataPath = path.join(lockPath, LOCK_METADATA_FILENAME);\n if (!(await pathExists(metadataPath))) {\n return undefined;\n }\n\n try {\n const parsed = await readJsonFile<Partial<FilesystemLockMetadata>>(metadataPath);\n const pid = parsed.pid;\n const acquiredAt = parsed.acquiredAt;\n const heartbeatAt = parsed.heartbeatAt;\n if (\n parsed.version !== LOCK_METADATA_VERSION ||\n typeof parsed.ownerToken !== \"string\" ||\n parsed.ownerToken.length === 0 ||\n typeof pid !== \"number\" ||\n !Number.isInteger(pid) ||\n pid <= 0 ||\n typeof acquiredAt !== \"number\" ||\n !Number.isFinite(acquiredAt) ||\n typeof heartbeatAt !== \"number\" ||\n !Number.isFinite(heartbeatAt)\n ) {\n return undefined;\n }\n return {\n version: LOCK_METADATA_VERSION,\n ownerToken: parsed.ownerToken,\n pid: pid,\n acquiredAt: acquiredAt,\n heartbeatAt: heartbeatAt,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function writeLockMetadata(\n lockPath: string,\n metadata: FilesystemLockMetadata,\n): Promise<void> {\n try {\n await writeJsonFileAtomic(path.join(lockPath, LOCK_METADATA_FILENAME), metadata);\n } catch (error) {\n await rm(lockPath, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function touchLockMetadata(lockPath: string, ownerToken: string): Promise<void> {\n const metadata = await readLockMetadata(lockPath);\n if (metadata === undefined || metadata.ownerToken !== ownerToken) {\n return;\n }\n\n await writeJsonFileAtomic(path.join(lockPath, LOCK_METADATA_FILENAME), {\n ...metadata,\n heartbeatAt: Date.now(),\n }).catch(() => undefined);\n}\n\nfunction isProcessRunning(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException | undefined)?.code === \"EPERM\";\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionCapabilities, OpensteerSessionOwnership } from \"@opensteer/protocol\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"./internal/filesystem.js\";\nimport { inspectCdpEndpoint } from \"./local-browser/cdp-discovery.js\";\n\nexport const OPENSTEER_LIVE_SESSION_LAYOUT = \"opensteer-session\";\nexport const OPENSTEER_LIVE_SESSION_VERSION = 1;\n\nexport type OpensteerLiveSessionProvider = \"local\" | \"cloud\";\n\ninterface PersistedSessionRecordBase {\n readonly layout: typeof OPENSTEER_LIVE_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LIVE_SESSION_VERSION;\n readonly provider: OpensteerLiveSessionProvider;\n readonly workspace?: string;\n readonly updatedAt: number;\n readonly activePageRef?: string;\n readonly reconnectable?: boolean;\n readonly capabilities?: OpensteerSessionCapabilities;\n}\n\nexport interface PersistedLocalBrowserSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"local\";\n readonly engine: \"playwright\" | \"abp\";\n readonly ownership?: Exclude<OpensteerSessionOwnership, \"managed\">;\n readonly endpoint?: string;\n readonly baseUrl?: string;\n readonly remoteDebuggingUrl?: string;\n readonly sessionDir?: string;\n readonly pid: number;\n readonly startedAt: number;\n readonly executablePath?: string;\n readonly userDataDir: string;\n}\n\nexport interface PersistedCloudSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"cloud\";\n readonly sessionId: string;\n readonly startedAt: number;\n}\n\nexport type PersistedSessionRecord =\n | PersistedLocalBrowserSessionRecord\n | PersistedCloudSessionRecord;\n\nexport function resolveLiveSessionRecordPath(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): string {\n return path.join(rootPath, \"live\", provider === \"local\" ? \"local.json\" : \"cloud.json\");\n}\n\nexport function resolveLocalSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"local\");\n}\n\nexport function resolveCloudSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"cloud\");\n}\n\nexport async function readPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<PersistedSessionRecord | undefined> {\n const sessionPath = resolveLiveSessionRecordPath(rootPath, provider);\n if (!(await pathExists(sessionPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedSessionRecord>>(sessionPath);\n if (provider === \"local\" && isPersistedLocalBrowserSessionRecord(parsed)) {\n return parsed;\n }\n if (provider === \"cloud\" && isPersistedCloudSessionRecord(parsed)) {\n return parsed;\n }\n return undefined;\n}\n\nexport async function readPersistedCloudSessionRecord(\n rootPath: string,\n): Promise<PersistedCloudSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"cloud\");\n return record?.provider === \"cloud\" ? record : undefined;\n}\n\nexport async function readPersistedLocalBrowserSessionRecord(\n rootPath: string,\n): Promise<PersistedLocalBrowserSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"local\");\n return record?.provider === \"local\" ? record : undefined;\n}\n\nexport async function writePersistedSessionRecord(\n rootPath: string,\n record: PersistedSessionRecord,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLiveSessionRecordPath(rootPath, record.provider), record);\n}\n\nexport async function clearPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<void> {\n await rm(resolveLiveSessionRecordPath(rootPath, provider), { force: true });\n}\n\nexport function getPersistedLocalBrowserSessionOwnership(\n record: PersistedLocalBrowserSessionRecord,\n): Exclude<OpensteerSessionOwnership, \"managed\"> {\n return record.ownership === \"attached\" ? \"attached\" : \"owned\";\n}\n\nexport async function isAttachedLocalBrowserSessionReachable(\n record: PersistedLocalBrowserSessionRecord,\n): Promise<boolean> {\n if (getPersistedLocalBrowserSessionOwnership(record) !== \"attached\") {\n return false;\n }\n if (record.engine !== \"playwright\" || record.endpoint === undefined) {\n return false;\n }\n try {\n await inspectCdpEndpoint({\n endpoint: record.endpoint,\n timeoutMs: 1_500,\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isPersistedCloudSessionRecord(\n value: Partial<PersistedCloudSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedCloudSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"cloud\" &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n\nfunction isPersistedLocalBrowserSessionRecord(\n value: Partial<PersistedLocalBrowserSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedLocalBrowserSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"local\" &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n (value.ownership === undefined ||\n value.ownership === \"owned\" ||\n value.ownership === \"attached\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt) &&\n typeof value.userDataDir === \"string\" &&\n value.userDataDir.length > 0\n );\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport function resolveOpensteerStateDir(): string {\n const explicit = process.env.OPENSTEER_HOME?.trim();\n if (explicit) {\n return path.resolve(explicit);\n }\n\n if (process.platform === \"win32\") {\n return path.join(\n process.env.LOCALAPPDATA ?? path.join(homedir(), \"AppData\", \"Local\"),\n \"Opensteer\",\n );\n }\n\n if (process.platform === \"darwin\") {\n return path.join(homedir(), \"Library\", \"Application Support\", \"Opensteer\");\n }\n\n return path.join(\n process.env.XDG_STATE_HOME ?? path.join(homedir(), \".local\", \"state\"),\n \"opensteer\",\n );\n}\n\nexport function resolveLocalViewRootDir(): string {\n return path.join(resolveOpensteerStateDir(), \"local-view\");\n}\n\nexport function resolveLocalViewPreferencesPath(): string {\n return path.join(resolveLocalViewRootDir(), \"preferences.json\");\n}\n\nexport function resolveLocalViewServiceDir(): string {\n return path.join(resolveLocalViewRootDir(), \"service\");\n}\n\nexport function resolveLocalViewSessionsDir(): string {\n return path.join(resolveLocalViewRootDir(), \"sessions\");\n}\n\nexport function resolveLocalViewServiceLockDir(): string {\n return path.join(resolveLocalViewServiceDir(), \"startup.lock\");\n}\n\nexport function resolveLocalViewServiceStatePath(): string {\n return path.join(resolveLocalViewServiceDir(), \"state.json\");\n}\n","import { createHash } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionOwnership } from \"@opensteer/protocol\";\n\nimport {\n ensureDirectory,\n listJsonFiles,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n} from \"../internal/filesystem.js\";\nimport {\n getPersistedLocalBrowserSessionOwnership,\n type PersistedLocalBrowserSessionRecord,\n} from \"../live-session.js\";\nimport { resolveLocalViewSessionsDir } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT = \"opensteer-local-view-session\";\nexport const OPENSTEER_LOCAL_VIEW_SESSION_VERSION = 1;\n\nexport interface PersistedLocalViewSessionManifest {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SESSION_VERSION;\n readonly sessionId: string;\n readonly rootPath: string;\n readonly workspace?: string;\n readonly engine: PersistedLocalBrowserSessionRecord[\"engine\"];\n readonly ownership: OpensteerSessionOwnership;\n readonly pid: number;\n readonly startedAt: number;\n readonly updatedAt: number;\n}\n\nexport function buildLocalViewSessionId(input: {\n readonly rootPath: string;\n readonly startedAt: number;\n readonly pid?: number;\n readonly ownership?: OpensteerSessionOwnership;\n readonly endpoint?: string;\n readonly baseUrl?: string;\n readonly remoteDebuggingUrl?: string;\n}): string {\n const ownership = input.ownership ?? \"owned\";\n const identity =\n ownership === \"attached\"\n ? (input.endpoint ?? input.remoteDebuggingUrl ?? input.baseUrl ?? \"attached\")\n : `pid:${String(input.pid ?? 0)}`;\n const hash = createHash(\"sha256\")\n .update(`${input.rootPath}\\n${ownership}\\n${identity}\\n${String(input.startedAt)}`)\n .digest(\"hex\");\n return `local_${hash.slice(0, 24)}`;\n}\n\nexport function buildLocalViewSessionIdForRecord(input: {\n readonly rootPath: string;\n readonly live: PersistedLocalBrowserSessionRecord;\n}): string {\n const ownership = getPersistedLocalBrowserSessionOwnership(input.live);\n if (ownership === \"attached\") {\n return buildLocalViewSessionId({\n rootPath: input.rootPath,\n ownership,\n startedAt: input.live.startedAt,\n ...(input.live.endpoint === undefined ? {} : { endpoint: input.live.endpoint }),\n ...(input.live.baseUrl === undefined ? {} : { baseUrl: input.live.baseUrl }),\n ...(input.live.remoteDebuggingUrl === undefined\n ? {}\n : { remoteDebuggingUrl: input.live.remoteDebuggingUrl }),\n });\n }\n return buildLocalViewSessionId({\n rootPath: input.rootPath,\n ownership,\n startedAt: input.live.startedAt,\n pid: input.live.pid,\n });\n}\n\nexport function createLocalViewSessionManifest(input: {\n readonly rootPath: string;\n readonly workspace?: string;\n readonly live: PersistedLocalBrowserSessionRecord;\n readonly ownership: OpensteerSessionOwnership;\n}): PersistedLocalViewSessionManifest {\n return {\n layout: OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT,\n version: OPENSTEER_LOCAL_VIEW_SESSION_VERSION,\n sessionId: buildLocalViewSessionIdForRecord({\n rootPath: input.rootPath,\n live: input.live,\n }),\n rootPath: input.rootPath,\n ...(input.workspace === undefined ? {} : { workspace: input.workspace }),\n engine: input.live.engine,\n ownership: input.ownership,\n pid: input.live.pid,\n startedAt: input.live.startedAt,\n updatedAt: Date.now(),\n };\n}\n\nexport async function writeLocalViewSessionManifest(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<void> {\n await ensureDirectory(resolveLocalViewSessionsDir());\n await writeJsonFileAtomic(resolveLocalViewSessionManifestPath(manifest.sessionId), manifest);\n}\n\nexport async function deleteLocalViewSessionManifest(sessionId: string): Promise<void> {\n await rm(resolveLocalViewSessionManifestPath(sessionId), { force: true }).catch(() => undefined);\n}\n\nexport async function readLocalViewSessionManifest(\n sessionId: string,\n): Promise<PersistedLocalViewSessionManifest | undefined> {\n const manifestPath = resolveLocalViewSessionManifestPath(sessionId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(manifestPath);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n}\n\nexport async function listLocalViewSessionManifests(): Promise<\n readonly PersistedLocalViewSessionManifest[]\n> {\n const directoryPath = resolveLocalViewSessionsDir();\n const fileNames = await listJsonFiles(directoryPath);\n const manifests = await Promise.all(\n fileNames.map(async (fileName) => {\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(\n path.join(directoryPath, fileName),\n ).catch(() => undefined);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n }),\n );\n return manifests\n .filter((manifest): manifest is PersistedLocalViewSessionManifest => manifest !== undefined)\n .sort(\n (left, right) =>\n left.startedAt - right.startedAt || left.sessionId.localeCompare(right.sessionId),\n );\n}\n\nexport function resolveLocalViewSessionManifestPath(sessionId: string): string {\n return path.join(resolveLocalViewSessionsDir(), `${sessionId}.json`);\n}\n\nfunction isPersistedLocalViewSessionManifest(\n value: Partial<PersistedLocalViewSessionManifest> | null | undefined,\n): value is PersistedLocalViewSessionManifest {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SESSION_VERSION &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.rootPath === \"string\" &&\n value.rootPath.length > 0 &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n (value.ownership === \"owned\" ||\n value.ownership === \"attached\" ||\n value.ownership === \"managed\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst PROCESS_STARTED_AT_MS = Math.floor(Date.now() - process.uptime() * 1_000);\nconst PROCESS_START_TIME_TOLERANCE_MS = 1_000;\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst LINUX_STAT_START_TIME_FIELD_INDEX = 19;\n\nexport interface ProcessOwner {\n readonly pid: number;\n readonly processStartedAtMs: number;\n}\n\nexport type ProcessLiveness = \"live\" | \"dead\" | \"unknown\";\n\nexport const CURRENT_PROCESS_OWNER: ProcessOwner = {\n pid: process.pid,\n processStartedAtMs: PROCESS_STARTED_AT_MS,\n};\n\nlet linuxClockTicksPerSecondPromise: Promise<number | null> | null = null;\n\nexport function parseProcessOwner(value: unknown): ProcessOwner | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const parsed = value as Partial<ProcessOwner>;\n const pid = Number(parsed.pid);\n const processStartedAtMs = Number(parsed.processStartedAtMs);\n if (!Number.isInteger(pid) || pid <= 0) {\n return null;\n }\n if (!Number.isInteger(processStartedAtMs) || processStartedAtMs <= 0) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nexport function processOwnersEqual(left: ProcessOwner | null, right: ProcessOwner | null): boolean {\n if (!left || !right) {\n return left === right;\n }\n\n return left.pid === right.pid && left.processStartedAtMs === right.processStartedAtMs;\n}\n\nexport async function getProcessLiveness(owner: ProcessOwner): Promise<ProcessLiveness> {\n if (\n owner.pid === process.pid &&\n hasMatchingProcessStartTime(owner.processStartedAtMs, PROCESS_STARTED_AT_MS)\n ) {\n return \"live\";\n }\n\n const startedAtMs = await readProcessStartedAtMs(owner.pid);\n if (typeof startedAtMs === \"number\") {\n return hasMatchingProcessStartTime(owner.processStartedAtMs, startedAtMs) ? \"live\" : \"dead\";\n }\n\n return isProcessRunning(owner.pid) ? \"unknown\" : \"dead\";\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\"\n ? error.code\n : undefined;\n return code !== \"ESRCH\";\n }\n}\n\nexport async function readProcessOwner(pid: number): Promise<ProcessOwner | null> {\n const processStartedAtMs = await readProcessStartedAtMs(pid);\n if (processStartedAtMs === null) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nfunction hasMatchingProcessStartTime(\n expectedStartedAtMs: number,\n actualStartedAtMs: number,\n): boolean {\n return Math.abs(expectedStartedAtMs - actualStartedAtMs) <= PROCESS_START_TIME_TOLERANCE_MS;\n}\n\nasync function readProcessStartedAtMs(pid: number): Promise<number | null> {\n if (pid <= 0) {\n return null;\n }\n\n if (process.platform === \"linux\") {\n return readLinuxProcessStartedAtMs(pid);\n }\n\n if (process.platform === \"win32\") {\n return readWindowsProcessStartedAtMs(pid);\n }\n\n return readPsProcessStartedAtMs(pid);\n}\n\nasync function readLinuxProcessStartedAtMs(pid: number): Promise<number | null> {\n let statRaw: string;\n try {\n statRaw = await readFile(`/proc/${String(pid)}/stat`, \"utf8\");\n } catch {\n return null;\n }\n\n const startTicks = parseLinuxProcessStartTicks(statRaw);\n if (startTicks === null) {\n return null;\n }\n\n const [bootTimeMs, clockTicksPerSecond] = await Promise.all([\n readLinuxBootTimeMs(),\n readLinuxClockTicksPerSecond(),\n ]);\n if (bootTimeMs === null || clockTicksPerSecond === null) {\n return null;\n }\n\n return Math.floor(bootTimeMs + (startTicks * 1_000) / clockTicksPerSecond);\n}\n\nfunction parseLinuxProcessStartTicks(statRaw: string): number | null {\n const closingParenIndex = statRaw.lastIndexOf(\")\");\n if (closingParenIndex === -1) {\n return null;\n }\n\n const fields = statRaw\n .slice(closingParenIndex + 2)\n .trim()\n .split(/\\s+/);\n const startTicks = Number(fields[LINUX_STAT_START_TIME_FIELD_INDEX]);\n return Number.isFinite(startTicks) && startTicks >= 0 ? startTicks : null;\n}\n\nasync function readLinuxBootTimeMs(): Promise<number | null> {\n try {\n const statRaw = await readFile(\"/proc/stat\", \"utf8\");\n const bootTimeLine = statRaw.split(\"\\n\").find((line) => line.startsWith(\"btime \"));\n if (!bootTimeLine) {\n return null;\n }\n\n const bootTimeSeconds = Number.parseInt(bootTimeLine.slice(\"btime \".length), 10);\n return Number.isFinite(bootTimeSeconds) ? bootTimeSeconds * 1_000 : null;\n } catch {\n return null;\n }\n}\n\nasync function readLinuxClockTicksPerSecond(): Promise<number | null> {\n if (!linuxClockTicksPerSecondPromise) {\n linuxClockTicksPerSecondPromise = execFileAsync(\"getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n })\n .then(({ stdout }) => {\n const value = Number.parseInt(stdout.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : null;\n })\n .catch(() => null);\n }\n\n return linuxClockTicksPerSecondPromise;\n}\n\nasync function readWindowsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n `(Get-Process -Id ${String(pid)}).StartTime.ToUniversalTime().ToString(\"o\")`,\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n },\n );\n const isoTimestamp = stdout.trim();\n if (!isoTimestamp) {\n return null;\n }\n const startedAtMs = Date.parse(isoTimestamp);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n\nasync function readPsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n });\n const startedAt = stdout.trim();\n if (!startedAt) {\n return null;\n }\n\n const startedAtMs = Date.parse(startedAt.replace(/\\s+/g, \" \"));\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n","import { rm } from \"node:fs/promises\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"../internal/filesystem.js\";\nimport { getProcessLiveness, type ProcessLiveness } from \"../local-browser/process-owner.js\";\nimport { resolveLocalViewServiceStatePath } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT = \"opensteer-local-view-service\";\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_VERSION = 3;\n\nexport interface PersistedLocalViewServiceState {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SERVICE_VERSION;\n readonly pid: number;\n readonly processStartedAtMs: number;\n readonly startedAt: number;\n readonly port: number;\n readonly token: string;\n readonly url: string;\n}\n\nexport async function readLocalViewServiceState(): Promise<\n PersistedLocalViewServiceState | undefined\n> {\n const statePath = resolveLocalViewServiceStatePath();\n if (!(await pathExists(statePath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewServiceState>>(statePath);\n if (!isPersistedLocalViewServiceState(parsed)) {\n return undefined;\n }\n\n return parsed;\n}\n\nexport async function writeLocalViewServiceState(\n state: PersistedLocalViewServiceState,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLocalViewServiceStatePath(), state);\n}\n\nexport async function clearLocalViewServiceState(\n match:\n | {\n readonly pid: number;\n readonly token: string;\n }\n | undefined = undefined,\n): Promise<void> {\n if (match !== undefined) {\n const current = await readLocalViewServiceState();\n if (current === undefined || current.pid !== match.pid || current.token !== match.token) {\n return;\n }\n }\n\n await rm(resolveLocalViewServiceStatePath(), { force: true });\n}\n\nexport async function isLocalViewServiceStateLive(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<boolean> {\n return (await getLocalViewServiceStateLiveness(state)) !== \"dead\";\n}\n\nexport async function getLocalViewServiceStateLiveness(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<ProcessLiveness> {\n if (state === undefined) {\n return \"dead\";\n }\n\n return getProcessLiveness({\n pid: state.pid,\n processStartedAtMs: state.processStartedAtMs,\n });\n}\n\nfunction isPersistedLocalViewServiceState(\n value: Partial<PersistedLocalViewServiceState> | null | undefined,\n): value is PersistedLocalViewServiceState {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SERVICE_VERSION &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.processStartedAtMs === \"number\" &&\n Number.isFinite(value.processStartedAtMs) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.port === \"number\" &&\n Number.isFinite(value.port) &&\n typeof value.token === \"string\" &&\n value.token.length > 0 &&\n typeof value.url === \"string\" &&\n value.url.length > 0\n );\n}\n"]}
|