@calimero-network/registry-cli 1.19.1 → 1.20.0
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/index.js +3 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/remote-config.ts","../src/lib/local-config.ts","../src/commands/health.ts","../src/lib/ipfs.ts","../src/utils/spinner.ts","../src/commands/ipfs.ts","../src/lib/local-storage.ts","../src/lib/local-artifacts.ts","../src/lib/local-server.ts","../src/commands/local.ts","../src/lib/services.ts","../src/commands/bundle.ts","../src/commands/config.ts","../src/commands/org.ts","../src/index.ts"],"names":["path","os","fs","defaultConfig","spinner","ora","chalk","Command","version","crypto","manifest","res","t","require"],"mappings":";;;;;;;;;;;;;;AAQO,IAAM,oBAAA,GAAuB,+BAAA;AAEpC,SAAS,aAAA,GAAkC;AACzC,EAAA,OAAO,EAAE,QAAA,EAAU,EAAE,GAAA,EAAK,sBAAqB,EAAE;AACnD;AASO,IAAM,eAAN,MAAmB;AAAA,EAChB,UAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAaA,KAAA,CAAK,IAAA;AAAA,MACrBC,IAAG,OAAA,EAAQ;AAAA,MACX,oBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,UAAA,EAAW;AAAA,EAChC;AAAA,EAEQ,UAAA,GAA+B;AACrC,IAAA,MAAM,WAAW,aAAA,EAAc;AAG/B,IAAA,IAAIC,GAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA;AAAA,UAC1BA,GAAA,CAAG,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM;AAAA,SACzC;AACA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,GAAG,QAAA,CAAS,QAAA;AAAA,YACZ,GAAI,cAAA,CAAe,QAAA,IAAY;AAAC;AAClC,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAmB;AAEzB,IAAA,MAAM,SAAA,GAAYF,KAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAC9C,IAAA,IAAI,CAACE,GAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAAA,GAAA,CAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AAIA,IAAA,MAAM,YAAA,GAAiC;AAAA,MACrC,QAAA,EAAU;AAAA,QACR,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA;AAAA,QAE1B,GAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GACrB,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,EAAO,GACtC;AAAC;AACP,KACF;AACA,IAAAA,GAAA,CAAG,aAAA,CAAc,KAAK,UAAA,EAAY,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,GAAyB;AACvB,IAAA,OACE,QAAQ,GAAA,CAAI,qBAAA,IACZ,IAAA,CAAK,MAAA,CAAO,SAAS,GAAA,IACrB,oBAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,GAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,GAAA,GAAM,GAAA;AAC3B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,GAAgC;AAC9B,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,IAAA,CAAK,OAAO,QAAA,CAAS,MAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,GAAS,MAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAO,QAAA,CAAS,MAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA8B;AAC5B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR,GAAA,EAAK,KAAK,cAAA,EAAe;AAAA;AAAA,QAEzB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAU,GAAI,KAAA,GAAQ;AAAA;AACrC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AACF,CAAA;AC7HA,SAASC,cAAAA,GAAiC;AACxC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAKN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,UAAA,EAAY;AAAA,KACd;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAKH,KAAAA,CAAK,IAAA,CAAKC,IAAG,OAAA,EAAQ,EAAG,sBAAsB,MAAM,CAAA;AAAA,MACzD,cAAcD,KAAAA,CAAK,IAAA,CAAKC,IAAG,OAAA,EAAQ,EAAG,sBAAsB,WAAW;AAAA,KACzE;AAAA,IACA,SAAA,EAAW;AAAA,MACT,YAAYD,KAAAA,CAAK,IAAA,CAAKC,IAAG,OAAA,EAAQ,EAAG,sBAAsB,WAAW,CAAA;AAAA,MACrE,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,OAAA;AAAA,MACb,YAAA,EAAc,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAM;AAAA;AACrC,GACF;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAaD,KAAAA,CAAK,IAAA;AAAA,MACrBC,IAAG,OAAA,EAAQ;AAAA,MACX,oBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,UAAUD,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,IAAW,oBAAoB,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,UAAA,EAAW;AAAA,EAChC;AAAA,EAEQ,UAAA,GAA8B;AACpC,IAAA,MAAM,WAAWE,cAAAA,EAAc;AAG/B,IAAA,IAAID,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA;AAAA,UAC1BA,GAAAA,CAAG,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,MAAM;AAAA,SACzC;AACA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ;AAAA,YACN,GAAG,QAAA,CAAS,MAAA;AAAA,YACZ,GAAI,cAAA,CAAe,MAAA,IAAU;AAAC,WAChC;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,GAAG,QAAA,CAAS,IAAA;AAAA,YACZ,GAAI,cAAA,CAAe,IAAA,IAAQ;AAAC,WAC9B;AAAA,UACA,SAAA,EAAW;AAAA,YACT,GAAG,QAAA,CAAS,SAAA;AAAA,YACZ,GAAI,cAAA,CAAe,SAAA,IAAa;AAAC;AACnC,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAmB;AAEzB,IAAA,MAAM,SAAA,GAAYF,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAC9C,IAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAAA,IAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AAGA,IAAAA,GAAAA,CAAG,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,OAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAAA,EAC5B;AAAA,EAEA,QAAQ,IAAA,EAAoB;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,GAAO,IAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,OAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAAA,EAC5B;AAAA,EAEA,QAAQ,IAAA,EAAoB;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,GAAO,IAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AAAA,EAC5B;AAAA,EAEA,cAAc,IAAA,EAAoB;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,GAAa,IAAA;AAChC,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA,EAGA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA;AAAA,EAC1B;AAAA,EAEA,WAAW,GAAA,EAAmB;AAG5B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,GAAA,GAAM,GAAA;AACvB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,YAAA,GAAeF,KAAAA,CAAK,IAAA,CAAK,KAAK,WAAW,CAAA;AAC1D,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,UAAA,GAAaA,KAAAA,CAAK,IAAA,CAAK,KAAK,WAAW,CAAA;AAC7D,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,YAAA;AAAA,EAC1B;AAAA,EAEA,gBAAgB,GAAA,EAAmB;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,YAAA,GAAe,GAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,UAAA,GAAa,GAAA;AACnC,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA,EAGA,kBAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACrB;AAAA,EAEA,mBAAmB,MAAA,EAAqD;AACtE,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,EAAE,GAAG,KAAK,MAAA,CAAO,SAAA,EAAW,GAAG,MAAA,EAAO;AAC9D,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA,EAGA,iBAAA,GAA0B;AACxB,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,KAAK,UAAA,EAAW;AAAA,MAChB,KAAK,eAAA,EAAgB;AAAA,MACrBA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc,SAAS,CAAA;AAAA,MACtCA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc,MAAM;AAAA,KACrC;AAEA,IAAA,IAAA,CAAK,QAAQ,CAAA,GAAA,KAAO;AAClB,MAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,QAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA,EAGA,SAAA,GAA6B;AAC3B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAASC,cAAAA,EAAc;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AACF,CAAA;;;ACnMO,IAAM,aAAA,GAAgB,IAAI,OAAA,CAAQ,QAAQ,CAAA,CAC9C,WAAA,CAAY,+CAA+C,CAAA,CAC3D,MAAA,CAAO,OAAO,OAAA,EAAS,OAAA,KAAY;AAClC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,IAAA,EAAK;AAKxC,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,YAAY,KAAA,EAAO;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,IAAA,GAAA,GAAM,UAAU,KAAA,CAAM,OAAA,EAAS,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,QAAA,CAAA;AAAA,EACpD,CAAA,MAAO;AAIL,IAAA,MAAM,IAAA,GAAA,CAAQ,UAAA,EAAY,GAAA,IAAO,IAAI,YAAA,EAAa,CAAE,cAAA,EAAe,EAChE,IAAA,EAAK,CACL,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACpB,IAAA,GAAA,GAAM,GAAG,IAAI,CAAA,YAAA,CAAA;AAAA,EACf;AAEA,EAAA,MAAMC,QAAAA,GAAUC,IAAA,CAAI,wBAAwB,CAAA,CAAE,KAAA,EAAM;AAEpD,EAAA,IAAI;AAIF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,MACpC,OAAA,EAAS,QAAA,CAAS,UAAA,EAAY,OAAA,IAAW,OAAO,CAAA;AAAA,MAChD,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB,KACvC,CAAA;AAED,IAAA,IAAI,IAAA,EAAM,WAAW,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,4BAA4B,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,OAC1D;AAAA,IACF;AAEA,IAAAD,QAAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAIE,MAAA,CAAM,KAAA,CAAM,WAAW,IAAA,CAAK,MAAM,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,OAAA,CAAQ,IAAIA,MAAA,CAAM,IAAA,CAAK,YAAY,IAAA,CAAK,SAAS,EAAE,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAF,QAAAA,CAAQ,KAAK,yBAAyB,CAAA;AAGtC,IAAA,MAAM,MAAA,GACH,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,IAChC,MAAM,YAAA,CAAa,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,IACpC,aAAA;AACF,IAAA,OAAA,CAAQ,MAAME,MAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,MAAM,EAAE,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,MAAMA,MAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,EAAE,CAAC,CAAA;AACzC,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACNA,MAAA,CAAM,KAAK,gDAAgD;AAAA,OAC7D;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AClEH,eAAsB,aAAa,QAAA,EAAmC;AACpE,EAAA,IAAI;AAKF,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,YAAA,GAAe,gDAAA;AAErB,IAAA,OAAA,CAAQ,IAAI,6DAAmD,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAEnE,IAAA,OAAO,YAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAAA,MACrF,EAAE,OAAO,KAAA;AAAM,KACjB;AAAA,EACF;AACF;AAEA,eAAsB,gBAAA,CACpB,KACA,UAAA,EACiB;AACjB,EAAA,IAAI;AAIF,IAAA,OAAA,CAAQ,IAAI,+DAAqD,CAAA;AACjE,IAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAGnE,IAAA,MAAM,gBAAA,GAAmB,wCAAwC,GAAG;AAAA,4EAAA,CAAA;AAGpE,IAAA,MAAM,eAAA,GAAkB,UAAA,IAAc,CAAA,EAAG,GAAG,CAAA,KAAA,CAAA;AAG5C,IAAA,aAAA,CAAc,iBAAiB,gBAAgB,CAAA;AAE/C,IAAA,OAAO,eAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAAA,MACzF,EAAE,OAAO,KAAA;AAAM,KACjB;AAAA,EACF;AACF;ACpDO,IAAM,OAAA,GAAU,CAAC,IAAA,KAAiBD,IAAAA,CAAI,IAAI,CAAA;;;ACE1C,IAAM,cAAc,IAAIE,OAAAA,CAAQ,MAAM,CAAA,CAC1C,WAAA,CAAY,iBAAiB,CAAA,CAC7B,UAAA;AAAA,EACC,IAAIA,OAAAA,CAAQ,QAAQ,CAAA,CACjB,WAAA,CAAY,uBAAuB,CAAA,CACnC,QAAA,CAAS,QAAA,EAAU,4BAA4B,CAAA,CAC/C,MAAA,CAAO,OAAM,IAAA,KAAQ;AACpB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,sBAAsB,CAAA,CAAE,KAAA,EAAM;AAEhD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,IAAI,CAAA;AACnC,MAAA,CAAA,CAAE,QAAQ,CAAA,2BAAA,CAA6B,CAAA;AACvC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,GAAG,CAAA,CAAE,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,CAAA,CAAE,KAAK,eAAe,CAAA;AACtB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,QAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC3C;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA,CACC,UAAA;AAAA,EACC,IAAIA,OAAAA,CAAQ,UAAU,EACnB,WAAA,CAAY,2BAA2B,EACvC,QAAA,CAAS,OAAA,EAAS,sBAAsB,CAAA,CACxC,SAAS,UAAA,EAAY,6BAA6B,EAClD,MAAA,CAAO,OAAO,KAAK,MAAA,KAAW;AAC7B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,0BAA0B,CAAA,CAAE,KAAA,EAAM;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AACrD,MAAA,CAAA,CAAE,QAAQ,CAAA,6BAAA,CAA+B,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,UAAU,CAAA,CAAE,CAAA;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,GAAG,CAAA,CAAE,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,CAAA,CAAE,KAAK,iBAAiB,CAAA;AACxB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,QAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC3C;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;ACsDK,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EAER,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAWP,KAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,WAAW,CAAA;AAC1D,IAAA,IAAA,CAAK,sBAAsBA,KAAAA,CAAK,IAAA;AAAA,MAC9B,OAAO,UAAA,EAAW;AAAA,MAClB;AAAA,KACF;AACA,IAAA,IAAA,CAAK,gBAAgBA,KAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,gBAAgB,CAAA;AACpE,IAAA,IAAA,CAAK,IAAA,GAAO;AAAA,MACV,IAAA,sBAAU,GAAA,EAAI;AAAA,MACd,eAAA,sBAAqB,GAAA,EAAI;AAAA,MACzB,SAAA,sBAAe,GAAA;AAAI,KACrB;AACA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI;AAEF,MAAA,IAAIE,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChC,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAMA,GAAAA,CAAG,aAAa,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA;AAClE,QAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,MACnD;AAGA,MAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC3C,QAAA,MAAM,sBAAsB,IAAA,CAAK,KAAA;AAAA,UAC/BA,GAAAA,CAAG,YAAA,CAAa,IAAA,CAAK,mBAAA,EAAqB,MAAM;AAAA,SAClD;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,IAAI,GAAA;AAAA,UAC9B,MAAA,CAAO,QAAQ,mBAAmB;AAAA,SACpC;AAAA,MACF;AAGA,MAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA,EAAG;AACrC,QAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAAA,UACzBA,GAAAA,CAAG,YAAA,CAAa,IAAA,CAAK,aAAA,EAAe,MAAM;AAAA,SAC5C;AACA,QAAA,IAAA,CAAK,KAAK,SAAA,GAAY,IAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,KAAK,8CAA8C,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAG9B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,CAAA;AACjD,MAAAA,GAAAA,CAAG,cAAc,IAAA,CAAK,QAAA,EAAU,KAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAGhE,MAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,eAAe,CAAA;AACvE,MAAAA,GAAAA,CAAG,aAAA;AAAA,QACD,IAAA,CAAK,mBAAA;AAAA,QACL,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAoB,IAAA,EAAM,CAAC;AAAA,OAC5C;AAGA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,SAAS,CAAA;AAC3D,MAAAA,GAAAA,CAAG,aAAA;AAAA,QACD,IAAA,CAAK,aAAA;AAAA,QACL,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC;AAAA,OACtC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qBAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA,CAAA;AAAA,QACA,EAAE,OAAO,KAAA;AAAM,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAyD;AAC/D,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAE7C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,CAAA,GAAA,KAAO,GAAA,CAAI,KAAK,QAAA,CAAS,OAAA,CAAQ,IAAK,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,CAAI,gBAAA,KAAqB,QAAQ,GAAG,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAA,EAAwC;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA,EAClC;AAAA,EAEA,MAAA,CAAO,QAAgB,GAAA,EAAuB;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,eAAe,SAAA,EAAkC;AAC/C,IAAA,MAAM,WAA0B,EAAC;AAGjC,IAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,KAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,EAAG;AACjE,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,SAAS,GAAG,CAAA,EAAG;AACnC,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AAClC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,IAAA,IAAQ,EAAA;AACtC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,MAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAA,EAAK,MAAA;AAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KACvB,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA,EAIA,iBAAA,CAAkB,KAAaM,QAAAA,EAA6C;AAC1E,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAIA,QAAO,CAAA,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1C;AAAA,EAEA,iBAAA,CACE,GAAA,EACAA,QAAAA,EACA,QAAA,EACM;AACN,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAIA,QAAO,CAAA,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,gBAAgB,IAAA,EAAkC;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,eAAA,CAAgB,MAAc,QAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,QAAA,GAAW;AACT,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC9B,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,IAAA;AAAA,MACzC,cAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU;AAAA,KACtC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,UAAA,EAAsC;AACjD,IAAA,MAAM,SAAA,GAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC/D,IAAA,MAAM,UAAA,GACJ,cACAR,KAAAA,CAAK,IAAA;AAAA,MACH,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,MACvB,SAAA;AAAA,MACA,UAAU,SAAS,CAAA,KAAA;AAAA,KACrB;AAGF,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACzC,IAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,MAAAA,IAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,IAAA,EAAM,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACvC,eAAA,EAAiB,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,MAC7D,SAAA,EAAW,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,KAAK,SAAS;AAAA,KACnD;AAEA,IAAAA,GAAAA,CAAG,cAAc,UAAA,EAAY,IAAA,CAAK,UAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAChE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,UAAA,EAAmC;AAC/C,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAE,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAMA,IAAG,YAAA,CAAa,UAAA,EAAY,MAAM,CAAC,CAAA;AAGjE,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,UAAA,CAAW,IAAA,IAAQ,EAAE,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,IAAI,GAAA;AAAA,MAC9B,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,eAAA,IAAmB,EAAE;AAAA,KACjD;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,UAAA,CAAW,SAAA,IAAa,EAAE,CAAC,CAAA;AAExE,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAkC;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,IAAA,GAAsB;AAE1B,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,OAAA,EAAS,KAAA;AAAA,MACT,OAAA,EAAS,4BAAA;AAAA,MACT,UAAA,EAAY,OAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,mBAAA;AAAA,QACN,WAAA,EAAa,+CAAA;AAAA,QACb,IAAA,EAAM,CAAC,QAAA,EAAU,IAAI,CAAA;AAAA,QACrB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA,EAAS,CAAC,wBAAwB,CAAA;AAAA,QAClC,MAAM;AAAC,OACT;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,yBAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA,YAAY;AAAC,KACf;AAEA,IAAA,IAAA,CAAK,iBAAA;AAAA,MACH,cAAA,CAAe,OAAA;AAAA,MACf,cAAA,CAAe,UAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF;AACF,CAAA;AC7WO,IAAM,sBAAN,MAA0B;AAAA,EACvB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EAER,WAAA,CAAY,QAAqB,SAAA,EAA2B;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,eAAA,EAAgB;AAC3C,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,EAAG;AACrC,MAAAA,IAAG,SAAA,CAAU,IAAA,CAAK,cAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,mBAAA,CACJ,UAAA,EACA,KAAA,EACAM,UACA,QAAA,EACiB;AACjB,IAAA,IAAI,CAACN,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAE,CAAA;AAAA,IACxD;AAGA,IAAA,MAAM,gBAAgBF,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,OAAOQ,QAAO,CAAA;AACjE,IAAA,IAAI,CAACN,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,MAAAA,IAAG,SAAA,CAAU,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,UAAA,GAAaF,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,QAAQ,CAAA;AACpD,IAAAE,GAAAA,CAAG,YAAA,CAAa,UAAA,EAAY,UAAU,CAAA;AAGtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAEnD,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,aAAA,CACJ,KAAA,EACAM,QAAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,eAAeR,KAAAA,CAAK,IAAA,CAAK,KAAK,YAAA,EAAc,KAAA,EAAOQ,UAAS,QAAQ,CAAA;AAE1E,IAAA,IAAI,CAACN,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,OAAOA,GAAAA,CAAG,aAAa,YAAY,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,YAAY,IAAA,EAA+B;AAC/C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,IAAI,CAAA;AAExD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAACA,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AACjD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAA;AAAA,IACxD;AAEA,IAAA,OAAOA,GAAAA,CAAG,aAAa,YAAY,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,iBACJ,QAAA,EAC2C;AAC3C,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAClC,IAAA,MAAM,UAAA,GAAaA,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAASO,QAAO,UAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAE1E,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,kBAAkB,QAAA,EAAmC;AACjE,IAAA,MAAM,UAAA,GAAaP,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AAC3C,IAAA,OAAOO,OAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,UAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,cAAA,CAAe,KAAA,EAAeD,QAAAA,EAAiB,QAAA,EAA0B;AACvE,IAAA,MAAM,OAAA,GAAU,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA;AAC9E,IAAA,OAAO,GAAG,OAAO,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,EAAIA,QAAO,IAAI,QAAQ,CAAA,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,qBAAqB,IAAA,EAAsB;AACzC,IAAA,MAAM,OAAA,GAAU,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA;AAC9E,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,mBAAA,CACJ,MAAA,GAAiB,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,EACtB;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAA0B;AAC7C,MAAA,IAAI,QAAkB,EAAC;AACvB,MAAA,MAAM,KAAA,GAAQN,GAAAA,CAAG,WAAA,CAAY,GAAG,CAAA;AAEhC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,QAAA,GAAWF,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,QAAA,MAAM,IAAA,GAAOE,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAEjC,QAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,UAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACrB;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAE9C,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,QAAA,CAAS,IAAI,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,OAAA,EAAQ;AAEtC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAAA,GAAAA,CAAG,WAAW,IAAI,CAAA;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,GAIE;AACA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,UAAA,GAA0B,IAAA;AAE9B,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAA0B;AAC7C,MAAA,IAAI,QAAkB,EAAC;AACvB,MAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,WAAA,CAAY,GAAG,CAAA;AAEhC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,QAAA,GAAWF,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,QAAA,MAAM,IAAA,GAAOE,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAEjC,QAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,UAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACrB;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,EAAG;AACpC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAE9C,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,QAAA,CAAS,IAAI,CAAA;AAC9B,QAAA,UAAA,EAAA;AACA,QAAA,SAAA,IAAa,KAAA,CAAM,IAAA;AAEnB,QAAA,IAAI,CAAC,UAAA,IAAc,KAAA,CAAM,KAAA,GAAQ,UAAA,EAAY;AAC3C,UAAA,UAAA,GAAa,KAAA,CAAM,KAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AC1LO,IAAM,sBAAN,MAA0B;AAAA,EACvB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA,GAAiC,IAAA;AAAA,EACjC,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,CAAe,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,mBAAA,CAAoB,MAAA,EAAQ,KAAK,SAAS,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,MAAM,IAAA,EAA8B;AACxC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAGjC,IAAA,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAG9B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ;AAAA,MACpB,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAGD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM;AAAA,MAC/B,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACd,CAAA;AAGD,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,KAC/D;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,SAAA,EAAW;AACnC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAA,GAAmC;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS;AACtC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AAE3D,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,SAAA;AAAA,MACd,GAAA,EAAK,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA;AAAA,MAC7D,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAAA,MAChC,WAAW,KAAA,CAAM,aAAA;AAAA,MACjB,gBAAgB,aAAA,CAAc;AAAA,KAChC;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAGrB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,eAAA,EAAgB;AACjD,IAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAAA,GAAAA,CAAG,OAAO,YAAA,EAAc,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,UAAA,EAAsC;AACjD,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,UAAA,EAAmC;AAC/C,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,UAAU,IAAA,EAAK;AAAA,EAC5B;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,YAAY;AACtC,MAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,IACxB,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,YAAY;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS;AACtC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AAE3D,MAAA,OAAO;AAAA,QACL,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,gBAAgB,aAAA,CAAc,UAAA;AAAA,QAC9B,WAAW,aAAA,CAAc;AAAA,OAC3B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,sCAAA;AAAA,MACA,OAAO,SAAS,KAAA,KAAU;AACxB,QAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAAM,QAAAA,EAAS,QAAA,KAAa,OAAA,CAAQ,MAAA;AAM7C,QAAA,IAAI;AACF,UAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA;AAAA,YAC7C,KAAA;AAAA,YACAA,QAAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,KAAA,CAAM,MAAA,CAAO,gBAAgB,0BAA0B,CAAA;AACvD,UAAA,KAAA,CAAM,MAAA;AAAA,YACJ,qBAAA;AAAA,YACA,yBAAyB,QAAQ,CAAA,CAAA;AAAA,WACnC;AAEA,UAAA,OAAO,YAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO;AAAA,YACL,UAAA,EAAY,GAAA;AAAA,YACZ,KAAA,EAAO,WAAA;AAAA,YACP,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,kBAAA,EAAoB,OAAO,SAAS,KAAA,KAAU;AAC5D,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,MAAA;AAEzB,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,cAAA,CAAe,YAAY,IAAI,CAAA;AAG/D,QAAA,KAAA,CAAM,MAAA,CAAO,gBAAgB,0BAA0B,CAAA;AAEvD,QAAA,OAAO,YAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,GAAA;AAAA,UACZ,KAAA,EAAO,WAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,YAAY;AAC3C,MAAA,OAAO,MAAM,KAAK,SAAA,EAAU;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,YAAY;AAC3C,MAAA,MAAM,KAAK,KAAA,EAAM;AACjB,MAAA,OAAO,EAAE,SAAS,wCAAA,EAAyC;AAAA,IAC7D,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAM,OAAA,KAAW;AAChD,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AACjD,MAAA,OAAO,EAAE,UAAA,EAAW;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gBAAA,EAAkB,OAAM,OAAA,KAAW;AAClD,MAAA,MAAM,EAAE,UAAA,EAAW,GAAI,OAAA,CAAQ,IAAA;AAC/B,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAU,CAAA;AAC7B,MAAA,OAAO,EAAE,SAAS,4BAAA,EAA6B;AAAA,IACjD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,YAAY;AAC1C,MAAA,MAAM,KAAK,IAAA,EAAK;AAChB,MAAA,OAAO,EAAE,SAAS,iCAAA,EAAkC;AAAA,IACtD,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,iBAAA,EAAmB,OAAO,SAAS,KAAA,KAAU;AAC3D,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAMtB,MAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,OAAA,EAAAA,QAAAA,EAAS,WAAU,GAAI,KAAA;AAG7C,MAAA,IAAI,OAAOA,QAAAA,EAAS;AAClB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,KAAKA,QAAO,CAAA;AAC9D,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,YAC1B,KAAA,EAAO,kBAAA;AAAA,YACP,OAAA,EAAS,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAIA,QAAO,CAAA,UAAA;AAAA,WAClC,CAAA;AAAA,QACH;AACA,QAAA,OAAO,CAAC,QAAQ,CAAA;AAAA,MAClB;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,aAAA,EAAc;AAChD,MAAA,MAAM,UAAU,EAAC;AAEjB,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAE/B,QAAA,IAAI,GAAA,IAAO,MAAA,CAAO,OAAA,KAAY,GAAA,EAAK;AACjC,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,YAAA,GAAe,OAAO,SAAA,EAAW,MAAA;AACvC,UAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,SAAA,EAAW;AAC/C,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AAGA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,OAAA,CAAQ,aAAA,CAAc,EAAE,OAAO,CAAA;AACpD,QAAA,IAAI,UAAA,KAAe,GAAG,OAAO,UAAA;AAE7B,QAAA,OAAO,CAAA,CAAE,UAAA,CAAW,aAAA,CAAc,CAAA,CAAE,YAAY,MAAA,EAAW;AAAA,UACzD,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAC,CAAA;AAID,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,OAAO,OAAA;AAAA,MACT;AAGA,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAA4B;AACxD,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA;AACnD,QAAA,IAAI,CAAC,QAAA,IAAY,MAAA,CAAO,UAAA,GAAa,SAAS,UAAA,EAAY;AACxD,UAAA,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,MAAM,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,mCAAA;AAAA,MACA,OAAO,SAAS,KAAA,KAAU;AACxB,QAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,OAAA,EAAAA,QAAAA,KAAY,OAAA,CAAQ,MAAA;AAK1C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,KAAKA,QAAO,CAAA;AAE9D,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,YAC1B,KAAA,EAAO,oBAAA;AAAA,YACP,OAAA,EAAS,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAA,EAAIA,QAAO,CAAA;AAAA,WAClD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAA;AC1SA,IAAM,YAAA,GAAe,IAAID,OAAAA,CAAQ,OAAO,CAAA,CAAE,WAAA;AAAA,EACxC;AACF,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIA,OAAAA,CAAQ,OAAO,CAAA,CAChB,WAAA,CAAY,6BAA6B,CAAA,CACzC,MAAA,CAAO,mBAAA,EAAqB,2BAAA,EAA6B,MAAM,CAAA,CAC/D,MAAA,CAAO,mBAAA,EAAqB,4BAAA,EAA8B,SAAS,CAAA,CACnE,MAAA;AAAA,IACC,sBAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAM,OAAA,KAAW;AACvB,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,4BAA4B,CAAA,CAAE,KAAA,EAAM;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC3B,MAAA,MAAA,CAAO,aAAA,CAAc,QAAQ,UAAU,CAAA;AACvC,MAAA,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AACzC,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC,CAAA;AAEzC,MAAAD,QAAAA,CAAQ,OAAA;AAAA,QACN,oCAAoC,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA;AAAA,OAC1E;AACA,MAAA,OAAA,CAAQ,GAAA,CAAIE,MAAAA,CAAM,IAAA,CAAK,oCAA6B,CAAC,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ,yBAAoB,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA;AAAA;AAC1D,OACF;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ,gCAAyB,MAAA,CAAO,aAAA,EAAe,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA;AAAA;AACrE,OACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,KAAA,CAAM,CAAA,gBAAA,EAAY,OAAO,UAAA,EAAY,EAAE,CAAC,CAAA;AAC1D,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ,4BAAqB,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,QAAA;AAAA;AAC3D,OACF;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ,2BAAoB,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,MAAA;AAAA;AAC1D,OACF;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,IAAA;AAAA,UACJ;AAAA;AACF,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,gCAAgC,CAAA;AAC7C,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,QAAQ,MAAM,CAAA,CACf,YAAY,4BAA4B,CAAA,CACxC,OAAO,YAAY;AAClB,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,4BAA4B,CAAA,CAAE,KAAA,EAAM;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,OAAO,IAAA,EAAK;AAElB,MAAAD,QAAAA,CAAQ,QAAQ,wBAAwB,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AACd,MAAAA,QAAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,QAAQ,QAAQ,CAAA,CACjB,YAAY,6BAA6B,CAAA,CACzC,OAAO,YAAY;AAClB,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,mCAAmC,CAAA,CAAE,KAAA,EAAM;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AAEtC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAAD,QAAAA,CAAQ,QAAQ,2BAA2B,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAIE,MAAAA,CAAM,KAAA,CAAM,kBAAa,MAAA,CAAO,GAAG,EAAE,CAAC,CAAA;AAClD,QAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,mBAAY,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,mBAAY,MAAA,CAAO,SAAS,eAAe,CAAC,CAAA;AACpE,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNA,MAAAA,CAAM,KAAA,CAAM,CAAA,qBAAA,EAAiB,MAAA,CAAO,cAAc,CAAA,UAAA,CAAY;AAAA,SAChE;AAAA,MACF,CAAA,MAAO;AACL,QAAAF,QAAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNE,MAAAA,CAAM,MAAA;AAAA,YACJ;AAAA;AACF,SACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,uCAAuC,CAAA;AACpD,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CAChB,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,aAAA,EAAe,kCAAkC,CAAA,CACxD,MAAA,CAAO,OAAM,OAAA,KAAW;AACvB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACND,MAAAA,CAAM,OAAO,yDAA+C;AAAA,OAC9D;AACA,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,gCAAgC,CAAC,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,MAAMF,QAAAA,GAAUC,IAAAA,CAAI,kCAAkC,CAAA,CAAE,KAAA,EAAM;AAE9D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,OAAO,KAAA,EAAM;AAEnB,MAAAD,QAAAA,CAAQ,QAAQ,2BAA2B,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAIE,MAAAA,CAAM,KAAA,CAAM,wCAAmC,CAAC,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,qCAAqC,CAAA;AAClD,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACjB,WAAA,CAAY,4BAA4B,CAAA,CACxC,MAAA,CAAO,qBAAA,EAAuB,kBAAkB,CAAA,CAChD,MAAA,CAAO,OAAM,OAAA,KAAW;AACvB,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAEhD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAErD,MAAAD,QAAAA,CAAQ,QAAQ,6BAA6B,CAAA;AAC7C,MAAA,OAAA,CAAQ,IAAIE,MAAAA,CAAM,KAAA,CAAM,CAAA,2BAAA,EAAuB,UAAU,EAAE,CAAC,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,OAAAA,CAAQ,SAAS,CAAA,CAClB,WAAA,CAAY,yCAAyC,CAAA,CACrD,QAAA,CAAS,eAAA,EAAiB,qBAAqB,CAAA,CAC/C,MAAA,CAAO,OAAM,UAAA,KAAc;AAC1B,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,0BAA0B,CAAA,CAAE,KAAA,EAAM;AAEtD,IAAA,IAAI;AACF,MAAA,IAAI,CAACH,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,QAAAE,QAAAA,CAAQ,KAAK,uBAAuB,CAAA;AACpC,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,EAAE,CAAC,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,MAAA,CAAO,QAAQ,UAAU,CAAA;AAE/B,MAAAF,QAAAA,CAAQ,QAAQ,4BAA4B,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAIE,MAAAA,CAAM,KAAA,CAAM,CAAA,sBAAA,EAAoB,UAAU,EAAE,CAAC,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;AAGA,YAAA,CAAa,UAAA;AAAA,EACX,IAAIC,QAAQ,MAAM,CAAA,CACf,YAAY,sCAAsC,CAAA,CAClD,OAAO,YAAY;AAClB,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,4CAA4C,CAAA,CAAE,KAAA,EAAM;AAExE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAE7C,MAAA,MAAM,OAAO,IAAA,EAAK;AAElB,MAAAD,QAAAA,CAAQ,QAAQ,iCAAiC,CAAA;AACjD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNE,MAAAA,CAAM,MAAM,0DAAqD;AAAA,OACnE;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,IAAA;AAAA,UACJ;AAAA;AACF,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAF,QAAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA;;;ACnOA,IAAM,eAAA,GAAkB,uBAAA;AAOjB,SAAS,oBAAoB,IAAA,EAAoB;AAMtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,yBAAyB,IAAI,CAAA,uEAAA;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,yBAAyB,IAAI,CAAA,iCAAA;AAAA,KAC/B;AAAA,EACF;AACA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAUO,SAAS,iBAAiB,IAAA,EAA6B;AAC5D,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sBAAsB,IAAI,CAAA,+DAAA;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACpC,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AAEnC,EAAA,IAAI,GAAA;AAKJ,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AACpD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,GAAA,GAAM,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AACvB,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,KAAK,EAAE,IAAA,EAAK;AAC1C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACnE;AAIA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sBAAsB,IAAI,CAAA,wGAAA;AAAA,KAC5B;AAAA,EACF;AAEA,EAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,EAAA,OAAO,GAAA,GAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAI,GAAI,EAAE,MAAM,IAAA,EAAK;AAClD;AAGO,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,OAAO,YAAY,IAAI,CAAA,KAAA,CAAA;AACzB;AAGO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,YAAY,IAAI,CAAA,SAAA,CAAA;AACzB;AAUO,SAAS,mBAAmB,CAAA,EAAoB;AACrD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACzD;AAMO,SAAS,yBAAyB,QAAA,EAAiC;AACxE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,CAAA,CAAE,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,IACvD;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,EAAE,IAAI,CAAA;AAAA,EACjB;AACF;AAaO,SAAS,qBAAqB,CAAA,EAAiB;AACpD,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA;AAChC,EAAA,IACE,CAAC,KACD,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAChB,YAAA,CAAa,KAAK,CAAC,CAAA,IACnB,SAAS,QAAA,CAAS,IAAI,KACtB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IACrB,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EACpB;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,CAAC,CAAA,kEAAA;AAAA,KAC1B;AAAA,EACF;AACF;AAkBO,SAAS,mBAAmB,QAAA,EAAoC;AACrE,EAAA,MAAM,KAAA,GAAQ,CAAC,eAAe,CAAA;AAC9B,EAAA,IAAI,SAAS,IAAA,EAAM,IAAA,QAAY,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AACtD,EAAA,IAAI,SAAS,GAAA,EAAK,IAAA,QAAY,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA;AACpD,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,QAAA,IAAY,EAAC,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,WAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,YAAY,KAAK,CAAA,2CAAA;AAAA,OACnB;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,SAAA,EAAY,KAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,KAAK,IAAI,CAAA,0BAAA;AAAA,OAChD;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACxB,IAAA,IAAI,GAAA,CAAI,KAAK,IAAA,EAAM;AACjB,MAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACrC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,SAAA,EAAY,KAAK,CAAA,YAAA,EAAe,GAAA,CAAI,IAAI,IAAI,CAAA,0BAAA;AAAA,SAC9C;AAAA,MACF;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,KAAA,CAAM,QAAQ,oBAAoB,CAAA;AAElC,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B;;;ACvKO,IAAM,aAAA,GAAgB,IAAIC,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,iCAAiC,CAAA,CAC7C,UAAA,CAAW,mBAAA,EAAqB,EAChC,UAAA,CAAW,iBAAA,EAAmB,CAAA,CAC9B,UAAA,CAAW,kBAAkB,CAAA,CAC7B,UAAA,CAAW,iBAAA,EAAmB,CAAA;AAmBjC,SAAS,mBAAA,GAA+B;AACtC,EAAA,OAAO,IAAIA,OAAAA,CAAQ,QAAQ,EACxB,WAAA,CAAY,uCAAuC,EACnD,QAAA,CAAS,aAAA,EAAe,uBAAuB,CAAA,CAC/C,SAAS,WAAA,EAAa,wCAAwC,EAC9D,QAAA,CAAS,WAAA,EAAa,sBAAsB,CAAA,CAC5C,MAAA;AAAA,IACC,uBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,eAAA,EAAiB,kBAAkB,CAAA,CAC1C,MAAA,CAAO,6BAAA,EAA+B,yBAAyB,CAAA,CAC/D,MAAA,CAAO,mBAAA,EAAqB,oBAAoB,CAAA,CAChD,MAAA,CAAO,kBAAA,EAAoB,cAAc,CAAA,CACzC,MAAA,CAAO,gBAAA,EAAkB,YAAY,CAAA,CACrC,MAAA,CAAO,cAAA,EAAgB,mBAAmB,CAAA,CAC1C,MAAA;AAAA,IACC,sBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,EAAe,IAAA,GAAiB,EAAC,KAAM;AACtC,MAAA,OAAO,CAAC,GAAG,IAAA,EAAM,KAAK,CAAA;AAAA,IACxB;AAAA,GACF,CACC,MAAA;AAAA,IACC,mBAAA;AAAA,IACA,iDAAA;AAAA,IACA,CAAC,KAAA,EAAe,IAAA,GAAiB,EAAC,KAAM;AACtC,MAAA,OAAO,CAAC,GAAG,IAAA,EAAM,KAAK,CAAA;AAAA,IACxB;AAAA,GACF,CACC,MAAA,CAAO,cAAA,EAAgB,4CAA4C,CAAA,CACnE,MAAA;AAAA,IACC,kBAAA;AAAA,IACA,4GAAA;AAAA,IACA,CAAC,OAAO,IAAA,KAA0B;AAChC,MAAA,OAAO,CAAC,GAAI,IAAA,IAAQ,EAAC,EAAI,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,IAClD;AAAA,GACF,CACC,WAAA;AAAA,IACC,OAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwCD,MAAA,CAAO,OAAO,QAAA,EAAU,GAAA,EAAKC,UAAS,OAAA,KAAY;AACjD,IAAA,IAAI;AAEF,MAAA,IAAI,iBAAuC,EAAC;AAC5C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,YAAA,GAAeR,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClD,QAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAA8B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAC9D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkBA,GAAAA,CAAG,YAAA,CAAa,YAAA,EAAc,MAAM,CAAA;AAC5D,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAGzC,UAAA,IACE,OAAO,WAAW,QAAA,IAClB,MAAA,KAAW,QACX,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EACpB;AACA,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAA4B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAC5D,YAAA,OAAA,CAAQ,MAAM,mCAAmC,CAAA;AACjD,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AAEA,UAAA,cAAA,GAAiB,MAAA;AAAA,QACnB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,sCAAA,EAAoC,QAAQ,QAAQ,CAAA;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAC3C;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAe,OAAO,cAAA,CAAe,OAAA;AAC3C,MAAA,MAAM,YAAA,GAAeM,YAAW,cAAA,CAAe,OAAA;AAC/C,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,MAAA;AACrD,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,IAAQ,cAAA,CAAe,IAAA;AACjD,MAAA,MAAM,gBAAA,GACJ,OAAA,CAAQ,WAAA,IAAe,cAAA,CAAe,WAAA;AACxC,MAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,MAAA,IAAU,eAAA;AAC7C,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,QAAA,IAAY,cAAA,CAAe,QAAA;AACzD,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,MAAA;AACrD,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,IAAQ,cAAA,CAAe,IAAA;AAGjD,MAAA,MAAM,kBAAkB,cAAA,CAAe,OAAA;AACvC,MAAA,MAAM,eAAe,cAAA,CAAe,IAAA;AAGpC,MAAA,IAAI,oBAAoB,KAAA,CAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AACpE,QAAA,OAAA,CAAQ,MAAM,qDAAgD,CAAA;AAC9D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,iBAAiB,KAAA,CAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC9D,QAAA,OAAA,CAAQ,MAAM,kDAA6C,CAAA;AAC3D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IACE,cAAA,CAAe,aAAa,KAAA,CAAA,IAC5B,CAAC,MAAM,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA,EACtC;AACA,QAAA,OAAA,CAAQ,MAAM,sDAAiD,CAAA;AAC/D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,MAAM,YAAA,GACJ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,GACtC,OAAA,CAAQ,MAAA,GACR,eAAA,IAAmB,EAAC;AAC1B,MAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAChC,OAAA,CAAQ,GAAA,GACR,YAAA,IAAgB,EAAC;AAGvB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAA,CAAQ,MAAM,8BAAyB,CAAA;AACvC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAIA,MAAA,IAAI,CAAC,6BAAA,CAA8B,IAAA,CAAK,YAAY,CAAA,EAAG;AACrD,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAIA,MAAA,IACE,CAAC,iDAAA,CAAkD,IAAA,CAAK,YAAY,CAAA,EACpE;AACA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAWR,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACtC,MAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA0B,QAAQ,CAAA,CAAE,CAAA;AAClD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,oCAAA,EAAgCF,KAAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,CAAA;AAGrE,MAAA,MAAM,WAAA,GAAcE,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AAC5C,MAAA,MAAM,WAAW,WAAA,CAAY,MAAA;AAG7B,MAAA,MAAM,QAAA,GAAWO,QACd,UAAA,CAAW,QAAQ,EACnB,MAAA,CAAO,WAAW,CAAA,CAClB,MAAA,CAAO,KAAK,CAAA;AAGf,MAAA,IAAI,WAAA,GAAqC,KAAA,CAAA;AACzC,MAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,MAAA,MAAM,oBAAoB,OAAA,CAAQ,GAAA;AAClC,MAAA,MAAM,sBACJ,OAAO,cAAA,CAAe,GAAA,KAAQ,QAAA,GAAW,eAAe,GAAA,GAAM,IAAA;AAGhE,MAAA,MAAM,cAAc,iBAAA,IAAqB,mBAAA;AAEzC,MAAA,IAAI,WAAA,EAAa;AAIf,QAAA,MAAM,eAAA,GAAkB,oBACpBT,KAAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GACxB,OAAA,CAAQ,QAAA,IAAY,mBAAA,GAClBA,KAAAA,CAAK,OAAA;AAAA,UACHA,MAAK,OAAA,CAAQA,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,UAC3C;AAAA,SACF,GACAA,KAAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAE9B,QAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,eAAe,CAAA,EAAG;AACnC,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAAyB,WAAW,CAAA,CAAE,CAAA;AACpD,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAqB,eAAe,CAAA,CAAE,CAAA;AACpD,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAGA,QAAA,IAAI;AACF,UAAA,UAAA,GAAaA,GAAAA,CAAG,aAAa,eAAe,CAAA;AAE5C,UAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,MAAM,CAAC,CAAA;AAGtC,UAAA,MAAM,OAAA,GAAUO,QACb,UAAA,CAAW,QAAQ,EACnB,MAAA,CAAO,UAAU,CAAA,CACjB,MAAA,CAAO,KAAK,CAAA;AAGf,UAAA,WAAA,GAAc;AAAA,YACZ,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,MAAM,UAAA,CAAW;AAAA,WACnB;AACA,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,uBAAA,EAA0BT,KAAAA,CAAK,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,WAC1D;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,4CAAuC,WAAW,CAAA;AAAA,WACpD;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAC3C;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF,WACE,cAAA,CAAe,GAAA,IACf,OAAO,cAAA,CAAe,QAAQ,QAAA,EAC9B;AAKA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAKA,MAAA,MAAM,WAAA,GAA+B,OAAA,CAAQ,OAAA,IAAW,EAAC;AACzD,MAAA,MAAM,mBAAoC,KAAA,CAAM,OAAA;AAAA,QAC9C,cAAA,CAAe;AAAA,OACjB,GACI,cAAA,CAAe,QAAA,GACf,EAAC;AACL,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,GACxBA,KAAAA,CAAK,OAAA,CAAQA,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA,GAC3C,OAAA,CAAQ,GAAA,EAAI;AAEhB,MAAA,MAAM,iBAAA,GAA+D;AAAA,QACnE,GAAG,WAAA,CAAY,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,EAAI,EAAE,CAAE,CAAA;AAAA,QAC3D,GAAG,iBAAiB,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,GAAA,EAAK,OAAA,EAAS,aAAY,CAAE;AAAA,OAChE;AAEA,MAAA,MAAM,mBAAyC,EAAC;AAEhD,MAAA,MAAM,sBAA8D,EAAC;AAMrE,MAAA,KAAA,MAAW,EAAE,GAAA,EAAI,IAAK,iBAAA,EAAmB;AACvC,QAAA,IAAI;AACF,UAAA,mBAAA,CAAoB,IAAI,IAAI,CAAA;AAAA,QAC9B,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,UAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,wBAAA,CAAyB,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,UAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,OAAA,EAAQ,IAAK,iBAAA,EAAmB;AAMhD,QAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,YAAY,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACzD,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,gBAAA,EAAc,IAAI,IAAI,CAAA,kCAAA;AAAA,WACxB;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,IACE,GAAA,CAAI,GAAA,KAAQ,KAAA,CAAA,KACX,OAAO,GAAA,CAAI,QAAQ,QAAA,IAAY,GAAA,CAAI,GAAA,CAAI,MAAA,KAAW,CAAA,CAAA,EACnD;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,gBAAA,EAAc,IAAI,IAAI,CAAA,iCAAA;AAAA,WACxB;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAGA,QAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAI,IAAI,CAAA;AAClD,QAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,gBAAA,EAAc,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,IAAI,IAAI,CAAA;AAAA,WACrD;AACA,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAE,CAAA;AAChD,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,MAAM,cAAA,GAAiBA,GAAAA,CAAG,YAAA,CAAa,WAAW,CAAA;AAClD,QAAA,MAAM,WAAA,GAAcO,QACjB,UAAA,CAAW,QAAQ,EACnB,MAAA,CAAO,cAAc,CAAA,CACrB,MAAA,CAAO,KAAK,CAAA;AACf,QAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAEhD,QAAA,MAAM,KAAA,GAA4B;AAAA,UAChC,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,eAAA;AAAA,YACN,IAAA,EAAM,WAAA;AAAA,YACN,MAAM,cAAA,CAAe;AAAA;AACvB,SACF;AACA,QAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,UACvB,OAAA,EAAS,eAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,IAAI,IAAI,GAAA,EAAK;AACX,UAAA,MAAM,UAAA,GAAaT,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAI,GAAG,CAAA;AAChD,UAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,gBAAA,EAAc,GAAA,CAAI,IAAI,CAAA,iBAAA,EAAoB,IAAI,GAAG,CAAA;AAAA,aACnD;AACA,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAC/C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAA,MAAM,aAAA,GAAgBA,GAAAA,CAAG,YAAA,CAAa,UAAU,CAAA;AAChD,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,UAC3C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,gBAAA,EAAc,GAAA,CAAI,IAAI,CAAA,yBAAA,EAA4B,IAAI,GAAG,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,aAC3C;AACA,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAA,MAAM,UAAA,GAAaO,QAChB,UAAA,CAAW,QAAQ,EACnB,MAAA,CAAO,aAAa,CAAA,CACpB,MAAA,CAAO,KAAK,CAAA;AACf,UAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAC9C,UAAA,KAAA,CAAM,GAAA,GAAM;AAAA,YACV,IAAA,EAAM,cAAA;AAAA,YACN,IAAA,EAAM,UAAA;AAAA,YACN,MAAM,aAAA,CAAc;AAAA,WACtB;AACA,UAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,YACvB,OAAA,EAAS,cAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAEA,QAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC3B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,yBAAyB,GAAA,CAAI,IAAI,KAAKT,KAAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA;AAAA,SAClE;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAIF;AAAA,QACF,MAAM,SAAA,IAAa,YAAA;AAAA,QACnB,aAAa,gBAAA,IAAoB,EAAA;AAAA,QACjC,MAAA,EAAQ;AAAA,OACV;AAGA,MAAA,MAAM,QAIF,EAAC;AACL,MAAA,IAAI,aAAA,QAAqB,QAAA,GAAW,aAAA;AACpC,MAAA,IAAI,WAAA,QAAmB,MAAA,GAAS,WAAA;AAChC,MAAA,IAAI,SAAA,QAAiB,IAAA,GAAO,SAAA;AAG5B,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,OAAA,EAAS,YAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAGA,MAAA,MAAM,QAAA,GAA2B;AAAA,QAC/B,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,KAAA,CAAA;AAAA,QACxD,UAAA,EACE,WAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAA,GACtD,UAAA,GACA,KAAA,CAAA;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,KAAK,WAAA,IAAe,KAAA,CAAA;AAAA,QACpB,QAAA,EAAU,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,gBAAA,GAAmB,KAAA,CAAA;AAAA,QAC3D,YAAY,EAAC;AAAA,QACb,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,KAAA,CAAA;AAAA,QAC/C,SAAA,EAAW,KAAA;AAAA,OACb;AAGA,MAAA,IAAI,SAAA,GAAY,WAAA,GACZA,KAAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GACxBA,KAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAA,EAAc,YAAY,CAAA;AAEvD,MAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,QAAAA,IAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7C;AAGA,MAAAA,GAAAA,CAAG,aAAA;AAAA,QACDF,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AAAA,QACpC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC;AAAA,OAClC;AAGA,MAAAE,IAAG,aAAA,CAAcF,KAAAA,CAAK,KAAK,SAAA,EAAW,UAAU,GAAG,WAAW,CAAA;AAG9D,MAAA,IAAI,UAAA,EAAY;AACd,QAAAE,IAAG,aAAA,CAAcF,KAAAA,CAAK,KAAK,SAAA,EAAW,UAAU,GAAG,UAAU,CAAA;AAAA,MAC/D;AAOA,MAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACnD,MAAA,KAAA,MAAW,EAAE,OAAA,EAAS,OAAA,EAAQ,IAAK,mBAAA,EAAqB;AACtD,QAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AACzC,QAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,QAAA,CAAS,WAAA,EAAa,IAAI,CAAA;AAC3C,QAAA,IAAI,IAAI,UAAA,CAAW,IAAI,KAAKA,KAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAChD,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,4DAAuD,OAAO,CAAA;AAAA,WAChE;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAAE,GAAAA,CAAG,UAAUF,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,QAAAE,GAAAA,CAAG,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAAA,MAChC;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAA8B,SAAS,CAAA,CAAE,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AACvC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,aAAA,EAAgB,iBAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC9D;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,wCAAA,EAA2CF,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,CAAC,CAAA,eAAA;AAAA,OAClF;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,0DAA0D,SAAS,CAAA,SAAA;AAAA,OACrE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC3C,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAA8B,OAAO,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,iBAAA,GAA6B;AACpC,EAAA,OAAO,IAAIO,OAAAA,CAAQ,MAAM,CAAA,CACtB,WAAA;AAAA,IACC;AAAA,GACF,CACC,QAAA,CAAS,eAAA,EAAiB,8BAA8B,CAAA,CACxD,MAAA,CAAO,SAAA,EAAW,2CAA2C,CAAA,CAC7D,MAAA,CAAO,UAAA,EAAY,kCAAkC,CAAA,CACrD,MAAA;AAAA,IACC,sBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,WAAA;AAAA,IACC,OAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsBF,CACC,MAAA,CAAO,OAAO,UAAA,EAAY,OAAA,KAAY;AACrC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI;AAEF,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,GAAA,IAAO,QAAQ,MAAA,CAAA,EAAS;AACtD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AAIA,MAAA,MAAM,QAAA,GACJ,OAAA,CAAQ,KAAA,KAAU,KAAA,GACd,KAAA,GACA,QAAQ,KAAA,KAAU,IAAA,GAChB,IAAA,GACA,CAAC,OAAA,CAAQ,MAAA;AACjB,MAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,KAAW,IAAA;AAGrC,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAQ;AACnC,QAAA,OAAA,CAAQ,MAAM,mDAA8C,CAAA;AAC5D,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW;AAC3B,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAWP,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACxC,MAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAC/C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,OAAA,GAAU,QAAA;AAEV,MAAA,IAAIA,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,CAAE,aAAY,EAAG;AACvC,QAAA,MAAM,aAAA,GAAgBF,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,eAAe,CAAA;AACzD,QAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAChD,QAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,gDAA2C,QAAQ,CAAA;AAAA,WACrD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC9D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,OAAA,GAAUF,MAAK,IAAA,CAAK,QAAA,EAAU,cAAc,IAAA,CAAK,GAAA,EAAK,CAAA,IAAA,CAAM,CAAA;AAO5D,QAAA,IAAI,WAAA;AACJ,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,IAAA,CAAK,KAAA;AAAA,YACjBE,GAAAA,CAAG,YAAA,CAAa,aAAA,EAAe,MAAM;AAAA,WACvC;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,wCAAA,EAAsC,QAAQ,CAAA,EAAA,EAC5C,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAC3C,CAAA;AAAA,WACF;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN;AAAA,WACF;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAIA,QAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM;AAC3B,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN;AAAA,WACF;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAIA,QAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,QAAA,IAAY,EAAC,EAAG;AAC5C,UAAA,IAAI,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM;AACpB,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,gBAAA,EAAc,GAAA,EAAK,IAAA,IAAQ,WAAW,CAAA,oCAAA;AAAA,aACxC;AACA,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AAAA,QACF;AAIA,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI;AACF,UAAA,YAAA,GAAe,mBAAmB,WAAW,CAAA;AAAA,QAC/C,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,UAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAGA,QAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,UAAA,IAAI,CAACA,IAAG,UAAA,CAAWF,KAAAA,CAAK,KAAK,QAAA,EAAU,CAAC,CAAC,CAAA,EAAG;AAC1C,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,wDAAmD,CAAC,CAAA;AAAA,aACtD;AACA,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AAAA,QACF;AAEA,QAAA,MAAU,GAAA,CAAA,MAAA;AAAA,UACR,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,UAC3C;AAAA,SACF;AACA,QAAA,OAAA,GAAU,OAAA;AACV,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,kDAAA,EAA8C,aAAa,MAAM,CAAA,OAAA;AAAA,SACnE;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,6BAAA,EAAyBA,KAAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,CAAA;AAG7D,MAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,OAAO,CAAA;AAE9C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAA,CAAQ,MAAM,0CAAqC,CAAA;AACnD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,SAAS,UAAA,EAAY;AAC7C,QAAA,OAAA,CAAQ,MAAM,wDAAmD,CAAA;AACjE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAC7C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAChD,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,QAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,MAAM,CAAA;AACvC,QAAA,MAAM,cAAA,GAAiB,IAAI,mBAAA,CAAoB,MAAA,EAAQ,KAAK,CAAA;AAG5D,QAAA,MAAM,iBAAiB,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,IAAA,CAAA;AACjE,QAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,mBAAA;AAAA,UACtC,OAAA;AAAA,UACA,QAAA,CAAS,OAAA;AAAA,UACT,QAAA,CAAS,UAAA;AAAA,UACT;AAAA,SACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAY/C,QAAA,KAAA,CAAM,iBAAA;AAAA,UACJ,QAAA,CAAS,OAAA;AAAA,UACT,QAAA,CAAS,UAAA;AAAA,UACT;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,IAAI,2CAAsC,CAAA;AAClD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,qCAAA,EAAwC,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,WAAA;AAAA,SACjF;AAAA,MACF,WAAW,SAAA,EAAW;AAGpB,QAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,QAAA,MAAM,cACJ,OAAA,CAAQ,GAAA,IACR,QAAQ,GAAA,CAAI,qBAAA,IACZ,aAAa,cAAA,EAAe;AAC9B,QAAA,MAAM,SACJ,OAAA,CAAQ,MAAA,IACR,QAAQ,GAAA,CAAI,gBAAA,IACZ,aAAa,SAAA,EAAU;AAEzB,QAAA,MAAM,YAAA,CAAa,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA;AAAA,MAC3D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAA4B,OAAO,CAAA;AACjD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,IAAI,OAAA,IAAWE,GAAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AACrC,QAAAA,GAAAA,CAAG,OAAO,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,gBAAA,GAA4B;AACnC,EAAA,OAAO,IAAIK,OAAAA,CAAQ,KAAK,CAAA,CACrB,WAAA,CAAY,qBAAqB,CAAA,CACjC,QAAA,CAAS,WAAA,EAAa,qCAAqC,CAAA,CAC3D,QAAA,CAAS,aAAa,sBAAsB,CAAA,CAC5C,MAAA,CAAO,SAAA,EAAW,oBAAA,EAAsB,IAAI,EAC5C,MAAA,CAAO,OAAO,GAAA,EAAKC,QAAAA,EAAS,OAAA,KAAY;AACvC,IAAA,IAAI;AACF,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,QAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,MAAM,CAAA;AACvC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,iBAAA,CAAkB,GAAA,EAAKA,QAAO,CAAA;AAErD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,QAC/C,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAAyB,GAAG,CAAA,CAAA,EAAIA,QAAO,CAAA,CAAE,CAAA;AACvD,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,uCAAkC,CAAA;AAChD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iBAAY,KAAK,CAAA;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,iBAAA,GAA6B;AACpC,EAAA,OAAO,IAAID,OAAAA,CAAQ,MAAM,CAAA,CACtB,WAAA;AAAA,IACC;AAAA,GACF,CACC,SAAS,WAAA,EAAa,wCAAwC,EAC9D,QAAA,CAAS,WAAA,EAAa,sBAAsB,CAAA,CAC5C,MAAA,CAAO,YAAY,yCAAyC,CAAA,CAC5D,OAAO,sBAAA,EAAwB,iCAAiC,EAChE,MAAA,CAAO,iBAAA,EAAmB,+CAA+C,CAAA,CACzE,MAAA;AAAA,IACC,mBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,eAAA,EAAiB,mBAAmB,CAAA,CAC3C,OAAO,6BAAA,EAA+B,0BAA0B,CAAA,CAChE,MAAA,CAAO,mBAAA,EAAqB,uCAAuC,EACnE,MAAA,CAAO,kBAAA,EAAoB,oBAAoB,CAAA,CAC/C,MAAA,CAAO,gBAAA,EAAkB,kBAAkB,CAAA,CAC3C,MAAA,CAAO,cAAA,EAAgB,gBAAgB,CAAA,CACvC,WAAA;AAAA,IACC,OAAA;AAAA,IACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GAWF,CACC,MAAA,CAAO,OAAO,GAAA,EAAKC,UAAS,OAAA,KAAY;AACvC,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,MAAA,MAAM,cACJ,OAAA,CAAQ,GAAA,IACR,QAAQ,GAAA,CAAI,qBAAA,IACZ,aAAa,cAAA,EAAe;AAC9B,MAAA,MAAM,SACJ,OAAA,CAAQ,MAAA,IACR,QAAQ,GAAA,CAAI,gBAAA,IACZ,aAAa,SAAA,EAAU;AAEzB,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmBA,QAAO,CAAC,CAAA,CAAA;AAErG,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AACA,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,eAAe,CAAA,GAAI,UAAU,MAAM,CAAA,CAAA;AAEvD,MAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,QAAA,MAAM,YAAA,GAAeR,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClD,QAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAA8B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAC9D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,MAAM,GAAA,GAAMA,GAAAA,CAAG,YAAA,CAAa,YAAA,EAAc,MAAM,CAAA;AAChD,QAAA,IAAIQ,SAAAA;AACJ,QAAA,IAAI;AACF,UAAAA,SAAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,QAC3B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,sCAAA,EAAoC,QAAQ,QAAQ,CAAA;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,IAAIA,SAAAA,CAAS,OAAA,KAAY,GAAA,IAAOA,SAAAA,CAAS,eAAeF,QAAAA,EAAS;AAC/D,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,iCAAA,EAA+BE,UAAS,OAAO,CAAA,CAAA,EAAIA,UAAS,UAAU,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAA,EAAIF,QAAO,CAAA,EAAA;AAAA,WACxH;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAEA,QAAA,MAAMG,IAAAA,GAAM,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,UACjC,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAUD,SAAQ;AAAA,SAC9B,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,MAAMC,IAAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QACxB,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,GAAO,EAAE,SAAS,IAAA,EAAK;AAAA,QACzB;AACA,QAAA,IAAIA,KAAI,EAAA,EAAI;AACV,UAAA,OAAA,CAAQ,IAAI,iCAA4B,CAAA;AACxC,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAgB,IAAA,CAAK,OAAA,IAAsB,GAAG,CAAA,CAAE,CAAA;AAC5D,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAgB,IAAA,CAAK,OAAA,IAAsBH,QAAO,CAAA,CAAE,CAAA;AAAA,QAClE,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GACH,IAAA,CAAK,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,EAAK,IAC3C,IAAA,CAAK,KAAA,IACL,IAAA;AACF,UAAA,OAAA,CAAQ,MAAM,CAAA,qBAAA,EAAmBG,IAAAA,CAAI,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AACzD,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAC7D,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAMC,EAAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AACzB,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAA,CAAK,MAAMA,EAAC,CAAA;AAAA,QACpB,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,GAAM,EAAE,SAASA,EAAAA,EAAE;AAAA,QACrB;AACA,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,mBAAA,EAAiB,IAAI,MAAM,CAAA,GAAA,EAAM,IAAI,KAAA,IAAS,GAAA,CAAI,WAAWA,EAAC,CAAA;AAAA,SAChE;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAY,MAAM,GAAA,CAAI,IAAA,EAAK;AACjC,MAAA,IAAI,QAAA,CAAS,OAAA,KAAY,GAAA,IAAO,QAAA,CAAS,eAAeJ,QAAAA,EAAS;AAC/D,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,CAAA,EAAW;AAC9B,QAAA,IAAI,CAAC,QAAA,CAAS,QAAA;AACZ,UAAA,QAAA,CAAS,WAAW,EAAE,IAAA,EAAM,IAAI,WAAA,EAAa,EAAA,EAAI,QAAQ,EAAA,EAAG;AAC9D,QAAA,QAAA,CAAS,QAAA,CAAS,OAAO,OAAA,CAAQ,IAAA;AAAA,MACnC;AACA,MAAA,IAAI,OAAA,CAAQ,gBAAgB,KAAA,CAAA,EAAW;AACrC,QAAA,IAAI,CAAC,QAAA,CAAS,QAAA;AACZ,UAAA,QAAA,CAAS,WAAW,EAAE,IAAA,EAAM,IAAI,WAAA,EAAa,EAAA,EAAI,QAAQ,EAAA,EAAG;AAC9D,QAAA,QAAA,CAAS,QAAA,CAAS,cAAc,OAAA,CAAQ,WAAA;AAAA,MAC1C;AACA,MAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,CAAA,EAAW;AAChC,QAAA,IAAI,CAAC,QAAA,CAAS,QAAA;AACZ,UAAA,QAAA,CAAS,WAAW,EAAE,IAAA,EAAM,IAAI,WAAA,EAAa,EAAA,EAAI,QAAQ,EAAA,EAAG;AAC9D,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,OAAA,CAAQ,MAAA;AAAA,MACrC;AACA,MAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,CAAA,EAAW;AAClC,QAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,QAAQ,EAAC;AACvC,QAAA,QAAA,CAAS,KAAA,CAAM,WAAW,OAAA,CAAQ,QAAA;AAAA,MACpC;AACA,MAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,CAAA,EAAW;AAChC,QAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,QAAQ,EAAC;AACvC,QAAA,QAAA,CAAS,KAAA,CAAM,SAAS,OAAA,CAAQ,MAAA;AAAA,MAClC;AACA,MAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,CAAA,EAAW;AAC9B,QAAA,IAAI,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,QAAQ,EAAC;AACvC,QAAA,QAAA,CAAS,KAAA,CAAM,OAAO,OAAA,CAAQ,IAAA;AAAA,MAChC;AAEA,MAAA,MAAM,UAAA,GAAaR,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,UAAU,eAAe,CAAA;AACjE,MAAAE,GAAAA,CAAG,cAAc,UAAA,EAAY,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAiC,UAAU,CAAA,CAAE,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,UAAU,CAAA,oBAAA,CAAsB,CAAA;AACnE,MAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,oCAAA,EAAuC,GAAG,CAAA,GAAA,EAAMM,QAAO,CAAA,0CAAA;AAAA,OACzD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAkB,OAAO,CAAA;AACvC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAGA,eAAe,YAAA,CACb,UAAA,EACA,QAAA,EACA,WAAA,EACA,MAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAkC,WAAW,CAAA,CAAE,CAAA;AAG3D,IAAA,MAAM,YAAA,GAAeN,GAAAA,CAAG,YAAA,CAAa,UAAU,CAAA;AAC/C,IAAA,MAAM,aAAa,YAAA,CAAa,MAAA;AAChC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,MAAA,CAAQ,CAAA;AAGjD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,SAAA,CAAU,MAAM,CAAA,YAAA,CAAc,CAAA;AAGlE,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,OAAA,EAAS,SAAS,OAAA,IAAW,KAAA;AAAA,MAC7B,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AAGA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,WAAW,QAAA,CAAS,QAAA;AAAA,IAC9B;AACA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,OAAA,CAAQ,aAAa,QAAA,CAAS,UAAA;AAAA,IAChC;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,OAAO,QAAA,CAAS,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,CAAS,QAAQ,KAAA,CAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,MAAM,QAAA,CAAS,GAAA;AAAA,IACzB;AACA,IAAA,IAAI,QAAA,CAAS,aAAa,KAAA,CAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,WAAW,QAAA,CAAS,QAAA;AAAA,IAC9B;AAEA,IAAA,OAAA,CAAQ,UAAA,GAAa,QAAA,CAAS,UAAA,IAAc,EAAC;AAC7C,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,QAAQ,QAAA,CAAS,KAAA;AAAA,IAC3B;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,IAC/B;AACA,IAAA,IACE,QAAA,CAAS,qBAAqB,IAAA,IAC9B,MAAA,CAAO,SAAS,iBAAiB,CAAA,CAAE,MAAK,EACxC;AACA,MAAA,OAAA,CAAQ,iBAAA,GAAoB,MAAA,CAAO,QAAA,CAAS,iBAAiB,EAAE,IAAA,EAAK;AAAA,IACtE;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,WAAW,QAAA,CAAS,QAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AAGA,IAAA,MAAM,WAAA,GAAc,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,gBAAA;AAC1C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,IAClD;AAGA,IAAA,MAAM,SAAS,CAAA,EAAG,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,oBAAA,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAE/B,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,GAAK,CAAA;AAE5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,EAAE,SAAS,YAAA,EAAa;AAAA,MACzC;AAGA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAA,CAAQ,IAAI,8CAAyC,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,YAAA,CAAa,OAAA,IAAW,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACrE,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,YAAA,EAAe,YAAA,CAAa,OAAA,IAAW,QAAA,CAAS,UAAU,CAAA;AAAA,SAC5D;AAGA,QAAA,MAAM,gBAAA;AAAA,UACJ,WAAA;AAAA,UACA,QAAA,CAAS,OAAA;AAAA,UACT,QAAA,CAAS;AAAA,SACX;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,eAAA,CAAgB,QAAA,CAAS,QAAQ,YAAY,CAAA;AAAA,MAC/C;AAAA,IACF,SAAS,UAAA,EAAqB;AAC5B,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,UAAA,YAAsB,KAAA,IAAS,UAAA,CAAW,IAAA,KAAS,YAAA,EAAc;AACnE,QAAA,OAAA,CAAQ,MAAM,2CAAsC,CAAA;AACpD,QAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AACpE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,UAAA;AAAA,IACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAAwC,OAAO,CAAA;AAC7D,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,eAAe,gBAAA,CACb,WAAA,EACA,WAAA,EACAM,QAAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,kDAA2C,CAAA;AAEvD,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAA,EAAIA,QAAO,CAAA,CAAA;AAE5F,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,GAAK,CAAA;AAE5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,QACtC,MAAA,EAAQ,KAAA;AAAA,QACR,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,MAAM,SAAS,IAAA,EAAK;AACpB,QAAA,OAAA,CAAQ,IAAI,0DAAqD,CAAA;AACjE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAgB,WAAW,CAAA,CAAE,CAAA;AACzC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,kEAAA,EAA2D,SAAS,MAAM,CAAA,CAAA;AAAA,SAC5E;AACA,QAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AAAA,MACtE;AAAA,IACF,SAAS,WAAA,EAAsB;AAC7B,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,WAAA,YAAuB,KAAA,IAAS,WAAA,CAAY,IAAA,KAAS,YAAA,EAAc;AACrE,QAAA,OAAA,CAAQ,KAAK,8CAAoC,CAAA;AAAA,MACnD,CAAA,MAAO;AACL,QAAA,MAAM,UACJ,WAAA,YAAuB,KAAA,GACnB,WAAA,CAAY,OAAA,GACZ,OAAO,WAAW,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,8CAAoC,OAAO,CAAA;AAAA,MAC1D;AACA,MAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AAAA,IACtE;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,0CAAgC,KAAK,CAAA;AAAA,EACpD;AACF;AAGA,SAAS,eAAA,CACP,YACA,YAAA,EACM;AACN,EAAA,MAAM,YAAA,GACJ,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,KAAA,IAAS,eAAA;AAEhD,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,GAAA;AACH,MAAA,OAAA,CAAQ,MAAM,sCAAiC,CAAA;AAC/C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAM,6CAA6C,CAAA;AAC3D,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAA,CAAQ,MAAM,8CAAyC,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAClC,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAA,CAAQ,MAAM,gDAA2C,CAAA;AACzD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAClC,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAA,CAAQ,MAAM,yCAAoC,CAAA;AAClD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAClC,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAA,CAAQ,MAAM,8BAAyB,CAAA;AACvC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAM,6CAA6C,CAAA;AAC3D,MAAA;AAAA,IACF;AACE,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAA6B,UAAU,CAAA,CAAE,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAAA;AAGtC,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB;AAGA,eAAe,gBACb,UAAA,EACgC;AAChC,EAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,EAAA,MAAU,GAAA,CAAA,CAAA,CAAE;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IAEN,OAAA,EAAS,CAAC,KAAA,KAAyB;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,eAAA,EAAiB;AAEpC,IACF;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaR,KAAAA,CAAK,IAAA,CAAKA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,CAAA;AAC5E,EAAA,IAAI,CAACE,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,IAAAA,GAAAA,CAAG,UAAU,UAAU,CAAA;AAAA,EACzB;AAEA,EAAA,IAAI;AACF,IAAA,MAAU,GAAA,CAAA,CAAA,CAAE;AAAA,MACV,IAAA,EAAM,UAAA;AAAA,MACN,GAAA,EAAK,UAAA;AAAA,MACL,MAAA,EAAQ,CAACF,KAAAA,KAAiBA,KAAAA,KAAS;AAAA,KACpC,CAAA;AAED,IAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,eAAe,CAAA;AAC1D,IAAA,IAAIE,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,MAAM,OAAA,GAAUA,GAAAA,CAAG,YAAA,CAAa,YAAA,EAAc,MAAM,CAAA;AACpD,MAAA,eAAA,GAAkB,OAAA;AAAA,IACpB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER,CAAA,SAAE;AAEA,IAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAAA,GAAAA,CAAG,OAAO,UAAA,EAAY,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,MAAM,+BAA+B,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;ACj3CO,IAAM,aAAA,GAAgB,IAAIK,OAAAA,CAAQ,QAAQ,EAC9C,WAAA,CAAY,8CAA8C,CAAA,CAC1D,UAAA,CAAW,sBAAA,EAAwB,EACnC,UAAA,CAAW,sBAAA,EAAwB,CAAA,CACnC,UAAA,CAAW,yBAAyB,CAAA,CACpC,UAAA,CAAW,wBAAA,EAA0B,CAAA;AAExC,SAAS,sBAAA,GAAkC;AACzC,EAAA,OAAO,IAAIA,OAAAA,CAAQ,KAAK,EACrB,WAAA,CAAY,2BAA2B,EACvC,QAAA,CAAS,OAAA,EAAS,2CAA2C,CAAA,CAC7D,SAAS,SAAA,EAAW,qBAAqB,EACzC,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,EAAa;AAEhC,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,cAAA;AAAA,QACL,KAAK,aAAA;AAAA,QACL,KAAK,KAAA;AACH,UAAA,MAAA,CAAO,eAAe,KAAK,CAAA;AAC3B,UAAA,OAAA,CAAQ,GAAA;AAAA,YACND,OAAM,KAAA,CAAM,CAAA,4BAAA,EAA0BA,OAAM,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE;AAAA,WAC3D;AACA,UAAA;AAAA,QAEF,KAAK,SAAA;AAAA,QACL,KAAK,QAAA;AACH,UAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AACtB,UAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,iCAA4B,CAAC,CAAA;AACrD,UAAA,OAAA,CAAQ,GAAA;AAAA,YACNA,MAAAA,CAAM,MAAA;AAAA,cACJ;AAAA;AACF,WACF;AACA,UAAA;AAAA,QAEF;AACE,UAAA,OAAA,CAAQ,MAAMA,MAAAA,CAAM,GAAA,CAAI,CAAA,kCAAA,EAAgC,GAAG,EAAE,CAAC,CAAA;AAC9D,UAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,UAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,UAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAClB,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,qCAAgC,GAAG,OAAO,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,sBAAA,GAAkC;AACzC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,KAAK,CAAA,CACrB,WAAA,CAAY,2BAA2B,CAAA,CACvC,QAAA,CAAS,OAAA,EAAS,2CAA2C,CAAA,CAC7D,MAAA,CAAO,CAAA,GAAA,KAAO;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,EAAa;AAEhC,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,cAAA;AAAA,QACL,KAAK,aAAA;AAAA,QACL,KAAK,KAAA;AACH,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,cAAA,EAAgB,CAAA;AACnC,UAAA;AAAA,QAEF,KAAK,SAAA;AAAA,QACL,KAAK,QAAA,EAAU;AACb,UAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,UAAA,IAAI,MAAA,EAAQ;AAEV,YAAA,MAAM,SACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ,CAAA,EAAG,OAAO,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA,GAClE,KAAA;AACN,YAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,YAAA,OAAA,CAAQ,GAAA;AAAA,cACND,MAAAA,CAAM,MAAA;AAAA,gBACJ;AAAA;AACF,aACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AAAA,UACzB;AACA,UAAA;AAAA,QACF;AAAA,QAEA;AACE,UAAA,OAAA,CAAQ,MAAMA,MAAAA,CAAM,GAAA,CAAI,CAAA,kCAAA,EAAgC,GAAG,EAAE,CAAC,CAAA;AAC9D,UAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,UAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,UAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAClB,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,qCAAgC,GAAG,OAAO,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,uBAAA,GAAmC;AAC1C,EAAA,OAAO,IAAIC,OAAAA,CAAQ,MAAM,CAAA,CACtB,WAAA,CAAY,+BAA+B,CAAA,CAC3C,KAAA,CAAM,IAAI,CAAA,CACV,MAAA,CAAO,MAAM;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,EAAa;AAEhC,MAAA,OAAA,CAAQ,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,6CAAsC,CAAC,CAAA;AAG9D,MAAA,MAAM,UAAA,GAAa,OAAO,aAAA,EAAc;AACxC,MAAA,MAAM,gBAAA,GAAmBJ,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA;AAGjD,MAAA,MAAM,GAAA,GAAM,OAAO,cAAA,EAAe;AAClC,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AACrC,QAAA,SAAA,GAAYI,MAAAA,CAAM,OAAO,sCAAsC,CAAA;AAAA,MACjE,WAAW,gBAAA,EAAkB;AAC3B,QAAA,SAAA,GAAYA,MAAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,SAAA,GAAYA,MAAAA,CAAM,KAAK,WAAW,CAAA;AAAA,MACpC;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,eAAe,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAGlE,MAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI,OAAA,CAAQ,IAAI,gBAAA,EAAkB;AAChC,UAAA,YAAA,GAAeA,MAAAA,CAAM,OAAO,iCAAiC,CAAA;AAAA,QAC/D,WAAW,gBAAA,EAAkB;AAC3B,UAAA,YAAA,GAAeA,MAAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,YAAA,GAAeA,MAAAA,CAAM,KAAK,WAAW,CAAA;AAAA,QACvC;AACA,QAAA,MAAM,SACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ,CAAA,EAAG,OAAO,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,MAAM,MAAA,CAAO,SAAA,CAAU,OAAO,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA,GAClE,KAAA;AACN,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MACtE;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,IAAA,CAAK;AAAA,uBAAA,EAAqB,UAAU,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0CAA0C,CAAC,CAAA;AAAA,MACpE;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,sCAAiC,GAAG,OAAO,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,wBAAA,GAAoC;AAC3C,EAAA,OAAO,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CACvB,WAAA,CAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,SAAA,EAAW,0BAA0B,CAAA,CAC5C,MAAA,CAAO,CAAA,OAAA,KAAW;AACjB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACND,MAAAA,CAAM,IAAI,kDAA6C;AAAA,SACzD;AACA,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNA,MAAAA,CAAM,MAAA;AAAA,YACJ;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,EAAa;AAChC,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,wCAAmC,CAAC,CAAA;AAC5D,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,uCAAkC,GAAG,OAAO,CAAA;AACpE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AC5LA,IAAM,eAAA,GAAkB,GAAA;AAExB,SAAS,cAAc,OAAA,EAGrB;AACA,EAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,MAAU,EAAC;AAChD,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,EAAA,MAAM,MACJ,IAAA,CAAK,GAAA,IACL,QAAQ,GAAA,CAAI,qBAAA,IACZ,aAAa,cAAA,EAAe;AAC9B,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,OAAA,EACE,SAAS,MAAA,CAAO,IAAA,CAAK,WAAW,eAAe,CAAA,EAAG,EAAE,CAAA,IAAK;AAAA,GAC7D;AACF;AAGA,SAAS,cAAA,GAAyC;AAChD,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,EAAA,MAAM,MAAA,GAAS,aAAa,SAAA,EAAU;AACtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG;AAC7C;AASA,eAAe,SAAA,CACb,GAAA,EACA,OAAA,GAAwB,EAAC,EACa;AACtC,EAAA,MAAM,EAAE,OAAA,GAAU,eAAA,EAAiB,GAAG,MAAK,GAAI,OAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,KAAK,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC3B,GAAG,IAAA;AAAA,IACH,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,IAAA,CAAK;AAAA;AACV,GACD,CAAA;AACD,EAAA,YAAA,CAAa,EAAE,CAAA;AACf,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,EAAA,MAAM,IAAA,GAAO,IAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAW,MAAA;AAC/C,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO;AACpC;AAEO,IAAM,aAAa,IAAIC,OAAAA,CAAQ,KAAK,CAAA,CACxC,WAAA,CAAY,wDAAwD,CAAA,CACpE,UAAA;AAAA,EACC,IAAIA,OAAAA,CAAQ,MAAM,CAAA,CACf,WAAA;AAAA,IACC;AAAA,GACF,CACC,MAAA,CAAO,OAAO,QAAA,EAAU,OAAA,KAAqB;AAC5C,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,uBAAuB,CAAA,CAAE,KAAA,EAAM;AACnD,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,cAAA,EAAe;AAAA,IAC/B,SAAS,CAAA,EAAG;AACV,MAAAD,QAAAA,CAAQ,KAAK,oBAAoB,CAAA;AACjC,MAAA,OAAA,CAAQ,KAAA,CAAME,MAAAA,CAAM,GAAA,CAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAGlC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,SAAA,CAE5B,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,QACxB,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT;AAAA,OACD,CAAA;AACD,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,CAAC,IAAA,EAAM,MAAM,KAAA,EAAO;AACxC,QAAAF,QAAAA,CAAQ,KAAK,2CAA2C,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNE,MAAAA,CAAM,GAAA;AAAA,YACJ;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,OAAA,GAAU,KAAK,IAAA,CAAK,KAAA;AACpB,MAAAF,QAAAA,CAAQ,IAAA,GAAO,CAAA,2BAAA,EAA8B,OAAO,CAAA,GAAA,CAAA;AAAA,IACtD,SAAS,CAAA,EAAG;AACV,MAAAA,QAAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAME,MAAAA,CAAM,GAAA,CAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,SAAS,CAAA,EAAG,IAAI,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAE7B,MAAA,EAAQ;AAAA,QACR,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT;AAAA,OACD,CAAA;AACD,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAAF,QAAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAC1B,OACD,EAAC;AACL,MAAAF,QAAAA,CAAQ,OAAA,CAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACtD,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAIE,MAAAA,CAAM,MAAA,CAAO,wBAAwB,CAAC,CAAA;AAClD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA;AAAA,QAClC,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACP,SAAA;AAAA,YACE,GAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,CAAA,CAAE,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,YAC/C,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,aAAa,OAAA;AAAQ,WACjD,CAAE,KAAA,CAAM,OAAO,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,EAAC,EAAE,EAAG,MAAA,EAAQ,CAAA,EAAE,CAAE;AAAA;AACtD,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC/B,QAAA,MAAM,UAAU,aAAA,CAAc,CAAC,CAAA,CAAE,IAAA,EAAM,WAAW,EAAC;AACnD,QAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,OAAO,CAAA;AACtD,QAAA,MAAM,IAAA,GAAO,UAAU,IAAA,IAAQ,GAAA;AAC/B,QAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,QAAA,MAAM,SAAA,GACJ,SAAS,OAAA,GAAUA,MAAAA,CAAM,OAAO,OAAO,CAAA,GAAIA,MAAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC5D,QAAA,OAAO,CAAA,EAAGA,MAAAA,CAAM,KAAA,CAAM,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,KAAKA,MAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,OAAA,EAAU,KAAA,KAAU,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAC,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,MAC/H,CAAC,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC9B,SAAS,CAAA,EAAG;AACV,MAAAF,QAAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAME,MAAAA,CAAM,GAAA,CAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACjB,YAAY,gDAAgD,CAAA,CAC5D,cAAA,CAAe,mBAAA,EAAqB,2BAA2B,CAAA,CAC/D,cAAA,CAAe,mBAAA,EAAqB,iCAAiC,CAAA,CACrE,MAAA;AAAA,IACC,OAAO,SAAyC,OAAA,KAAqB;AACnE,MAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,MAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,0BAA0B,CAAA,CAAE,KAAA,EAAM;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,cAAc,cAAA,EAAe;AACnC,QAAA,MAAM,QAAA,GAAW,cAAA;AACjB,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAK;AAAA,UACxB,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,GAAO,WAAA;AAAY,SACxC;AACA,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAG7B,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,UACtB,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,IAAI,UAAU,GAAA,EAAK;AACjB,UAAA,MAAM,GAAA,GAAM,IAAA;AACZ,UAAAD,SAAQ,IAAA,CAAK,GAAA,EAAK,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAC7C,UAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAAF,QAAAA,CAAQ,QAAQ,sBAAsB,CAAA;AACtC,QAAA,OAAA,CAAQ,GAAA,CAAIE,OAAM,KAAA,CAAM,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAAA,MACxD,SAAS,CAAA,EAAG;AACV,QAAAF,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,SACtD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAAA;AAEN,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,KAAK,CAAA,CACd,YAAY,6BAA6B,CAAA,CACzC,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,MAAA,CAAO,OAAO,KAAA,EAAe,UAAU,OAAA,KAAqB;AAC3D,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAC1D,IAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,0BAA0B,CAAA,CAAE,KAAA,EAAM;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,SAAA,CAE7B,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAClD,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAAD,QAAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAAA,QAAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,QAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAAF,QAAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC3C,SAAS,CAAA,EAAG;AACV,MAAAA,QAAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAME,MAAAA,CAAM,GAAA,CAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC;AACL,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,QAAQ,EACjB,WAAA,CAAY,sCAAsC,EAClD,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,OAAO,mBAAA,EAAqB,kBAAkB,EAC9C,MAAA,CAAO,uBAAA,EAAyB,sBAAsB,CAAA,CACtD,MAAA;AAAA,IACC,OACE,KAAA,EACA,OAAA,EACA,OAAA,KACG;AACH,MAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,MAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,0BAA0B,CAAA,CAAE,KAAA,EAAM;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,cAAc,cAAA,EAAe;AACnC,QAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAC1D,QAAA,MAAM,OAAgC,EAAC;AACvC,QAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,KAAA,CAAA,EAAW,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpD,QAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,CAAA,EAAW;AAClC,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC7C,CAAA,CAAA,MAAQ;AACN,YAAAD,QAAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,UAC7D,MAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EACE,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UACxD,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,IAAI,UAAU,GAAA,EAAK;AACjB,UAAAA,QAAAA,CAAQ,IAAA;AAAA,YACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,WAC3D;AACA,UAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAAF,QAAAA,CAAQ,QAAQ,SAAS,CAAA;AACzB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MAC3C,SAAS,CAAA,EAAG;AACV,QAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,SACtD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAAA;AAEN,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACjB,YAAY,wDAAwD,CAAA,CACpE,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,MAAA,CAAO,WAAA,EAAa,0BAA0B,CAAA,CAC9C,MAAA;AAAA,IACC,OAAO,KAAA,EAAe,OAAA,EAA4B,OAAA,KAAqB;AACrE,MAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,MAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,QAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,UAAU,CAAA;AACnD,QAAA,MAAM,KAAK,eAAA,CAAgB;AAAA,UACzB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ;AAAA,SACjB,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,MAAM,IAAI,OAAA,CAAiB,CAAA,OAAA,KAAW;AACtD,UAAA,EAAA,CAAG,QAAA;AAAA,YACDD,MAAAA,CAAM,MAAA;AAAA,cACJ,wBAAwB,KAAK,CAAA,8EAAA;AAAA,aAC/B;AAAA,YACA,CAAA,MAAA,KAAU;AACR,cAAA,EAAA,CAAG,KAAA,EAAM;AACT,cAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,OAAkB,KAAK,CAAA;AAAA,YAC/C;AAAA,WACF;AAAA,QACF,CAAC,CAAA;AACD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAClC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAMF,QAAAA,GAAUC,IAAAA,CAAI,0BAA0B,CAAA,CAAE,KAAA,EAAM;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,cAAc,cAAA,EAAe;AACnC,QAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAC1D,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,UAC7D,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,IAAI,UAAU,GAAA,EAAK;AACjB,UAAAD,QAAAA,CAAQ,IAAA;AAAA,YACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,WAC3D;AACA,UAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAAF,QAAAA,CAAQ,QAAQ,sBAAsB,CAAA;AAAA,MACxC,SAAS,CAAA,EAAG;AACV,QAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,SACtD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAAA;AAEN,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,SAAS,CAAA,CAClB,WAAA,CAAY,2CAA2C,CAAA,CACvD,UAAA;AAAA,IACC,IAAIA,OAAAA,CAAQ,MAAM,CAAA,CACf,YAAY,wBAAwB,CAAA,CACpC,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,MAAA,CAAO,OAAO,KAAA,EAAe,UAAU,OAAA,KAAqB;AAC3D,MAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAC1D,MAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,EAAM;AACjD,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,SAAA,CAE5B,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AACnD,QAAA,IAAI,WAAW,GAAA,EAAK;AAClB,UAAAD,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAAF,QAAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,QAAA,MAAM,OAAA,GACH,IAAA,EACG,OAAA,IAAW,EAAC;AAClB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MAC9C,SAAS,CAAA,EAAG;AACV,QAAAA,QAAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,SACtD;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,GACL,CACC,UAAA;AAAA,IACC,IAAIC,OAAAA,CAAQ,KAAK,EACd,WAAA,CAAY,uBAAuB,EACnC,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,QAAA,CAAS,WAAW,sBAAsB,CAAA,CAC1C,OAAO,mBAAA,EAAqB,uBAAA,EAAyB,QAAQ,CAAA,CAC7D,MAAA;AAAA,MACC,OACE,KAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,KACG;AACH,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,QAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,kBAAkB,CAAA,CAAE,KAAA,EAAM;AAC9C,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,cAAA,EAAe;AACnC,UAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO;AAAA,YACX,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,YAClB,IAAA,EAAM,OAAA,CAAQ,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU;AAAA,WAC7C;AACA,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,YAC7D,MAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,YACzB,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,UAAU,GAAA,EAAK;AACjB,YAAAD,QAAAA,CAAQ,IAAA;AAAA,cACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAAF,QAAAA,CAAQ,QAAQ,cAAc,CAAA;AAAA,QAChC,SAAS,CAAA,EAAG;AACV,UAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAAA;AACF,GACJ,CACC,UAAA;AAAA,IACC,IAAIC,OAAAA,CAAQ,QAAQ,EACjB,WAAA,CAAY,wCAAwC,EACpD,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,SAAS,SAAA,EAAW,sBAAsB,EAC1C,cAAA,CAAe,mBAAA,EAAqB,2BAA2B,CAAA,CAC/D,MAAA;AAAA,MACC,OACE,KAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,KACG;AACH,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU,QAAA;AAClD,QAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,yBAAyB,CAAA,CAAE,KAAA,EAAM;AACrD,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,cAAA,EAAe;AACnC,UAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,YAAY,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA,CAAA;AACtG,UAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAK;AACpB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,YAC7D,MAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,YACzB,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,UAAU,GAAA,EAAK;AACjB,YAAAD,QAAAA,CAAQ,IAAA;AAAA,cACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAAF,QAAAA,CAAQ,OAAA,CAAQ,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,QAC7C,SAAS,CAAA,EAAG;AACV,UAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAAA;AACF,GACJ,CACC,UAAA;AAAA,IACC,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACjB,YAAY,0BAA0B,CAAA,CACtC,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,QAAA,CAAS,SAAA,EAAW,sBAAsB,CAAA,CAC1C,MAAA;AAAA,MACC,OACE,KAAA,EACA,KAAA,EACA,QAAA,EACA,OAAA,KACG;AACH,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,QAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAChD,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,cAAA,EAAe;AACnC,UAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,YAAY,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA,CAAA;AACtG,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,YAC7D,MAAA,EAAQ,QAAA;AAAA,YACR,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,UAAU,GAAA,EAAK;AACjB,YAAAD,QAAAA,CAAQ,IAAA;AAAA,cACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAAF,QAAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAAA,QAClC,SAAS,CAAA,EAAG;AACV,UAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAAA;AACF;AAER,CAAA,CACC,UAAA;AAAA,EACC,IAAIC,OAAAA,CAAQ,UAAU,CAAA,CACnB,WAAA,CAAY,6CAA6C,CAAA,CACzD,UAAA;AAAA,IACC,IAAIA,OAAAA,CAAQ,MAAM,CAAA,CACf,YAAY,oCAAoC,CAAA,CAChD,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,QAAA,CAAS,WAAA,EAAa,cAAc,CAAA,CACpC,MAAA;AAAA,MACC,OAAO,KAAA,EAAe,GAAA,EAAa,QAAA,EAAU,OAAA,KAAqB;AAChE,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,QAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAChD,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,cAAA,EAAe;AACnC,UAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,SAAA,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAS,GAAA,CAAI,MAAK,EAAE;AACnC,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,YAC7D,MAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,YACzB,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,UAAU,GAAA,EAAK;AACjB,YAAAD,QAAAA,CAAQ,IAAA;AAAA,cACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAAF,QAAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAAA,QAClC,SAAS,CAAA,EAAG;AACV,UAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAAA;AACF,GACJ,CACC,UAAA;AAAA,IACC,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACjB,YAAY,wCAAwC,CAAA,CACpD,QAAA,CAAS,SAAA,EAAW,yBAAyB,CAAA,CAC7C,QAAA,CAAS,WAAA,EAAa,cAAc,CAAA,CACpC,MAAA;AAAA,MACC,OAAO,KAAA,EAAe,GAAA,EAAa,QAAA,EAAU,OAAA,KAAqB;AAChE,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,cAAc,OAAO,CAAA;AAC9C,QAAA,MAAMH,QAAAA,GAAUC,IAAAA,CAAI,sBAAsB,CAAA,CAAE,KAAA,EAAM;AAClD,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,cAAA,EAAe;AACnC,UAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,aAAa,kBAAA,CAAmB,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA,CAAA;AACrG,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,UAAU,CAAA,EAAG,IAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,YAC7D,MAAA,EAAQ,QAAA;AAAA,YACR,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,UAAU,GAAA,EAAK;AACjB,YAAAD,QAAAA,CAAQ,IAAA;AAAA,cACL,IAAA,EAA+B,OAAA,IAAW,CAAA,KAAA,EAAQ,MAAM,CAAA;AAAA,aAC3D;AACA,YAAA,OAAA,CAAQ,MAAME,MAAAA,CAAM,GAAA,CAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAC7C,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AACA,UAAAF,QAAAA,CAAQ,QAAQ,kBAAkB,CAAA;AAAA,QACpC,SAAS,CAAA,EAAG;AACV,UAAAA,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACNE,MAAAA,CAAM,IAAI,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC;AAAA,WACtD;AACA,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAAA;AACF;AAER,CAAA;;;AC9kBF,IAAMO,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,IAAM,EAAE,OAAA,EAAQ,GAAIA,QAAAA,CAAQ,iBAAiB,CAAA;AAE7C,IAAM,OAAA,GAAU,IAAIN,OAAAA,EAAQ;AAE5B,OAAA,CACG,IAAA,CAAK,mBAAmB,CAAA,CACxB,WAAA;AAAA,EACC;AACF,CAAA,CACC,QAAQ,OAAO,CAAA;AAGlB,OAAA,CAAQ,WAAA;AAAA,EACN,OAAA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AASF,CAAA;AAGA,OAAA,CAAQ,MAAA,CAAO,mBAAmB,2CAA2C,CAAA;AAC7E,OAAA,CAAQ,MAAA;AAAA,EACN,yBAAA;AAAA,EACA,iCAAA;AAAA,EACA;AACF,CAAA;AACA,OAAA,CAAQ,MAAA,CAAO,WAAW,0CAA0C,CAAA;AAGpE,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,WAAW,CAAA;AAC9B,OAAA,CAAQ,WAAW,YAAY,CAAA;AAC/B,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,aAAa,CAAA;AAChC,OAAA,CAAQ,WAAW,UAAU,CAAA;AAG7B,OAAA,CAAQ,YAAA,EAAa;AAErB,IAAI;AACF,EAAA,OAAA,CAAQ,KAAA,EAAM;AAChB,CAAA,CAAA,OAAS,GAAA,EAAc;AAErB,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,cAAc,GAAA,EAAK;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAM,GAAA,CAA6B,QAAA,IAAY,CAAC,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,MAAMD,MAAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG,IAAI,OAAO,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,wBAAwB,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB","file":"index.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\n/**\n * The public registry, named once. It was written out in loadConfig, in reset\n * and in getRegistryUrl, which is three places for one value to drift.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://apps.calimero.network';\n\nfunction defaultConfig(): RemoteConfigData {\n return { registry: { url: DEFAULT_REGISTRY_URL } };\n}\n\nexport interface RemoteConfigData {\n registry: {\n url: string;\n apiKey?: string;\n };\n}\n\nexport class RemoteConfig {\n private configPath: string;\n private config: RemoteConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'remote-config.json'\n );\n this.config = this.loadConfig();\n }\n\n private loadConfig(): RemoteConfigData {\n const defaults = defaultConfig();\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n registry: {\n ...defaults.registry,\n ...(existingConfig.registry || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaults;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config - always save API key if it's set in config\n // (env var takes precedence when reading, but doesn't prevent saving)\n const configToSave: RemoteConfigData = {\n registry: {\n url: this.config.registry.url,\n // Save API key if it exists in config (regardless of env var)\n ...(this.config.registry.apiKey\n ? { apiKey: this.config.registry.apiKey }\n : {}),\n },\n };\n fs.writeFileSync(this.configPath, JSON.stringify(configToSave, null, 2));\n }\n\n /**\n * Get registry URL with priority:\n * 1. Environment variable CALIMERO_REGISTRY_URL\n * 2. Config file value\n * 3. Default value\n */\n getRegistryUrl(): string {\n return (\n process.env.CALIMERO_REGISTRY_URL ||\n this.config.registry.url ||\n DEFAULT_REGISTRY_URL\n );\n }\n\n /**\n * Set registry URL\n */\n setRegistryUrl(url: string): void {\n this.config.registry.url = url;\n this.saveConfig();\n }\n\n /**\n * Get API key with priority:\n * 1. Environment variable CALIMERO_API_KEY\n * 2. Config file value\n * 3. undefined\n */\n getApiKey(): string | undefined {\n return process.env.CALIMERO_API_KEY || this.config.registry.apiKey;\n }\n\n /**\n * Set API key (stored in config file)\n */\n setApiKey(apiKey: string): void {\n this.config.registry.apiKey = apiKey;\n this.saveConfig();\n }\n\n /**\n * Remove API key from config\n */\n removeApiKey(): void {\n delete this.config.registry.apiKey;\n this.saveConfig();\n }\n\n /**\n * Get full configuration\n */\n getConfig(): RemoteConfigData {\n return {\n registry: {\n url: this.getRegistryUrl(),\n // Don't expose API key in getConfig (security)\n apiKey: this.getApiKey() ? '***' : undefined,\n },\n };\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Reset to defaults\n */\n reset(): void {\n this.config = defaultConfig();\n this.saveConfig();\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface LocalConfigData {\n server: {\n port: number;\n host: string;\n publicHost: string;\n };\n data: {\n dir: string;\n artifactsDir: string;\n };\n artifacts: {\n storageDir: string;\n serveLocal: boolean;\n copyArtifacts: boolean;\n maxFileSize: string;\n allowedTypes: string[];\n };\n}\n\n/**\n * One source for the defaults. They were written out twice, in loadConfig and\n * in reset, and had drifted: reset bound a different host and omitted\n * publicHost entirely, which artifact URLs are built from.\n */\nfunction defaultConfig(): LocalConfigData {\n return {\n server: {\n // Reset used to say localhost here, but never reached the listener:\n // `local start` sets the host on every run and defaults to 0.0.0.0,\n // which is also what publicHost assumes, since a container reaching\n // host.docker.internal cannot be served from loopback.\n host: '0.0.0.0',\n port: 8082,\n publicHost: 'host.docker.internal',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n}\n\nexport class LocalConfig {\n private configPath: string;\n private dataDir: string;\n private config: LocalConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'config.json'\n );\n this.dataDir = path.join(os.homedir(), '.calimero-registry');\n this.config = this.loadConfig();\n }\n\n private loadConfig(): LocalConfigData {\n const defaults = defaultConfig();\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n server: {\n ...defaults.server,\n ...(existingConfig.server || {}),\n },\n data: {\n ...defaults.data,\n ...(existingConfig.data || {}),\n },\n artifacts: {\n ...defaults.artifacts,\n ...(existingConfig.artifacts || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaults;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config\n fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n }\n\n // Server configuration\n getPort(): number {\n return this.config.server.port;\n }\n\n setPort(port: number): void {\n this.config.server.port = port;\n this.saveConfig();\n }\n\n getHost(): string {\n return this.config.server.host;\n }\n\n setHost(host: string): void {\n this.config.server.host = host;\n this.saveConfig();\n }\n\n getPublicHost(): string {\n return this.config.server.publicHost;\n }\n\n setPublicHost(host: string): void {\n this.config.server.publicHost = host;\n this.saveConfig();\n }\n\n // Data directory configuration\n getDataDir(): string {\n return this.config.data.dir;\n }\n\n setDataDir(dir: string): void {\n // artifactsDir and storageDir name the same directory; moving the data\n // dir has to move both, or a later read gets the previous location.\n this.config.data.dir = dir;\n this.config.data.artifactsDir = path.join(dir, 'artifacts');\n this.config.artifacts.storageDir = path.join(dir, 'artifacts');\n this.saveConfig();\n }\n\n getArtifactsDir(): string {\n return this.config.data.artifactsDir;\n }\n\n setArtifactsDir(dir: string): void {\n this.config.data.artifactsDir = dir;\n this.config.artifacts.storageDir = dir;\n this.saveConfig();\n }\n\n // Artifact configuration\n getArtifactsConfig() {\n return this.config.artifacts;\n }\n\n setArtifactsConfig(config: Partial<LocalConfigData['artifacts']>): void {\n this.config.artifacts = { ...this.config.artifacts, ...config };\n this.saveConfig();\n }\n\n // Utility methods\n ensureDirectories(): void {\n const dirs = [\n this.getDataDir(),\n this.getArtifactsDir(),\n path.join(this.getDataDir(), 'backups'),\n path.join(this.getDataDir(), 'logs'),\n ];\n\n dirs.forEach(dir => {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n });\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n // Get full configuration\n getConfig(): LocalConfigData {\n return { ...this.config };\n }\n\n // Reset to defaults\n reset(): void {\n this.config = defaultConfig();\n this.saveConfig();\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport axios from 'axios';\nimport { RemoteConfig } from '../lib/remote-config.js';\nimport { LocalConfig } from '../lib/local-config.js';\n\nexport const healthCommand = new Command('health')\n .description('Check the health of the Calimero Registry API')\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts();\n\n // The two registries expose health at different paths: the local server\n // owns its whole origin and serves /healthz, while on the deployed\n // registry that path belongs to the frontend.\n let url: string;\n if (globalOpts?.local) {\n const local = new LocalConfig();\n url = `http://${local.getHost()}:${local.getPort()}/healthz`;\n } else {\n // getRegistryUrl already falls through the env var to the public\n // registry, so repeating that default here would only give it a second\n // place to drift from.\n const base = (globalOpts?.url || new RemoteConfig().getRegistryUrl())\n .trim()\n .replace(/\\/$/, '');\n url = `${base}/api/healthz`;\n }\n\n const spinner = ora('Checking API health...').start();\n\n try {\n // Accept only a JSON body that says ok. Asking the deployed registry for\n // /healthz used to reach the frontend, and any 200 from the app shell\n // read as healthy against an API that was never contacted.\n const { data } = await axios.get(url, {\n timeout: parseInt(globalOpts?.timeout || '10000'),\n headers: { Accept: 'application/json' },\n });\n\n if (data?.status !== 'ok') {\n throw new Error(\n `unexpected response from ${url}: ${JSON.stringify(data)}`\n );\n }\n\n spinner.succeed('API is healthy');\n console.log(chalk.green(`Status: ${data.status}`));\n if (data.timestamp) {\n console.log(chalk.gray(`Checked: ${data.timestamp}`));\n }\n } catch (error) {\n spinner.fail('API health check failed');\n // A refused connection arrives with an empty message, which on its own\n // says nothing about what was tried; the url is the useful part.\n const reason =\n (error instanceof Error && error.message) ||\n (axios.isAxiosError(error) && error.code) ||\n 'no response';\n console.error(chalk.red(`Error: ${reason}`));\n console.error(chalk.gray(`Tried: ${url}`));\n if (globalOpts?.local) {\n console.error(\n chalk.gray('Is it running? \"calimero-registry local start\"')\n );\n }\n process.exit(1);\n }\n });\n","import { writeFileSync, existsSync } from 'fs';\n\nexport async function uploadToIPFS(filePath: string): Promise<string> {\n try {\n // For now, we'll simulate IPFS upload since public gateways require authentication\n // In production, you'd use a service like Pinata, Infura, or your own IPFS node\n\n // Check if file exists (this satisfies the linter by using filePath)\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Use a hardcoded valid CID for demo\n const simulatedCid = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG';\n\n console.log('⚠️ Using simulated IPFS upload for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n return simulatedCid;\n } catch (error) {\n throw new Error(\n `Failed to upload to IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { cause: error }\n );\n }\n}\n\nexport async function downloadFromIPFS(\n cid: string,\n outputPath?: string\n): Promise<string> {\n try {\n // For demo purposes, we'll simulate IPFS download\n // In production, you'd actually download from IPFS\n\n console.log('⚠️ Using simulated IPFS download for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n // Generate a simulated file content based on CID\n const simulatedContent = `Simulated IPFS file content for CID: ${cid}\\nThis is a demo file that would normally contain the actual application data.`;\n\n // Determine output path\n const finalOutputPath = outputPath || `${cid}.wasm`;\n\n // Write the simulated content to file\n writeFileSync(finalOutputPath, simulatedContent);\n\n return finalOutputPath;\n } catch (error) {\n throw new Error(\n `Failed to download from IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { cause: error }\n );\n }\n}\n","import ora from 'ora';\n\nexport const spinner = (text: string) => ora(text);\n","import { Command } from 'commander';\nimport { uploadToIPFS, downloadFromIPFS } from '../lib/ipfs';\nimport { spinner } from '../utils/spinner';\n\nexport const ipfsCommand = new Command('ipfs')\n .description('IPFS operations')\n .addCommand(\n new Command('upload')\n .description('Upload a file to IPFS')\n .argument('<file>', 'Path to the file to upload')\n .action(async file => {\n const s = spinner('Uploading to IPFS...').start();\n\n try {\n const cid = await uploadToIPFS(file);\n s.succeed(`File uploaded successfully!`);\n console.log(`CID: ${cid}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Upload failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('download')\n .description('Download a file from IPFS')\n .argument('<cid>', 'IPFS CID to download')\n .argument('[output]', 'Output file path (optional)')\n .action(async (cid, output) => {\n const s = spinner('Downloading from IPFS...').start();\n\n try {\n const outputPath = await downloadFromIPFS(cid, output);\n s.succeed(`File downloaded successfully!`);\n console.log(`Saved to: ${outputPath}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Download failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n );\n","import fs from 'fs';\nimport path from 'path';\nimport { LocalConfig } from './local-config.js';\n\nexport interface AppSummary {\n id: string;\n name: string;\n latest_version: string;\n latest_digest: string;\n developer_pubkey?: string;\n alias?: string;\n}\n\nexport interface VersionInfo {\n semver: string;\n digest: string;\n cid: string; // Added for compatibility\n yanked: boolean;\n}\n\n// --- V2 / Bundle Manifest Support ---\n\nexport interface BundleArtifact {\n path: string;\n hash: string | null;\n size: number;\n}\n\nexport interface BundleMetadata {\n name: string;\n description?: string;\n // Set by the registry from the publishing account and carried forward from\n // the package's first version, so `bundle edit` sends it back rather than\n // setting it. Every published manifest has one.\n author?: string;\n icon?: string;\n tags?: string[];\n license?: string;\n}\n\nexport interface BundleInterfaces {\n exports?: string[];\n uses?: string[];\n}\n\nexport interface BundleLinks {\n frontend?: string;\n github?: string;\n docs?: string;\n}\n\nexport interface BundleSignature {\n alg: string;\n sig: string;\n pubkey: string;\n signed_at: string;\n}\n\n/**\n * A named service shipped alongside the main application in a multi-service\n * bundle (e.g. a \"lobby\" matchmaking service next to a \"tictactoe\" main app).\n * Packed under `services/<name>.wasm` (+ optional `services/<name>.abi.json`).\n */\nexport interface BundleServiceEntry {\n name: string;\n wasm: BundleArtifact;\n abi?: BundleArtifact;\n}\n\nexport interface BundleManifest {\n version: string; // \"1.0\" (internal manifest version)\n package: string;\n appVersion: string;\n\n metadata?: BundleMetadata;\n interfaces?: BundleInterfaces;\n\n /** The MAIN application WASM (packed as `app.wasm`). Always present. */\n wasm?: BundleArtifact;\n /** The MAIN application ABI (packed as `abi.json`), if any. */\n abi?: BundleArtifact;\n /**\n * Additional named services shipped alongside the main app. Optional and\n * omitted entirely for single-app bundles, so existing manifests are\n * unchanged (and their signatures still verify).\n */\n services?: BundleServiceEntry[];\n migrations: BundleArtifact[];\n\n links?: BundleLinks;\n signature?: BundleSignature;\n\n /** Minimum runtime version required by this bundle (e.g. \"0.2.0\"). Preserved when pushing. */\n minRuntimeVersion?: string;\n /** DID of the signer — part of the signed payload, must be forwarded as-is. */\n signerId?: string;\n}\n\nexport interface LocalRegistryData {\n apps: Map<string, AppSummary>;\n bundleManifests: Map<string, BundleManifest>; // Key: \"package/version\"\n artifacts: Map<string, string>; // digest -> file path\n}\n\nexport class LocalDataStore {\n private config: LocalConfig;\n private data: LocalRegistryData;\n private appsFile: string;\n private bundleManifestsFile: string;\n private artifactsFile: string;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.appsFile = path.join(config.getDataDir(), 'apps.json');\n this.bundleManifestsFile = path.join(\n config.getDataDir(),\n 'bundle_manifests.json'\n );\n this.artifactsFile = path.join(config.getDataDir(), 'artifacts.json');\n this.data = {\n apps: new Map(),\n bundleManifests: new Map(),\n artifacts: new Map(),\n };\n this.loadData();\n }\n\n private loadData(): void {\n try {\n // Load apps\n if (fs.existsSync(this.appsFile)) {\n const appsData = JSON.parse(fs.readFileSync(this.appsFile, 'utf8'));\n this.data.apps = new Map(Object.entries(appsData));\n }\n\n // Load bundle manifests\n if (fs.existsSync(this.bundleManifestsFile)) {\n const bundleManifestsData = JSON.parse(\n fs.readFileSync(this.bundleManifestsFile, 'utf8')\n );\n this.data.bundleManifests = new Map(\n Object.entries(bundleManifestsData)\n );\n }\n\n // Load artifacts\n if (fs.existsSync(this.artifactsFile)) {\n const artifactsData = JSON.parse(\n fs.readFileSync(this.artifactsFile, 'utf8')\n );\n this.data.artifacts = new Map(Object.entries(artifactsData));\n }\n } catch {\n console.warn('Failed to load existing data, starting fresh');\n }\n }\n\n private saveData(): void {\n try {\n // Ensure data directory exists\n this.config.ensureDirectories();\n\n // Save apps\n const appsObj = Object.fromEntries(this.data.apps);\n fs.writeFileSync(this.appsFile, JSON.stringify(appsObj, null, 2));\n\n // Save bundle manifests\n const bundleManifestsObj = Object.fromEntries(this.data.bundleManifests);\n fs.writeFileSync(\n this.bundleManifestsFile,\n JSON.stringify(bundleManifestsObj, null, 2)\n );\n\n // Save artifacts\n const artifactsObj = Object.fromEntries(this.data.artifacts);\n fs.writeFileSync(\n this.artifactsFile,\n JSON.stringify(artifactsObj, null, 2)\n );\n } catch (error) {\n throw new Error(\n `Failed to save data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n { cause: error }\n );\n }\n }\n\n // Apps management\n getApps(filters?: { name?: string; dev?: string }): AppSummary[] {\n let apps = Array.from(this.data.apps.values());\n\n if (filters?.name) {\n apps = apps.filter(app => app.name.includes(filters.name!));\n }\n\n if (filters?.dev) {\n apps = apps.filter(app => app.developer_pubkey === filters.dev);\n }\n\n return apps;\n }\n\n getApp(appKey: string): AppSummary | undefined {\n return this.data.apps.get(appKey);\n }\n\n setApp(appKey: string, app: AppSummary): void {\n this.data.apps.set(appKey, app);\n this.saveData();\n }\n\n // Versions management (bundles only)\n getAppVersions(packageId: string): VersionInfo[] {\n const versions: VersionInfo[] = [];\n\n // Get bundle versions\n for (const [key, manifest] of this.data.bundleManifests.entries()) {\n if (key.startsWith(`${packageId}/`)) {\n const semver = key.split('/').pop()!;\n const digest = manifest.wasm?.hash || '';\n versions.push({\n semver,\n digest,\n cid: digest, // Compatibility\n yanked: false,\n });\n }\n }\n\n return versions.sort((a, b) =>\n a.semver.localeCompare(b.semver, undefined, { numeric: true })\n );\n }\n\n // Manifest management (V2 / Bundles)\n\n getBundleManifest(pkg: string, version: string): BundleManifest | undefined {\n const key = `${pkg}/${version}`;\n return this.data.bundleManifests.get(key);\n }\n\n setBundleManifest(\n pkg: string,\n version: string,\n manifest: BundleManifest\n ): void {\n const key = `${pkg}/${version}`;\n this.data.bundleManifests.set(key, manifest);\n this.saveData();\n }\n\n // Artifact management\n getArtifactPath(hash: string): string | undefined {\n return this.data.artifacts.get(hash);\n }\n\n setArtifactPath(hash: string, filePath: string): void {\n this.data.artifacts.set(hash, filePath);\n this.saveData();\n }\n\n // Statistics\n getStats() {\n return {\n publishedApps: this.data.apps.size,\n totalVersions: this.data.bundleManifests.size,\n totalArtifacts: this.data.artifacts.size,\n };\n }\n\n // Backup and restore\n async backup(outputPath?: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath =\n outputPath ||\n path.join(\n this.config.getDataDir(),\n 'backups',\n `backup-${timestamp}.json`\n );\n\n // Ensure backup directory exists\n const backupDir = path.dirname(backupPath);\n if (!fs.existsSync(backupDir)) {\n fs.mkdirSync(backupDir, { recursive: true });\n }\n\n const backupData = {\n timestamp: new Date().toISOString(),\n apps: Object.fromEntries(this.data.apps),\n bundleManifests: Object.fromEntries(this.data.bundleManifests),\n artifacts: Object.fromEntries(this.data.artifacts),\n };\n\n fs.writeFileSync(backupPath, JSON.stringify(backupData, null, 2));\n return backupPath;\n }\n\n async restore(backupPath: string): Promise<void> {\n if (!fs.existsSync(backupPath)) {\n throw new Error(`Backup file not found: ${backupPath}`);\n }\n\n const backupData = JSON.parse(fs.readFileSync(backupPath, 'utf8'));\n\n // Restore data\n this.data.apps = new Map(Object.entries(backupData.apps || {}));\n this.data.bundleManifests = new Map(\n Object.entries(backupData.bundleManifests || {})\n );\n this.data.artifacts = new Map(Object.entries(backupData.artifacts || {}));\n\n this.saveData();\n }\n\n // Reset data\n reset(): void {\n this.data.apps.clear();\n this.data.bundleManifests.clear();\n this.data.artifacts.clear();\n this.saveData();\n }\n\n /**\n * Get all bundle manifests\n */\n getAllBundles(): BundleManifest[] {\n return Array.from(this.data.bundleManifests.values());\n }\n\n // Seed with sample data\n async seed(): Promise<void> {\n // V2 Sample Bundle\n const bundleManifest: BundleManifest = {\n version: '1.0',\n package: 'com.calimero.sample-bundle',\n appVersion: '1.0.0',\n metadata: {\n name: 'Sample Bundle App',\n description: 'A sample application using V2 Bundle Manifest',\n tags: ['sample', 'v2'],\n license: 'MIT',\n },\n interfaces: {\n exports: ['com.calimero.sample.v1'],\n uses: [],\n },\n links: {\n frontend: 'https://example.com/app',\n github: 'https://github.com/example/app',\n },\n wasm: {\n path: 'app.wasm',\n size: 1024,\n hash: null,\n },\n abi: {\n path: 'abi.json',\n size: 512,\n hash: null,\n },\n migrations: [],\n };\n\n this.setBundleManifest(\n bundleManifest.package,\n bundleManifest.appVersion,\n bundleManifest\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { Buffer } from 'buffer';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore } from './local-storage.js';\n\nexport class LocalArtifactServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactsDir: string;\n\n constructor(config: LocalConfig, dataStore: LocalDataStore) {\n this.config = config;\n this.dataStore = dataStore;\n this.artifactsDir = config.getArtifactsDir();\n this.ensureArtifactsDir();\n }\n\n private ensureArtifactsDir(): void {\n if (!fs.existsSync(this.artifactsDir)) {\n fs.mkdirSync(this.artifactsDir, { recursive: true });\n }\n }\n\n // Copy artifact to local storage\n async copyArtifactToLocal(\n sourcePath: string,\n appId: string,\n version: string,\n filename: string\n ): Promise<string> {\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n // Create app version directory\n const appVersionDir = path.join(this.artifactsDir, appId, version);\n if (!fs.existsSync(appVersionDir)) {\n fs.mkdirSync(appVersionDir, { recursive: true });\n }\n\n // Copy file to local storage\n const targetPath = path.join(appVersionDir, filename);\n fs.copyFileSync(sourcePath, targetPath);\n\n // Calculate file hash for tracking\n const fileHash = await this.calculateFileHash(targetPath);\n this.dataStore.setArtifactPath(fileHash, targetPath);\n\n return targetPath;\n }\n\n // Serve artifact by app ID, version, and filename\n async serveArtifact(\n appId: string,\n version: string,\n filename: string\n ): Promise<Buffer> {\n const artifactPath = path.join(this.artifactsDir, appId, version, filename);\n\n if (!fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found: ${artifactPath}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Serve artifact by hash\n async serveByHash(hash: string): Promise<Buffer> {\n const artifactPath = this.dataStore.getArtifactPath(hash);\n\n if (!artifactPath || !fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found for hash: ${hash}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Validate artifact file\n async validateArtifact(\n filePath: string\n ): Promise<{ size: number; sha256: string }> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const stats = fs.statSync(filePath);\n const fileBuffer = fs.readFileSync(filePath);\n const sha256 = crypto.createHash('sha256').update(fileBuffer).digest('hex');\n\n return {\n size: stats.size,\n sha256,\n };\n }\n\n // Calculate file hash\n private async calculateFileHash(filePath: string): Promise<string> {\n const fileBuffer = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n }\n\n // Get artifact URL for local serving\n getArtifactUrl(appId: string, version: string, filename: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${appId}/${version}/${filename}`;\n }\n\n // Get artifact URL by hash\n getArtifactUrlByHash(hash: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${hash}`;\n }\n\n // Clean up old artifacts\n async cleanupOldArtifacts(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n const now = Date.now();\n\n // Get all artifact files\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n const age = now - stats.mtime.getTime();\n\n if (age > maxAge) {\n fs.unlinkSync(file);\n console.log(`Cleaned up old artifact: ${file}`);\n }\n }\n }\n\n // Get artifact statistics\n getArtifactStats(): {\n totalFiles: number;\n totalSize: number;\n oldestFile: Date | null;\n } {\n let totalFiles = 0;\n let totalSize = 0;\n let oldestFile: Date | null = null;\n\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n if (fs.existsSync(this.artifactsDir)) {\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n totalFiles++;\n totalSize += stats.size;\n\n if (!oldestFile || stats.mtime < oldestFile) {\n oldestFile = stats.mtime;\n }\n }\n }\n\n return {\n totalFiles,\n totalSize,\n oldestFile,\n };\n }\n}\n","import fastify, { FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, BundleManifest } from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\n\nexport interface ServerStatus {\n running: boolean;\n url: string;\n dataDir: string;\n appsCount: number;\n artifactsCount: number;\n}\n\nexport class LocalRegistryServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n private server: FastifyInstance | null = null;\n private isRunning = false;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.dataStore = new LocalDataStore(config);\n this.artifactServer = new LocalArtifactServer(config, this.dataStore);\n }\n\n async start(port?: number): Promise<void> {\n if (this.isRunning) {\n throw new Error('Local registry is already running');\n }\n\n const serverPort = port || this.config.getPort();\n const host = this.config.getHost();\n\n // Ensure directories exist\n this.config.ensureDirectories();\n\n // Create Fastify server\n this.server = fastify({\n logger: {\n level: 'info',\n },\n });\n\n // Register CORS\n await this.server.register(cors, {\n origin: true,\n credentials: true,\n });\n\n // Register routes\n await this.registerRoutes();\n\n // Start server\n await this.server.listen({ port: serverPort, host });\n this.isRunning = true;\n\n console.log(\n `Local registry server started on http://${host}:${serverPort}`\n );\n }\n\n async stop(): Promise<void> {\n if (!this.server || !this.isRunning) {\n throw new Error('Local registry is not running');\n }\n\n await this.server.close();\n this.isRunning = false;\n this.server = null;\n }\n\n async getStatus(): Promise<ServerStatus> {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n running: this.isRunning,\n url: `http://${this.config.getHost()}:${this.config.getPort()}`,\n dataDir: this.config.getDataDir(),\n appsCount: stats.publishedApps,\n artifactsCount: artifactStats.totalFiles,\n };\n }\n\n async reset(): Promise<void> {\n this.dataStore.reset();\n\n // Clean up artifacts directory\n const artifactsDir = this.config.getArtifactsDir();\n if (fs.existsSync(artifactsDir)) {\n fs.rmSync(artifactsDir, { recursive: true, force: true });\n }\n }\n\n async backup(outputPath?: string): Promise<string> {\n return await this.dataStore.backup(outputPath);\n }\n\n async restore(backupPath: string): Promise<void> {\n await this.dataStore.restore(backupPath);\n }\n\n async seed(): Promise<void> {\n await this.dataStore.seed();\n }\n\n private async registerRoutes(): Promise<void> {\n if (!this.server) {\n throw new Error('Server not initialized');\n }\n\n // Health endpoint\n this.server.get('/healthz', async () => {\n return { status: 'ok' };\n });\n\n // Statistics endpoint\n this.server.get('/stats', async () => {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n publishedApps: stats.publishedApps,\n totalVersions: stats.totalVersions,\n totalArtifacts: artifactStats.totalFiles,\n totalSize: artifactStats.totalSize,\n };\n });\n\n // Artifact endpoints\n this.server.get(\n '/artifacts/:appId/:version/:filename',\n async (request, reply) => {\n const { appId, version, filename } = request.params as {\n appId: string;\n version: string;\n filename: string;\n };\n\n try {\n const artifactData = await this.artifactServer.serveArtifact(\n appId,\n version,\n filename\n );\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n }\n );\n\n this.server.get('/artifacts/:hash', async (request, reply) => {\n const { hash } = request.params as { hash: string };\n\n try {\n const artifactData = await this.artifactServer.serveByHash(hash);\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n });\n\n // Local registry management endpoints\n this.server.get('/local/status', async () => {\n return await this.getStatus();\n });\n\n this.server.post('/local/reset', async () => {\n await this.reset();\n return { message: 'Local registry data reset successfully' };\n });\n\n this.server.get('/local/backup', async request => {\n const query = request.query as { output?: string };\n const backupPath = await this.backup(query.output);\n return { backupPath };\n });\n\n this.server.post('/local/restore', async request => {\n const { backupPath } = request.body as { backupPath: string };\n await this.restore(backupPath);\n return { message: 'Data restored successfully' };\n });\n\n this.server.post('/local/seed', async () => {\n await this.seed();\n return { message: 'Sample data seeded successfully' };\n });\n\n // V2 Bundle API endpoints\n this.server.get('/api/v2/bundles', async (request, reply) => {\n const query = request.query as {\n package?: string;\n version?: string;\n developer?: string;\n };\n\n const { package: pkg, version, developer } = query;\n\n // If specific package and version requested, return single bundle\n if (pkg && version) {\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n if (!manifest) {\n return reply.code(404).send({\n error: 'bundle_not_found',\n message: `Bundle ${pkg}@${version} not found`,\n });\n }\n return [manifest];\n }\n\n // Get all bundles\n const allBundles = this.dataStore.getAllBundles();\n const bundles = [];\n\n for (const bundle of allBundles) {\n // Filter by package if specified\n if (pkg && bundle.package !== pkg) {\n continue;\n }\n\n // Filter by developer pubkey if specified\n if (developer) {\n const bundlePubkey = bundle.signature?.pubkey;\n if (!bundlePubkey || bundlePubkey !== developer) {\n continue;\n }\n }\n\n bundles.push(bundle);\n }\n\n // Sort by package name, then by version (descending)\n bundles.sort((a, b) => {\n const pkgCompare = a.package.localeCompare(b.package);\n if (pkgCompare !== 0) return pkgCompare;\n // For same package, sort by version descending\n return b.appVersion.localeCompare(a.appVersion, undefined, {\n numeric: true,\n });\n });\n\n // If filtering by package, return all versions\n // Otherwise, return only latest version per package\n if (pkg) {\n return bundles;\n }\n\n // Group by package and return only latest version\n const latestByPackage = new Map<string, BundleManifest>();\n for (const bundle of bundles) {\n const existing = latestByPackage.get(bundle.package);\n if (!existing || bundle.appVersion > existing.appVersion) {\n latestByPackage.set(bundle.package, bundle);\n }\n }\n\n return Array.from(latestByPackage.values());\n });\n\n this.server.get(\n '/api/v2/bundles/:package/:version',\n async (request, reply) => {\n const { package: pkg, version } = request.params as {\n package: string;\n version: string;\n };\n\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n\n if (!manifest) {\n return reply.code(404).send({\n error: 'manifest_not_found',\n message: `Manifest not found for ${pkg}@${version}`,\n });\n }\n\n return manifest;\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { LocalRegistryServer } from '../lib/local-server.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport fs from 'fs';\n\nconst localCommand = new Command('local').description(\n 'Manage local registry for development'\n);\n\n// Start local registry\nlocalCommand.addCommand(\n new Command('start')\n .description('Start local registry server')\n .option('-p, --port <port>', 'Port to run the server on', '8082')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option(\n '--public-host <host>',\n 'Public host exposed in manifest artifact URLs',\n 'host.docker.internal'\n )\n .action(async options => {\n const spinner = ora('Starting local registry...').start();\n\n try {\n const config = new LocalConfig();\n config.setHost(options.host);\n config.setPublicHost(options.publicHost);\n config.setPort(parseInt(options.port, 10));\n const server = new LocalRegistryServer(config);\n\n await server.start(parseInt(options.port));\n\n spinner.succeed(\n `Local registry started on http://${config.getHost()}:${config.getPort()}`\n );\n console.log(chalk.blue('\\n📱 Local Registry Status:'));\n console.log(\n chalk.green(\n `✅ Server: http://${config.getHost()}:${config.getPort()}`\n )\n );\n console.log(\n chalk.green(\n `🌐 Public URL: http://${config.getPublicHost()}:${config.getPort()}`\n )\n );\n console.log(chalk.green(`📁 Data: ${config.getDataDir()}`));\n console.log(\n chalk.green(\n `📋 Health: http://${config.getHost()}:${config.getPort()}/healthz`\n )\n );\n console.log(\n chalk.green(\n `📊 Stats: http://${config.getHost()}:${config.getPort()}/stats`\n )\n );\n console.log(\n chalk.blue(\n '\\n💡 Use --local flag with other commands to use local registry'\n )\n );\n } catch (error) {\n spinner.fail('Failed to start local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Stop local registry\nlocalCommand.addCommand(\n new Command('stop')\n .description('Stop local registry server')\n .action(async () => {\n const spinner = ora('Stopping local registry...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.stop();\n\n spinner.succeed('Local registry stopped');\n } catch (error) {\n spinner.fail('Failed to stop local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Status check\nlocalCommand.addCommand(\n new Command('status')\n .description('Check local registry status')\n .action(async () => {\n const spinner = ora('Checking local registry status...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const status = await server.getStatus();\n\n if (status.running) {\n spinner.succeed('Local registry is running');\n console.log(chalk.green(`✅ Server: ${status.url}`));\n console.log(chalk.green(`📁 Data: ${status.dataDir}`));\n console.log(chalk.green(`📊 Apps: ${status.appsCount} applications`));\n console.log(\n chalk.green(`📦 Artifacts: ${status.artifactsCount} artifacts`)\n );\n } else {\n spinner.warn('Local registry is not running');\n console.log(\n chalk.yellow(\n '💡 Run \"calimero-registry local start\" to start the local registry'\n )\n );\n }\n } catch (error) {\n spinner.fail('Failed to check local registry status');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Reset local data\nlocalCommand.addCommand(\n new Command('reset')\n .description('Reset local registry data')\n .option('-f, --force', 'Force reset without confirmation')\n .action(async options => {\n if (!options.force) {\n console.log(\n chalk.yellow('⚠️ This will delete all local registry data!')\n );\n console.log(chalk.yellow(' Use --force flag to confirm'));\n return;\n }\n\n const spinner = ora('Resetting local registry data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.reset();\n\n spinner.succeed('Local registry data reset');\n console.log(chalk.green('✅ All local data has been cleared'));\n } catch (error) {\n spinner.fail('Failed to reset local registry data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Backup local data\nlocalCommand.addCommand(\n new Command('backup')\n .description('Backup local registry data')\n .option('-o, --output <file>', 'Output file path')\n .action(async options => {\n const spinner = ora('Creating backup...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const backupPath = await server.backup(options.output);\n\n spinner.succeed('Backup created successfully');\n console.log(chalk.green(`📦 Backup saved to: ${backupPath}`));\n } catch (error) {\n spinner.fail('Failed to create backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Restore from backup\nlocalCommand.addCommand(\n new Command('restore')\n .description('Restore local registry data from backup')\n .argument('<backup-file>', 'Path to backup file')\n .action(async backupFile => {\n const spinner = ora('Restoring from backup...').start();\n\n try {\n if (!fs.existsSync(backupFile)) {\n spinner.fail('Backup file not found');\n console.error(chalk.red(`File not found: ${backupFile}`));\n process.exit(1);\n }\n\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.restore(backupFile);\n\n spinner.succeed('Data restored successfully');\n console.log(chalk.green(`✅ Restored from: ${backupFile}`));\n } catch (error) {\n spinner.fail('Failed to restore from backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Seed with sample data\nlocalCommand.addCommand(\n new Command('seed')\n .description('Seed local registry with sample data')\n .action(async () => {\n const spinner = ora('Seeding local registry with sample data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.seed();\n\n spinner.succeed('Sample data seeded successfully');\n console.log(\n chalk.green('✅ Local registry populated with sample applications')\n );\n console.log(\n chalk.blue(\n '💡 Run \"calimero-registry bundle get com.calimero.sample-bundle 1.0.0 --local\" to see the sample bundle'\n )\n );\n } catch (error) {\n spinner.fail('Failed to seed sample data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\nexport { localCommand };\n","/**\n * Multi-service bundle helpers.\n *\n * A bundle always has a MAIN application (manifest.wasm / manifest.abi, packed\n * as `app.wasm` / `abi.json`). A multi-service bundle additionally ships one or\n * more named SERVICE WASMs alongside the main app — e.g. a \"tictactoe\" main app\n * with a \"lobby\" matchmaking service. Service artifacts are packed under\n * `services/<name>.wasm` (+ optional `services/<name>.abi.json`).\n *\n * These helpers are pure (no I/O) so they can be unit-tested in isolation; the\n * `bundle` command wires them to the filesystem.\n */\n\nimport type { BundleManifest } from './local-storage.js';\n\n/** Source-file references for a service, as authored on the CLI or in a manifest config file. */\nexport interface ServiceSource {\n name: string;\n wasm: string; // path to the service WASM file\n abi?: string; // optional path to the service ABI JSON file\n}\n\n/**\n * Service names must be filesystem-safe and collision-free with the main\n * `app.wasm`.\n *\n * NOTE: this regex and the rules in {@link validateServiceName} (≤64 chars,\n * not \"app\") are mirrored backend-side in\n * packages/backend/src/lib/bundle-storage-kv.js (storeBundleManifest). They are\n * not shared at the module level (ESM/TS CLI vs CJS backend), so any change\n * here must be reflected there and vice versa.\n */\nconst SERVICE_NAME_RE = /^[a-z0-9][a-z0-9_-]*$/;\n\n/**\n * Validate a service name. Names become path segments (`services/<name>.wasm`),\n * so they must be lowercase, free of separators, and not the reserved main name.\n * @throws Error on an invalid name.\n */\nexport function validateServiceName(name: string): void {\n // Guard the runtime type: `name` is typed string, but it often comes from\n // parsed manifest JSON, where it could be a number/boolean/etc. Without this,\n // `RegExp.test(123)` would coerce to \"123\" and pass, and a numeric 123 would\n // be treated as distinct from the string \"123\" by the uniqueness check while\n // colliding on the same `services/123.wasm` path.\n if (typeof name !== 'string' || !SERVICE_NAME_RE.test(name)) {\n throw new Error(\n `Invalid service name \"${name}\". Use lowercase letters, digits, \"-\" or \"_\" (must start alphanumeric).`\n );\n }\n // Bound the length so it can't blow past filesystem path-component limits\n // (most systems cap a component at 255 bytes; \"<name>.abi.json\" adds 9).\n if (name.length > 64) {\n throw new Error(\n `Invalid service name \"${name}\": must be at most 64 characters.`\n );\n }\n if (name === 'app') {\n throw new Error(\n 'Service name \"app\" is reserved for the main application. Choose another name.'\n );\n }\n}\n\n/**\n * Parse a `--service` CLI spec of the form:\n * `name=path/to.wasm`\n * `name=path/to.wasm,abi=path/to-abi.json`\n *\n * The ABI segment is optional. Whitespace around tokens is trimmed.\n * @throws Error on a malformed spec.\n */\nexport function parseServiceSpec(spec: string): ServiceSource {\n const eq = spec.indexOf('=');\n if (eq === -1) {\n throw new Error(\n `Invalid --service \"${spec}\". Expected \"name=path.wasm\" or \"name=path.wasm,abi=path.json\".`\n );\n }\n const name = spec.slice(0, eq).trim();\n let rest = spec.slice(eq + 1).trim();\n\n let abi: string | undefined;\n // Optional \",abi=<path>\" tail, tolerant of whitespace around the separator.\n // The abi value may not contain a comma ([^,]*), so a stray second \",abi=\"\n // leaves a comma in the WASM path and is caught by the check below. The `*`\n // (not `+`) still matches an empty value so it reports \"empty abi path\".\n const abiMatch = rest.match(/,\\s*abi\\s*=\\s*([^,]*)$/);\n if (abiMatch) {\n abi = abiMatch[1].trim();\n rest = rest.slice(0, abiMatch.index).trim();\n if (!abi) {\n throw new Error(`Invalid --service \"${spec}\": empty abi path.`);\n }\n }\n\n const wasm = rest;\n if (!wasm) {\n throw new Error(`Invalid --service \"${spec}\": missing WASM path.`);\n }\n // A comma here means either a comma in the WASM path (unsupported — it would\n // be silently truncated) or a malformed abi tail (e.g. \",ab=\" / \",abi\"). Fail\n // loudly rather than packing the wrong file.\n if (wasm.includes(',')) {\n throw new Error(\n `Invalid --service \"${spec}\": unexpected comma in WASM path. Use \"name=path.wasm,abi=path.json\"; commas in paths are not supported.`\n );\n }\n\n validateServiceName(name);\n return abi ? { name, wasm, abi } : { name, wasm };\n}\n\n/** The in-bundle artifact path for a service's WASM (e.g. \"services/lobby.wasm\"). */\nexport function serviceWasmPath(name: string): string {\n return `services/${name}.wasm`;\n}\n\n/** The in-bundle artifact path for a service's ABI (e.g. \"services/lobby.abi.json\"). */\nexport function serviceAbiPath(name: string): string {\n return `services/${name}.abi.json`;\n}\n\n/**\n * True if a service artifact path lives under the `services/` directory (the\n * layout {@link serviceWasmPath}/{@link serviceAbiPath} emit). Service\n * artifacts must stay under `services/` so they can't collide with the main\n * app's top-level `app.wasm` / `abi.json`. Mirrors the backend's\n * `underServicesDir` (packages/backend/src/lib/bundle-storage-kv.js) — keep the\n * two in sync.\n */\nexport function isUnderServicesDir(p: string): boolean {\n return typeof p === 'string' && /^services[\\\\/]/.test(p);\n}\n\n/**\n * Reject duplicate service names across the merged set (CLI + manifest config).\n * @throws Error listing the first duplicate found.\n */\nexport function assertUniqueServiceNames(services: ServiceSource[]): void {\n const seen = new Set<string>();\n for (const s of services) {\n if (seen.has(s.name)) {\n throw new Error(`Duplicate service name \"${s.name}\".`);\n }\n seen.add(s.name);\n }\n}\n\n/**\n * Reject an archive path that isn't a safe, bundle-relative path. A `.mpk`\n * unpacked from an untrusted source (or a hand-crafted manifest) could carry a\n * `path` like `/etc/passwd` or `../../x`; packing such a path would read files\n * from outside the bundle directory. Paths must be relative, non-empty, and\n * free of any `.` or `..` segment (checked against both separators for\n * cross-platform safety). Our generated paths (`app.wasm`, `abi.json`,\n * `services/<name>.wasm`) never contain a dot *segment*, so rejecting them is\n * safe and keeps the guard strict.\n * @throws Error on an unsafe path.\n */\nexport function assertSafeBundlePath(p: string): void {\n const segments = p.split(/[\\\\/]/);\n if (\n !p ||\n p.startsWith('/') ||\n /^[a-zA-Z]:/.test(p) ||\n segments.includes('..') ||\n segments.includes('.') ||\n segments.includes('')\n ) {\n throw new Error(\n `Unsafe bundle path \"${p}\": must be a non-empty relative path with no \".\" or \"..\" segments.`\n );\n }\n}\n\n/**\n * Collect the list of files (relative to the bundle directory) that a manifest\n * references and that must therefore be packed into the `.mpk`. Always includes\n * `manifest.json` and the main `wasm.path`; includes the main `abi.path` and\n * each service's `wasm.path` / `abi.path` when present.\n *\n * Every referenced path is checked with {@link assertSafeBundlePath} so a\n * crafted manifest can't pull files from outside the bundle directory.\n *\n * Throws if a declared service has no `wasm.path` — packing must not silently\n * drop a service that the manifest advertises. (Callers like `bundle push`\n * also guard this earlier with a friendlier message.)\n *\n * Used by `bundle push` when packing a directory so service WASMs are not\n * silently dropped from the archive.\n */\nexport function collectBundleFiles(manifest: BundleManifest): string[] {\n const files = ['manifest.json'];\n if (manifest.wasm?.path) files.push(manifest.wasm.path);\n if (manifest.abi?.path) files.push(manifest.abi.path);\n for (const svc of manifest.services ?? []) {\n const label = svc?.name ?? '<unnamed>';\n if (!svc.wasm?.path) {\n throw new Error(\n `Service \"${label}\" has no wasm.path; cannot pack the bundle.`\n );\n }\n // Service artifacts must live under services/ (matches the backend's\n // storeBundleManifest check), so packing fails fast locally instead of\n // succeeding here and being rejected by the registry after upload.\n if (!isUnderServicesDir(svc.wasm.path)) {\n throw new Error(\n `Service \"${label}\" wasm.path \"${svc.wasm.path}\" must be under services/.`\n );\n }\n files.push(svc.wasm.path);\n if (svc.abi?.path) {\n if (!isUnderServicesDir(svc.abi.path)) {\n throw new Error(\n `Service \"${label}\" abi.path \"${svc.abi.path}\" must be under services/.`\n );\n }\n files.push(svc.abi.path);\n }\n }\n files.forEach(assertSafeBundlePath);\n // De-dupe while preserving order (a malformed manifest could repeat a path).\n return [...new Set(files)];\n}\n","/**\n * Bundle Management Commands\n *\n * Implements:\n * - bundle push <file.mpk>\n * - bundle get <package> <version>\n */\n\nimport { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport * as tar from 'tar';\nimport crypto from 'crypto';\nimport {\n LocalDataStore,\n BundleManifest,\n BundleServiceEntry,\n} from '../lib/local-storage.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport { LocalArtifactServer } from '../lib/local-artifacts.js';\nimport { RemoteConfig } from '../lib/remote-config.js';\nimport {\n ServiceSource,\n parseServiceSpec,\n validateServiceName,\n serviceWasmPath,\n serviceAbiPath,\n assertUniqueServiceNames,\n collectBundleFiles,\n} from '../lib/services.js';\n\ninterface BundlePushPayload {\n version: string;\n package: string;\n appVersion: string;\n _binary: string;\n _overwrite: boolean;\n metadata?: BundleManifest['metadata'];\n interfaces?: BundleManifest['interfaces'];\n wasm?: BundleManifest['wasm'];\n abi?: BundleManifest['abi'];\n services?: BundleManifest['services'];\n migrations?: BundleManifest['migrations'];\n links?: BundleManifest['links'];\n signature?: BundleManifest['signature'];\n signerId?: string;\n minRuntimeVersion?: string;\n}\n\ninterface ApiResponseBody {\n message?: string;\n error?: string;\n package?: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport const bundleCommand = new Command('bundle')\n .description('Manage application bundles (V2)')\n .addCommand(createCreateCommand())\n .addCommand(createPushCommand())\n .addCommand(createGetCommand())\n .addCommand(createEditCommand());\n\ninterface BundleManifestConfig {\n package?: string;\n version?: string;\n output?: string;\n name?: string;\n description?: string;\n author?: string;\n frontend?: string;\n github?: string;\n docs?: string;\n exports?: string[];\n uses?: string[];\n abi?: string | BundleManifest['abi']; // Can be file path string or BundleArtifact object\n /** Additional services, each referencing source file paths (relative to this manifest). */\n services?: ServiceSource[];\n}\n\nfunction createCreateCommand(): Command {\n return new Command('create')\n .description('Create an MPK bundle from a WASM file')\n .argument('<wasm-file>', 'Path to the WASM file')\n .argument('[package]', 'Package name (e.g. com.calimero.myapp)')\n .argument('[version]', 'Version (e.g. 1.0.0)')\n .option(\n '-m, --manifest <path>',\n 'Path to manifest JSON file (can contain package, version, and other options)'\n )\n .option('-o, --output <path>', 'Output path for the MPK file')\n .option('--name <name>', 'Application name')\n .option('--description <description>', 'Application description')\n .option('--author <author>', 'Application author')\n .option('--frontend <url>', 'Frontend URL')\n .option('--github <url>', 'GitHub URL')\n .option('--docs <url>', 'Documentation URL')\n .option(\n '--export <interface>',\n 'Export interface (can be specified multiple times)',\n (value: string, prev: string[] = []) => {\n return [...prev, value];\n }\n )\n .option(\n '--use <interface>',\n 'Use interface (can be specified multiple times)',\n (value: string, prev: string[] = []) => {\n return [...prev, value];\n }\n )\n .option('--abi <path>', 'Path to ABI JSON file to include in bundle')\n .option(\n '--service <spec>',\n 'Add a service WASM alongside the main app: \"name=path.wasm\" or \"name=path.wasm,abi=path.json\" (repeatable)',\n (value, prev: ServiceSource[]) => {\n return [...(prev || []), parseServiceSpec(value)];\n }\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json -o output.mpk\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --name \"My App\" --frontend https://app.example.com\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --abi abi.json\n $ calimero-registry bundle create app.wasm --manifest manifest.json --abi res/abi.json\n $ calimero-registry bundle create tictactoe.wasm com.calimero.ttt 1.0.0 --service lobby=lobby.wasm,abi=lobby-abi.json\n\nManifest File Format (JSON):\n {\n \"package\": \"com.calimero.myapp\",\n \"version\": \"1.0.0\",\n \"output\": \"./dist/myapp.mpk\",\n \"name\": \"My Application\",\n \"description\": \"Application description\",\n \"author\": \"Calimero Team\",\n \"frontend\": \"https://app.example.com\",\n \"github\": \"https://github.com/user/repo\",\n \"docs\": \"https://docs.example.com\",\n \"exports\": [\"interface1\", \"interface2\"],\n \"uses\": [\"interface3\"],\n \"abi\": \"res/abi.json\",\n \"services\": [\n { \"name\": \"lobby\", \"wasm\": \"res/lobby.wasm\", \"abi\": \"res/lobby-abi.json\" }\n ]\n }\n\nNote:\n - Package and version can be provided via arguments, manifest file, or both\n - CLI arguments take precedence over manifest file values\n - If using manifest file, package and version can be omitted from command line\n - The -o/--output option overrides manifest.output if both are provided\n - ABI can be provided via --abi flag or manifest.abi field (file path string)\n - ABI file will be included in the bundle and referenced in the manifest\n - The main app is always packed as app.wasm; services are packed under services/<name>.wasm\n - Services merge from --service flags and manifest.services; names must be unique\n`\n )\n .action(async (wasmFile, pkg, version, options) => {\n try {\n // Read manifest file if provided\n let manifestConfig: BundleManifestConfig = {};\n if (options.manifest) {\n const manifestPath = path.resolve(options.manifest);\n if (!fs.existsSync(manifestPath)) {\n console.error(`❌ Manifest file not found: ${options.manifest}`);\n process.exit(1);\n }\n try {\n const manifestContent = fs.readFileSync(manifestPath, 'utf8');\n const parsed = JSON.parse(manifestContent);\n\n // Validate that parsed JSON is an object\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n console.error(`❌ Invalid manifest file: ${options.manifest}`);\n console.error(' Manifest must be a JSON object');\n process.exit(1);\n }\n\n manifestConfig = parsed as BundleManifestConfig;\n } catch (error) {\n console.error(\n `❌ Failed to parse manifest file: ${options.manifest}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n }\n\n // Merge manifest with CLI options (CLI takes precedence)\n const finalPackage = pkg || manifestConfig.package;\n const finalVersion = version || manifestConfig.version;\n const finalOutput = options.output || manifestConfig.output;\n const finalName = options.name || manifestConfig.name;\n const finalDescription =\n options.description || manifestConfig.description;\n const finalAuthor =\n options.author || manifestConfig.author || 'Calimero Team';\n const finalFrontend = options.frontend || manifestConfig.frontend;\n const finalGithub = options.github || manifestConfig.github;\n const finalDocs = options.docs || manifestConfig.docs;\n\n // Validate and extract array options (CLI takes precedence - if CLI provides values, use only those)\n const manifestExports = manifestConfig.exports;\n const manifestUses = manifestConfig.uses;\n\n // Validate manifest array fields are actually arrays\n if (manifestExports !== undefined && !Array.isArray(manifestExports)) {\n console.error('❌ Invalid manifest: \"exports\" must be an array');\n process.exit(1);\n }\n if (manifestUses !== undefined && !Array.isArray(manifestUses)) {\n console.error('❌ Invalid manifest: \"uses\" must be an array');\n process.exit(1);\n }\n if (\n manifestConfig.services !== undefined &&\n !Array.isArray(manifestConfig.services)\n ) {\n console.error('❌ Invalid manifest: \"services\" must be an array');\n process.exit(1);\n }\n\n // CLI options take precedence - if CLI provides exports/uses, use only those\n const finalExports =\n options.export && options.export.length > 0\n ? options.export\n : manifestExports || [];\n const finalUses =\n options.use && options.use.length > 0\n ? options.use\n : manifestUses || [];\n\n // Validate required parameters\n if (!wasmFile) {\n console.error('❌ WASM file is required');\n process.exit(1);\n }\n\n if (!finalPackage) {\n console.error(\n '❌ Package name is required (provide via argument, --manifest file, or manifest.package)'\n );\n process.exit(1);\n }\n\n if (!finalVersion) {\n console.error(\n '❌ Version is required (provide via argument, --manifest file, or manifest.version)'\n );\n process.exit(1);\n }\n\n // Validate package name format (basic validation)\n // Allow hyphens consistently in all segments: com.calimero.my-app, com.my-org.app, etc.\n if (!/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/.test(finalPackage)) {\n console.error(\n '❌ Invalid package name format. Expected format: com.calimero.myapp or com.my-org.my-app'\n );\n process.exit(1);\n }\n\n // Validate version format (semver-like)\n // Allow dots and hyphens in prerelease and build metadata: 1.0.0-alpha.1, 1.0.0-rc.2+build.1\n if (\n !/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.-]+)?(\\+[a-z0-9.-]+)?$/i.test(finalVersion)\n ) {\n console.error(\n '❌ Invalid version format. Expected format: 1.0.0, 1.0.0-alpha, or 1.0.0-alpha.1'\n );\n process.exit(1);\n }\n\n const wasmPath = path.resolve(wasmFile);\n if (!fs.existsSync(wasmPath)) {\n console.error(`❌ WASM file not found: ${wasmFile}`);\n process.exit(1);\n }\n\n console.log(`📦 Creating MPK bundle from: ${path.basename(wasmPath)}`);\n\n // Read WASM file\n const wasmContent = fs.readFileSync(wasmPath);\n const wasmSize = wasmContent.length;\n\n // Calculate SHA256 hash\n const wasmHash = crypto\n .createHash('sha256')\n .update(wasmContent)\n .digest('hex');\n\n // Handle ABI file (CLI option takes precedence over manifest)\n let abiArtifact: BundleManifest['abi'] = undefined;\n let abiContent: Buffer | null = null;\n const abiPathFromOption = options.abi;\n const abiPathFromManifest =\n typeof manifestConfig.abi === 'string' ? manifestConfig.abi : null;\n\n // Determine ABI file path (CLI option takes precedence)\n const abiFilePath = abiPathFromOption || abiPathFromManifest;\n\n if (abiFilePath) {\n // Resolve ABI file path:\n // - CLI option (--abi) is always relative to cwd (consistent with WASM file handling)\n // - Manifest abi field is relative to manifest file directory\n const abiResolvedPath = abiPathFromOption\n ? path.resolve(abiFilePath) // CLI option: always resolve relative to cwd\n : options.manifest && abiPathFromManifest\n ? path.resolve(\n path.dirname(path.resolve(options.manifest)),\n abiFilePath\n ) // Manifest field: resolve relative to manifest directory\n : path.resolve(abiFilePath); // Fallback: resolve relative to cwd\n\n if (!fs.existsSync(abiResolvedPath)) {\n console.error(`❌ ABI file not found: ${abiFilePath}`);\n console.error(` Resolved path: ${abiResolvedPath}`);\n process.exit(1);\n }\n\n // Read ABI file\n try {\n abiContent = fs.readFileSync(abiResolvedPath);\n // Validate it's valid JSON\n JSON.parse(abiContent.toString('utf8'));\n\n // Calculate ABI hash\n const abiHash = crypto\n .createHash('sha256')\n .update(abiContent)\n .digest('hex');\n\n // Create ABI artifact\n abiArtifact = {\n path: 'abi.json',\n hash: abiHash,\n size: abiContent.length,\n };\n console.log(\n ` Including ABI file: ${path.basename(abiResolvedPath)}`\n );\n } catch (error) {\n console.error(\n `❌ Failed to read or parse ABI file: ${abiFilePath}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n } else if (\n manifestConfig.abi &&\n typeof manifestConfig.abi === 'object'\n ) {\n // If manifest provides ABI as an object (BundleArtifact), we need the actual file\n // to include in the bundle. The object only contains metadata (path, hash, size)\n // but not the source file location. Since we're in this branch, options.abi is falsy\n // (otherwise we'd be in the first if branch), so we can't include the file.\n console.error(\n '❌ Manifest provides ABI as object, but --abi flag is required to include the ABI file in bundle'\n );\n console.error(\n ' Provide the ABI file path with --abi flag, or change manifest.abi to a file path string'\n );\n process.exit(1);\n }\n\n // Handle services (additional WASMs alongside the main app).\n // Sources come from --service flags (paths relative to cwd) and/or the\n // manifest's \"services\" array (paths relative to the manifest file).\n const cliServices: ServiceSource[] = options.service || [];\n const manifestServices: ServiceSource[] = Array.isArray(\n manifestConfig.services\n )\n ? manifestConfig.services\n : [];\n const manifestDir = options.manifest\n ? path.dirname(path.resolve(options.manifest))\n : process.cwd();\n\n const allServiceSources: { src: ServiceSource; baseDir: string }[] = [\n ...cliServices.map(src => ({ src, baseDir: process.cwd() })),\n ...manifestServices.map(src => ({ src, baseDir: manifestDir })),\n ];\n\n const serviceArtifacts: BundleServiceEntry[] = [];\n // Relative archive path -> file content, written into outputDir below.\n const serviceFilesToWrite: { relPath: string; content: Buffer }[] = [];\n\n // Validate every service name BEFORE checking uniqueness, so a bad name\n // reports a name error rather than a misleading \"duplicate\" one. CLI\n // entries were already validated in parseServiceSpec; re-checking is\n // harmless and also covers manifest entries (which skip that path).\n for (const { src } of allServiceSources) {\n try {\n validateServiceName(src.name);\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n }\n\n // Then reject duplicate names (covers --service + manifest overlap).\n try {\n assertUniqueServiceNames(allServiceSources.map(s => s.src));\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n\n for (const { src, baseDir } of allServiceSources) {\n // Guard runtime types: manifest-config entries are parsed JSON, so\n // `wasm`/`abi` could be objects (e.g. a BundleArtifact copied from a\n // built manifest) rather than file-path strings. Without this,\n // path.resolve would coerce an object to \"[object Object]\" and yield\n // a misleading \"not found\" error.\n if (typeof src.wasm !== 'string' || src.wasm.length === 0) {\n console.error(\n `❌ Service \"${src.name}\" wasm must be a file path string.`\n );\n process.exit(1);\n }\n if (\n src.abi !== undefined &&\n (typeof src.abi !== 'string' || src.abi.length === 0)\n ) {\n console.error(\n `❌ Service \"${src.name}\" abi must be a file path string.`\n );\n process.exit(1);\n }\n\n // Resolve + read the service WASM.\n const svcWasmPath = path.resolve(baseDir, src.wasm);\n if (!fs.existsSync(svcWasmPath)) {\n console.error(\n `❌ Service \"${src.name}\" WASM not found: ${src.wasm}`\n );\n console.error(` Resolved path: ${svcWasmPath}`);\n process.exit(1);\n }\n const svcWasmContent = fs.readFileSync(svcWasmPath);\n const svcWasmHash = crypto\n .createHash('sha256')\n .update(svcWasmContent)\n .digest('hex');\n const wasmArchivePath = serviceWasmPath(src.name);\n\n const entry: BundleServiceEntry = {\n name: src.name,\n wasm: {\n path: wasmArchivePath,\n hash: svcWasmHash,\n size: svcWasmContent.length,\n },\n };\n serviceFilesToWrite.push({\n relPath: wasmArchivePath,\n content: svcWasmContent,\n });\n\n // Resolve + read the optional service ABI.\n if (src.abi) {\n const svcAbiPath = path.resolve(baseDir, src.abi);\n if (!fs.existsSync(svcAbiPath)) {\n console.error(\n `❌ Service \"${src.name}\" ABI not found: ${src.abi}`\n );\n console.error(` Resolved path: ${svcAbiPath}`);\n process.exit(1);\n }\n const svcAbiContent = fs.readFileSync(svcAbiPath);\n try {\n JSON.parse(svcAbiContent.toString('utf8'));\n } catch (error) {\n console.error(\n `❌ Service \"${src.name}\" ABI is not valid JSON: ${src.abi}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n const svcAbiHash = crypto\n .createHash('sha256')\n .update(svcAbiContent)\n .digest('hex');\n const abiArchivePath = serviceAbiPath(src.name);\n entry.abi = {\n path: abiArchivePath,\n hash: svcAbiHash,\n size: svcAbiContent.length,\n };\n serviceFilesToWrite.push({\n relPath: abiArchivePath,\n content: svcAbiContent,\n });\n }\n\n serviceArtifacts.push(entry);\n console.log(\n ` Including service: ${src.name} (${path.basename(svcWasmPath)})`\n );\n }\n\n // Build metadata\n const metadata: {\n name: string;\n description: string;\n author: string;\n } = {\n name: finalName || finalPackage,\n description: finalDescription || '',\n author: finalAuthor,\n };\n\n // Build links if provided\n const links: {\n frontend?: string;\n github?: string;\n docs?: string;\n } = {};\n if (finalFrontend) links.frontend = finalFrontend;\n if (finalGithub) links.github = finalGithub;\n if (finalDocs) links.docs = finalDocs;\n\n // Build interfaces\n const interfaces = {\n exports: finalExports,\n uses: finalUses,\n };\n\n // Create bundle manifest\n const manifest: BundleManifest = {\n version: '1.0',\n package: finalPackage,\n appVersion: finalVersion,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n interfaces:\n interfaces.exports.length > 0 || interfaces.uses.length > 0\n ? interfaces\n : undefined,\n wasm: {\n path: 'app.wasm',\n hash: wasmHash,\n size: wasmSize,\n },\n abi: abiArtifact || undefined,\n services: serviceArtifacts.length > 0 ? serviceArtifacts : undefined,\n migrations: [],\n links: Object.keys(links).length > 0 ? links : undefined,\n signature: undefined,\n };\n\n // Determine output directory\n let outputDir = finalOutput\n ? path.resolve(finalOutput)\n : path.join(process.cwd(), finalPackage, finalVersion);\n\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write manifest.json\n fs.writeFileSync(\n path.join(outputDir, 'manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Copy WASM file as app.wasm\n fs.writeFileSync(path.join(outputDir, 'app.wasm'), wasmContent);\n\n // Copy ABI file if provided\n if (abiContent) {\n fs.writeFileSync(path.join(outputDir, 'abi.json'), abiContent);\n }\n\n // Copy service files (under services/) preserving their archive paths.\n // Assert each destination stays inside outputDir/services/ — defence in\n // depth against a crafted name escaping the directory (e.g. \"../app\"),\n // independent of validateServiceName. Uses path.relative so the check\n // is correct regardless of OS path separator.\n const servicesDir = path.join(outputDir, 'services');\n for (const { relPath, content } of serviceFilesToWrite) {\n const dest = path.join(outputDir, relPath);\n const rel = path.relative(servicesDir, dest);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n console.error(\n `❌ Refusing to write service file outside services/: ${relPath}`\n );\n process.exit(1);\n }\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.writeFileSync(dest, content);\n }\n\n console.log(`✅ Bundle files written to: ${outputDir}`);\n console.log(` Package: ${finalPackage}`);\n console.log(` Version: ${finalVersion}`);\n console.log(` WASM Hash: ${wasmHash}`);\n if (abiArtifact) {\n console.log(` ABI Hash: ${abiArtifact.hash}`);\n }\n if (serviceArtifacts.length > 0) {\n console.log(\n ` Services: ${serviceArtifacts.map(s => s.name).join(', ')}`\n );\n }\n console.log('');\n console.log('Next steps:');\n console.log(\n ` 1. Sign the manifest: mero-sign sign ${path.join(outputDir, 'manifest.json')} --key key.json`\n );\n console.log(\n ` 2. Push the bundle: calimero-registry bundle push ${outputDir} --remote`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n console.error('❌ Failed to create bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createPushCommand(): Command {\n return new Command('push')\n .description(\n 'Push a bundle (.mpk) to the registry (local or remote). Defaults to local registry.'\n )\n .argument('<bundle-file>', 'Path to the .mpk bundle file')\n .option('--local', 'Push to local registry instance (default)')\n .option('--remote', 'Push to remote registry instance')\n .option(\n '--url <registry-url>',\n 'Registry URL for remote push (overrides config file)'\n )\n .option(\n '--api-key <key>',\n 'API key for authentication (overrides config file and env var)'\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle push bundle.mpk --local\n $ calimero-registry bundle push bundle.mpk --remote\n $ calimero-registry bundle push bundle.mpk --remote --url https://apps.calimero.network\n $ calimero-registry bundle push bundle.mpk --remote --api-key your-api-key\n\nConfiguration:\n Set defaults using the config command:\n $ calimero-registry config set registry-url https://apps.calimero.network\n $ calimero-registry config set api-key your-api-key\n \n Or use environment variables:\n $ export CALIMERO_REGISTRY_URL=https://apps.calimero.network\n $ export CALIMERO_API_KEY=your-api-key\n\nNote:\n - Use --local for development/testing with local registry\n - Use --remote for production deployments\n - Config file values are used unless overridden by flags or environment variables\n - Priority: flag > environment variable > config file > default\n`\n )\n .action(async (bundleFile, options) => {\n let mpkPath: string;\n let tempMpk: string | null = null;\n try {\n // Warn if remote-only options are used without --remote\n if (!options.remote && (options.url || options.apiKey)) {\n console.warn(\n '⚠️ Warning: --url and --api-key are only used with --remote flag'\n );\n console.warn(\n ' These options will be ignored. Use --remote to push to remote registry.'\n );\n }\n\n // Determine mode: default to local if neither flag is set\n // Handle explicit false from --no-local flag\n const useLocal =\n options.local === false\n ? false\n : options.local === true\n ? true\n : !options.remote;\n const useRemote = options.remote === true;\n\n // Ensure mutually exclusive flags\n if (options.local && options.remote) {\n console.error('❌ Cannot use both --local and --remote flags');\n process.exit(1);\n }\n\n // Ensure at least one mode is selected\n if (!useLocal && !useRemote) {\n console.error(\n '❌ No push mode specified. Use --local or --remote flag'\n );\n process.exit(1);\n }\n\n const fullPath = path.resolve(bundleFile);\n if (!fs.existsSync(fullPath)) {\n console.error(`❌ File not found: ${bundleFile}`);\n process.exit(1);\n }\n\n // If a directory is given, pack it into a temp .mpk first\n mpkPath = fullPath;\n\n if (fs.statSync(fullPath).isDirectory()) {\n const manifestInDir = path.join(fullPath, 'manifest.json');\n const wasmInDir = path.join(fullPath, 'app.wasm');\n if (!fs.existsSync(manifestInDir)) {\n console.error(\n `❌ manifest.json not found in directory: ${fullPath}`\n );\n process.exit(1);\n }\n if (!fs.existsSync(wasmInDir)) {\n console.error(`❌ app.wasm not found in directory: ${fullPath}`);\n process.exit(1);\n }\n tempMpk = path.join(fullPath, `.temp-push-${Date.now()}.mpk`);\n\n // Derive the file list from the manifest so service WASMs (and any\n // ABIs) are packed, not just the main app. manifest.json is required\n // and was verified above, so a parse failure is a hard error — never\n // fall back silently, which would drop service files from the archive\n // while still reporting success.\n let dirManifest: BundleManifest;\n try {\n dirManifest = JSON.parse(\n fs.readFileSync(manifestInDir, 'utf8')\n ) as BundleManifest;\n } catch (e) {\n console.error(\n `❌ Failed to parse manifest.json in ${fullPath}: ${\n e instanceof Error ? e.message : String(e)\n }`\n );\n console.error(\n ' Fix the manifest JSON and retry (service files would otherwise be silently omitted).'\n );\n process.exit(1);\n }\n\n // A bundle must declare its main app WASM; without it the archive\n // would omit app.wasm and still \"succeed\".\n if (!dirManifest.wasm?.path) {\n console.error(\n '❌ manifest.json has no main wasm (wasm.path). A bundle must include its main application.'\n );\n process.exit(1);\n }\n\n // Each declared service must carry a wasm.path; otherwise it would be\n // listed in the manifest but silently dropped from the archive.\n for (const svc of dirManifest.services ?? []) {\n if (!svc?.wasm?.path) {\n console.error(\n `❌ Service \"${svc?.name ?? '<unnamed>'}\" in manifest.json has no wasm.path.`\n );\n process.exit(1);\n }\n }\n\n // Collect the files to pack; rejects unsafe paths (absolute / \"..\")\n // that a crafted manifest could use to read outside the directory.\n let archiveFiles: string[];\n try {\n archiveFiles = collectBundleFiles(dirManifest);\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n\n // Verify every referenced file exists before packing.\n for (const f of archiveFiles) {\n if (!fs.existsSync(path.join(fullPath, f))) {\n console.error(\n `❌ Bundle file referenced by manifest not found: ${f}`\n );\n process.exit(1);\n }\n }\n\n await tar.create(\n { gzip: true, file: tempMpk, cwd: fullPath },\n archiveFiles\n );\n mpkPath = tempMpk;\n console.log(\n `📦 Packed directory into temporary bundle (${archiveFiles.length} files)`\n );\n }\n\n console.log(`📦 Processing bundle: ${path.basename(mpkPath)}`);\n\n // 1. Read bundle and extract manifest\n const manifest = await extractManifest(mpkPath);\n\n if (!manifest) {\n console.error('❌ manifest.json not found in bundle');\n process.exit(1);\n }\n\n // 2. Validate manifest\n if (!manifest.package || !manifest.appVersion) {\n console.error('❌ Invalid manifest: missing package or appVersion');\n process.exit(1);\n }\n\n console.log(` Package: ${manifest.package}`);\n console.log(` Version: ${manifest.appVersion}`);\n if (manifest.metadata) {\n console.log(` Name: ${manifest.metadata.name}`);\n }\n\n // 3. Store (Local Mode)\n if (useLocal) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const artifactServer = new LocalArtifactServer(config, store);\n\n // Copy bundle artifact to local storage\n const bundleFilename = `${manifest.package}-${manifest.appVersion}.mpk`;\n const targetPath = await artifactServer.copyArtifactToLocal(\n mpkPath,\n manifest.package,\n manifest.appVersion,\n bundleFilename\n );\n\n console.log(` Artifact stored: ${targetPath}`);\n\n // Update manifest with local artifact path/url?\n // Actually, for V2 bundles, the registry serves the whole .mpk.\n // The manifest inside the registry is metadata.\n // We might want to store the bundle download URL in the manifest we serve via API?\n // Or just keep it implicit (API constructs download link).\n\n // For local-storage, we can add a field to track where the .mpk is.\n // But LocalDataStore mainly stores the JSON.\n // The artifacts are stored by convention in artifacts/package/version/.\n\n store.setBundleManifest(\n manifest.package,\n manifest.appVersion,\n manifest\n );\n console.log('✅ Bundle manifest registered locally');\n console.log(\n ` Run 'calimero-registry bundle get ${manifest.package} ${manifest.appVersion}' to verify`\n );\n } else if (useRemote) {\n // Remote Mode: Push to remote registry\n // Get values from config file, with flag/environment variable overrides\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n await pushToRemote(mpkPath, manifest, registryUrl, apiKey);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Failed to push bundle:', message);\n process.exit(1);\n } finally {\n if (tempMpk && fs.existsSync(tempMpk)) {\n fs.rmSync(tempMpk);\n }\n }\n });\n}\n\nfunction createGetCommand(): Command {\n return new Command('get')\n .description('Get bundle manifest')\n .argument('<package>', 'Package name (e.g. com.calimero.kv)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--local', 'Use local registry', true)\n .action(async (pkg, version, options) => {\n try {\n if (options.local) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const manifest = store.getBundleManifest(pkg, version);\n\n if (manifest) {\n console.log(JSON.stringify(manifest, null, 2));\n } else {\n console.error(`❌ Manifest not found: ${pkg}@${version}`);\n process.exit(1);\n }\n } else {\n console.error('❌ Remote get not implemented yet');\n process.exit(1);\n }\n } catch (error) {\n console.error('❌ Error:', error);\n process.exit(1);\n }\n });\n}\n\nfunction createEditCommand(): Command {\n return new Command('edit')\n .description(\n 'Edit package metadata (name, description, author, links). Use --remote to talk to the registry. Either supply --manifest (signed manifest file to PATCH) or use options to fetch, modify, and output a manifest for you to sign.'\n )\n .argument('<package>', 'Package name (e.g. com.calimero.myapp)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--remote', 'Use remote registry (required for edit)')\n .option('--url <registry-url>', 'Registry URL (overrides config)')\n .option('--api-key <key>', 'API key for remote (overrides config and env)')\n .option(\n '--manifest <path>',\n 'Path to signed manifest to PATCH (if omitted, GET + apply options + write file + instructions)'\n )\n .option(\n '-o, --output <path>',\n 'Where to write modified manifest when not using --manifest (default: manifest.json)'\n )\n .option('--name <name>', 'Set metadata.name')\n .option('--description <description>', 'Set metadata.description')\n .option('--author <author>', 'Set metadata.author (use \"\" to clear)')\n .option('--frontend <url>', 'Set links.frontend')\n .option('--github <url>', 'Set links.github')\n .option('--docs <url>', 'Set links.docs')\n .addHelpText(\n 'after',\n `\nExamples:\n # 1) Get current manifest, apply edits, write manifest.json and show sign instructions:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --name \"New Name\" --description \"New desc\" -o manifest.json\n\n # 2) After signing with mero-sign, PATCH the signed manifest:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --manifest signed-manifest.json\n\n # 3) With custom registry URL:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --url https://apps.calimero.network --manifest signed-manifest.json\n`\n )\n .action(async (pkg, version, options) => {\n try {\n if (!options.remote) {\n console.error(\n '❌ Edit requires --remote (editing is only supported against the remote registry).'\n );\n process.exit(1);\n }\n\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n const baseUrl = registryUrl.replace(/\\/$/, '');\n const bundleUrl = `${baseUrl}/api/v2/bundles/${encodeURIComponent(pkg)}/${encodeURIComponent(version)}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;\n\n if (options.manifest) {\n // PATCH path: read manifest from file and PATCH\n const manifestPath = path.resolve(options.manifest);\n if (!fs.existsSync(manifestPath)) {\n console.error(`❌ Manifest file not found: ${options.manifest}`);\n process.exit(1);\n }\n const raw = fs.readFileSync(manifestPath, 'utf8');\n let manifest: BundleManifest;\n try {\n manifest = JSON.parse(raw) as BundleManifest;\n } catch {\n console.error(\n `❌ Invalid JSON in manifest file: ${options.manifest}`\n );\n process.exit(1);\n }\n if (manifest.package !== pkg || manifest.appVersion !== version) {\n console.error(\n `❌ Manifest package/version (${manifest.package}@${manifest.appVersion}) does not match command args (${pkg}@${version}).`\n );\n process.exit(1);\n }\n\n const res = await fetch(bundleUrl, {\n method: 'PATCH',\n headers,\n body: JSON.stringify(manifest),\n });\n const text = await res.text();\n let body: ApiResponseBody;\n try {\n body = JSON.parse(text) as ApiResponseBody;\n } catch {\n body = { message: text };\n }\n if (res.ok) {\n console.log('✅ Bundle metadata updated.');\n console.log(` Package: ${(body.package as string) || pkg}`);\n console.log(` Version: ${(body.version as string) || version}`);\n } else {\n const errMsg =\n (body.message && String(body.message).trim()) ||\n body.error ||\n text;\n console.error(`❌ PATCH failed (${res.status}): ${errMsg}`);\n process.exit(1);\n }\n return;\n }\n\n // GET path: fetch manifest, apply options, write to file, print instructions\n const res = await fetch(bundleUrl, { method: 'GET', headers });\n if (!res.ok) {\n const t = await res.text();\n let err: ApiResponseBody;\n try {\n err = JSON.parse(t) as ApiResponseBody;\n } catch {\n err = { message: t };\n }\n console.error(\n `❌ GET failed (${res.status}): ${err.error ?? err.message ?? t}`\n );\n process.exit(1);\n }\n\n const manifest = (await res.json()) as BundleManifest;\n if (manifest.package !== pkg || manifest.appVersion !== version) {\n console.error(\n '❌ Response manifest package/version does not match URL.'\n );\n process.exit(1);\n }\n\n // Apply options (only editable fields)\n if (options.name !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.name = options.name;\n }\n if (options.description !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.description = options.description;\n }\n if (options.author !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.author = options.author;\n }\n if (options.frontend !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.frontend = options.frontend;\n }\n if (options.github !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.github = options.github;\n }\n if (options.docs !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.docs = options.docs;\n }\n\n const outputPath = path.resolve(options.output || 'manifest.json');\n fs.writeFileSync(outputPath, JSON.stringify(manifest, null, 2));\n console.log(`✅ Wrote modified manifest to: ${outputPath}`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Sign the manifest with mero-sign:');\n console.log(` mero-sign sign ${outputPath} --key your-key.json`);\n console.log(' 2. PATCH the signed manifest:');\n console.log(\n ` calimero-registry bundle edit '${pkg}' '${version}' --remote --manifest signed-manifest.json`\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Edit failed:', message);\n process.exit(1);\n }\n });\n}\n\n// Helper to push bundle to remote registry\nasync function pushToRemote(\n bundlePath: string,\n manifest: BundleManifest,\n registryUrl: string,\n apiKey?: string\n): Promise<void> {\n try {\n console.log(`📤 Pushing to remote registry: ${registryUrl}`);\n\n // 1. Read bundle file as binary\n const bundleBuffer = fs.readFileSync(bundlePath);\n const bundleSize = bundleBuffer.length;\n console.log(` Bundle size: ${bundleSize} bytes`);\n\n // 2. Convert bundle to hex string\n const bundleHex = bundleBuffer.toString('hex');\n console.log(` Converted to hex (${bundleHex.length} characters)`);\n\n // 3. Build request payload matching API format\n const payload: BundlePushPayload = {\n version: manifest.version || '1.0',\n package: manifest.package,\n appVersion: manifest.appVersion,\n _binary: bundleHex,\n _overwrite: true,\n };\n\n // Preserve all manifest fields\n if (manifest.metadata) {\n payload.metadata = manifest.metadata;\n }\n if (manifest.interfaces) {\n payload.interfaces = manifest.interfaces;\n }\n if (manifest.wasm) {\n payload.wasm = manifest.wasm;\n }\n if (manifest.abi !== undefined) {\n payload.abi = manifest.abi;\n }\n if (manifest.services !== undefined) {\n payload.services = manifest.services;\n }\n // Always include migrations even if empty — dropping [] changes the signed payload\n payload.migrations = manifest.migrations ?? [];\n if (manifest.links) {\n payload.links = manifest.links;\n }\n if (manifest.signature) {\n payload.signature = manifest.signature;\n }\n if (\n manifest.minRuntimeVersion != null &&\n String(manifest.minRuntimeVersion).trim()\n ) {\n payload.minRuntimeVersion = String(manifest.minRuntimeVersion).trim();\n }\n if (manifest.signerId) {\n payload.signerId = manifest.signerId;\n }\n\n // 4. Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided (from option or environment variable)\n const finalApiKey = apiKey || process.env.CALIMERO_API_KEY;\n if (finalApiKey) {\n headers['Authorization'] = `Bearer ${finalApiKey}`;\n }\n\n // 5. POST to remote registry\n const apiUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/push`;\n console.log(` POST ${apiUrl}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseBody: ApiResponseBody;\n try {\n responseBody = JSON.parse(responseText) as ApiResponseBody;\n } catch {\n responseBody = { message: responseText };\n }\n\n // 6. Handle response\n if (response.status === 201) {\n console.log('✅ Bundle manifest uploaded successfully');\n console.log(` Package: ${responseBody.package || manifest.package}`);\n console.log(\n ` Version: ${responseBody.version || manifest.appVersion}`\n );\n\n // 7. Verify bundle was stored correctly\n await verifyRemotePush(\n registryUrl,\n manifest.package,\n manifest.appVersion\n );\n } else {\n // Handle error responses\n handlePushError(response.status, responseBody);\n }\n } catch (fetchError: unknown) {\n clearTimeout(timeoutId);\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n console.error('❌ Request timed out after 60 seconds');\n console.error(' The bundle may be too large or the server is slow');\n process.exit(1);\n }\n throw fetchError;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Failed to push to remote registry:', message);\n throw error;\n }\n}\n\n// Helper to verify bundle was stored correctly\nasync function verifyRemotePush(\n registryUrl: string,\n packageName: string,\n version: string\n): Promise<void> {\n try {\n console.log('🔍 Verifying upload to remote registry...');\n\n const verifyUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/${packageName}/${version}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n try {\n const response = await fetch(verifyUrl, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n await response.json(); // Consume response body\n console.log('✅ Bundle verified and accessible on remote registry');\n console.log(`🌐 Registry: ${registryUrl}`);\n console.log(`🔗 Endpoint: ${verifyUrl}`);\n } else {\n console.warn(\n `⚠️ Upload verification failed - bundle not found (HTTP ${response.status})`\n );\n console.warn(' The bundle may still be processing, check manually');\n }\n } catch (verifyError: unknown) {\n clearTimeout(timeoutId);\n if (verifyError instanceof Error && verifyError.name === 'AbortError') {\n console.warn('⚠️ Verification request timed out');\n } else {\n const message =\n verifyError instanceof Error\n ? verifyError.message\n : String(verifyError);\n console.warn('⚠️ Verification request failed:', message);\n }\n console.warn(' The bundle may still be accessible, check manually');\n }\n } catch (error) {\n // Verification failure is not critical\n console.warn('⚠️ Could not verify bundle:', error);\n }\n}\n\n// Helper to handle push errors with helpful messages\nfunction handlePushError(\n statusCode: number,\n responseBody: ApiResponseBody\n): void {\n const errorMessage =\n responseBody.message || responseBody.error || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n console.error('❌ Bad Request: Invalid manifest');\n console.error(` ${errorMessage}`);\n console.error(' Check that your bundle manifest is valid');\n break;\n case 401:\n console.error('❌ Unauthorized: Authentication required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Provide an API key with --api-key or CALIMERO_API_KEY env var'\n );\n break;\n case 403:\n console.error('❌ Forbidden: Namespace ownership required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Ensure you have permission to publish to this package namespace'\n );\n break;\n case 409:\n console.error('❌ Conflict: Version already exists');\n console.error(` ${errorMessage}`);\n console.error(\n ' Increment the version number and try again, or contact registry admin'\n );\n break;\n case 500:\n console.error('❌ Internal Server Error');\n console.error(` ${errorMessage}`);\n console.error(' The registry server encountered an error');\n break;\n default:\n console.error(`❌ Upload failed with HTTP ${statusCode}`);\n console.error(` ${errorMessage}`);\n }\n\n process.exit(1);\n}\n\n// Helper to extract manifest.json from .mpk (tar.gz)\nasync function extractManifest(\n bundlePath: string\n): Promise<BundleManifest | null> {\n let manifestContent: string | null = null;\n\n await tar.t({\n file: bundlePath,\n\n onentry: (entry: tar.ReadEntry) => {\n if (entry.path === 'manifest.json') {\n // Found it\n }\n },\n });\n\n // Actual extraction\n const extractDir = path.join(path.dirname(bundlePath), `.temp-${Date.now()}`);\n if (!fs.existsSync(extractDir)) {\n fs.mkdirSync(extractDir);\n }\n\n try {\n await tar.x({\n file: bundlePath,\n cwd: extractDir,\n filter: (path: string) => path === 'manifest.json',\n });\n\n const manifestPath = path.join(extractDir, 'manifest.json');\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf8');\n manifestContent = content;\n }\n } catch {\n // ignore\n } finally {\n // Cleanup\n if (fs.existsSync(extractDir)) {\n fs.rmSync(extractDir, { recursive: true, force: true });\n }\n }\n\n if (manifestContent) {\n try {\n return JSON.parse(manifestContent) as BundleManifest;\n } catch {\n console.error('Failed to parse manifest JSON');\n return null;\n }\n }\n\n return null;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nexport const configCommand = new Command('config')\n .description('Manage CLI configuration for remote registry')\n .addCommand(createConfigSetCommand())\n .addCommand(createConfigGetCommand())\n .addCommand(createConfigListCommand())\n .addCommand(createConfigResetCommand());\n\nfunction createConfigSetCommand(): Command {\n return new Command('set')\n .description('Set a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .argument('<value>', 'Configuration value')\n .action((key, value) => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n config.setRegistryUrl(value);\n console.log(\n chalk.green(`✅ Registry URL set to: ${chalk.bold(value)}`)\n );\n break;\n\n case 'api-key':\n case 'apiKey':\n config.setApiKey(value);\n console.log(chalk.green('✅ API key set successfully'));\n console.log(\n chalk.yellow(\n '💡 Note: API key is stored in plain text. Consider using CALIMERO_API_KEY environment variable for better security.'\n )\n );\n break;\n\n default:\n console.error(chalk.red(`❌ Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to set configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigGetCommand(): Command {\n return new Command('get')\n .description('Get a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .action(key => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n console.log(config.getRegistryUrl());\n break;\n\n case 'api-key':\n case 'apiKey': {\n const apiKey = config.getApiKey();\n if (apiKey) {\n // Mask API key for security\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(masked);\n console.log(\n chalk.yellow(\n '💡 Note: API key is masked. Use \"config list\" to see source.'\n )\n );\n } else {\n console.log('(not set)');\n }\n break;\n }\n\n default:\n console.error(chalk.red(`❌ Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to get configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigListCommand(): Command {\n return new Command('list')\n .description('List all configuration values')\n .alias('ls')\n .action(() => {\n try {\n const config = new RemoteConfig();\n\n console.log(chalk.blue('\\n📋 Remote Registry Configuration\\n'));\n\n // Check if config file exists\n const configPath = config.getConfigPath();\n const configFileExists = fs.existsSync(configPath);\n\n // Registry URL\n const url = config.getRegistryUrl();\n let urlSource: string;\n if (process.env.CALIMERO_REGISTRY_URL) {\n urlSource = chalk.yellow('(from CALIMERO_REGISTRY_URL env var)');\n } else if (configFileExists) {\n urlSource = chalk.gray('(from config file)');\n } else {\n urlSource = chalk.gray('(default)');\n }\n console.log(` ${chalk.bold('Registry URL:')} ${url} ${urlSource}`);\n\n // API Key\n const apiKey = config.getApiKey();\n if (apiKey) {\n let apiKeySource: string;\n if (process.env.CALIMERO_API_KEY) {\n apiKeySource = chalk.yellow('(from CALIMERO_API_KEY env var)');\n } else if (configFileExists) {\n apiKeySource = chalk.gray('(from config file)');\n } else {\n apiKeySource = chalk.gray('(default)');\n }\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(` ${chalk.bold('API Key:')} ${masked} ${apiKeySource}`);\n } else {\n console.log(` ${chalk.bold('API Key:')} ${chalk.gray('(not set)')}`);\n }\n\n console.log(chalk.blue(`\\n📁 Config file: ${configPath}`));\n if (!configFileExists) {\n console.log(chalk.gray(' (file does not exist, using defaults)'));\n }\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to list configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigResetCommand(): Command {\n return new Command('reset')\n .description('Reset configuration to defaults')\n .option('--force', 'Skip confirmation prompt')\n .action(options => {\n try {\n if (!options.force) {\n console.error(\n chalk.red('❌ Configuration reset requires --force flag')\n );\n console.log(\n chalk.yellow(\n '⚠️ This will reset all configuration to defaults. Use --force to confirm.'\n )\n );\n process.exit(1);\n }\n\n const config = new RemoteConfig();\n config.reset();\n\n console.log(chalk.green('✅ Configuration reset to defaults'));\n console.log(chalk.blue('\\nDefault values:'));\n console.log(' Registry URL: https://apps.calimero.network');\n console.log(' API Key: (not set)');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to reset configuration:'), message);\n process.exit(1);\n }\n });\n}\n","/**\n * Organization commands: create, list, get, update, members, packages.\n * Write operations use Authorization: Bearer <api-token>.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nconst DEFAULT_TIMEOUT = 10000;\n\nfunction getGlobalOpts(command: Command): {\n url: string;\n timeout: number;\n} {\n const opts = command.parent?.parent?.opts() ?? {};\n const remoteConfig = new RemoteConfig();\n const url =\n opts.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n return {\n url,\n timeout:\n parseInt(String(opts.timeout ?? DEFAULT_TIMEOUT), 10) || DEFAULT_TIMEOUT,\n };\n}\n\n/** Returns the Authorization header for CLI write operations. Throws if no token configured. */\nfunction getAuthHeaders(): Record<string, string> {\n const remoteConfig = new RemoteConfig();\n const apiKey = remoteConfig.getApiKey();\n if (!apiKey) {\n throw new Error(\n 'API token required for org write operations.\\n' +\n 'Get a token from the Organizations page in the web UI, then run:\\n' +\n ' calimero-registry config set api-key <token>'\n );\n }\n return { Authorization: `Bearer ${apiKey}` };\n}\n\ninterface FetchOptions {\n method?: string;\n body?: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nasync function fetchJson<T>(\n url: string,\n options: FetchOptions = {}\n): Promise<{ data: T; status: number }> {\n const { timeout = DEFAULT_TIMEOUT, ...init } = options;\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n const res = await fetch(url, {\n ...init,\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...init.headers,\n },\n });\n clearTimeout(id);\n const text = await res.text();\n const data = text ? (JSON.parse(text) as T) : (undefined as T);\n return { data, status: res.status };\n}\n\nexport const orgCommand = new Command('org')\n .description('Manage organizations (create, list, members, packages)')\n .addCommand(\n new Command('list')\n .description(\n 'List organizations you belong to (uses API token to resolve identity)'\n )\n .action(async (_options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Resolving identity...').start();\n let authHeaders: Record<string, string>;\n try {\n authHeaders = getAuthHeaders();\n } catch (e) {\n spinner.fail('API token required');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const base = url.replace(/\\/$/, '');\n\n // Resolve identity from API token via /api/auth/me (email + optional pubkey for org list)\n let myEmail: string;\n try {\n const { data, status } = await fetchJson<{\n user?: { email?: string };\n }>(`${base}/api/auth/me`, {\n method: 'GET',\n headers: authHeaders,\n timeout,\n });\n if (status !== 200 || !data?.user?.email) {\n spinner.fail('Could not resolve identity from API token');\n console.error(\n chalk.red(\n 'Ensure your API token is valid. Get a new one from the web UI.'\n )\n );\n process.exit(1);\n }\n myEmail = data.user.email;\n spinner.text = `Fetching organizations for ${myEmail}...`;\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const apiUrl = `${base}/api/v2/orgs?member=${encodeURIComponent(myEmail)}`;\n try {\n const { data, status } = await fetchJson<\n Array<{ id: string; name: string; slug: string }>\n >(apiUrl, {\n method: 'GET',\n headers: authHeaders,\n timeout,\n });\n if (status !== 200) {\n spinner.fail('Failed to list organizations');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n const orgs = Array.isArray(data)\n ? (data as Array<{ id: string; name: string; slug: string }>)\n : [];\n spinner.succeed(`Found ${orgs.length} organization(s)`);\n if (orgs.length === 0) {\n console.log(chalk.yellow('No organizations found'));\n return;\n }\n // Fetch members for each org in parallel to show count + role\n const memberResults = await Promise.all(\n orgs.map(o =>\n fetchJson<{ members: Array<{ email: string; role: string }> }>(\n `${base}/api/v2/orgs/${encodeURIComponent(o.id)}/members`,\n { method: 'GET', headers: authHeaders, timeout }\n ).catch(() => ({ data: { members: [] }, status: 0 }))\n )\n );\n const lines = orgs.map((o, i) => {\n const members = memberResults[i].data?.members ?? [];\n const myMember = members.find(m => m.email === myEmail);\n const role = myMember?.role ?? '?';\n const count = members.length;\n const roleLabel =\n role === 'admin' ? chalk.yellow('admin') : chalk.gray(role);\n return `${chalk.white(o.slug)} ${chalk.gray(o.name)} ${chalk.gray(`${count} member${count !== 1 ? 's' : ''}`)} ${roleLabel}`;\n });\n console.log(lines.join('\\n'));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('create')\n .description('Create a new organization (requires API token)')\n .requiredOption('-n, --name <name>', 'Organization display name')\n .requiredOption('-s, --slug <slug>', 'Organization slug (e.g. my-org)')\n .action(\n async (options: { name: string; slug: string }, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Creating organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = '/api/v2/orgs';\n const body = {\n name: options.name.trim(),\n slug: options.slug.trim().toLowerCase(),\n };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson<\n | { id: string; name: string; slug: string }\n | { error: string; message: string }\n >(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n const err = data as { error?: string; message?: string };\n spinner.fail(err?.message || `HTTP ${status}`);\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Organization created');\n console.log(chalk.green(JSON.stringify(data, null, 2)));\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('get')\n .description('Get organization by id/slug')\n .argument('<orgId>', 'Organization id or slug')\n .action(async (orgId: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const base = url.replace(/\\/$/, '');\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const spinner = ora('Fetching organization...').start();\n try {\n const { data, status } = await fetchJson<\n Record<string, unknown> | { error: string; message: string }\n >(`${base}${pathname}`, { method: 'GET', timeout });\n if (status === 404) {\n spinner.fail('Organization not found');\n process.exit(1);\n }\n if (status !== 200) {\n spinner.fail('Request failed');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('OK');\n console.log(JSON.stringify(data, null, 2));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('update')\n .description('Update organization (name, metadata)')\n .argument('<orgId>', 'Organization id or slug')\n .option('-n, --name <name>', 'New display name')\n .option('-m, --metadata <json>', 'Metadata JSON object')\n .action(\n async (\n orgId: string,\n options: { name?: string; metadata?: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Updating organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const body: Record<string, unknown> = {};\n if (options.name !== undefined) body.name = options.name;\n if (options.metadata !== undefined) {\n try {\n body.metadata = JSON.parse(options.metadata);\n } catch {\n spinner.fail('--metadata must be valid JSON');\n process.exit(1);\n }\n }\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'PATCH',\n body:\n Object.keys(body).length > 0 ? JSON.stringify(body) : undefined,\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Updated');\n console.log(JSON.stringify(data, null, 2));\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('delete')\n .description('Delete an organization and all its data (irreversible)')\n .argument('<orgId>', 'Organization id or slug')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(\n async (orgId: string, options: { yes?: boolean }, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n if (!options.yes) {\n const { createInterface } = await import('readline');\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const confirmed = await new Promise<boolean>(resolve => {\n rl.question(\n chalk.yellow(\n `Delete organization \"${orgId}\" and all its members/packages? This cannot be undone. Type \"yes\" to confirm: `\n ),\n answer => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'yes');\n }\n );\n });\n if (!confirmed) {\n console.log(chalk.gray('Aborted.'));\n return;\n }\n }\n const spinner = ora('Deleting organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Organization deleted');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('members')\n .description('List, add, or remove organization members')\n .addCommand(\n new Command('list')\n .description('List members of an org')\n .argument('<orgId>', 'Organization id or slug')\n .action(async (orgId: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const base = url.replace(/\\/$/, '');\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members`;\n const spinner = ora('Fetching members...').start();\n try {\n const { data, status } = await fetchJson<{\n members: Array<{ email: string; role: string }>;\n }>(`${base}${pathname}`, { method: 'GET', timeout });\n if (status !== 200) {\n spinner.fail('Failed');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('OK');\n const members =\n (data as { members?: Array<{ email: string; role: string }> })\n ?.members ?? [];\n console.log(JSON.stringify(members, null, 2));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('add')\n .description('Add a member by email')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .option('-r, --role <role>', 'Role: member or admin', 'member')\n .action(\n async (\n orgId: string,\n email: string,\n options: { role: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Adding member...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members`;\n const body = {\n email: email.trim(),\n role: options.role === 'admin' ? 'admin' : 'member',\n };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Member added');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('update')\n .description('Update a member role (admin or member)')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .requiredOption('-r, --role <role>', 'New role: admin or member')\n .action(\n async (\n orgId: string,\n email: string,\n options: { role: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const role = options.role === 'admin' ? 'admin' : 'member';\n const spinner = ora('Updating member role...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(email.trim())}`;\n const body = { role };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed(`Role updated to \"${role}\"`);\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('remove')\n .description('Remove a member by email')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .action(\n async (\n orgId: string,\n email: string,\n _options,\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Removing member...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(email.trim())}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Member removed');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n )\n .addCommand(\n new Command('packages')\n .description('Link or unlink packages to the organization')\n .addCommand(\n new Command('link')\n .description('Link a package to the organization')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<package>', 'Package name')\n .action(\n async (orgId: string, pkg: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Linking package...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/packages`;\n const body = { package: pkg.trim() };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Package linked');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('unlink')\n .description('Unlink a package from the organization')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<package>', 'Package name')\n .action(\n async (orgId: string, pkg: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Unlinking package...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/packages/${encodeURIComponent(pkg.trim())}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Package unlinked');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createRequire } from 'module';\nimport { healthCommand } from './commands/health.js';\nimport { ipfsCommand } from './commands/ipfs.js';\nimport { localCommand } from './commands/local.js';\nimport { bundleCommand } from './commands/bundle.js';\nimport { configCommand } from './commands/config.js';\nimport { orgCommand } from './commands/org.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json');\n\nconst program = new Command();\n\nprogram\n .name('calimero-registry')\n .description(\n 'Calimero Network App Registry CLI - Command-line interface for the App Registry'\n )\n .version(version);\n\n// Global help text with examples\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry org list\n $ calimero-registry bundle get com.example.my-app 1.0.0\n $ calimero-registry local start\n $ calimero-registry health\n\nFor more information, visit: https://github.com/calimero-network/app-registry\n`\n);\n\n// Global options — no default; commands fall back to RemoteConfig / CALIMERO_REGISTRY_URL\nprogram.option('-u, --url <url>', 'Registry API URL (overrides saved config)');\nprogram.option(\n '-t, --timeout <timeout>',\n 'Request timeout in milliseconds',\n '10000'\n);\nprogram.option('--local', 'Use local registry instead of remote API');\n\n// Add commands\nprogram.addCommand(healthCommand);\nprogram.addCommand(ipfsCommand);\nprogram.addCommand(localCommand);\nprogram.addCommand(bundleCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(orgCommand);\n\n// Global error handler\nprogram.exitOverride();\n\ntry {\n program.parse();\n} catch (err: unknown) {\n // Commander throws for --version, --help, and no-command help (exitCode 0) — ignore those\n if (err && typeof err === 'object' && 'exitCode' in err) {\n process.exit((err as { exitCode: number }).exitCode ?? 0);\n }\n if (err instanceof Error) {\n console.error(chalk.red('Error:'), err.message);\n } else {\n console.error(chalk.red('Unknown error occurred'));\n }\n process.exit(1);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/remote-config.ts","../src/lib/local-config.ts","../src/commands/health.ts","../src/lib/ipfs.ts","../src/utils/spinner.ts","../src/commands/ipfs.ts","../src/lib/local-storage.ts","../src/lib/local-artifacts.ts","../src/lib/local-server.ts","../src/commands/local.ts","../src/lib/services.ts","../src/commands/bundle.ts","../src/commands/config.ts","../src/commands/org.ts","../src/index.ts"],"names":["path","os","fs","defaultConfig","spinner","ora","chalk","Command","version","crypto","manifest","res","t","require"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\n/**\n * The public registry, named once. It was written out in loadConfig, in reset\n * and in getRegistryUrl, which is three places for one value to drift.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://apps.calimero.network';\n\nfunction defaultConfig(): RemoteConfigData {\n return { registry: { url: DEFAULT_REGISTRY_URL } };\n}\n\nexport interface RemoteConfigData {\n registry: {\n url: string;\n apiKey?: string;\n };\n}\n\nexport class RemoteConfig {\n private configPath: string;\n private config: RemoteConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'remote-config.json'\n );\n this.config = this.loadConfig();\n }\n\n private loadConfig(): RemoteConfigData {\n const defaults = defaultConfig();\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n registry: {\n ...defaults.registry,\n ...(existingConfig.registry || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaults;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config - always save API key if it's set in config\n // (env var takes precedence when reading, but doesn't prevent saving)\n const configToSave: RemoteConfigData = {\n registry: {\n url: this.config.registry.url,\n // Save API key if it exists in config (regardless of env var)\n ...(this.config.registry.apiKey\n ? { apiKey: this.config.registry.apiKey }\n : {}),\n },\n };\n fs.writeFileSync(this.configPath, JSON.stringify(configToSave, null, 2));\n }\n\n /**\n * Get registry URL with priority:\n * 1. Environment variable CALIMERO_REGISTRY_URL\n * 2. Config file value\n * 3. Default value\n */\n getRegistryUrl(): string {\n return (\n process.env.CALIMERO_REGISTRY_URL ||\n this.config.registry.url ||\n DEFAULT_REGISTRY_URL\n );\n }\n\n /**\n * Set registry URL\n */\n setRegistryUrl(url: string): void {\n this.config.registry.url = url;\n this.saveConfig();\n }\n\n /**\n * Get API key with priority:\n * 1. Environment variable CALIMERO_API_KEY\n * 2. Config file value\n * 3. undefined\n */\n getApiKey(): string | undefined {\n return process.env.CALIMERO_API_KEY || this.config.registry.apiKey;\n }\n\n /**\n * Set API key (stored in config file)\n */\n setApiKey(apiKey: string): void {\n this.config.registry.apiKey = apiKey;\n this.saveConfig();\n }\n\n /**\n * Remove API key from config\n */\n removeApiKey(): void {\n delete this.config.registry.apiKey;\n this.saveConfig();\n }\n\n /**\n * Get full configuration\n */\n getConfig(): RemoteConfigData {\n return {\n registry: {\n url: this.getRegistryUrl(),\n // Don't expose API key in getConfig (security)\n apiKey: this.getApiKey() ? '***' : undefined,\n },\n };\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Reset to defaults\n */\n reset(): void {\n this.config = defaultConfig();\n this.saveConfig();\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface LocalConfigData {\n server: {\n port: number;\n host: string;\n publicHost: string;\n };\n data: {\n dir: string;\n artifactsDir: string;\n };\n artifacts: {\n storageDir: string;\n serveLocal: boolean;\n copyArtifacts: boolean;\n maxFileSize: string;\n allowedTypes: string[];\n };\n}\n\n/**\n * One source for the defaults. They were written out twice, in loadConfig and\n * in reset, and had drifted: reset bound a different host and omitted\n * publicHost entirely, which artifact URLs are built from.\n */\nfunction defaultConfig(): LocalConfigData {\n return {\n server: {\n // Reset used to say localhost here, but never reached the listener:\n // `local start` sets the host on every run and defaults to 0.0.0.0,\n // which is also what publicHost assumes, since a container reaching\n // host.docker.internal cannot be served from loopback.\n host: '0.0.0.0',\n port: 8082,\n publicHost: 'host.docker.internal',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n}\n\nexport class LocalConfig {\n private configPath: string;\n private dataDir: string;\n private config: LocalConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'config.json'\n );\n this.dataDir = path.join(os.homedir(), '.calimero-registry');\n this.config = this.loadConfig();\n }\n\n private loadConfig(): LocalConfigData {\n const defaults = defaultConfig();\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n server: {\n ...defaults.server,\n ...(existingConfig.server || {}),\n },\n data: {\n ...defaults.data,\n ...(existingConfig.data || {}),\n },\n artifacts: {\n ...defaults.artifacts,\n ...(existingConfig.artifacts || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaults;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config\n fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n }\n\n // Server configuration\n getPort(): number {\n return this.config.server.port;\n }\n\n setPort(port: number): void {\n this.config.server.port = port;\n this.saveConfig();\n }\n\n getHost(): string {\n return this.config.server.host;\n }\n\n setHost(host: string): void {\n this.config.server.host = host;\n this.saveConfig();\n }\n\n getPublicHost(): string {\n return this.config.server.publicHost;\n }\n\n setPublicHost(host: string): void {\n this.config.server.publicHost = host;\n this.saveConfig();\n }\n\n // Data directory configuration\n getDataDir(): string {\n return this.config.data.dir;\n }\n\n setDataDir(dir: string): void {\n // artifactsDir and storageDir name the same directory; moving the data\n // dir has to move both, or a later read gets the previous location.\n this.config.data.dir = dir;\n this.config.data.artifactsDir = path.join(dir, 'artifacts');\n this.config.artifacts.storageDir = path.join(dir, 'artifacts');\n this.saveConfig();\n }\n\n getArtifactsDir(): string {\n return this.config.data.artifactsDir;\n }\n\n setArtifactsDir(dir: string): void {\n this.config.data.artifactsDir = dir;\n this.config.artifacts.storageDir = dir;\n this.saveConfig();\n }\n\n // Artifact configuration\n getArtifactsConfig() {\n return this.config.artifacts;\n }\n\n setArtifactsConfig(config: Partial<LocalConfigData['artifacts']>): void {\n this.config.artifacts = { ...this.config.artifacts, ...config };\n this.saveConfig();\n }\n\n // Utility methods\n ensureDirectories(): void {\n const dirs = [\n this.getDataDir(),\n this.getArtifactsDir(),\n path.join(this.getDataDir(), 'backups'),\n path.join(this.getDataDir(), 'logs'),\n ];\n\n dirs.forEach(dir => {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n });\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n // Get full configuration\n getConfig(): LocalConfigData {\n return { ...this.config };\n }\n\n // Reset to defaults\n reset(): void {\n this.config = defaultConfig();\n this.saveConfig();\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport axios from 'axios';\nimport { RemoteConfig } from '../lib/remote-config.js';\nimport { LocalConfig } from '../lib/local-config.js';\n\nexport const healthCommand = new Command('health')\n .description('Check the health of the Calimero Registry API')\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts();\n\n // The two registries expose health at different paths: the local server\n // owns its whole origin and serves /healthz, while on the deployed\n // registry that path belongs to the frontend.\n let url: string;\n if (globalOpts?.local) {\n const local = new LocalConfig();\n url = `http://${local.getHost()}:${local.getPort()}/healthz`;\n } else {\n // getRegistryUrl already falls through the env var to the public\n // registry, so repeating that default here would only give it a second\n // place to drift from.\n const base = (globalOpts?.url || new RemoteConfig().getRegistryUrl())\n .trim()\n .replace(/\\/$/, '');\n url = `${base}/api/healthz`;\n }\n\n const spinner = ora('Checking API health...').start();\n\n try {\n // Accept only a JSON body that says ok. Asking the deployed registry for\n // /healthz used to reach the frontend, and any 200 from the app shell\n // read as healthy against an API that was never contacted.\n const { data } = await axios.get(url, {\n timeout: parseInt(globalOpts?.timeout || '10000'),\n headers: { Accept: 'application/json' },\n });\n\n if (data?.status !== 'ok') {\n throw new Error(\n `unexpected response from ${url}: ${JSON.stringify(data)}`\n );\n }\n\n spinner.succeed('API is healthy');\n console.log(chalk.green(`Status: ${data.status}`));\n if (data.timestamp) {\n console.log(chalk.gray(`Checked: ${data.timestamp}`));\n }\n } catch (error) {\n spinner.fail('API health check failed');\n // A refused connection arrives with an empty message, which on its own\n // says nothing about what was tried; the url is the useful part.\n const reason =\n (error instanceof Error && error.message) ||\n (axios.isAxiosError(error) && error.code) ||\n 'no response';\n console.error(chalk.red(`Error: ${reason}`));\n console.error(chalk.gray(`Tried: ${url}`));\n if (globalOpts?.local) {\n console.error(\n chalk.gray('Is it running? \"calimero-registry local start\"')\n );\n }\n process.exit(1);\n }\n });\n","import { writeFileSync, existsSync } from 'fs';\n\nexport async function uploadToIPFS(filePath: string): Promise<string> {\n try {\n // For now, we'll simulate IPFS upload since public gateways require authentication\n // In production, you'd use a service like Pinata, Infura, or your own IPFS node\n\n // Check if file exists (this satisfies the linter by using filePath)\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Use a hardcoded valid CID for demo\n const simulatedCid = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG';\n\n console.log('⚠️ Using simulated IPFS upload for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n return simulatedCid;\n } catch (error) {\n throw new Error(\n `Failed to upload to IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { cause: error }\n );\n }\n}\n\nexport async function downloadFromIPFS(\n cid: string,\n outputPath?: string\n): Promise<string> {\n try {\n // For demo purposes, we'll simulate IPFS download\n // In production, you'd actually download from IPFS\n\n console.log('⚠️ Using simulated IPFS download for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n // Generate a simulated file content based on CID\n const simulatedContent = `Simulated IPFS file content for CID: ${cid}\\nThis is a demo file that would normally contain the actual application data.`;\n\n // Determine output path\n const finalOutputPath = outputPath || `${cid}.wasm`;\n\n // Write the simulated content to file\n writeFileSync(finalOutputPath, simulatedContent);\n\n return finalOutputPath;\n } catch (error) {\n throw new Error(\n `Failed to download from IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { cause: error }\n );\n }\n}\n","import ora from 'ora';\n\nexport const spinner = (text: string) => ora(text);\n","import { Command } from 'commander';\nimport { uploadToIPFS, downloadFromIPFS } from '../lib/ipfs';\nimport { spinner } from '../utils/spinner';\n\nexport const ipfsCommand = new Command('ipfs')\n .description('IPFS operations')\n .addCommand(\n new Command('upload')\n .description('Upload a file to IPFS')\n .argument('<file>', 'Path to the file to upload')\n .action(async file => {\n const s = spinner('Uploading to IPFS...').start();\n\n try {\n const cid = await uploadToIPFS(file);\n s.succeed(`File uploaded successfully!`);\n console.log(`CID: ${cid}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Upload failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('download')\n .description('Download a file from IPFS')\n .argument('<cid>', 'IPFS CID to download')\n .argument('[output]', 'Output file path (optional)')\n .action(async (cid, output) => {\n const s = spinner('Downloading from IPFS...').start();\n\n try {\n const outputPath = await downloadFromIPFS(cid, output);\n s.succeed(`File downloaded successfully!`);\n console.log(`Saved to: ${outputPath}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Download failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n );\n","import fs from 'fs';\nimport path from 'path';\nimport { LocalConfig } from './local-config.js';\n\nexport interface AppSummary {\n id: string;\n name: string;\n latest_version: string;\n latest_digest: string;\n developer_pubkey?: string;\n alias?: string;\n}\n\nexport interface VersionInfo {\n semver: string;\n digest: string;\n cid: string; // Added for compatibility\n yanked: boolean;\n}\n\n// --- V2 / Bundle Manifest Support ---\n\nexport interface BundleArtifact {\n path: string;\n hash: string | null;\n size: number;\n}\n\nexport interface BundleMetadata {\n name: string;\n description?: string;\n // Set by the registry from the publishing account and carried forward from\n // the package's first version, so `bundle edit` sends it back rather than\n // setting it. Every published manifest has one.\n author?: string;\n icon?: string;\n tags?: string[];\n license?: string;\n}\n\nexport interface BundleInterfaces {\n exports?: string[];\n uses?: string[];\n}\n\nexport interface BundleLinks {\n frontend?: string;\n github?: string;\n docs?: string;\n}\n\nexport interface BundleSignature {\n alg: string;\n sig: string;\n pubkey: string;\n signed_at: string;\n}\n\n/**\n * A named service shipped alongside the main application in a multi-service\n * bundle (e.g. a \"lobby\" matchmaking service next to a \"tictactoe\" main app).\n * Packed under `services/<name>.wasm` (+ optional `services/<name>.abi.json`).\n */\nexport interface BundleServiceEntry {\n name: string;\n wasm: BundleArtifact;\n abi?: BundleArtifact;\n}\n\nexport interface BundleManifest {\n version: string; // \"1.0\" (internal manifest version)\n package: string;\n appVersion: string;\n\n metadata?: BundleMetadata;\n interfaces?: BundleInterfaces;\n\n /** The MAIN application WASM (packed as `app.wasm`). Always present. */\n wasm?: BundleArtifact;\n /** The MAIN application ABI (packed as `abi.json`), if any. */\n abi?: BundleArtifact;\n /**\n * Additional named services shipped alongside the main app. Optional and\n * omitted entirely for single-app bundles, so existing manifests are\n * unchanged (and their signatures still verify).\n */\n services?: BundleServiceEntry[];\n migrations: BundleArtifact[];\n\n links?: BundleLinks;\n signature?: BundleSignature;\n\n /** Minimum runtime version required by this bundle (e.g. \"0.2.0\"). Preserved when pushing. */\n minRuntimeVersion?: string;\n /** Deep-link handler declarations. A sibling of `metadata`, not nested in it. */\n handlers?: { slug?: string };\n /**\n * Which node release the WASM was compiled against, derived by\n * `cargo mero bundle` from the resolved `calimero-sdk` dependency.\n *\n * Distinct from `minRuntimeVersion`, which is hand-declared and states a\n * floor. Absent on bundles built before cargo-mero began stamping it.\n */\n buildInfo?: {\n sdkSource?: string;\n sdkVersion?: string;\n sdkRev?: string;\n };\n /** DID of the signer — part of the signed payload, must be forwarded as-is. */\n signerId?: string;\n}\n\nexport interface LocalRegistryData {\n apps: Map<string, AppSummary>;\n bundleManifests: Map<string, BundleManifest>; // Key: \"package/version\"\n artifacts: Map<string, string>; // digest -> file path\n}\n\nexport class LocalDataStore {\n private config: LocalConfig;\n private data: LocalRegistryData;\n private appsFile: string;\n private bundleManifestsFile: string;\n private artifactsFile: string;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.appsFile = path.join(config.getDataDir(), 'apps.json');\n this.bundleManifestsFile = path.join(\n config.getDataDir(),\n 'bundle_manifests.json'\n );\n this.artifactsFile = path.join(config.getDataDir(), 'artifacts.json');\n this.data = {\n apps: new Map(),\n bundleManifests: new Map(),\n artifacts: new Map(),\n };\n this.loadData();\n }\n\n private loadData(): void {\n try {\n // Load apps\n if (fs.existsSync(this.appsFile)) {\n const appsData = JSON.parse(fs.readFileSync(this.appsFile, 'utf8'));\n this.data.apps = new Map(Object.entries(appsData));\n }\n\n // Load bundle manifests\n if (fs.existsSync(this.bundleManifestsFile)) {\n const bundleManifestsData = JSON.parse(\n fs.readFileSync(this.bundleManifestsFile, 'utf8')\n );\n this.data.bundleManifests = new Map(\n Object.entries(bundleManifestsData)\n );\n }\n\n // Load artifacts\n if (fs.existsSync(this.artifactsFile)) {\n const artifactsData = JSON.parse(\n fs.readFileSync(this.artifactsFile, 'utf8')\n );\n this.data.artifacts = new Map(Object.entries(artifactsData));\n }\n } catch {\n console.warn('Failed to load existing data, starting fresh');\n }\n }\n\n private saveData(): void {\n try {\n // Ensure data directory exists\n this.config.ensureDirectories();\n\n // Save apps\n const appsObj = Object.fromEntries(this.data.apps);\n fs.writeFileSync(this.appsFile, JSON.stringify(appsObj, null, 2));\n\n // Save bundle manifests\n const bundleManifestsObj = Object.fromEntries(this.data.bundleManifests);\n fs.writeFileSync(\n this.bundleManifestsFile,\n JSON.stringify(bundleManifestsObj, null, 2)\n );\n\n // Save artifacts\n const artifactsObj = Object.fromEntries(this.data.artifacts);\n fs.writeFileSync(\n this.artifactsFile,\n JSON.stringify(artifactsObj, null, 2)\n );\n } catch (error) {\n throw new Error(\n `Failed to save data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n { cause: error }\n );\n }\n }\n\n // Apps management\n getApps(filters?: { name?: string; dev?: string }): AppSummary[] {\n let apps = Array.from(this.data.apps.values());\n\n if (filters?.name) {\n apps = apps.filter(app => app.name.includes(filters.name!));\n }\n\n if (filters?.dev) {\n apps = apps.filter(app => app.developer_pubkey === filters.dev);\n }\n\n return apps;\n }\n\n getApp(appKey: string): AppSummary | undefined {\n return this.data.apps.get(appKey);\n }\n\n setApp(appKey: string, app: AppSummary): void {\n this.data.apps.set(appKey, app);\n this.saveData();\n }\n\n // Versions management (bundles only)\n getAppVersions(packageId: string): VersionInfo[] {\n const versions: VersionInfo[] = [];\n\n // Get bundle versions\n for (const [key, manifest] of this.data.bundleManifests.entries()) {\n if (key.startsWith(`${packageId}/`)) {\n const semver = key.split('/').pop()!;\n const digest = manifest.wasm?.hash || '';\n versions.push({\n semver,\n digest,\n cid: digest, // Compatibility\n yanked: false,\n });\n }\n }\n\n return versions.sort((a, b) =>\n a.semver.localeCompare(b.semver, undefined, { numeric: true })\n );\n }\n\n // Manifest management (V2 / Bundles)\n\n getBundleManifest(pkg: string, version: string): BundleManifest | undefined {\n const key = `${pkg}/${version}`;\n return this.data.bundleManifests.get(key);\n }\n\n setBundleManifest(\n pkg: string,\n version: string,\n manifest: BundleManifest\n ): void {\n const key = `${pkg}/${version}`;\n this.data.bundleManifests.set(key, manifest);\n this.saveData();\n }\n\n // Artifact management\n getArtifactPath(hash: string): string | undefined {\n return this.data.artifacts.get(hash);\n }\n\n setArtifactPath(hash: string, filePath: string): void {\n this.data.artifacts.set(hash, filePath);\n this.saveData();\n }\n\n // Statistics\n getStats() {\n return {\n publishedApps: this.data.apps.size,\n totalVersions: this.data.bundleManifests.size,\n totalArtifacts: this.data.artifacts.size,\n };\n }\n\n // Backup and restore\n async backup(outputPath?: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath =\n outputPath ||\n path.join(\n this.config.getDataDir(),\n 'backups',\n `backup-${timestamp}.json`\n );\n\n // Ensure backup directory exists\n const backupDir = path.dirname(backupPath);\n if (!fs.existsSync(backupDir)) {\n fs.mkdirSync(backupDir, { recursive: true });\n }\n\n const backupData = {\n timestamp: new Date().toISOString(),\n apps: Object.fromEntries(this.data.apps),\n bundleManifests: Object.fromEntries(this.data.bundleManifests),\n artifacts: Object.fromEntries(this.data.artifacts),\n };\n\n fs.writeFileSync(backupPath, JSON.stringify(backupData, null, 2));\n return backupPath;\n }\n\n async restore(backupPath: string): Promise<void> {\n if (!fs.existsSync(backupPath)) {\n throw new Error(`Backup file not found: ${backupPath}`);\n }\n\n const backupData = JSON.parse(fs.readFileSync(backupPath, 'utf8'));\n\n // Restore data\n this.data.apps = new Map(Object.entries(backupData.apps || {}));\n this.data.bundleManifests = new Map(\n Object.entries(backupData.bundleManifests || {})\n );\n this.data.artifacts = new Map(Object.entries(backupData.artifacts || {}));\n\n this.saveData();\n }\n\n // Reset data\n reset(): void {\n this.data.apps.clear();\n this.data.bundleManifests.clear();\n this.data.artifacts.clear();\n this.saveData();\n }\n\n /**\n * Get all bundle manifests\n */\n getAllBundles(): BundleManifest[] {\n return Array.from(this.data.bundleManifests.values());\n }\n\n // Seed with sample data\n async seed(): Promise<void> {\n // V2 Sample Bundle\n const bundleManifest: BundleManifest = {\n version: '1.0',\n package: 'com.calimero.sample-bundle',\n appVersion: '1.0.0',\n metadata: {\n name: 'Sample Bundle App',\n description: 'A sample application using V2 Bundle Manifest',\n tags: ['sample', 'v2'],\n license: 'MIT',\n },\n interfaces: {\n exports: ['com.calimero.sample.v1'],\n uses: [],\n },\n links: {\n frontend: 'https://example.com/app',\n github: 'https://github.com/example/app',\n },\n wasm: {\n path: 'app.wasm',\n size: 1024,\n hash: null,\n },\n abi: {\n path: 'abi.json',\n size: 512,\n hash: null,\n },\n migrations: [],\n };\n\n this.setBundleManifest(\n bundleManifest.package,\n bundleManifest.appVersion,\n bundleManifest\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { Buffer } from 'buffer';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore } from './local-storage.js';\n\nexport class LocalArtifactServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactsDir: string;\n\n constructor(config: LocalConfig, dataStore: LocalDataStore) {\n this.config = config;\n this.dataStore = dataStore;\n this.artifactsDir = config.getArtifactsDir();\n this.ensureArtifactsDir();\n }\n\n private ensureArtifactsDir(): void {\n if (!fs.existsSync(this.artifactsDir)) {\n fs.mkdirSync(this.artifactsDir, { recursive: true });\n }\n }\n\n // Copy artifact to local storage\n async copyArtifactToLocal(\n sourcePath: string,\n appId: string,\n version: string,\n filename: string\n ): Promise<string> {\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n // Create app version directory\n const appVersionDir = path.join(this.artifactsDir, appId, version);\n if (!fs.existsSync(appVersionDir)) {\n fs.mkdirSync(appVersionDir, { recursive: true });\n }\n\n // Copy file to local storage\n const targetPath = path.join(appVersionDir, filename);\n fs.copyFileSync(sourcePath, targetPath);\n\n // Calculate file hash for tracking\n const fileHash = await this.calculateFileHash(targetPath);\n this.dataStore.setArtifactPath(fileHash, targetPath);\n\n return targetPath;\n }\n\n // Serve artifact by app ID, version, and filename\n async serveArtifact(\n appId: string,\n version: string,\n filename: string\n ): Promise<Buffer> {\n const artifactPath = path.join(this.artifactsDir, appId, version, filename);\n\n if (!fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found: ${artifactPath}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Serve artifact by hash\n async serveByHash(hash: string): Promise<Buffer> {\n const artifactPath = this.dataStore.getArtifactPath(hash);\n\n if (!artifactPath || !fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found for hash: ${hash}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Validate artifact file\n async validateArtifact(\n filePath: string\n ): Promise<{ size: number; sha256: string }> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const stats = fs.statSync(filePath);\n const fileBuffer = fs.readFileSync(filePath);\n const sha256 = crypto.createHash('sha256').update(fileBuffer).digest('hex');\n\n return {\n size: stats.size,\n sha256,\n };\n }\n\n // Calculate file hash\n private async calculateFileHash(filePath: string): Promise<string> {\n const fileBuffer = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n }\n\n // Get artifact URL for local serving\n getArtifactUrl(appId: string, version: string, filename: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${appId}/${version}/${filename}`;\n }\n\n // Get artifact URL by hash\n getArtifactUrlByHash(hash: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${hash}`;\n }\n\n // Clean up old artifacts\n async cleanupOldArtifacts(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n const now = Date.now();\n\n // Get all artifact files\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n const age = now - stats.mtime.getTime();\n\n if (age > maxAge) {\n fs.unlinkSync(file);\n console.log(`Cleaned up old artifact: ${file}`);\n }\n }\n }\n\n // Get artifact statistics\n getArtifactStats(): {\n totalFiles: number;\n totalSize: number;\n oldestFile: Date | null;\n } {\n let totalFiles = 0;\n let totalSize = 0;\n let oldestFile: Date | null = null;\n\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n if (fs.existsSync(this.artifactsDir)) {\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n totalFiles++;\n totalSize += stats.size;\n\n if (!oldestFile || stats.mtime < oldestFile) {\n oldestFile = stats.mtime;\n }\n }\n }\n\n return {\n totalFiles,\n totalSize,\n oldestFile,\n };\n }\n}\n","import fastify, { FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, BundleManifest } from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\n\nexport interface ServerStatus {\n running: boolean;\n url: string;\n dataDir: string;\n appsCount: number;\n artifactsCount: number;\n}\n\nexport class LocalRegistryServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n private server: FastifyInstance | null = null;\n private isRunning = false;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.dataStore = new LocalDataStore(config);\n this.artifactServer = new LocalArtifactServer(config, this.dataStore);\n }\n\n async start(port?: number): Promise<void> {\n if (this.isRunning) {\n throw new Error('Local registry is already running');\n }\n\n const serverPort = port || this.config.getPort();\n const host = this.config.getHost();\n\n // Ensure directories exist\n this.config.ensureDirectories();\n\n // Create Fastify server\n this.server = fastify({\n logger: {\n level: 'info',\n },\n });\n\n // Register CORS\n await this.server.register(cors, {\n origin: true,\n credentials: true,\n });\n\n // Register routes\n await this.registerRoutes();\n\n // Start server\n await this.server.listen({ port: serverPort, host });\n this.isRunning = true;\n\n console.log(\n `Local registry server started on http://${host}:${serverPort}`\n );\n }\n\n async stop(): Promise<void> {\n if (!this.server || !this.isRunning) {\n throw new Error('Local registry is not running');\n }\n\n await this.server.close();\n this.isRunning = false;\n this.server = null;\n }\n\n async getStatus(): Promise<ServerStatus> {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n running: this.isRunning,\n url: `http://${this.config.getHost()}:${this.config.getPort()}`,\n dataDir: this.config.getDataDir(),\n appsCount: stats.publishedApps,\n artifactsCount: artifactStats.totalFiles,\n };\n }\n\n async reset(): Promise<void> {\n this.dataStore.reset();\n\n // Clean up artifacts directory\n const artifactsDir = this.config.getArtifactsDir();\n if (fs.existsSync(artifactsDir)) {\n fs.rmSync(artifactsDir, { recursive: true, force: true });\n }\n }\n\n async backup(outputPath?: string): Promise<string> {\n return await this.dataStore.backup(outputPath);\n }\n\n async restore(backupPath: string): Promise<void> {\n await this.dataStore.restore(backupPath);\n }\n\n async seed(): Promise<void> {\n await this.dataStore.seed();\n }\n\n private async registerRoutes(): Promise<void> {\n if (!this.server) {\n throw new Error('Server not initialized');\n }\n\n // Health endpoint\n this.server.get('/healthz', async () => {\n return { status: 'ok' };\n });\n\n // Statistics endpoint\n this.server.get('/stats', async () => {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n publishedApps: stats.publishedApps,\n totalVersions: stats.totalVersions,\n totalArtifacts: artifactStats.totalFiles,\n totalSize: artifactStats.totalSize,\n };\n });\n\n // Artifact endpoints\n this.server.get(\n '/artifacts/:appId/:version/:filename',\n async (request, reply) => {\n const { appId, version, filename } = request.params as {\n appId: string;\n version: string;\n filename: string;\n };\n\n try {\n const artifactData = await this.artifactServer.serveArtifact(\n appId,\n version,\n filename\n );\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n }\n );\n\n this.server.get('/artifacts/:hash', async (request, reply) => {\n const { hash } = request.params as { hash: string };\n\n try {\n const artifactData = await this.artifactServer.serveByHash(hash);\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n });\n\n // Local registry management endpoints\n this.server.get('/local/status', async () => {\n return await this.getStatus();\n });\n\n this.server.post('/local/reset', async () => {\n await this.reset();\n return { message: 'Local registry data reset successfully' };\n });\n\n this.server.get('/local/backup', async request => {\n const query = request.query as { output?: string };\n const backupPath = await this.backup(query.output);\n return { backupPath };\n });\n\n this.server.post('/local/restore', async request => {\n const { backupPath } = request.body as { backupPath: string };\n await this.restore(backupPath);\n return { message: 'Data restored successfully' };\n });\n\n this.server.post('/local/seed', async () => {\n await this.seed();\n return { message: 'Sample data seeded successfully' };\n });\n\n // V2 Bundle API endpoints\n this.server.get('/api/v2/bundles', async (request, reply) => {\n const query = request.query as {\n package?: string;\n version?: string;\n developer?: string;\n };\n\n const { package: pkg, version, developer } = query;\n\n // If specific package and version requested, return single bundle\n if (pkg && version) {\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n if (!manifest) {\n return reply.code(404).send({\n error: 'bundle_not_found',\n message: `Bundle ${pkg}@${version} not found`,\n });\n }\n return [manifest];\n }\n\n // Get all bundles\n const allBundles = this.dataStore.getAllBundles();\n const bundles = [];\n\n for (const bundle of allBundles) {\n // Filter by package if specified\n if (pkg && bundle.package !== pkg) {\n continue;\n }\n\n // Filter by developer pubkey if specified\n if (developer) {\n const bundlePubkey = bundle.signature?.pubkey;\n if (!bundlePubkey || bundlePubkey !== developer) {\n continue;\n }\n }\n\n bundles.push(bundle);\n }\n\n // Sort by package name, then by version (descending)\n bundles.sort((a, b) => {\n const pkgCompare = a.package.localeCompare(b.package);\n if (pkgCompare !== 0) return pkgCompare;\n // For same package, sort by version descending\n return b.appVersion.localeCompare(a.appVersion, undefined, {\n numeric: true,\n });\n });\n\n // If filtering by package, return all versions\n // Otherwise, return only latest version per package\n if (pkg) {\n return bundles;\n }\n\n // Group by package and return only latest version\n const latestByPackage = new Map<string, BundleManifest>();\n for (const bundle of bundles) {\n const existing = latestByPackage.get(bundle.package);\n if (!existing || bundle.appVersion > existing.appVersion) {\n latestByPackage.set(bundle.package, bundle);\n }\n }\n\n return Array.from(latestByPackage.values());\n });\n\n this.server.get(\n '/api/v2/bundles/:package/:version',\n async (request, reply) => {\n const { package: pkg, version } = request.params as {\n package: string;\n version: string;\n };\n\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n\n if (!manifest) {\n return reply.code(404).send({\n error: 'manifest_not_found',\n message: `Manifest not found for ${pkg}@${version}`,\n });\n }\n\n return manifest;\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { LocalRegistryServer } from '../lib/local-server.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport fs from 'fs';\n\nconst localCommand = new Command('local').description(\n 'Manage local registry for development'\n);\n\n// Start local registry\nlocalCommand.addCommand(\n new Command('start')\n .description('Start local registry server')\n .option('-p, --port <port>', 'Port to run the server on', '8082')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option(\n '--public-host <host>',\n 'Public host exposed in manifest artifact URLs',\n 'host.docker.internal'\n )\n .action(async options => {\n const spinner = ora('Starting local registry...').start();\n\n try {\n const config = new LocalConfig();\n config.setHost(options.host);\n config.setPublicHost(options.publicHost);\n config.setPort(parseInt(options.port, 10));\n const server = new LocalRegistryServer(config);\n\n await server.start(parseInt(options.port));\n\n spinner.succeed(\n `Local registry started on http://${config.getHost()}:${config.getPort()}`\n );\n console.log(chalk.blue('\\n📱 Local Registry Status:'));\n console.log(\n chalk.green(\n `✅ Server: http://${config.getHost()}:${config.getPort()}`\n )\n );\n console.log(\n chalk.green(\n `🌐 Public URL: http://${config.getPublicHost()}:${config.getPort()}`\n )\n );\n console.log(chalk.green(`📁 Data: ${config.getDataDir()}`));\n console.log(\n chalk.green(\n `📋 Health: http://${config.getHost()}:${config.getPort()}/healthz`\n )\n );\n console.log(\n chalk.green(\n `📊 Stats: http://${config.getHost()}:${config.getPort()}/stats`\n )\n );\n console.log(\n chalk.blue(\n '\\n💡 Use --local flag with other commands to use local registry'\n )\n );\n } catch (error) {\n spinner.fail('Failed to start local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Stop local registry\nlocalCommand.addCommand(\n new Command('stop')\n .description('Stop local registry server')\n .action(async () => {\n const spinner = ora('Stopping local registry...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.stop();\n\n spinner.succeed('Local registry stopped');\n } catch (error) {\n spinner.fail('Failed to stop local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Status check\nlocalCommand.addCommand(\n new Command('status')\n .description('Check local registry status')\n .action(async () => {\n const spinner = ora('Checking local registry status...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const status = await server.getStatus();\n\n if (status.running) {\n spinner.succeed('Local registry is running');\n console.log(chalk.green(`✅ Server: ${status.url}`));\n console.log(chalk.green(`📁 Data: ${status.dataDir}`));\n console.log(chalk.green(`📊 Apps: ${status.appsCount} applications`));\n console.log(\n chalk.green(`📦 Artifacts: ${status.artifactsCount} artifacts`)\n );\n } else {\n spinner.warn('Local registry is not running');\n console.log(\n chalk.yellow(\n '💡 Run \"calimero-registry local start\" to start the local registry'\n )\n );\n }\n } catch (error) {\n spinner.fail('Failed to check local registry status');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Reset local data\nlocalCommand.addCommand(\n new Command('reset')\n .description('Reset local registry data')\n .option('-f, --force', 'Force reset without confirmation')\n .action(async options => {\n if (!options.force) {\n console.log(\n chalk.yellow('⚠️ This will delete all local registry data!')\n );\n console.log(chalk.yellow(' Use --force flag to confirm'));\n return;\n }\n\n const spinner = ora('Resetting local registry data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.reset();\n\n spinner.succeed('Local registry data reset');\n console.log(chalk.green('✅ All local data has been cleared'));\n } catch (error) {\n spinner.fail('Failed to reset local registry data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Backup local data\nlocalCommand.addCommand(\n new Command('backup')\n .description('Backup local registry data')\n .option('-o, --output <file>', 'Output file path')\n .action(async options => {\n const spinner = ora('Creating backup...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const backupPath = await server.backup(options.output);\n\n spinner.succeed('Backup created successfully');\n console.log(chalk.green(`📦 Backup saved to: ${backupPath}`));\n } catch (error) {\n spinner.fail('Failed to create backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Restore from backup\nlocalCommand.addCommand(\n new Command('restore')\n .description('Restore local registry data from backup')\n .argument('<backup-file>', 'Path to backup file')\n .action(async backupFile => {\n const spinner = ora('Restoring from backup...').start();\n\n try {\n if (!fs.existsSync(backupFile)) {\n spinner.fail('Backup file not found');\n console.error(chalk.red(`File not found: ${backupFile}`));\n process.exit(1);\n }\n\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.restore(backupFile);\n\n spinner.succeed('Data restored successfully');\n console.log(chalk.green(`✅ Restored from: ${backupFile}`));\n } catch (error) {\n spinner.fail('Failed to restore from backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Seed with sample data\nlocalCommand.addCommand(\n new Command('seed')\n .description('Seed local registry with sample data')\n .action(async () => {\n const spinner = ora('Seeding local registry with sample data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.seed();\n\n spinner.succeed('Sample data seeded successfully');\n console.log(\n chalk.green('✅ Local registry populated with sample applications')\n );\n console.log(\n chalk.blue(\n '💡 Run \"calimero-registry bundle get com.calimero.sample-bundle 1.0.0 --local\" to see the sample bundle'\n )\n );\n } catch (error) {\n spinner.fail('Failed to seed sample data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\nexport { localCommand };\n","/**\n * Multi-service bundle helpers.\n *\n * A bundle always has a MAIN application (manifest.wasm / manifest.abi, packed\n * as `app.wasm` / `abi.json`). A multi-service bundle additionally ships one or\n * more named SERVICE WASMs alongside the main app — e.g. a \"tictactoe\" main app\n * with a \"lobby\" matchmaking service. Service artifacts are packed under\n * `services/<name>.wasm` (+ optional `services/<name>.abi.json`).\n *\n * These helpers are pure (no I/O) so they can be unit-tested in isolation; the\n * `bundle` command wires them to the filesystem.\n */\n\nimport type { BundleManifest } from './local-storage.js';\n\n/** Source-file references for a service, as authored on the CLI or in a manifest config file. */\nexport interface ServiceSource {\n name: string;\n wasm: string; // path to the service WASM file\n abi?: string; // optional path to the service ABI JSON file\n}\n\n/**\n * Service names must be filesystem-safe and collision-free with the main\n * `app.wasm`.\n *\n * NOTE: this regex and the rules in {@link validateServiceName} (≤64 chars,\n * not \"app\") are mirrored backend-side in\n * packages/backend/src/lib/bundle-storage-kv.js (storeBundleManifest). They are\n * not shared at the module level (ESM/TS CLI vs CJS backend), so any change\n * here must be reflected there and vice versa.\n */\nconst SERVICE_NAME_RE = /^[a-z0-9][a-z0-9_-]*$/;\n\n/**\n * Validate a service name. Names become path segments (`services/<name>.wasm`),\n * so they must be lowercase, free of separators, and not the reserved main name.\n * @throws Error on an invalid name.\n */\nexport function validateServiceName(name: string): void {\n // Guard the runtime type: `name` is typed string, but it often comes from\n // parsed manifest JSON, where it could be a number/boolean/etc. Without this,\n // `RegExp.test(123)` would coerce to \"123\" and pass, and a numeric 123 would\n // be treated as distinct from the string \"123\" by the uniqueness check while\n // colliding on the same `services/123.wasm` path.\n if (typeof name !== 'string' || !SERVICE_NAME_RE.test(name)) {\n throw new Error(\n `Invalid service name \"${name}\". Use lowercase letters, digits, \"-\" or \"_\" (must start alphanumeric).`\n );\n }\n // Bound the length so it can't blow past filesystem path-component limits\n // (most systems cap a component at 255 bytes; \"<name>.abi.json\" adds 9).\n if (name.length > 64) {\n throw new Error(\n `Invalid service name \"${name}\": must be at most 64 characters.`\n );\n }\n if (name === 'app') {\n throw new Error(\n 'Service name \"app\" is reserved for the main application. Choose another name.'\n );\n }\n}\n\n/**\n * Parse a `--service` CLI spec of the form:\n * `name=path/to.wasm`\n * `name=path/to.wasm,abi=path/to-abi.json`\n *\n * The ABI segment is optional. Whitespace around tokens is trimmed.\n * @throws Error on a malformed spec.\n */\nexport function parseServiceSpec(spec: string): ServiceSource {\n const eq = spec.indexOf('=');\n if (eq === -1) {\n throw new Error(\n `Invalid --service \"${spec}\". Expected \"name=path.wasm\" or \"name=path.wasm,abi=path.json\".`\n );\n }\n const name = spec.slice(0, eq).trim();\n let rest = spec.slice(eq + 1).trim();\n\n let abi: string | undefined;\n // Optional \",abi=<path>\" tail, tolerant of whitespace around the separator.\n // The abi value may not contain a comma ([^,]*), so a stray second \",abi=\"\n // leaves a comma in the WASM path and is caught by the check below. The `*`\n // (not `+`) still matches an empty value so it reports \"empty abi path\".\n const abiMatch = rest.match(/,\\s*abi\\s*=\\s*([^,]*)$/);\n if (abiMatch) {\n abi = abiMatch[1].trim();\n rest = rest.slice(0, abiMatch.index).trim();\n if (!abi) {\n throw new Error(`Invalid --service \"${spec}\": empty abi path.`);\n }\n }\n\n const wasm = rest;\n if (!wasm) {\n throw new Error(`Invalid --service \"${spec}\": missing WASM path.`);\n }\n // A comma here means either a comma in the WASM path (unsupported — it would\n // be silently truncated) or a malformed abi tail (e.g. \",ab=\" / \",abi\"). Fail\n // loudly rather than packing the wrong file.\n if (wasm.includes(',')) {\n throw new Error(\n `Invalid --service \"${spec}\": unexpected comma in WASM path. Use \"name=path.wasm,abi=path.json\"; commas in paths are not supported.`\n );\n }\n\n validateServiceName(name);\n return abi ? { name, wasm, abi } : { name, wasm };\n}\n\n/** The in-bundle artifact path for a service's WASM (e.g. \"services/lobby.wasm\"). */\nexport function serviceWasmPath(name: string): string {\n return `services/${name}.wasm`;\n}\n\n/** The in-bundle artifact path for a service's ABI (e.g. \"services/lobby.abi.json\"). */\nexport function serviceAbiPath(name: string): string {\n return `services/${name}.abi.json`;\n}\n\n/**\n * True if a service artifact path lives under the `services/` directory (the\n * layout {@link serviceWasmPath}/{@link serviceAbiPath} emit). Service\n * artifacts must stay under `services/` so they can't collide with the main\n * app's top-level `app.wasm` / `abi.json`. Mirrors the backend's\n * `underServicesDir` (packages/backend/src/lib/bundle-storage-kv.js) — keep the\n * two in sync.\n */\nexport function isUnderServicesDir(p: string): boolean {\n return typeof p === 'string' && /^services[\\\\/]/.test(p);\n}\n\n/**\n * Reject duplicate service names across the merged set (CLI + manifest config).\n * @throws Error listing the first duplicate found.\n */\nexport function assertUniqueServiceNames(services: ServiceSource[]): void {\n const seen = new Set<string>();\n for (const s of services) {\n if (seen.has(s.name)) {\n throw new Error(`Duplicate service name \"${s.name}\".`);\n }\n seen.add(s.name);\n }\n}\n\n/**\n * Reject an archive path that isn't a safe, bundle-relative path. A `.mpk`\n * unpacked from an untrusted source (or a hand-crafted manifest) could carry a\n * `path` like `/etc/passwd` or `../../x`; packing such a path would read files\n * from outside the bundle directory. Paths must be relative, non-empty, and\n * free of any `.` or `..` segment (checked against both separators for\n * cross-platform safety). Our generated paths (`app.wasm`, `abi.json`,\n * `services/<name>.wasm`) never contain a dot *segment*, so rejecting them is\n * safe and keeps the guard strict.\n * @throws Error on an unsafe path.\n */\nexport function assertSafeBundlePath(p: string): void {\n const segments = p.split(/[\\\\/]/);\n if (\n !p ||\n p.startsWith('/') ||\n /^[a-zA-Z]:/.test(p) ||\n segments.includes('..') ||\n segments.includes('.') ||\n segments.includes('')\n ) {\n throw new Error(\n `Unsafe bundle path \"${p}\": must be a non-empty relative path with no \".\" or \"..\" segments.`\n );\n }\n}\n\n/**\n * Collect the list of files (relative to the bundle directory) that a manifest\n * references and that must therefore be packed into the `.mpk`. Always includes\n * `manifest.json` and the main `wasm.path`; includes the main `abi.path` and\n * each service's `wasm.path` / `abi.path` when present.\n *\n * Every referenced path is checked with {@link assertSafeBundlePath} so a\n * crafted manifest can't pull files from outside the bundle directory.\n *\n * Throws if a declared service has no `wasm.path` — packing must not silently\n * drop a service that the manifest advertises. (Callers like `bundle push`\n * also guard this earlier with a friendlier message.)\n *\n * Used by `bundle push` when packing a directory so service WASMs are not\n * silently dropped from the archive.\n */\nexport function collectBundleFiles(manifest: BundleManifest): string[] {\n const files = ['manifest.json'];\n if (manifest.wasm?.path) files.push(manifest.wasm.path);\n if (manifest.abi?.path) files.push(manifest.abi.path);\n for (const svc of manifest.services ?? []) {\n const label = svc?.name ?? '<unnamed>';\n if (!svc.wasm?.path) {\n throw new Error(\n `Service \"${label}\" has no wasm.path; cannot pack the bundle.`\n );\n }\n // Service artifacts must live under services/ (matches the backend's\n // storeBundleManifest check), so packing fails fast locally instead of\n // succeeding here and being rejected by the registry after upload.\n if (!isUnderServicesDir(svc.wasm.path)) {\n throw new Error(\n `Service \"${label}\" wasm.path \"${svc.wasm.path}\" must be under services/.`\n );\n }\n files.push(svc.wasm.path);\n if (svc.abi?.path) {\n if (!isUnderServicesDir(svc.abi.path)) {\n throw new Error(\n `Service \"${label}\" abi.path \"${svc.abi.path}\" must be under services/.`\n );\n }\n files.push(svc.abi.path);\n }\n }\n files.forEach(assertSafeBundlePath);\n // De-dupe while preserving order (a malformed manifest could repeat a path).\n return [...new Set(files)];\n}\n","/**\n * Bundle Management Commands\n *\n * Implements:\n * - bundle push <file.mpk>\n * - bundle get <package> <version>\n */\n\nimport { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport * as tar from 'tar';\nimport crypto from 'crypto';\nimport {\n LocalDataStore,\n BundleManifest,\n BundleServiceEntry,\n} from '../lib/local-storage.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport { LocalArtifactServer } from '../lib/local-artifacts.js';\nimport { RemoteConfig } from '../lib/remote-config.js';\nimport {\n ServiceSource,\n parseServiceSpec,\n validateServiceName,\n serviceWasmPath,\n serviceAbiPath,\n assertUniqueServiceNames,\n collectBundleFiles,\n} from '../lib/services.js';\n\n/**\n * The push body: the signed manifest as it stands, plus the two `_`-prefixed\n * transient fields the server strips before checking the signature.\n *\n * Extends the manifest rather than re-listing its fields. A closed list here\n * would mean a manifest field that this type does not know about is a type\n * error at the spread, pushing the next person back to copying fields by hand\n * — which is what dropped `handlers` and would have dropped `buildInfo`.\n */\ninterface BundlePushPayload extends BundleManifest {\n version: string;\n package: string;\n appVersion: string;\n _binary: string;\n _overwrite: boolean;\n}\n\ninterface ApiResponseBody {\n message?: string;\n error?: string;\n package?: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport const bundleCommand = new Command('bundle')\n .description('Manage application bundles (V2)')\n .addCommand(createCreateCommand())\n .addCommand(createPushCommand())\n .addCommand(createGetCommand())\n .addCommand(createEditCommand());\n\ninterface BundleManifestConfig {\n package?: string;\n version?: string;\n output?: string;\n name?: string;\n description?: string;\n author?: string;\n frontend?: string;\n github?: string;\n docs?: string;\n exports?: string[];\n uses?: string[];\n abi?: string | BundleManifest['abi']; // Can be file path string or BundleArtifact object\n /** Additional services, each referencing source file paths (relative to this manifest). */\n services?: ServiceSource[];\n}\n\nfunction createCreateCommand(): Command {\n return new Command('create')\n .description('Create an MPK bundle from a WASM file')\n .argument('<wasm-file>', 'Path to the WASM file')\n .argument('[package]', 'Package name (e.g. com.calimero.myapp)')\n .argument('[version]', 'Version (e.g. 1.0.0)')\n .option(\n '-m, --manifest <path>',\n 'Path to manifest JSON file (can contain package, version, and other options)'\n )\n .option('-o, --output <path>', 'Output path for the MPK file')\n .option('--name <name>', 'Application name')\n .option('--description <description>', 'Application description')\n .option('--author <author>', 'Application author')\n .option('--frontend <url>', 'Frontend URL')\n .option('--github <url>', 'GitHub URL')\n .option('--docs <url>', 'Documentation URL')\n .option(\n '--export <interface>',\n 'Export interface (can be specified multiple times)',\n (value: string, prev: string[] = []) => {\n return [...prev, value];\n }\n )\n .option(\n '--use <interface>',\n 'Use interface (can be specified multiple times)',\n (value: string, prev: string[] = []) => {\n return [...prev, value];\n }\n )\n .option('--abi <path>', 'Path to ABI JSON file to include in bundle')\n .option(\n '--service <spec>',\n 'Add a service WASM alongside the main app: \"name=path.wasm\" or \"name=path.wasm,abi=path.json\" (repeatable)',\n (value, prev: ServiceSource[]) => {\n return [...(prev || []), parseServiceSpec(value)];\n }\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json -o output.mpk\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --name \"My App\" --frontend https://app.example.com\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --abi abi.json\n $ calimero-registry bundle create app.wasm --manifest manifest.json --abi res/abi.json\n $ calimero-registry bundle create tictactoe.wasm com.calimero.ttt 1.0.0 --service lobby=lobby.wasm,abi=lobby-abi.json\n\nManifest File Format (JSON):\n {\n \"package\": \"com.calimero.myapp\",\n \"version\": \"1.0.0\",\n \"output\": \"./dist/myapp.mpk\",\n \"name\": \"My Application\",\n \"description\": \"Application description\",\n \"author\": \"Calimero Team\",\n \"frontend\": \"https://app.example.com\",\n \"github\": \"https://github.com/user/repo\",\n \"docs\": \"https://docs.example.com\",\n \"exports\": [\"interface1\", \"interface2\"],\n \"uses\": [\"interface3\"],\n \"abi\": \"res/abi.json\",\n \"services\": [\n { \"name\": \"lobby\", \"wasm\": \"res/lobby.wasm\", \"abi\": \"res/lobby-abi.json\" }\n ]\n }\n\nNote:\n - Package and version can be provided via arguments, manifest file, or both\n - CLI arguments take precedence over manifest file values\n - If using manifest file, package and version can be omitted from command line\n - The -o/--output option overrides manifest.output if both are provided\n - ABI can be provided via --abi flag or manifest.abi field (file path string)\n - ABI file will be included in the bundle and referenced in the manifest\n - The main app is always packed as app.wasm; services are packed under services/<name>.wasm\n - Services merge from --service flags and manifest.services; names must be unique\n`\n )\n .action(async (wasmFile, pkg, version, options) => {\n try {\n // Read manifest file if provided\n let manifestConfig: BundleManifestConfig = {};\n if (options.manifest) {\n const manifestPath = path.resolve(options.manifest);\n if (!fs.existsSync(manifestPath)) {\n console.error(`❌ Manifest file not found: ${options.manifest}`);\n process.exit(1);\n }\n try {\n const manifestContent = fs.readFileSync(manifestPath, 'utf8');\n const parsed = JSON.parse(manifestContent);\n\n // Validate that parsed JSON is an object\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n console.error(`❌ Invalid manifest file: ${options.manifest}`);\n console.error(' Manifest must be a JSON object');\n process.exit(1);\n }\n\n manifestConfig = parsed as BundleManifestConfig;\n } catch (error) {\n console.error(\n `❌ Failed to parse manifest file: ${options.manifest}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n }\n\n // Merge manifest with CLI options (CLI takes precedence)\n const finalPackage = pkg || manifestConfig.package;\n const finalVersion = version || manifestConfig.version;\n const finalOutput = options.output || manifestConfig.output;\n const finalName = options.name || manifestConfig.name;\n const finalDescription =\n options.description || manifestConfig.description;\n const finalAuthor =\n options.author || manifestConfig.author || 'Calimero Team';\n const finalFrontend = options.frontend || manifestConfig.frontend;\n const finalGithub = options.github || manifestConfig.github;\n const finalDocs = options.docs || manifestConfig.docs;\n\n // Validate and extract array options (CLI takes precedence - if CLI provides values, use only those)\n const manifestExports = manifestConfig.exports;\n const manifestUses = manifestConfig.uses;\n\n // Validate manifest array fields are actually arrays\n if (manifestExports !== undefined && !Array.isArray(manifestExports)) {\n console.error('❌ Invalid manifest: \"exports\" must be an array');\n process.exit(1);\n }\n if (manifestUses !== undefined && !Array.isArray(manifestUses)) {\n console.error('❌ Invalid manifest: \"uses\" must be an array');\n process.exit(1);\n }\n if (\n manifestConfig.services !== undefined &&\n !Array.isArray(manifestConfig.services)\n ) {\n console.error('❌ Invalid manifest: \"services\" must be an array');\n process.exit(1);\n }\n\n // CLI options take precedence - if CLI provides exports/uses, use only those\n const finalExports =\n options.export && options.export.length > 0\n ? options.export\n : manifestExports || [];\n const finalUses =\n options.use && options.use.length > 0\n ? options.use\n : manifestUses || [];\n\n // Validate required parameters\n if (!wasmFile) {\n console.error('❌ WASM file is required');\n process.exit(1);\n }\n\n if (!finalPackage) {\n console.error(\n '❌ Package name is required (provide via argument, --manifest file, or manifest.package)'\n );\n process.exit(1);\n }\n\n if (!finalVersion) {\n console.error(\n '❌ Version is required (provide via argument, --manifest file, or manifest.version)'\n );\n process.exit(1);\n }\n\n // Validate package name format (basic validation)\n // Allow hyphens consistently in all segments: com.calimero.my-app, com.my-org.app, etc.\n if (!/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/.test(finalPackage)) {\n console.error(\n '❌ Invalid package name format. Expected format: com.calimero.myapp or com.my-org.my-app'\n );\n process.exit(1);\n }\n\n // Validate version format (semver-like)\n // Allow dots and hyphens in prerelease and build metadata: 1.0.0-alpha.1, 1.0.0-rc.2+build.1\n if (\n !/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.-]+)?(\\+[a-z0-9.-]+)?$/i.test(finalVersion)\n ) {\n console.error(\n '❌ Invalid version format. Expected format: 1.0.0, 1.0.0-alpha, or 1.0.0-alpha.1'\n );\n process.exit(1);\n }\n\n const wasmPath = path.resolve(wasmFile);\n if (!fs.existsSync(wasmPath)) {\n console.error(`❌ WASM file not found: ${wasmFile}`);\n process.exit(1);\n }\n\n console.log(`📦 Creating MPK bundle from: ${path.basename(wasmPath)}`);\n\n // Read WASM file\n const wasmContent = fs.readFileSync(wasmPath);\n const wasmSize = wasmContent.length;\n\n // Calculate SHA256 hash\n const wasmHash = crypto\n .createHash('sha256')\n .update(wasmContent)\n .digest('hex');\n\n // Handle ABI file (CLI option takes precedence over manifest)\n let abiArtifact: BundleManifest['abi'] = undefined;\n let abiContent: Buffer | null = null;\n const abiPathFromOption = options.abi;\n const abiPathFromManifest =\n typeof manifestConfig.abi === 'string' ? manifestConfig.abi : null;\n\n // Determine ABI file path (CLI option takes precedence)\n const abiFilePath = abiPathFromOption || abiPathFromManifest;\n\n if (abiFilePath) {\n // Resolve ABI file path:\n // - CLI option (--abi) is always relative to cwd (consistent with WASM file handling)\n // - Manifest abi field is relative to manifest file directory\n const abiResolvedPath = abiPathFromOption\n ? path.resolve(abiFilePath) // CLI option: always resolve relative to cwd\n : options.manifest && abiPathFromManifest\n ? path.resolve(\n path.dirname(path.resolve(options.manifest)),\n abiFilePath\n ) // Manifest field: resolve relative to manifest directory\n : path.resolve(abiFilePath); // Fallback: resolve relative to cwd\n\n if (!fs.existsSync(abiResolvedPath)) {\n console.error(`❌ ABI file not found: ${abiFilePath}`);\n console.error(` Resolved path: ${abiResolvedPath}`);\n process.exit(1);\n }\n\n // Read ABI file\n try {\n abiContent = fs.readFileSync(abiResolvedPath);\n // Validate it's valid JSON\n JSON.parse(abiContent.toString('utf8'));\n\n // Calculate ABI hash\n const abiHash = crypto\n .createHash('sha256')\n .update(abiContent)\n .digest('hex');\n\n // Create ABI artifact\n abiArtifact = {\n path: 'abi.json',\n hash: abiHash,\n size: abiContent.length,\n };\n console.log(\n ` Including ABI file: ${path.basename(abiResolvedPath)}`\n );\n } catch (error) {\n console.error(\n `❌ Failed to read or parse ABI file: ${abiFilePath}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n } else if (\n manifestConfig.abi &&\n typeof manifestConfig.abi === 'object'\n ) {\n // If manifest provides ABI as an object (BundleArtifact), we need the actual file\n // to include in the bundle. The object only contains metadata (path, hash, size)\n // but not the source file location. Since we're in this branch, options.abi is falsy\n // (otherwise we'd be in the first if branch), so we can't include the file.\n console.error(\n '❌ Manifest provides ABI as object, but --abi flag is required to include the ABI file in bundle'\n );\n console.error(\n ' Provide the ABI file path with --abi flag, or change manifest.abi to a file path string'\n );\n process.exit(1);\n }\n\n // Handle services (additional WASMs alongside the main app).\n // Sources come from --service flags (paths relative to cwd) and/or the\n // manifest's \"services\" array (paths relative to the manifest file).\n const cliServices: ServiceSource[] = options.service || [];\n const manifestServices: ServiceSource[] = Array.isArray(\n manifestConfig.services\n )\n ? manifestConfig.services\n : [];\n const manifestDir = options.manifest\n ? path.dirname(path.resolve(options.manifest))\n : process.cwd();\n\n const allServiceSources: { src: ServiceSource; baseDir: string }[] = [\n ...cliServices.map(src => ({ src, baseDir: process.cwd() })),\n ...manifestServices.map(src => ({ src, baseDir: manifestDir })),\n ];\n\n const serviceArtifacts: BundleServiceEntry[] = [];\n // Relative archive path -> file content, written into outputDir below.\n const serviceFilesToWrite: { relPath: string; content: Buffer }[] = [];\n\n // Validate every service name BEFORE checking uniqueness, so a bad name\n // reports a name error rather than a misleading \"duplicate\" one. CLI\n // entries were already validated in parseServiceSpec; re-checking is\n // harmless and also covers manifest entries (which skip that path).\n for (const { src } of allServiceSources) {\n try {\n validateServiceName(src.name);\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n }\n\n // Then reject duplicate names (covers --service + manifest overlap).\n try {\n assertUniqueServiceNames(allServiceSources.map(s => s.src));\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n\n for (const { src, baseDir } of allServiceSources) {\n // Guard runtime types: manifest-config entries are parsed JSON, so\n // `wasm`/`abi` could be objects (e.g. a BundleArtifact copied from a\n // built manifest) rather than file-path strings. Without this,\n // path.resolve would coerce an object to \"[object Object]\" and yield\n // a misleading \"not found\" error.\n if (typeof src.wasm !== 'string' || src.wasm.length === 0) {\n console.error(\n `❌ Service \"${src.name}\" wasm must be a file path string.`\n );\n process.exit(1);\n }\n if (\n src.abi !== undefined &&\n (typeof src.abi !== 'string' || src.abi.length === 0)\n ) {\n console.error(\n `❌ Service \"${src.name}\" abi must be a file path string.`\n );\n process.exit(1);\n }\n\n // Resolve + read the service WASM.\n const svcWasmPath = path.resolve(baseDir, src.wasm);\n if (!fs.existsSync(svcWasmPath)) {\n console.error(\n `❌ Service \"${src.name}\" WASM not found: ${src.wasm}`\n );\n console.error(` Resolved path: ${svcWasmPath}`);\n process.exit(1);\n }\n const svcWasmContent = fs.readFileSync(svcWasmPath);\n const svcWasmHash = crypto\n .createHash('sha256')\n .update(svcWasmContent)\n .digest('hex');\n const wasmArchivePath = serviceWasmPath(src.name);\n\n const entry: BundleServiceEntry = {\n name: src.name,\n wasm: {\n path: wasmArchivePath,\n hash: svcWasmHash,\n size: svcWasmContent.length,\n },\n };\n serviceFilesToWrite.push({\n relPath: wasmArchivePath,\n content: svcWasmContent,\n });\n\n // Resolve + read the optional service ABI.\n if (src.abi) {\n const svcAbiPath = path.resolve(baseDir, src.abi);\n if (!fs.existsSync(svcAbiPath)) {\n console.error(\n `❌ Service \"${src.name}\" ABI not found: ${src.abi}`\n );\n console.error(` Resolved path: ${svcAbiPath}`);\n process.exit(1);\n }\n const svcAbiContent = fs.readFileSync(svcAbiPath);\n try {\n JSON.parse(svcAbiContent.toString('utf8'));\n } catch (error) {\n console.error(\n `❌ Service \"${src.name}\" ABI is not valid JSON: ${src.abi}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n const svcAbiHash = crypto\n .createHash('sha256')\n .update(svcAbiContent)\n .digest('hex');\n const abiArchivePath = serviceAbiPath(src.name);\n entry.abi = {\n path: abiArchivePath,\n hash: svcAbiHash,\n size: svcAbiContent.length,\n };\n serviceFilesToWrite.push({\n relPath: abiArchivePath,\n content: svcAbiContent,\n });\n }\n\n serviceArtifacts.push(entry);\n console.log(\n ` Including service: ${src.name} (${path.basename(svcWasmPath)})`\n );\n }\n\n // Build metadata\n const metadata: {\n name: string;\n description: string;\n author: string;\n } = {\n name: finalName || finalPackage,\n description: finalDescription || '',\n author: finalAuthor,\n };\n\n // Build links if provided\n const links: {\n frontend?: string;\n github?: string;\n docs?: string;\n } = {};\n if (finalFrontend) links.frontend = finalFrontend;\n if (finalGithub) links.github = finalGithub;\n if (finalDocs) links.docs = finalDocs;\n\n // Build interfaces\n const interfaces = {\n exports: finalExports,\n uses: finalUses,\n };\n\n // Create bundle manifest\n const manifest: BundleManifest = {\n version: '1.0',\n package: finalPackage,\n appVersion: finalVersion,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n interfaces:\n interfaces.exports.length > 0 || interfaces.uses.length > 0\n ? interfaces\n : undefined,\n wasm: {\n path: 'app.wasm',\n hash: wasmHash,\n size: wasmSize,\n },\n abi: abiArtifact || undefined,\n services: serviceArtifacts.length > 0 ? serviceArtifacts : undefined,\n migrations: [],\n links: Object.keys(links).length > 0 ? links : undefined,\n signature: undefined,\n };\n\n // Determine output directory\n let outputDir = finalOutput\n ? path.resolve(finalOutput)\n : path.join(process.cwd(), finalPackage, finalVersion);\n\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write manifest.json\n fs.writeFileSync(\n path.join(outputDir, 'manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Copy WASM file as app.wasm\n fs.writeFileSync(path.join(outputDir, 'app.wasm'), wasmContent);\n\n // Copy ABI file if provided\n if (abiContent) {\n fs.writeFileSync(path.join(outputDir, 'abi.json'), abiContent);\n }\n\n // Copy service files (under services/) preserving their archive paths.\n // Assert each destination stays inside outputDir/services/ — defence in\n // depth against a crafted name escaping the directory (e.g. \"../app\"),\n // independent of validateServiceName. Uses path.relative so the check\n // is correct regardless of OS path separator.\n const servicesDir = path.join(outputDir, 'services');\n for (const { relPath, content } of serviceFilesToWrite) {\n const dest = path.join(outputDir, relPath);\n const rel = path.relative(servicesDir, dest);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n console.error(\n `❌ Refusing to write service file outside services/: ${relPath}`\n );\n process.exit(1);\n }\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.writeFileSync(dest, content);\n }\n\n console.log(`✅ Bundle files written to: ${outputDir}`);\n console.log(` Package: ${finalPackage}`);\n console.log(` Version: ${finalVersion}`);\n console.log(` WASM Hash: ${wasmHash}`);\n if (abiArtifact) {\n console.log(` ABI Hash: ${abiArtifact.hash}`);\n }\n if (serviceArtifacts.length > 0) {\n console.log(\n ` Services: ${serviceArtifacts.map(s => s.name).join(', ')}`\n );\n }\n console.log('');\n console.log('Next steps:');\n console.log(\n ` 1. Sign the manifest: mero-sign sign ${path.join(outputDir, 'manifest.json')} --key key.json`\n );\n console.log(\n ` 2. Push the bundle: calimero-registry bundle push ${outputDir} --remote`\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n console.error('❌ Failed to create bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createPushCommand(): Command {\n return new Command('push')\n .description(\n 'Push a bundle (.mpk) to the registry (local or remote). Defaults to local registry.'\n )\n .argument('<bundle-file>', 'Path to the .mpk bundle file')\n .option('--local', 'Push to local registry instance (default)')\n .option('--remote', 'Push to remote registry instance')\n .option(\n '--url <registry-url>',\n 'Registry URL for remote push (overrides config file)'\n )\n .option(\n '--api-key <key>',\n 'API key for authentication (overrides config file and env var)'\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle push bundle.mpk --local\n $ calimero-registry bundle push bundle.mpk --remote\n $ calimero-registry bundle push bundle.mpk --remote --url https://apps.calimero.network\n $ calimero-registry bundle push bundle.mpk --remote --api-key your-api-key\n\nConfiguration:\n Set defaults using the config command:\n $ calimero-registry config set registry-url https://apps.calimero.network\n $ calimero-registry config set api-key your-api-key\n \n Or use environment variables:\n $ export CALIMERO_REGISTRY_URL=https://apps.calimero.network\n $ export CALIMERO_API_KEY=your-api-key\n\nNote:\n - Use --local for development/testing with local registry\n - Use --remote for production deployments\n - Config file values are used unless overridden by flags or environment variables\n - Priority: flag > environment variable > config file > default\n`\n )\n .action(async (bundleFile, options) => {\n let mpkPath: string;\n let tempMpk: string | null = null;\n try {\n // Warn if remote-only options are used without --remote\n if (!options.remote && (options.url || options.apiKey)) {\n console.warn(\n '⚠️ Warning: --url and --api-key are only used with --remote flag'\n );\n console.warn(\n ' These options will be ignored. Use --remote to push to remote registry.'\n );\n }\n\n // Determine mode: default to local if neither flag is set\n // Handle explicit false from --no-local flag\n const useLocal =\n options.local === false\n ? false\n : options.local === true\n ? true\n : !options.remote;\n const useRemote = options.remote === true;\n\n // Ensure mutually exclusive flags\n if (options.local && options.remote) {\n console.error('❌ Cannot use both --local and --remote flags');\n process.exit(1);\n }\n\n // Ensure at least one mode is selected\n if (!useLocal && !useRemote) {\n console.error(\n '❌ No push mode specified. Use --local or --remote flag'\n );\n process.exit(1);\n }\n\n const fullPath = path.resolve(bundleFile);\n if (!fs.existsSync(fullPath)) {\n console.error(`❌ File not found: ${bundleFile}`);\n process.exit(1);\n }\n\n // If a directory is given, pack it into a temp .mpk first\n mpkPath = fullPath;\n\n if (fs.statSync(fullPath).isDirectory()) {\n const manifestInDir = path.join(fullPath, 'manifest.json');\n const wasmInDir = path.join(fullPath, 'app.wasm');\n if (!fs.existsSync(manifestInDir)) {\n console.error(\n `❌ manifest.json not found in directory: ${fullPath}`\n );\n process.exit(1);\n }\n if (!fs.existsSync(wasmInDir)) {\n console.error(`❌ app.wasm not found in directory: ${fullPath}`);\n process.exit(1);\n }\n tempMpk = path.join(fullPath, `.temp-push-${Date.now()}.mpk`);\n\n // Derive the file list from the manifest so service WASMs (and any\n // ABIs) are packed, not just the main app. manifest.json is required\n // and was verified above, so a parse failure is a hard error — never\n // fall back silently, which would drop service files from the archive\n // while still reporting success.\n let dirManifest: BundleManifest;\n try {\n dirManifest = JSON.parse(\n fs.readFileSync(manifestInDir, 'utf8')\n ) as BundleManifest;\n } catch (e) {\n console.error(\n `❌ Failed to parse manifest.json in ${fullPath}: ${\n e instanceof Error ? e.message : String(e)\n }`\n );\n console.error(\n ' Fix the manifest JSON and retry (service files would otherwise be silently omitted).'\n );\n process.exit(1);\n }\n\n // A bundle must declare its main app WASM; without it the archive\n // would omit app.wasm and still \"succeed\".\n if (!dirManifest.wasm?.path) {\n console.error(\n '❌ manifest.json has no main wasm (wasm.path). A bundle must include its main application.'\n );\n process.exit(1);\n }\n\n // Each declared service must carry a wasm.path; otherwise it would be\n // listed in the manifest but silently dropped from the archive.\n for (const svc of dirManifest.services ?? []) {\n if (!svc?.wasm?.path) {\n console.error(\n `❌ Service \"${svc?.name ?? '<unnamed>'}\" in manifest.json has no wasm.path.`\n );\n process.exit(1);\n }\n }\n\n // Collect the files to pack; rejects unsafe paths (absolute / \"..\")\n // that a crafted manifest could use to read outside the directory.\n let archiveFiles: string[];\n try {\n archiveFiles = collectBundleFiles(dirManifest);\n } catch (e) {\n console.error(`❌ ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n\n // Verify every referenced file exists before packing.\n for (const f of archiveFiles) {\n if (!fs.existsSync(path.join(fullPath, f))) {\n console.error(\n `❌ Bundle file referenced by manifest not found: ${f}`\n );\n process.exit(1);\n }\n }\n\n await tar.create(\n { gzip: true, file: tempMpk, cwd: fullPath },\n archiveFiles\n );\n mpkPath = tempMpk;\n console.log(\n `📦 Packed directory into temporary bundle (${archiveFiles.length} files)`\n );\n }\n\n console.log(`📦 Processing bundle: ${path.basename(mpkPath)}`);\n\n // 1. Read bundle and extract manifest\n const manifest = await extractManifest(mpkPath);\n\n if (!manifest) {\n console.error('❌ manifest.json not found in bundle');\n process.exit(1);\n }\n\n // 2. Validate manifest\n if (!manifest.package || !manifest.appVersion) {\n console.error('❌ Invalid manifest: missing package or appVersion');\n process.exit(1);\n }\n\n console.log(` Package: ${manifest.package}`);\n console.log(` Version: ${manifest.appVersion}`);\n if (manifest.metadata) {\n console.log(` Name: ${manifest.metadata.name}`);\n }\n\n // 3. Store (Local Mode)\n if (useLocal) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const artifactServer = new LocalArtifactServer(config, store);\n\n // Copy bundle artifact to local storage\n const bundleFilename = `${manifest.package}-${manifest.appVersion}.mpk`;\n const targetPath = await artifactServer.copyArtifactToLocal(\n mpkPath,\n manifest.package,\n manifest.appVersion,\n bundleFilename\n );\n\n console.log(` Artifact stored: ${targetPath}`);\n\n // Update manifest with local artifact path/url?\n // Actually, for V2 bundles, the registry serves the whole .mpk.\n // The manifest inside the registry is metadata.\n // We might want to store the bundle download URL in the manifest we serve via API?\n // Or just keep it implicit (API constructs download link).\n\n // For local-storage, we can add a field to track where the .mpk is.\n // But LocalDataStore mainly stores the JSON.\n // The artifacts are stored by convention in artifacts/package/version/.\n\n store.setBundleManifest(\n manifest.package,\n manifest.appVersion,\n manifest\n );\n console.log('✅ Bundle manifest registered locally');\n console.log(\n ` Run 'calimero-registry bundle get ${manifest.package} ${manifest.appVersion}' to verify`\n );\n } else if (useRemote) {\n // Remote Mode: Push to remote registry\n // Get values from config file, with flag/environment variable overrides\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n await pushToRemote(mpkPath, manifest, registryUrl, apiKey);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Failed to push bundle:', message);\n process.exit(1);\n } finally {\n if (tempMpk && fs.existsSync(tempMpk)) {\n fs.rmSync(tempMpk);\n }\n }\n });\n}\n\nfunction createGetCommand(): Command {\n return new Command('get')\n .description('Get bundle manifest')\n .argument('<package>', 'Package name (e.g. com.calimero.kv)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--local', 'Use local registry', true)\n .action(async (pkg, version, options) => {\n try {\n if (options.local) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const manifest = store.getBundleManifest(pkg, version);\n\n if (manifest) {\n console.log(JSON.stringify(manifest, null, 2));\n } else {\n console.error(`❌ Manifest not found: ${pkg}@${version}`);\n process.exit(1);\n }\n } else {\n console.error('❌ Remote get not implemented yet');\n process.exit(1);\n }\n } catch (error) {\n console.error('❌ Error:', error);\n process.exit(1);\n }\n });\n}\n\nfunction createEditCommand(): Command {\n return new Command('edit')\n .description(\n 'Edit package metadata (name, description, author, links). Use --remote to talk to the registry. Either supply --manifest (signed manifest file to PATCH) or use options to fetch, modify, and output a manifest for you to sign.'\n )\n .argument('<package>', 'Package name (e.g. com.calimero.myapp)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--remote', 'Use remote registry (required for edit)')\n .option('--url <registry-url>', 'Registry URL (overrides config)')\n .option('--api-key <key>', 'API key for remote (overrides config and env)')\n .option(\n '--manifest <path>',\n 'Path to signed manifest to PATCH (if omitted, GET + apply options + write file + instructions)'\n )\n .option(\n '-o, --output <path>',\n 'Where to write modified manifest when not using --manifest (default: manifest.json)'\n )\n .option('--name <name>', 'Set metadata.name')\n .option('--description <description>', 'Set metadata.description')\n .option('--author <author>', 'Set metadata.author (use \"\" to clear)')\n .option('--frontend <url>', 'Set links.frontend')\n .option('--github <url>', 'Set links.github')\n .option('--docs <url>', 'Set links.docs')\n .addHelpText(\n 'after',\n `\nExamples:\n # 1) Get current manifest, apply edits, write manifest.json and show sign instructions:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --name \"New Name\" --description \"New desc\" -o manifest.json\n\n # 2) After signing with mero-sign, PATCH the signed manifest:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --manifest signed-manifest.json\n\n # 3) With custom registry URL:\n $ calimero-registry bundle edit com.calimero.myapp 1.0.0 --remote --url https://apps.calimero.network --manifest signed-manifest.json\n`\n )\n .action(async (pkg, version, options) => {\n try {\n if (!options.remote) {\n console.error(\n '❌ Edit requires --remote (editing is only supported against the remote registry).'\n );\n process.exit(1);\n }\n\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n const baseUrl = registryUrl.replace(/\\/$/, '');\n const bundleUrl = `${baseUrl}/api/v2/bundles/${encodeURIComponent(pkg)}/${encodeURIComponent(version)}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;\n\n if (options.manifest) {\n // PATCH path: read manifest from file and PATCH\n const manifestPath = path.resolve(options.manifest);\n if (!fs.existsSync(manifestPath)) {\n console.error(`❌ Manifest file not found: ${options.manifest}`);\n process.exit(1);\n }\n const raw = fs.readFileSync(manifestPath, 'utf8');\n let manifest: BundleManifest;\n try {\n manifest = JSON.parse(raw) as BundleManifest;\n } catch {\n console.error(\n `❌ Invalid JSON in manifest file: ${options.manifest}`\n );\n process.exit(1);\n }\n if (manifest.package !== pkg || manifest.appVersion !== version) {\n console.error(\n `❌ Manifest package/version (${manifest.package}@${manifest.appVersion}) does not match command args (${pkg}@${version}).`\n );\n process.exit(1);\n }\n\n const res = await fetch(bundleUrl, {\n method: 'PATCH',\n headers,\n body: JSON.stringify(manifest),\n });\n const text = await res.text();\n let body: ApiResponseBody;\n try {\n body = JSON.parse(text) as ApiResponseBody;\n } catch {\n body = { message: text };\n }\n if (res.ok) {\n console.log('✅ Bundle metadata updated.');\n console.log(` Package: ${(body.package as string) || pkg}`);\n console.log(` Version: ${(body.version as string) || version}`);\n } else {\n const errMsg =\n (body.message && String(body.message).trim()) ||\n body.error ||\n text;\n console.error(`❌ PATCH failed (${res.status}): ${errMsg}`);\n process.exit(1);\n }\n return;\n }\n\n // GET path: fetch manifest, apply options, write to file, print instructions\n const res = await fetch(bundleUrl, { method: 'GET', headers });\n if (!res.ok) {\n const t = await res.text();\n let err: ApiResponseBody;\n try {\n err = JSON.parse(t) as ApiResponseBody;\n } catch {\n err = { message: t };\n }\n console.error(\n `❌ GET failed (${res.status}): ${err.error ?? err.message ?? t}`\n );\n process.exit(1);\n }\n\n const manifest = (await res.json()) as BundleManifest;\n if (manifest.package !== pkg || manifest.appVersion !== version) {\n console.error(\n '❌ Response manifest package/version does not match URL.'\n );\n process.exit(1);\n }\n\n // Apply options (only editable fields)\n if (options.name !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.name = options.name;\n }\n if (options.description !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.description = options.description;\n }\n if (options.author !== undefined) {\n if (!manifest.metadata)\n manifest.metadata = { name: '', description: '', author: '' };\n manifest.metadata.author = options.author;\n }\n if (options.frontend !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.frontend = options.frontend;\n }\n if (options.github !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.github = options.github;\n }\n if (options.docs !== undefined) {\n if (!manifest.links) manifest.links = {};\n manifest.links.docs = options.docs;\n }\n\n const outputPath = path.resolve(options.output || 'manifest.json');\n fs.writeFileSync(outputPath, JSON.stringify(manifest, null, 2));\n console.log(`✅ Wrote modified manifest to: ${outputPath}`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Sign the manifest with mero-sign:');\n console.log(` mero-sign sign ${outputPath} --key your-key.json`);\n console.log(' 2. PATCH the signed manifest:');\n console.log(\n ` calimero-registry bundle edit '${pkg}' '${version}' --remote --manifest signed-manifest.json`\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Edit failed:', message);\n process.exit(1);\n }\n });\n}\n\n// Helper to push bundle to remote registry\nasync function pushToRemote(\n bundlePath: string,\n manifest: BundleManifest,\n registryUrl: string,\n apiKey?: string\n): Promise<void> {\n try {\n console.log(`📤 Pushing to remote registry: ${registryUrl}`);\n\n // 1. Read bundle file as binary\n const bundleBuffer = fs.readFileSync(bundlePath);\n const bundleSize = bundleBuffer.length;\n console.log(` Bundle size: ${bundleSize} bytes`);\n\n // 2. Convert bundle to hex string\n const bundleHex = bundleBuffer.toString('hex');\n console.log(` Converted to hex (${bundleHex.length} characters)`);\n\n // 3. Build request payload matching API format.\n //\n // ⚠️ SPREAD THE MANIFEST. DO NOT LIST ITS FIELDS. This block used to copy\n // fields one at a time, which is a whitelist that silently drops anything\n // added to the manifest afterwards — and dropping a field is not a partial\n // send, it is a FAILED PUBLISH. The signature covers the canonical manifest\n // with only `signature` and `_`-prefixed keys excluded, so a field that\n // goes missing here changes the bytes the server hashes and the push comes\n // back `invalid_signature`, pointing at the key rather than at this copy.\n // `handlers` (deep-link slugs) and `buildInfo` (the node release the WASM\n // was built against) were both already outside the old list.\n //\n // The server's own push-file route does exactly this spread, so the two\n // publish paths now send the same bytes.\n const payload: BundlePushPayload = {\n ...manifest,\n version: manifest.version || '1.0',\n package: manifest.package,\n appVersion: manifest.appVersion,\n // Always include migrations even if empty — dropping [] changes the signed payload\n migrations: manifest.migrations ?? [],\n _binary: bundleHex,\n _overwrite: true,\n };\n\n // 4. Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided (from option or environment variable)\n const finalApiKey = apiKey || process.env.CALIMERO_API_KEY;\n if (finalApiKey) {\n headers['Authorization'] = `Bearer ${finalApiKey}`;\n }\n\n // 5. POST to remote registry\n const apiUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/push`;\n console.log(` POST ${apiUrl}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseBody: ApiResponseBody;\n try {\n responseBody = JSON.parse(responseText) as ApiResponseBody;\n } catch {\n responseBody = { message: responseText };\n }\n\n // 6. Handle response\n if (response.status === 201) {\n console.log('✅ Bundle manifest uploaded successfully');\n console.log(` Package: ${responseBody.package || manifest.package}`);\n console.log(\n ` Version: ${responseBody.version || manifest.appVersion}`\n );\n\n // 7. Verify bundle was stored correctly\n await verifyRemotePush(\n registryUrl,\n manifest.package,\n manifest.appVersion\n );\n } else {\n // Handle error responses\n handlePushError(response.status, responseBody);\n }\n } catch (fetchError: unknown) {\n clearTimeout(timeoutId);\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n console.error('❌ Request timed out after 60 seconds');\n console.error(' The bundle may be too large or the server is slow');\n process.exit(1);\n }\n throw fetchError;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('❌ Failed to push to remote registry:', message);\n throw error;\n }\n}\n\n// Helper to verify bundle was stored correctly\nasync function verifyRemotePush(\n registryUrl: string,\n packageName: string,\n version: string\n): Promise<void> {\n try {\n console.log('🔍 Verifying upload to remote registry...');\n\n const verifyUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/${packageName}/${version}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n try {\n const response = await fetch(verifyUrl, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n await response.json(); // Consume response body\n console.log('✅ Bundle verified and accessible on remote registry');\n console.log(`🌐 Registry: ${registryUrl}`);\n console.log(`🔗 Endpoint: ${verifyUrl}`);\n } else {\n console.warn(\n `⚠️ Upload verification failed - bundle not found (HTTP ${response.status})`\n );\n console.warn(' The bundle may still be processing, check manually');\n }\n } catch (verifyError: unknown) {\n clearTimeout(timeoutId);\n if (verifyError instanceof Error && verifyError.name === 'AbortError') {\n console.warn('⚠️ Verification request timed out');\n } else {\n const message =\n verifyError instanceof Error\n ? verifyError.message\n : String(verifyError);\n console.warn('⚠️ Verification request failed:', message);\n }\n console.warn(' The bundle may still be accessible, check manually');\n }\n } catch (error) {\n // Verification failure is not critical\n console.warn('⚠️ Could not verify bundle:', error);\n }\n}\n\n// Helper to handle push errors with helpful messages\nfunction handlePushError(\n statusCode: number,\n responseBody: ApiResponseBody\n): void {\n const errorMessage =\n responseBody.message || responseBody.error || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n console.error('❌ Bad Request: Invalid manifest');\n console.error(` ${errorMessage}`);\n console.error(' Check that your bundle manifest is valid');\n break;\n case 401:\n console.error('❌ Unauthorized: Authentication required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Provide an API key with --api-key or CALIMERO_API_KEY env var'\n );\n break;\n case 403:\n console.error('❌ Forbidden: Namespace ownership required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Ensure you have permission to publish to this package namespace'\n );\n break;\n case 409:\n console.error('❌ Conflict: Version already exists');\n console.error(` ${errorMessage}`);\n console.error(\n ' Increment the version number and try again, or contact registry admin'\n );\n break;\n case 500:\n console.error('❌ Internal Server Error');\n console.error(` ${errorMessage}`);\n console.error(' The registry server encountered an error');\n break;\n default:\n console.error(`❌ Upload failed with HTTP ${statusCode}`);\n console.error(` ${errorMessage}`);\n }\n\n process.exit(1);\n}\n\n// Helper to extract manifest.json from .mpk (tar.gz)\nasync function extractManifest(\n bundlePath: string\n): Promise<BundleManifest | null> {\n let manifestContent: string | null = null;\n\n await tar.t({\n file: bundlePath,\n\n onentry: (entry: tar.ReadEntry) => {\n if (entry.path === 'manifest.json') {\n // Found it\n }\n },\n });\n\n // Actual extraction\n const extractDir = path.join(path.dirname(bundlePath), `.temp-${Date.now()}`);\n if (!fs.existsSync(extractDir)) {\n fs.mkdirSync(extractDir);\n }\n\n try {\n await tar.x({\n file: bundlePath,\n cwd: extractDir,\n filter: (path: string) => path === 'manifest.json',\n });\n\n const manifestPath = path.join(extractDir, 'manifest.json');\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf8');\n manifestContent = content;\n }\n } catch {\n // ignore\n } finally {\n // Cleanup\n if (fs.existsSync(extractDir)) {\n fs.rmSync(extractDir, { recursive: true, force: true });\n }\n }\n\n if (manifestContent) {\n try {\n return JSON.parse(manifestContent) as BundleManifest;\n } catch {\n console.error('Failed to parse manifest JSON');\n return null;\n }\n }\n\n return null;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nexport const configCommand = new Command('config')\n .description('Manage CLI configuration for remote registry')\n .addCommand(createConfigSetCommand())\n .addCommand(createConfigGetCommand())\n .addCommand(createConfigListCommand())\n .addCommand(createConfigResetCommand());\n\nfunction createConfigSetCommand(): Command {\n return new Command('set')\n .description('Set a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .argument('<value>', 'Configuration value')\n .action((key, value) => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n config.setRegistryUrl(value);\n console.log(\n chalk.green(`✅ Registry URL set to: ${chalk.bold(value)}`)\n );\n break;\n\n case 'api-key':\n case 'apiKey':\n config.setApiKey(value);\n console.log(chalk.green('✅ API key set successfully'));\n console.log(\n chalk.yellow(\n '💡 Note: API key is stored in plain text. Consider using CALIMERO_API_KEY environment variable for better security.'\n )\n );\n break;\n\n default:\n console.error(chalk.red(`❌ Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to set configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigGetCommand(): Command {\n return new Command('get')\n .description('Get a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .action(key => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n console.log(config.getRegistryUrl());\n break;\n\n case 'api-key':\n case 'apiKey': {\n const apiKey = config.getApiKey();\n if (apiKey) {\n // Mask API key for security\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(masked);\n console.log(\n chalk.yellow(\n '💡 Note: API key is masked. Use \"config list\" to see source.'\n )\n );\n } else {\n console.log('(not set)');\n }\n break;\n }\n\n default:\n console.error(chalk.red(`❌ Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to get configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigListCommand(): Command {\n return new Command('list')\n .description('List all configuration values')\n .alias('ls')\n .action(() => {\n try {\n const config = new RemoteConfig();\n\n console.log(chalk.blue('\\n📋 Remote Registry Configuration\\n'));\n\n // Check if config file exists\n const configPath = config.getConfigPath();\n const configFileExists = fs.existsSync(configPath);\n\n // Registry URL\n const url = config.getRegistryUrl();\n let urlSource: string;\n if (process.env.CALIMERO_REGISTRY_URL) {\n urlSource = chalk.yellow('(from CALIMERO_REGISTRY_URL env var)');\n } else if (configFileExists) {\n urlSource = chalk.gray('(from config file)');\n } else {\n urlSource = chalk.gray('(default)');\n }\n console.log(` ${chalk.bold('Registry URL:')} ${url} ${urlSource}`);\n\n // API Key\n const apiKey = config.getApiKey();\n if (apiKey) {\n let apiKeySource: string;\n if (process.env.CALIMERO_API_KEY) {\n apiKeySource = chalk.yellow('(from CALIMERO_API_KEY env var)');\n } else if (configFileExists) {\n apiKeySource = chalk.gray('(from config file)');\n } else {\n apiKeySource = chalk.gray('(default)');\n }\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(` ${chalk.bold('API Key:')} ${masked} ${apiKeySource}`);\n } else {\n console.log(` ${chalk.bold('API Key:')} ${chalk.gray('(not set)')}`);\n }\n\n console.log(chalk.blue(`\\n📁 Config file: ${configPath}`));\n if (!configFileExists) {\n console.log(chalk.gray(' (file does not exist, using defaults)'));\n }\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to list configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigResetCommand(): Command {\n return new Command('reset')\n .description('Reset configuration to defaults')\n .option('--force', 'Skip confirmation prompt')\n .action(options => {\n try {\n if (!options.force) {\n console.error(\n chalk.red('❌ Configuration reset requires --force flag')\n );\n console.log(\n chalk.yellow(\n '⚠️ This will reset all configuration to defaults. Use --force to confirm.'\n )\n );\n process.exit(1);\n }\n\n const config = new RemoteConfig();\n config.reset();\n\n console.log(chalk.green('✅ Configuration reset to defaults'));\n console.log(chalk.blue('\\nDefault values:'));\n console.log(' Registry URL: https://apps.calimero.network');\n console.log(' API Key: (not set)');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('❌ Failed to reset configuration:'), message);\n process.exit(1);\n }\n });\n}\n","/**\n * Organization commands: create, list, get, update, members, packages.\n * Write operations use Authorization: Bearer <api-token>.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nconst DEFAULT_TIMEOUT = 10000;\n\nfunction getGlobalOpts(command: Command): {\n url: string;\n timeout: number;\n} {\n const opts = command.parent?.parent?.opts() ?? {};\n const remoteConfig = new RemoteConfig();\n const url =\n opts.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n return {\n url,\n timeout:\n parseInt(String(opts.timeout ?? DEFAULT_TIMEOUT), 10) || DEFAULT_TIMEOUT,\n };\n}\n\n/** Returns the Authorization header for CLI write operations. Throws if no token configured. */\nfunction getAuthHeaders(): Record<string, string> {\n const remoteConfig = new RemoteConfig();\n const apiKey = remoteConfig.getApiKey();\n if (!apiKey) {\n throw new Error(\n 'API token required for org write operations.\\n' +\n 'Get a token from the Organizations page in the web UI, then run:\\n' +\n ' calimero-registry config set api-key <token>'\n );\n }\n return { Authorization: `Bearer ${apiKey}` };\n}\n\ninterface FetchOptions {\n method?: string;\n body?: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nasync function fetchJson<T>(\n url: string,\n options: FetchOptions = {}\n): Promise<{ data: T; status: number }> {\n const { timeout = DEFAULT_TIMEOUT, ...init } = options;\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n const res = await fetch(url, {\n ...init,\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...init.headers,\n },\n });\n clearTimeout(id);\n const text = await res.text();\n const data = text ? (JSON.parse(text) as T) : (undefined as T);\n return { data, status: res.status };\n}\n\nexport const orgCommand = new Command('org')\n .description('Manage organizations (create, list, members, packages)')\n .addCommand(\n new Command('list')\n .description(\n 'List organizations you belong to (uses API token to resolve identity)'\n )\n .action(async (_options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Resolving identity...').start();\n let authHeaders: Record<string, string>;\n try {\n authHeaders = getAuthHeaders();\n } catch (e) {\n spinner.fail('API token required');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const base = url.replace(/\\/$/, '');\n\n // Resolve identity from API token via /api/auth/me (email + optional pubkey for org list)\n let myEmail: string;\n try {\n const { data, status } = await fetchJson<{\n user?: { email?: string };\n }>(`${base}/api/auth/me`, {\n method: 'GET',\n headers: authHeaders,\n timeout,\n });\n if (status !== 200 || !data?.user?.email) {\n spinner.fail('Could not resolve identity from API token');\n console.error(\n chalk.red(\n 'Ensure your API token is valid. Get a new one from the web UI.'\n )\n );\n process.exit(1);\n }\n myEmail = data.user.email;\n spinner.text = `Fetching organizations for ${myEmail}...`;\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n\n const apiUrl = `${base}/api/v2/orgs?member=${encodeURIComponent(myEmail)}`;\n try {\n const { data, status } = await fetchJson<\n Array<{ id: string; name: string; slug: string }>\n >(apiUrl, {\n method: 'GET',\n headers: authHeaders,\n timeout,\n });\n if (status !== 200) {\n spinner.fail('Failed to list organizations');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n const orgs = Array.isArray(data)\n ? (data as Array<{ id: string; name: string; slug: string }>)\n : [];\n spinner.succeed(`Found ${orgs.length} organization(s)`);\n if (orgs.length === 0) {\n console.log(chalk.yellow('No organizations found'));\n return;\n }\n // Fetch members for each org in parallel to show count + role\n const memberResults = await Promise.all(\n orgs.map(o =>\n fetchJson<{ members: Array<{ email: string; role: string }> }>(\n `${base}/api/v2/orgs/${encodeURIComponent(o.id)}/members`,\n { method: 'GET', headers: authHeaders, timeout }\n ).catch(() => ({ data: { members: [] }, status: 0 }))\n )\n );\n const lines = orgs.map((o, i) => {\n const members = memberResults[i].data?.members ?? [];\n const myMember = members.find(m => m.email === myEmail);\n const role = myMember?.role ?? '?';\n const count = members.length;\n const roleLabel =\n role === 'admin' ? chalk.yellow('admin') : chalk.gray(role);\n return `${chalk.white(o.slug)} ${chalk.gray(o.name)} ${chalk.gray(`${count} member${count !== 1 ? 's' : ''}`)} ${roleLabel}`;\n });\n console.log(lines.join('\\n'));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('create')\n .description('Create a new organization (requires API token)')\n .requiredOption('-n, --name <name>', 'Organization display name')\n .requiredOption('-s, --slug <slug>', 'Organization slug (e.g. my-org)')\n .action(\n async (options: { name: string; slug: string }, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Creating organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = '/api/v2/orgs';\n const body = {\n name: options.name.trim(),\n slug: options.slug.trim().toLowerCase(),\n };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson<\n | { id: string; name: string; slug: string }\n | { error: string; message: string }\n >(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n const err = data as { error?: string; message?: string };\n spinner.fail(err?.message || `HTTP ${status}`);\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Organization created');\n console.log(chalk.green(JSON.stringify(data, null, 2)));\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('get')\n .description('Get organization by id/slug')\n .argument('<orgId>', 'Organization id or slug')\n .action(async (orgId: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const base = url.replace(/\\/$/, '');\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const spinner = ora('Fetching organization...').start();\n try {\n const { data, status } = await fetchJson<\n Record<string, unknown> | { error: string; message: string }\n >(`${base}${pathname}`, { method: 'GET', timeout });\n if (status === 404) {\n spinner.fail('Organization not found');\n process.exit(1);\n }\n if (status !== 200) {\n spinner.fail('Request failed');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('OK');\n console.log(JSON.stringify(data, null, 2));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(chalk.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('update')\n .description('Update organization (name, metadata)')\n .argument('<orgId>', 'Organization id or slug')\n .option('-n, --name <name>', 'New display name')\n .option('-m, --metadata <json>', 'Metadata JSON object')\n .action(\n async (\n orgId: string,\n options: { name?: string; metadata?: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Updating organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const body: Record<string, unknown> = {};\n if (options.name !== undefined) body.name = options.name;\n if (options.metadata !== undefined) {\n try {\n body.metadata = JSON.parse(options.metadata);\n } catch {\n spinner.fail('--metadata must be valid JSON');\n process.exit(1);\n }\n }\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'PATCH',\n body:\n Object.keys(body).length > 0 ? JSON.stringify(body) : undefined,\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Updated');\n console.log(JSON.stringify(data, null, 2));\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('delete')\n .description('Delete an organization and all its data (irreversible)')\n .argument('<orgId>', 'Organization id or slug')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(\n async (orgId: string, options: { yes?: boolean }, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n if (!options.yes) {\n const { createInterface } = await import('readline');\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const confirmed = await new Promise<boolean>(resolve => {\n rl.question(\n chalk.yellow(\n `Delete organization \"${orgId}\" and all its members/packages? This cannot be undone. Type \"yes\" to confirm: `\n ),\n answer => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'yes');\n }\n );\n });\n if (!confirmed) {\n console.log(chalk.gray('Aborted.'));\n return;\n }\n }\n const spinner = ora('Deleting organization...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Organization deleted');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('members')\n .description('List, add, or remove organization members')\n .addCommand(\n new Command('list')\n .description('List members of an org')\n .argument('<orgId>', 'Organization id or slug')\n .action(async (orgId: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const base = url.replace(/\\/$/, '');\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members`;\n const spinner = ora('Fetching members...').start();\n try {\n const { data, status } = await fetchJson<{\n members: Array<{ email: string; role: string }>;\n }>(`${base}${pathname}`, { method: 'GET', timeout });\n if (status !== 200) {\n spinner.fail('Failed');\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('OK');\n const members =\n (data as { members?: Array<{ email: string; role: string }> })\n ?.members ?? [];\n console.log(JSON.stringify(members, null, 2));\n } catch (e) {\n spinner.fail('Request failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('add')\n .description('Add a member by email')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .option('-r, --role <role>', 'Role: member or admin', 'member')\n .action(\n async (\n orgId: string,\n email: string,\n options: { role: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Adding member...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members`;\n const body = {\n email: email.trim(),\n role: options.role === 'admin' ? 'admin' : 'member',\n };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Member added');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('update')\n .description('Update a member role (admin or member)')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .requiredOption('-r, --role <role>', 'New role: admin or member')\n .action(\n async (\n orgId: string,\n email: string,\n options: { role: string },\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const role = options.role === 'admin' ? 'admin' : 'member';\n const spinner = ora('Updating member role...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(email.trim())}`;\n const body = { role };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed(`Role updated to \"${role}\"`);\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('remove')\n .description('Remove a member by email')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<email>', 'Member email address')\n .action(\n async (\n orgId: string,\n email: string,\n _options,\n command: Command\n ) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Removing member...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(email.trim())}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Member removed');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n )\n .addCommand(\n new Command('packages')\n .description('Link or unlink packages to the organization')\n .addCommand(\n new Command('link')\n .description('Link a package to the organization')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<package>', 'Package name')\n .action(\n async (orgId: string, pkg: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Linking package...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/packages`;\n const body = { package: pkg.trim() };\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'POST',\n body: JSON.stringify(body),\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Package linked');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command('unlink')\n .description('Unlink a package from the organization')\n .argument('<orgId>', 'Organization id or slug')\n .argument('<package>', 'Package name')\n .action(\n async (orgId: string, pkg: string, _options, command: Command) => {\n const { url, timeout } = getGlobalOpts(command);\n const spinner = ora('Unlinking package...').start();\n try {\n const authHeaders = getAuthHeaders();\n const pathname = `/api/v2/orgs/${encodeURIComponent(orgId)}/packages/${encodeURIComponent(pkg.trim())}`;\n const base = url.replace(/\\/$/, '');\n const { data, status } = await fetchJson(`${base}${pathname}`, {\n method: 'DELETE',\n timeout,\n headers: authHeaders,\n });\n if (status >= 400) {\n spinner.fail(\n (data as { message?: string })?.message || `HTTP ${status}`\n );\n console.error(chalk.red(JSON.stringify(data)));\n process.exit(1);\n }\n spinner.succeed('Package unlinked');\n } catch (e) {\n spinner.fail('Failed');\n console.error(\n chalk.red(e instanceof Error ? e.message : String(e))\n );\n process.exit(1);\n }\n }\n )\n )\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createRequire } from 'module';\nimport { healthCommand } from './commands/health.js';\nimport { ipfsCommand } from './commands/ipfs.js';\nimport { localCommand } from './commands/local.js';\nimport { bundleCommand } from './commands/bundle.js';\nimport { configCommand } from './commands/config.js';\nimport { orgCommand } from './commands/org.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json');\n\nconst program = new Command();\n\nprogram\n .name('calimero-registry')\n .description(\n 'Calimero Network App Registry CLI - Command-line interface for the App Registry'\n )\n .version(version);\n\n// Global help text with examples\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry org list\n $ calimero-registry bundle get com.example.my-app 1.0.0\n $ calimero-registry local start\n $ calimero-registry health\n\nFor more information, visit: https://github.com/calimero-network/app-registry\n`\n);\n\n// Global options — no default; commands fall back to RemoteConfig / CALIMERO_REGISTRY_URL\nprogram.option('-u, --url <url>', 'Registry API URL (overrides saved config)');\nprogram.option(\n '-t, --timeout <timeout>',\n 'Request timeout in milliseconds',\n '10000'\n);\nprogram.option('--local', 'Use local registry instead of remote API');\n\n// Add commands\nprogram.addCommand(healthCommand);\nprogram.addCommand(ipfsCommand);\nprogram.addCommand(localCommand);\nprogram.addCommand(bundleCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(orgCommand);\n\n// Global error handler\nprogram.exitOverride();\n\ntry {\n program.parse();\n} catch (err: unknown) {\n // Commander throws for --version, --help, and no-command help (exitCode 0) — ignore those\n if (err && typeof err === 'object' && 'exitCode' in err) {\n process.exit((err as { exitCode: number }).exitCode ?? 0);\n }\n if (err instanceof Error) {\n console.error(chalk.red('Error:'), err.message);\n } else {\n console.error(chalk.red('Unknown error occurred'));\n }\n process.exit(1);\n}\n"]}
|